NOR: add optional "flash erase_address" sector padding
[fw/openocd] / src / flash / nor / tcl.c
index b7e80df25d9802b0e93f44cec079208172744728..cf40a81a75e4b49145d3d7f44be6eb02af9a6b1c 100644 (file)
@@ -203,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");
@@ -229,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))
        {
@@ -698,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",