X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fflash.c;h=1a04e123f9db4e07a285bc16c8a9d307fe9660ef;hp=b40e074206b1cde8a39a4510accaf80684014e00;hb=ca594adb5a71f2bf60c1380172b8e61b075d9479;hpb=e9566a4a6af9b16762c66cf632abbeafbe8f874f diff --git a/src/flash/flash.c b/src/flash/flash.c index b40e074206..1a04e123f9 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -31,18 +31,6 @@ #include "image.h" #include "time_support.h" -/* command handlers */ -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); static int flash_write_unlock(target_t *target, image_t *image, uint32_t *written, int erase, bool unlock); /* flash drivers @@ -132,14 +120,6 @@ int flash_driver_protect(struct flash_bank_s *bank, int set, int first, int last return retval; } -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 ...]"); - return ERROR_OK; -} - static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { flash_bank_t *p; @@ -173,43 +153,6 @@ static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv) return JIM_OK; } -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_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, - "identify flash bank "); - register_command(cmd_ctx, flash_cmd, "erase_check", handle_flash_erase_check_command, COMMAND_EXEC, - "check erase state of sectors in flash bank "); - register_command(cmd_ctx, flash_cmd, "protect_check", handle_flash_protect_check_command, COMMAND_EXEC, - "check protection state of sectors in flash bank "); - register_command(cmd_ctx, flash_cmd, "erase_sector", handle_flash_erase_command, COMMAND_EXEC, - "erase sectors at "); - register_command(cmd_ctx, flash_cmd, "erase_address", handle_flash_erase_address_command, COMMAND_EXEC, - "erase address range
"); - - register_command(cmd_ctx, flash_cmd, "fillw", handle_flash_fill_command, COMMAND_EXEC, - "fill with pattern (no autoerase)
"); - register_command(cmd_ctx, flash_cmd, "fillh", handle_flash_fill_command, COMMAND_EXEC, - "fill with pattern
"); - register_command(cmd_ctx, flash_cmd, "fillb", handle_flash_fill_command, COMMAND_EXEC, - "fill with pattern
"); - - register_command(cmd_ctx, flash_cmd, "write_bank", handle_flash_write_bank_command, COMMAND_EXEC, - "write binary data to "); - register_command(cmd_ctx, flash_cmd, "write_image", handle_flash_write_image_command, COMMAND_EXEC, - "write_image [erase] [unlock] [offset] [type]"); - register_command(cmd_ctx, flash_cmd, "protect", handle_flash_protect_command, COMMAND_EXEC, - "set protection of sectors at "); - } - - return ERROR_OK; -} - flash_bank_t *get_flash_bank_by_num_noprobe(int num) { flash_bank_t *p; @@ -256,7 +199,7 @@ flash_bank_t *get_flash_bank_by_num(int num) } int flash_command_get_bank_by_num( - struct command_context_s *cmd_ctx, char *str, flash_bank_t **bank) + struct command_context_s *cmd_ctx, const char *str, flash_bank_t **bank) { unsigned bank_num; COMMAND_PARSE_NUMBER(uint, str, bank_num); @@ -292,54 +235,54 @@ static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cm for (i = 0; flash_drivers[i]; i++) { - if (strcmp(args[0], flash_drivers[i]->name) == 0) - { - flash_bank_t *p, *c; + if (strcmp(args[0], flash_drivers[i]->name) != 0) + continue; - /* register flash specific commands */ - if (flash_drivers[i]->register_commands(cmd_ctx) != ERROR_OK) - { - LOG_ERROR("couldn't register '%s' commands", args[0]); - return ERROR_FAIL; - } + flash_bank_t *p, *c; - c = malloc(sizeof(flash_bank_t)); - c->target = target; - c->driver = flash_drivers[i]; - c->driver_priv = NULL; - COMMAND_PARSE_NUMBER(u32, args[1], c->base); - COMMAND_PARSE_NUMBER(u32, args[2], c->size); - COMMAND_PARSE_NUMBER(int, args[3], c->chip_width); - COMMAND_PARSE_NUMBER(int, args[4], c->bus_width); - c->num_sectors = 0; - c->sectors = NULL; - c->next = NULL; - - if ((retval = flash_drivers[i]->flash_bank_command(cmd_ctx, cmd, args, argc, c)) != ERROR_OK) - { - LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8" PRIx32 , args[0], c->base); - free(c); - return retval; - } + /* register flash specific commands */ + if (flash_drivers[i]->register_commands(cmd_ctx) != ERROR_OK) + { + LOG_ERROR("couldn't register '%s' commands", args[0]); + return ERROR_FAIL; + } - /* 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) bank_num++; - if (p) - p->next = c; - c->bank_number = bank_num + 1; - } - else - { - flash_banks = c; - c->bank_number = 0; - } + c = malloc(sizeof(flash_bank_t)); + c->target = target; + c->driver = flash_drivers[i]; + c->driver_priv = NULL; + COMMAND_PARSE_NUMBER(u32, args[1], c->base); + COMMAND_PARSE_NUMBER(u32, args[2], c->size); + COMMAND_PARSE_NUMBER(int, args[3], c->chip_width); + COMMAND_PARSE_NUMBER(int, args[4], c->bus_width); + c->num_sectors = 0; + c->sectors = NULL; + c->next = NULL; + + if ((retval = flash_drivers[i]->flash_bank_command(cmd_ctx, cmd, args, argc, c)) != ERROR_OK) + { + LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8" PRIx32 , args[0], c->base); + free(c); + return retval; + } - found = 1; + /* 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) bank_num++; + if (p) + p->next = c; + c->bank_number = bank_num + 1; + } + else + { + flash_banks = c; + c->bank_number = 0; } + + found = 1; } /* no matching flash driver found */ @@ -367,48 +310,48 @@ static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cm for (p = flash_banks; p; p = p->next, i++) { - if (i == bank_nr) + if (i != bank_nr) + continue; + + char buf[1024]; + + /* attempt auto probe */ + if ((retval = p->driver->auto_probe(p)) != ERROR_OK) + return retval; + + command_print(cmd_ctx, + "#%" PRIi32 " : %s at 0x%8.8" PRIx32 ", size 0x%8.8" PRIx32 ", buswidth %i, chipwidth %i", + i, + p->driver->name, + p->base, + p->size, + p->bus_width, + p->chip_width); + for (j = 0; j < p->num_sectors; j++) { - char buf[1024]; + char *protect_state; - /* attempt auto probe */ - if ((retval = p->driver->auto_probe(p)) != ERROR_OK) - return retval; + if (p->sectors[j].is_protected == 0) + protect_state = "not protected"; + else if (p->sectors[j].is_protected == 1) + protect_state = "protected"; + else + protect_state = "protection state unknown"; command_print(cmd_ctx, - "#%" PRIi32 " : %s at 0x%8.8" PRIx32 ", size 0x%8.8" PRIx32 ", buswidth %i, chipwidth %i", - i, - p->driver->name, - p->base, - p->size, - p->bus_width, - p->chip_width); - for (j = 0; j < p->num_sectors; j++) - { - char *protect_state; - - if (p->sectors[j].is_protected == 0) - protect_state = "not protected"; - else if (p->sectors[j].is_protected == 1) - protect_state = "protected"; - else - protect_state = "protection state unknown"; - - command_print(cmd_ctx, - "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s", - j, - p->sectors[j].offset, - p->sectors[j].size, - p->sectors[j].size >> 10, - protect_state); - } - - *buf = '\0'; /* initialize buffer, otherwise it migh contain garbage if driver function fails */ - retval = p->driver->info(p, buf, sizeof(buf)); - command_print(cmd_ctx, "%s", buf); - if (retval != ERROR_OK) - LOG_ERROR("error retrieving flash info (%d)", retval); + "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s", + j, + p->sectors[j].offset, + p->sectors[j].size, + p->sectors[j].size >> 10, + protect_state); } + + *buf = '\0'; /* initialize buffer, otherwise it migh contain garbage if driver function fails */ + retval = p->driver->info(p, buf, sizeof(buf)); + command_print(cmd_ctx, "%s", buf); + if (retval != ERROR_OK) + LOG_ERROR("error retrieving flash info (%d)", retval); } return ERROR_OK; @@ -463,38 +406,35 @@ static int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, c if (ERROR_OK != retval) return retval; - if (p) + int j; + if ((retval = p->driver->erase_check(p)) == ERROR_OK) { - int j; - if ((retval = p->driver->erase_check(p)) == ERROR_OK) - { - command_print(cmd_ctx, "successfully checked erase state"); - } - else - { - command_print(cmd_ctx, "unknown error when checking erase state of flash bank #%s at 0x%8.8" PRIx32, - args[0], p->base); - } + command_print(cmd_ctx, "successfully checked erase state"); + } + else + { + command_print(cmd_ctx, "unknown error when checking erase state of flash bank #%s at 0x%8.8" PRIx32, + args[0], p->base); + } - for (j = 0; j < p->num_sectors; j++) - { - char *erase_state; + for (j = 0; j < p->num_sectors; j++) + { + char *erase_state; - if (p->sectors[j].is_erased == 0) - erase_state = "not erased"; - else if (p->sectors[j].is_erased == 1) - erase_state = "erased"; - else - erase_state = "erase state unknown"; + if (p->sectors[j].is_erased == 0) + erase_state = "not erased"; + else if (p->sectors[j].is_erased == 1) + erase_state = "erased"; + else + erase_state = "erase state unknown"; - command_print(cmd_ctx, - "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s", - j, - p->sectors[j].offset, - p->sectors[j].size, - p->sectors[j].size >> 10, - erase_state); - } + command_print(cmd_ctx, + "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s", + j, + p->sectors[j].offset, + p->sectors[j].size, + p->sectors[j].size >> 10, + erase_state); } return ERROR_OK; @@ -506,8 +446,6 @@ static int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, int retval; int address; int length; - duration_t duration; - char *duration_text; target_t *target = get_current_target(cmd_ctx); @@ -531,16 +469,16 @@ static int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, /* We can't know if we did a resume + halt, in which case we no longer know the erased state */ flash_set_dirty(); - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); + + retval = flash_erase_address_range(target, address, length); - if ((retval = flash_erase_address_range(target, address, length)) == ERROR_OK) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) - { - return retval; - } - command_print(cmd_ctx, "erased address 0x%8.8x length %i in %s", address, length, duration_text); - free(duration_text); + command_print(cmd_ctx, "erased address 0x%8.8x (length %i)" + " in %fs (%0.3f kb/s)", address, length, + duration_elapsed(&bench), duration_kbps(&bench, length)); } return retval; @@ -556,21 +494,17 @@ static int handle_flash_protect_check_command(struct command_context_s *cmd_ctx, if (ERROR_OK != retval) return retval; - if (p) + if ((retval = p->driver->protect_check(p)) == ERROR_OK) { - int retval; - if ((retval = p->driver->protect_check(p)) == ERROR_OK) - { - command_print(cmd_ctx, "successfully checked protect state"); - } - else if (retval == ERROR_FLASH_OPERATION_FAILED) - { - command_print(cmd_ctx, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8" PRIx32, args[0], p->base); - } - else - { - command_print(cmd_ctx, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8" PRIx32, args[0], p->base); - } + command_print(cmd_ctx, "successfully checked protect state"); + } + else if (retval == ERROR_FLASH_OPERATION_FAILED) + { + command_print(cmd_ctx, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8" PRIx32, args[0], p->base); + } + else + { + command_print(cmd_ctx, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8" PRIx32, args[0], p->base); } return ERROR_OK; @@ -597,45 +531,40 @@ static int flash_check_sector_parameters(struct command_context_s *cmd_ctx, static int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - if (argc > 2) - { - uint32_t bank_nr; - uint32_t first; - uint32_t last; - - COMMAND_PARSE_NUMBER(u32, args[0], bank_nr); - flash_bank_t *p = get_flash_bank_by_num(bank_nr); - if (!p) - return ERROR_OK; - - COMMAND_PARSE_NUMBER(u32, args[1], first); - if (strcmp(args[2], "last") == 0) - last = p->num_sectors - 1; - else - COMMAND_PARSE_NUMBER(u32, args[2], last); + if (argc != 2) + return ERROR_COMMAND_SYNTAX_ERROR; - int retval; - if ((retval = flash_check_sector_parameters(cmd_ctx, - first, last, p->num_sectors)) != ERROR_OK) - return retval; + uint32_t bank_nr; + uint32_t first; + uint32_t last; - duration_t duration; - char *duration_text; - duration_start_measure(&duration); + COMMAND_PARSE_NUMBER(u32, args[0], bank_nr); + flash_bank_t *p = get_flash_bank_by_num(bank_nr); + if (!p) + return ERROR_OK; - if ((retval = flash_driver_erase(p, first, last)) == ERROR_OK) { - if ((retval = duration_stop_measure(&duration, - &duration_text)) != ERROR_OK) - return retval; - command_print(cmd_ctx, "erased sectors %i through %i " - "on flash bank %i in %s", - (int) first, (int) last, (int) bank_nr, - duration_text); - free(duration_text); - } - } + COMMAND_PARSE_NUMBER(u32, args[1], first); + if (strcmp(args[2], "last") == 0) + last = p->num_sectors - 1; else - return ERROR_COMMAND_SYNTAX_ERROR; + COMMAND_PARSE_NUMBER(u32, args[2], last); + + int retval; + if ((retval = flash_check_sector_parameters(cmd_ctx, + first, last, p->num_sectors)) != ERROR_OK) + return retval; + + struct duration bench; + duration_start(&bench); + + retval = flash_driver_erase(p, first, last); + + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) + { + command_print(cmd_ctx, "erased sectors %" PRIu32 " " + "through %" PRIu32" on flash bank %" PRIu32 " " + "in %fs", first, last, bank_nr, duration_elapsed(&bench)); + } return ERROR_OK; } @@ -643,47 +572,45 @@ static int handle_flash_erase_command(struct command_context_s *cmd_ctx, static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - if (argc > 3) - { - uint32_t bank_nr; - uint32_t first; - uint32_t last; - int set; - - COMMAND_PARSE_NUMBER(u32, args[0], bank_nr); - flash_bank_t *p = get_flash_bank_by_num(bank_nr); - if (!p) - return ERROR_OK; - - COMMAND_PARSE_NUMBER(u32, args[1], first); - if (strcmp(args[2], "last") == 0) - last = p->num_sectors - 1; - else - COMMAND_PARSE_NUMBER(u32, args[2], last); + if (argc != 3) + return ERROR_COMMAND_SYNTAX_ERROR; - if (strcmp(args[3], "on") == 0) - set = 1; - else if (strcmp(args[3], "off") == 0) - set = 0; - else - return ERROR_COMMAND_SYNTAX_ERROR; + uint32_t bank_nr; + uint32_t first; + uint32_t last; + int set; - int retval; - if ((retval = flash_check_sector_parameters(cmd_ctx, - first, last, p->num_sectors)) != ERROR_OK) - return retval; + COMMAND_PARSE_NUMBER(u32, args[0], bank_nr); + flash_bank_t *p = get_flash_bank_by_num(bank_nr); + if (!p) + return ERROR_OK; - 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", (int) first, - (int) last, (int) bank_nr); - } - } + COMMAND_PARSE_NUMBER(u32, args[1], first); + if (strcmp(args[2], "last") == 0) + last = p->num_sectors - 1; + else + COMMAND_PARSE_NUMBER(u32, args[2], last); + + if (strcmp(args[3], "on") == 0) + set = 1; + else if (strcmp(args[3], "off") == 0) + set = 0; else return ERROR_COMMAND_SYNTAX_ERROR; + int retval; + if ((retval = flash_check_sector_parameters(cmd_ctx, + first, last, p->num_sectors)) != ERROR_OK) + return retval; + + 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", (int) first, + (int) last, (int) bank_nr); + } + return ERROR_OK; } @@ -694,10 +621,7 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c image_t image; uint32_t written; - duration_t duration; - char *duration_text; - - int retval, retvaltemp; + int retval; if (argc < 1) { @@ -739,7 +663,8 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c return ERROR_FAIL; } - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); if (argc >= 2) { @@ -767,23 +692,13 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c return retval; } - if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - image_close(&image); - return retvaltemp; + command_print(cmd_ctx, "wrote %" PRIu32 " byte from file %s " + "in %fs (%0.3f kb/s)", written, args[0], + duration_elapsed(&bench), duration_kbps(&bench, written)); } - float speed; - - speed = written / 1024.0; - speed /= ((float)duration.duration.tv_sec - + ((float)duration.duration.tv_usec / 1000000.0)); - command_print(cmd_ctx, - "wrote %" PRIu32 " byte from file %s in %s (%f kb/s)", - written, args[0], duration_text, speed); - - free(duration_text); - image_close(&image); return retval; @@ -791,7 +706,7 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - int err = ERROR_OK, retval; + int err = ERROR_OK; uint32_t address; uint32_t pattern; uint32_t count; @@ -800,8 +715,6 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm 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); uint32_t i; uint32_t wordsize; @@ -854,7 +767,8 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm exit(-1); } - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); for (wrote = 0; wrote < (count*wordsize); wrote += cur_size) { @@ -883,24 +797,14 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm return ERROR_FAIL; } } - } - if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) + if (duration_measure(&bench) == ERROR_OK) { - return retval; + command_print(cmd_ctx, "wrote %" PRIu32 " bytes to 0x%8.8" PRIx32 + " in %fs (%0.3f kb/s)", wrote, address, + duration_elapsed(&bench), duration_kbps(&bench, wrote)); } - - float speed; - - speed = wrote / 1024.0; - speed /= ((float)duration.duration.tv_sec - + ((float)duration.duration.tv_usec / 1000000.0)); - command_print(cmd_ctx, - "wrote %" PRIu32 " bytes to 0x%8.8" PRIx32 " in %s (%f kb/s)", - wrote, address, duration_text, speed); - - free(duration_text); return ERROR_OK; } @@ -909,17 +813,13 @@ static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, ch uint32_t offset; uint8_t *buffer; uint32_t buf_cnt; - fileio_t fileio; - duration_t duration; - char *duration_text; - - if (argc != 3) return ERROR_COMMAND_SYNTAX_ERROR; - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); flash_bank_t *p; int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &p); @@ -946,24 +846,13 @@ static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, ch free(buffer); buffer = NULL; - int retvaltemp; - if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) - { - fileio_close(&fileio); - return retvaltemp; - } - if (retval == ERROR_OK) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - float elapsed = (float)duration.duration.tv_sec; - elapsed += (float)duration.duration.tv_usec / 1000000.0; - float speed = (float)fileio.size / elapsed; - command_print(cmd_ctx, - "wrote %lld byte from file %s to flash bank %u " - "at offset 0x%8.8" PRIx32 " in %s (%f kb/s)", + command_print(cmd_ctx, "wrote %lld byte from file %s to flash bank %u" + " at offset 0x%8.8" PRIx32 " in %fs (%0.3f kb/s)", fileio.size, args[1], p->bank_number, offset, - duration_text, speed / 1024); + duration_elapsed(&bench), duration_kbps(&bench, fileio.size)); } - free(duration_text); fileio_close(&fileio); @@ -1328,3 +1217,65 @@ int default_flash_blank_check(struct flash_bank_s *bank) return ERROR_OK; } + +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) + return ERROR_OK; + + 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, + "identify flash bank "); + register_command(cmd_ctx, flash_cmd, "erase_check", + handle_flash_erase_check_command, COMMAND_EXEC, + "check erase state of sectors in flash bank "); + register_command(cmd_ctx, flash_cmd, "protect_check", + handle_flash_protect_check_command, COMMAND_EXEC, + "check protection state of sectors in flash bank "); + register_command(cmd_ctx, flash_cmd, "erase_sector", + handle_flash_erase_command, COMMAND_EXEC, + "erase sectors at "); + register_command(cmd_ctx, flash_cmd, "erase_address", + handle_flash_erase_address_command, COMMAND_EXEC, + "erase address range
"); + + register_command(cmd_ctx, flash_cmd, "fillw", + handle_flash_fill_command, COMMAND_EXEC, + "fill with pattern (no autoerase)
"); + register_command(cmd_ctx, flash_cmd, "fillh", + handle_flash_fill_command, COMMAND_EXEC, + "fill with pattern
"); + register_command(cmd_ctx, flash_cmd, "fillb", + handle_flash_fill_command, COMMAND_EXEC, + "fill with pattern
"); + + register_command(cmd_ctx, flash_cmd, "write_bank", + handle_flash_write_bank_command, COMMAND_EXEC, + "write binary data to "); + register_command(cmd_ctx, flash_cmd, "write_image", + handle_flash_write_image_command, COMMAND_EXEC, + "write_image [erase] [unlock] [offset] [type]"); + register_command(cmd_ctx, flash_cmd, "protect", + handle_flash_protect_command, COMMAND_EXEC, + "set protection of sectors at "); + + return ERROR_OK; +} + +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 ...]"); + return ERROR_OK; +}