X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fflash%2Fflash.c;h=0fe655352f7a9d0d733b12c5a501817bffba79d6;hb=bf509dbafa4957ca635c92dc2ea5389e14255a7f;hp=c5cf757f946a0a48a231c64cc17d07a72757e104;hpb=0cba0d4df3fe120f08945703506f8405760325c9;p=openocd diff --git a/src/flash/flash.c b/src/flash/flash.c index c5cf757f..0fe65535 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -28,46 +28,27 @@ #endif #include "flash.h" -#include "command.h" -#include "target.h" -#include "time_support.h" -#include "fileio.h" #include "image.h" -#include "log.h" -#include "armv4_5.h" -#include "algorithm.h" -#include "binarybuffer.h" -#include "armv7m.h" - -#include -#include -#include -#include -#include -#include -#include +#include "time_support.h" /* command handlers */ -int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_probe_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_protect_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_write_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -flash_bank_t *get_flash_bank_by_addr(target_t *target, u32 addr); +static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_probe_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_protect_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); /* flash drivers */ extern flash_driver_t lpc2000_flash; extern flash_driver_t cfi_flash; extern flash_driver_t at91sam7_flash; -extern flash_driver_t at91sam7_old_flash; extern flash_driver_t str7x_flash; extern flash_driver_t str9x_flash; extern flash_driver_t aduc702x_flash; @@ -78,12 +59,13 @@ extern flash_driver_t tms470_flash; extern flash_driver_t ecosflash_flash; extern flash_driver_t lpc288x_flash; extern flash_driver_t ocl_flash; +extern flash_driver_t pic32mx_flash; +extern flash_driver_t avr_flash; flash_driver_t *flash_drivers[] = { &lpc2000_flash, &cfi_flash, &at91sam7_flash, - &at91sam7_old_flash, &str7x_flash, &str9x_flash, &aduc702x_flash, @@ -94,6 +76,8 @@ flash_driver_t *flash_drivers[] = { &ecosflash_flash, &lpc288x_flash, &ocl_flash, + &pic32mx_flash, + &avr_flash, NULL, }; @@ -101,7 +85,7 @@ flash_bank_t *flash_banks; static command_t *flash_cmd; /* wafer thin wrapper for invoking the flash driver */ -static int flash_driver_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) +static int flash_driver_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count) { int retval; @@ -263,7 +247,7 @@ flash_bank_t *get_flash_bank_by_num(int num) return p; } -int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { int retval; int i; @@ -275,9 +259,9 @@ int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_COMMAND_SYNTAX_ERROR; } - if ((target = get_target_by_num(strtoul(args[5], NULL, 0))) == NULL) + if ((target = get_target(args[5])) == NULL) { - LOG_ERROR("target %lu not defined", strtoul(args[5], NULL, 0)); + LOG_ERROR("target '%s' not defined", args[5]); return ERROR_FAIL; } @@ -316,14 +300,17 @@ int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char /* put flash bank in linked list */ if (flash_banks) { + int bank_num = 0; /* find last flash bank */ - for (p = flash_banks; p && p->next; p = p->next); + for (p = flash_banks; p && p->next; p = p->next) bank_num++; if (p) p->next = c; + c->bank_number = bank_num + 1; } else { flash_banks = c; + c->bank_number = 0; } found = 1; @@ -340,10 +327,10 @@ int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_OK; } -int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *p; - int i = 0; + uint32_t i = 0; int j = 0; int retval; @@ -391,7 +378,7 @@ int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_OK; } -int handle_flash_probe_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_probe_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *p; int retval; @@ -427,7 +414,7 @@ int handle_flash_probe_command(struct command_context_s *cmd_ctx, char *cmd, cha return ERROR_OK; } -int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *p; int retval; @@ -443,7 +430,7 @@ int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, char *cm int j; if ((retval = p->driver->erase_check(p)) == ERROR_OK) { - command_print(cmd_ctx, "successfully checked erase state", p->driver->name, p->base); + command_print(cmd_ctx, "successfully checked erase state"); } else { @@ -471,7 +458,7 @@ int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, char *cm return ERROR_OK; } -int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *p; int retval; @@ -519,7 +506,7 @@ int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, char * return retval; } -int handle_flash_protect_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_protect_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *p; int retval; @@ -553,7 +540,7 @@ int handle_flash_protect_check_command(struct command_context_s *cmd_ctx, char * return ERROR_OK; } -int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { if (argc > 2) { @@ -578,7 +565,8 @@ int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, cha return retval; } - command_print(cmd_ctx, "erased sectors %i through %i on flash bank %i in %s", first, last, strtoul(args[0], 0, 0), duration_text); + command_print(cmd_ctx, "erased sectors %i through %i on flash bank %li in %s", + first, last, strtoul(args[0], 0, 0), duration_text); free(duration_text); } } @@ -590,7 +578,7 @@ int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, cha return ERROR_OK; } -int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { if (argc > 3) { @@ -617,7 +605,9 @@ int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, c retval = flash_driver_protect(p, set, first, last); if (retval == ERROR_OK) { - command_print(cmd_ctx, "%s protection for sectors %i through %i on flash bank %i", (set) ? "set" : "cleared", first, last, strtoul(args[0], 0, 0)); + command_print(cmd_ctx, "%s protection for sectors %i through %i on flash bank %li", + (set) ? "set" : "cleared", first, + last, strtoul(args[0], 0, 0)); } } else @@ -629,12 +619,12 @@ int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, c return ERROR_OK; } -int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { target_t *target = get_current_target(cmd_ctx); image_t image; - u32 written; + uint32_t written; duration_t duration; char *duration_text; @@ -714,20 +704,22 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm return retval; } -int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { int err = ERROR_OK, retval; - u32 address; - u32 pattern; - u32 count; - u8 chunk[1024]; - u32 wrote = 0; - int chunk_count; + uint32_t address; + uint32_t pattern; + uint32_t count; + uint8_t chunk[1024]; + uint8_t readback[1024]; + uint32_t wrote = 0; + uint32_t cur_size = 0; + uint32_t chunk_count; char *duration_text; duration_t duration; target_t *target = get_current_target(cmd_ctx); - u32 i; - int wordsize; + uint32_t i; + uint32_t wordsize; if (argc != 3) { @@ -781,9 +773,9 @@ int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char duration_start_measure(&duration); - for (wrote=0; wrote<(count*wordsize); wrote+=sizeof(chunk)) + for (wrote=0; wrote<(count*wordsize); wrote += cur_size) { - int cur_size = MIN( (count*wordsize - wrote) , 1024 ); + cur_size = MIN( (count*wordsize - wrote), sizeof(chunk) ); flash_bank_t *bank; bank = get_flash_bank_by_addr(target, address); if(bank == NULL) @@ -793,7 +785,21 @@ int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char err = flash_driver_write(bank, chunk, address - bank->base + wrote, cur_size); if (err!=ERROR_OK) return err; - wrote += cur_size; + + err = target_read_buffer(target, address + wrote, cur_size, readback); + if (err!=ERROR_OK) + return err; + + unsigned i; + for (i=0; i c->base + c->size) + if (addr + length - 1 > c->base + c->size - 1) return ERROR_FLASH_DST_BREAKS_ALIGNMENT; addr -= c->base; @@ -968,12 +974,12 @@ int flash_erase_address_range(target_t *target, u32 addr, u32 length) } /* write (optional verify) an image to flash memory of the given target */ -int flash_write(target_t *target, image_t *image, u32 *written, int erase) +int flash_write(target_t *target, image_t *image, uint32_t *written, int erase) { int retval=ERROR_OK; int section; - u32 section_offset; + uint32_t section_offset; flash_bank_t *c; int *padding; @@ -997,12 +1003,12 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase) /* loop until we reach end of the image */ while (section < image->num_sections) { - u32 buffer_size; - u8 *buffer; + uint32_t buffer_size; + uint8_t *buffer; int section_first; int section_last; - u32 run_address = image->sections[section].base_address + section_offset; - u32 run_size = image->sections[section].size - section_offset; + uint32_t run_address = image->sections[section].base_address + section_offset; + uint32_t run_size = image->sections[section].size - section_offset; int pad_bytes = 0; if (image->sections[section].size == 0) @@ -1025,7 +1031,7 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase) section_first = section; section_last = section; padding[section] = 0; - while ((run_address + run_size < c->base + c->size) + while ((run_address + run_size - 1 < c->base + c->size - 1) && (section_last + 1 < image->num_sections)) { if (image->sections[section_last + 1].base_address < (run_address + run_size)) @@ -1047,8 +1053,12 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase) } /* fit the run into bank constraints */ - if (run_address + run_size > c->base + c->size) + if (run_address + run_size - 1 > c->base + c->size - 1) + { + LOG_WARNING("writing %d bytes only - as image section is %d bytes and bank is only %d bytes", \ + c->base + c->size - run_address, run_size, c->size); run_size = c->base + c->size - run_address; + } /* allocate buffer */ buffer = malloc(run_size); @@ -1057,7 +1067,7 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase) /* read sections to the buffer */ while (buffer_size < run_size) { - u32 size_read; + uint32_t size_read; size_read = run_size - buffer_size; if (size_read > image->sections[section].size - section_offset) @@ -1119,10 +1129,10 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase) int default_flash_mem_blank_check(struct flash_bank_s *bank) { target_t *target = bank->target; - u8 buffer[1024]; + uint8_t buffer[1024]; int buffer_size = sizeof(buffer); int i; - int nBytes; + uint32_t nBytes; if (bank->target->state != TARGET_HALTED) { @@ -1132,12 +1142,12 @@ int default_flash_mem_blank_check(struct flash_bank_s *bank) for (i = 0; i < bank->num_sectors; i++) { - int j; + uint32_t j; bank->sectors[i].is_erased = 1; for (j = 0; j < bank->sectors[i].size; j += buffer_size) { - int chunk; + uint32_t chunk; int retval; chunk = buffer_size; if (chunk > (j - bank->sectors[i].size)) @@ -1145,7 +1155,7 @@ int default_flash_mem_blank_check(struct flash_bank_s *bank) chunk = (j - bank->sectors[i].size); } - retval = target->type->read_memory(target, bank->base + bank->sectors[i].offset + j, 4, chunk/4, buffer); + retval = target_read_memory(target, bank->base + bank->sectors[i].offset + j, 4, chunk/4, buffer); if (retval != ERROR_OK) return retval; @@ -1169,7 +1179,7 @@ int default_flash_blank_check(struct flash_bank_s *bank) int i; int retval; int fast_check = 0; - u32 blank; + uint32_t blank; if (bank->target->state != TARGET_HALTED) { @@ -1179,8 +1189,8 @@ int default_flash_blank_check(struct flash_bank_s *bank) for (i = 0; i < bank->num_sectors; i++) { - u32 address = bank->base + bank->sectors[i].offset; - u32 size = bank->sectors[i].size; + uint32_t address = bank->base + bank->sectors[i].offset; + uint32_t size = bank->sectors[i].size; if ((retval = target_blank_check_memory(target, address, size, &blank)) != ERROR_OK) {