X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fnor%2Ftcl.c;h=aed55c05afc342c710b2b1eddc4598f4605b9136;hb=41cb9118536db5e5e2836ad6c75daae1d21b6f4a;hp=65523fbe4bfda55256930a8c4cfb92aa8e2cfb96;hpb=1c5c57ec8e3f285cc81d4ad101edccb82b721beb;p=openocd.git diff --git a/src/flash/nor/tcl.c b/src/flash/nor/tcl.c index 65523fbe4b..aed55c05af 100644 --- a/src/flash/nor/tcl.c +++ b/src/flash/nor/tcl.c @@ -26,6 +26,11 @@ #include #include +/** + * @file + * Implements Tcl commands used to access NOR flash facilities. + */ + COMMAND_HELPER(flash_command_get_bank, unsigned name_index, struct flash_bank **bank) { @@ -198,14 +203,29 @@ COMMAND_HANDLER(handle_flash_erase_address_command) int retval; int address; int length; - + bool do_pad = false; struct target *target = get_current_target(CMD_CTX); - if (CMD_ARGC != 2) + switch (CMD_ARGC) { + case 3: + /* Optionally pad out the address range to block/sector + * boundaries. We can't know if there's data in that part + * of the flash; only do padding if we're told to. + */ + if (strcmp("pad", CMD_ARGV[0]) != 0) + return ERROR_COMMAND_SYNTAX_ERROR; + do_pad = true; + CMD_ARGC--; + CMD_ARGV++; + /* FALL THROUGH */ + case 2: + COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], address); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], length); + break; + default: return ERROR_COMMAND_SYNTAX_ERROR; + } - COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], address); - COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], length); if (length <= 0) { command_print(CMD_CTX, "Length must be >0"); @@ -224,7 +244,7 @@ COMMAND_HANDLER(handle_flash_erase_address_command) struct duration bench; duration_start(&bench); - retval = flash_erase_address_range(target, address, length); + retval = flash_erase_address_range(target, do_pad, address, length); if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { @@ -414,7 +434,7 @@ COMMAND_HANDLER(handle_flash_write_image_command) if (CMD_ARGC >= 2) { image.base_address_set = 1; - COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], image.base_address); + COMMAND_PARSE_NUMBER(llong, CMD_ARGV[1], image.base_address); } else { @@ -693,9 +713,12 @@ static const struct command_registration flash_exec_command_handlers[] = { .name = "erase_address", .handler = handle_flash_erase_address_command, .mode = COMMAND_EXEC, - .usage = "address length", - .help = "Erase flash blocks starting at address " - "and continuing for length bytes.", + .usage = "['pad'] address length", + .help = "Erase flash sectors starting at address and " + "continuing for length bytes. If 'pad' is specified, " + "data outside that range may also be erased: the start " + "address may be decreased, and length increased, so " + "that all of the first and last sectors are erased.", }, { .name = "fillw", @@ -751,7 +774,7 @@ static const struct command_registration flash_exec_command_handlers[] = { COMMAND_REGISTRATION_DONE }; -int flash_init_drivers(struct command_context *cmd_ctx) +static int flash_init_drivers(struct command_context *cmd_ctx) { if (!flash_bank_list()) return ERROR_OK; @@ -766,7 +789,7 @@ COMMAND_HANDLER(handle_flash_bank_command) if (CMD_ARGC < 7) { LOG_ERROR("usage: flash bank " - " "); + " "); return ERROR_COMMAND_SYNTAX_ERROR; } // save bank name and advance arguments for compatibility @@ -901,7 +924,7 @@ COMMAND_HANDLER(handle_flash_init_command) static const struct command_registration flash_config_command_handlers[] = { { .name = "bank", - .handler = &handle_flash_bank_command, + .handler = handle_flash_bank_command, .mode = COMMAND_CONFIG, .usage = "bank_id driver_name base_address size_bytes " "chip_width_bytes bus_width_bytes target " @@ -912,19 +935,19 @@ static const struct command_registration flash_config_command_handlers[] = { { .name = "init", .mode = COMMAND_CONFIG, - .handler = &handle_flash_init_command, + .handler = handle_flash_init_command, .help = "Initialize flash devices.", }, { .name = "banks", .mode = COMMAND_ANY, - .handler = &handle_flash_banks_command, + .handler = handle_flash_banks_command, .help = "Display table with information about flash banks.", }, { .name = "list", .mode = COMMAND_ANY, - .jim_handler = &jim_flash_list, + .jim_handler = jim_flash_list, .help = "Returns a list of details about the flash banks.", }, COMMAND_REGISTRATION_DONE