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");
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))
{
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
{
.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",
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;
if (CMD_ARGC < 7)
{
LOG_ERROR("usage: flash bank <name> <driver> "
- "<base> <size> <chip_width> <bus_width>");
+ "<base> <size> <chip_width> <bus_width> <target>");
return ERROR_COMMAND_SYNTAX_ERROR;
}
// save bank name and advance arguments for compatibility
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 "
{
.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