X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fflash.c;h=071503f162c360fe589ba1fce12e39455788e1d3;hp=99e71d7a90b8d5bfbc4577b95a1c8cc8fbaf5511;hb=870b8c04557f0b7441cc502debaf537984d77e2a;hpb=23402315ce01071f30d7ec0c5ca7563ce41f1cc6 diff --git a/src/flash/flash.c b/src/flash/flash.c index 99e71d7a90..071503f162 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -28,6 +28,7 @@ #endif #include "flash.h" +#include "common.h" #include "image.h" #include "time_support.h" @@ -180,6 +181,23 @@ int flash_get_bank_count(void) return i; } +struct flash_bank *get_flash_bank_by_name(const char *name) +{ + unsigned requested = get_flash_name_index(name); + unsigned found = 0; + + struct flash_bank *bank; + for (bank = flash_banks; NULL != bank; bank = bank->next) + { + if (!flash_driver_name_matches(bank->driver->name, name)) + continue; + if (++found < requested) + continue; + return bank; + } + return NULL; +} + struct flash_bank *get_flash_bank_by_num(int num) { struct flash_bank *p = get_flash_bank_by_num_noprobe(num); @@ -198,17 +216,21 @@ struct flash_bank *get_flash_bank_by_num(int num) return p; } -COMMAND_HELPER(flash_command_get_bank_by_num, - unsigned name_index, struct flash_bank **bank) +COMMAND_HELPER(flash_command_get_bank_by_num, unsigned name_index, + struct flash_bank **bank) { const char *name = CMD_ARGV[name_index]; + *bank = get_flash_bank_by_name(name); + if (*bank) + return ERROR_OK; + unsigned bank_num; COMMAND_PARSE_NUMBER(uint, name, bank_num); *bank = get_flash_bank_by_num(bank_num); if (!*bank) { - command_print(cmd_ctx, "flash bank '%s' not found", name); + command_print(CMD_CTX, "flash bank '%s' not found", name); return ERROR_INVALID_ARGUMENTS; } return ERROR_OK; @@ -241,7 +263,7 @@ COMMAND_HANDLER(handle_flash_bank_command) struct flash_bank *p, *c; /* register flash specific commands */ - if (flash_drivers[i]->register_commands(cmd_ctx) != ERROR_OK) + if (flash_drivers[i]->register_commands(CMD_CTX) != ERROR_OK) { LOG_ERROR("couldn't register '%s' commands", CMD_ARGV[0]); return ERROR_FAIL; @@ -320,7 +342,7 @@ COMMAND_HANDLER(handle_flash_info_command) if ((retval = p->driver->auto_probe(p)) != ERROR_OK) return retval; - command_print(cmd_ctx, + command_print(CMD_CTX, "#%" PRIi32 " : %s at 0x%8.8" PRIx32 ", size 0x%8.8" PRIx32 ", buswidth %i, chipwidth %i", i, p->driver->name, @@ -339,7 +361,7 @@ COMMAND_HANDLER(handle_flash_info_command) else protect_state = "protection state unknown"; - command_print(cmd_ctx, + command_print(CMD_CTX, "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s", j, p->sectors[j].offset, @@ -350,7 +372,7 @@ COMMAND_HANDLER(handle_flash_info_command) *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); + command_print(CMD_CTX, "%s", buf); if (retval != ERROR_OK) LOG_ERROR("error retrieving flash info (%d)", retval); } @@ -374,22 +396,22 @@ COMMAND_HANDLER(handle_flash_probe_command) { if ((retval = p->driver->probe(p)) == ERROR_OK) { - command_print(cmd_ctx, "flash '%s' found at 0x%8.8" PRIx32, p->driver->name, p->base); + command_print(CMD_CTX, "flash '%s' found at 0x%8.8" PRIx32, p->driver->name, p->base); } else if (retval == ERROR_FLASH_BANK_INVALID) { - command_print(cmd_ctx, "probing failed for flash bank '#%s' at 0x%8.8" PRIx32, + command_print(CMD_CTX, "probing failed for flash bank '#%s' at 0x%8.8" PRIx32, CMD_ARGV[0], p->base); } else { - command_print(cmd_ctx, "unknown error when probing flash bank '#%s' at 0x%8.8" PRIx32, + command_print(CMD_CTX, "unknown error when probing flash bank '#%s' at 0x%8.8" PRIx32, CMD_ARGV[0], p->base); } } else { - command_print(cmd_ctx, "flash bank '#%s' is out of bounds", CMD_ARGV[0]); + command_print(CMD_CTX, "flash bank '#%s' is out of bounds", CMD_ARGV[0]); } return ERROR_OK; @@ -410,11 +432,11 @@ COMMAND_HANDLER(handle_flash_erase_check_command) int j; if ((retval = p->driver->erase_check(p)) == ERROR_OK) { - command_print(cmd_ctx, "successfully checked erase state"); + 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, + command_print(CMD_CTX, "unknown error when checking erase state of flash bank #%s at 0x%8.8" PRIx32, CMD_ARGV[0], p->base); } @@ -429,7 +451,7 @@ COMMAND_HANDLER(handle_flash_erase_check_command) else erase_state = "erase state unknown"; - command_print(cmd_ctx, + command_print(CMD_CTX, "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s", j, p->sectors[j].offset, @@ -448,7 +470,7 @@ COMMAND_HANDLER(handle_flash_erase_address_command) int address; int length; - struct target *target = get_current_target(cmd_ctx); + struct target *target = get_current_target(CMD_CTX); if (CMD_ARGC != 2) return ERROR_COMMAND_SYNTAX_ERROR; @@ -457,7 +479,7 @@ COMMAND_HANDLER(handle_flash_erase_address_command) COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], length); if (length <= 0) { - command_print(cmd_ctx, "Length must be >0"); + command_print(CMD_CTX, "Length must be >0"); return ERROR_COMMAND_SYNTAX_ERROR; } @@ -477,7 +499,7 @@ COMMAND_HANDLER(handle_flash_erase_address_command) if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - command_print(cmd_ctx, "erased address 0x%8.8x (length %i)" + 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)); } @@ -497,15 +519,15 @@ COMMAND_HANDLER(handle_flash_protect_check_command) if ((retval = p->driver->protect_check(p)) == ERROR_OK) { - command_print(cmd_ctx, "successfully checked protect state"); + 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, CMD_ARGV[0], p->base); + command_print(CMD_CTX, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8" PRIx32, CMD_ARGV[0], p->base); } else { - command_print(cmd_ctx, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8" PRIx32, CMD_ARGV[0], p->base); + command_print(CMD_CTX, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8" PRIx32, CMD_ARGV[0], p->base); } return ERROR_OK; @@ -550,7 +572,7 @@ COMMAND_HANDLER(handle_flash_erase_command) COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], last); int retval; - if ((retval = flash_check_sector_parameters(cmd_ctx, + if ((retval = flash_check_sector_parameters(CMD_CTX, first, last, p->num_sectors)) != ERROR_OK) return retval; @@ -561,7 +583,7 @@ COMMAND_HANDLER(handle_flash_erase_command) if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - command_print(cmd_ctx, "erased sectors %" PRIu32 " " + command_print(CMD_CTX, "erased sectors %" PRIu32 " " "through %" PRIu32" on flash bank %" PRIu32 " " "in %fs", first, last, bank_nr, duration_elapsed(&bench)); } @@ -577,7 +599,6 @@ COMMAND_HANDLER(handle_flash_protect_command) uint32_t bank_nr; uint32_t first; uint32_t last; - int set; COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], bank_nr); struct flash_bank *p = get_flash_bank_by_num(bank_nr); @@ -590,21 +611,17 @@ COMMAND_HANDLER(handle_flash_protect_command) else COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], last); - if (strcmp(CMD_ARGV[3], "on") == 0) - set = 1; - else if (strcmp(CMD_ARGV[3], "off") == 0) - set = 0; - else - return ERROR_COMMAND_SYNTAX_ERROR; + bool set; + COMMAND_PARSE_ON_OFF(CMD_ARGV[3], set); int retval; - if ((retval = flash_check_sector_parameters(cmd_ctx, + 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 " + 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); @@ -615,7 +632,7 @@ COMMAND_HANDLER(handle_flash_protect_command) COMMAND_HANDLER(handle_flash_write_image_command) { - struct target *target = get_current_target(cmd_ctx); + struct target *target = get_current_target(CMD_CTX); struct image image; uint32_t written; @@ -638,13 +655,13 @@ COMMAND_HANDLER(handle_flash_write_image_command) auto_erase = 1; CMD_ARGV++; CMD_ARGC--; - command_print(cmd_ctx, "auto erase enabled"); + command_print(CMD_CTX, "auto erase enabled"); } else if (strcmp(CMD_ARGV[0], "unlock") == 0) { auto_unlock = true; CMD_ARGV++; CMD_ARGC--; - command_print(cmd_ctx, "auto unlock enabled"); + command_print(CMD_CTX, "auto unlock enabled"); } else { break; @@ -693,7 +710,7 @@ COMMAND_HANDLER(handle_flash_write_image_command) if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - command_print(cmd_ctx, "wrote %" PRIu32 " byte from file %s " + command_print(CMD_CTX, "wrote %" PRIu32 " byte from file %s " "in %fs (%0.3f kb/s)", written, CMD_ARGV[0], duration_elapsed(&bench), duration_kbps(&bench, written)); } @@ -714,7 +731,7 @@ COMMAND_HANDLER(handle_flash_fill_command) uint32_t wrote = 0; uint32_t cur_size = 0; uint32_t chunk_count; - struct target *target = get_current_target(cmd_ctx); + struct target *target = get_current_target(CMD_CTX); uint32_t i; uint32_t wordsize; @@ -800,7 +817,7 @@ COMMAND_HANDLER(handle_flash_fill_command) if (duration_measure(&bench) == ERROR_OK) { - command_print(cmd_ctx, "wrote %" PRIu32 " bytes to 0x%8.8" PRIx32 + 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)); } @@ -847,7 +864,7 @@ COMMAND_HANDLER(handle_flash_write_bank_command) if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - command_print(cmd_ctx, "wrote %zu byte from file %s to flash bank %u" + command_print(CMD_CTX, "wrote %zu byte from file %s to flash bank %u" " at offset 0x%8.8" PRIx32 " in %fs (%0.3f kb/s)", fileio.size, CMD_ARGV[1], p->bank_number, offset, duration_elapsed(&bench), duration_kbps(&bench, fileio.size));