X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fflash.c;h=212b6de776ef508c0297d66ef19472950e26ea2d;hp=6d47334b9302158f78c3689e112716149662871d;hb=0bba832713cca8e5931d5d21f37f526d0a3979cf;hpb=b2164dd21103bc49863789c5f2ccaca1d93755d9 diff --git a/src/flash/flash.c b/src/flash/flash.c index 6d47334b93..212b6de776 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -48,19 +48,17 @@ #include /* 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 */ @@ -78,6 +76,7 @@ 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; flash_driver_t *flash_drivers[] = { &lpc2000_flash, @@ -94,6 +93,7 @@ flash_driver_t *flash_drivers[] = { &ecosflash_flash, &lpc288x_flash, &ocl_flash, + &pic32mx_flash, NULL, }; @@ -144,7 +144,7 @@ int flash_register_commands(struct command_context_s *cmd_ctx) { flash_cmd = register_command(cmd_ctx, NULL, "flash", NULL, COMMAND_ANY, NULL); - register_command(cmd_ctx, flash_cmd, "bank", handle_flash_bank_command, COMMAND_CONFIG, "flash_bank [driver_options ...]"); + register_command(cmd_ctx, flash_cmd, "bank", handle_flash_bank_command, COMMAND_CONFIG, "flash bank [driver_options ...]"); return ERROR_OK; } @@ -157,11 +157,6 @@ static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv) return JIM_ERR; } - if (!flash_banks) - { - return JIM_ERR; - } - Jim_Obj *list=Jim_NewListObj(interp, NULL, 0); for (p = flash_banks; p; p = p->next) { @@ -188,10 +183,10 @@ static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv) int flash_init_drivers(struct command_context_s *cmd_ctx) { + register_jim(cmd_ctx, "ocd_flash_banks", jim_flash_banks, "return information about the flash banks"); + if (flash_banks) { - register_jim(cmd_ctx, "ocd_flash_banks", jim_flash_banks, "return information about the flash banks"); - register_command(cmd_ctx, flash_cmd, "info", handle_flash_info_command, COMMAND_EXEC, "print info about flash bank "); register_command(cmd_ctx, flash_cmd, "probe", handle_flash_probe_command, COMMAND_EXEC, @@ -268,7 +263,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; @@ -321,14 +316,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; @@ -345,7 +343,7 @@ 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; @@ -396,7 +394,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; @@ -432,7 +430,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; @@ -471,13 +469,12 @@ int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, char *cm j, p->sectors[j].offset, p->sectors[j].size, p->sectors[j].size>>10, erase_state); } - } 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; @@ -525,7 +522,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; @@ -559,7 +556,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) { @@ -596,7 +593,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) { @@ -635,7 +632,7 @@ 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); @@ -663,7 +660,6 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm command_print(cmd_ctx, "auto erase enabled"); } - if (argc < 1) { return ERROR_COMMAND_SYNTAX_ERROR; @@ -721,7 +717,7 @@ 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; @@ -729,6 +725,7 @@ int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char u32 count; u8 chunk[1024]; u32 wrote = 0; + u32 cur_size = 0; int chunk_count; char *duration_text; duration_t duration; @@ -748,7 +745,6 @@ int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char if(count == 0) return ERROR_OK; - switch(cmd[4]) { case 'w': @@ -789,9 +785,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) @@ -801,7 +797,6 @@ 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; } if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) @@ -809,7 +804,6 @@ int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char return retval; } - if(err == ERROR_OK) { float speed; @@ -823,7 +817,7 @@ int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_OK; } -int handle_flash_write_bank_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) { u32 offset; u8 *buffer; @@ -954,7 +948,7 @@ int flash_erase_address_range(target_t *target, u32 addr, u32 length) } /* check whether it fits */ - if (addr + length > c->base + c->size) + if (addr + length - 1 > c->base + c->size - 1) return ERROR_FLASH_DST_BREAKS_ALIGNMENT; addr -= c->base; @@ -1034,7 +1028,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)) @@ -1056,8 +1050,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); @@ -1178,7 +1176,7 @@ int default_flash_blank_check(struct flash_bank_s *bank) int i; int retval; int fast_check = 0; - int blank; + u32 blank; if (bank->target->state != TARGET_HALTED) {