David Brownell wrote:
> On Sunday 20 September 2009, Johnny Halfmoon wrote:
>> +               if ((retval = flash_check_sector_parameters(cmd_ctx, first, 
>> last, p->num_sectors)) !
> 
> I had in mind more like
> 
>       uint32_t value; 


Okay. Like this then:


= = = = = = = = = = = =


 doc/openocd.texi  |    6 ++-
 src/flash/flash.c |   97 +++++++++++++++++++++++++++++++++++-------------------
 2 files changed, 67 insertions(+), 36 deletions(-)

Index: src/flash/flash.c
===================================================================
--- src/flash/flash.c   (revision 2736)
+++ src/flash/flash.c   (working copy)
@@ -559,40 +559,62 @@
        return ERROR_OK;
 }
 
+int flash_check_sector_parameters(struct command_context_s *cmd_ctx, uint32_t 
first, uint32_t last, uint num_sectors)
+{
+       if ( first >= last ) {
+               command_print(cmd_ctx, "ERROR: last sector must be > first 
sector");
+               return ERROR_FAIL;
+       }
+
+       if ( last > (num_sectors - 1)) {
+               command_print(cmd_ctx, "ERROR: last sector must be =< %d", 
num_sectors - 1);
+               return ERROR_FAIL;
+       }
+
+       return ERROR_OK;
+}
+
 static int handle_flash_erase_command(struct command_context_s *cmd_ctx, char 
*cmd, char **args, int argc)
 {
        if (argc > 2)
        {
-               int first = strtoul(args[1], NULL, 0);
-               int last = strtoul(args[2], NULL, 0);
+               uint32_t bank_nr;
+               uint32_t first;
+               uint32_t last;
                int retval;
-               flash_bank_t *p = get_flash_bank_by_num(strtoul(args[0], NULL, 
0));
+
+               if ((retval = parse_u32(args[0], &bank_nr)) != ERROR_OK)
+                       return retval;
+
+               flash_bank_t *p = get_flash_bank_by_num(bank_nr);
+               if (!p)
+                       return ERROR_OK;
+
+               if ((retval = parse_u32(args[1], &first)) != ERROR_OK)
+                       return retval;
+               if (strcmp(args[2], "last") == 0)
+                       last = p->num_sectors - 1;
+               else
+                       if ((retval = parse_u32(args[2], &last)) != ERROR_OK)
+                               return retval;
+
+               if ((retval = flash_check_sector_parameters(cmd_ctx, first, 
last, p->num_sectors)) != ERROR_OK)
+                       return retval;
+
                duration_t duration;
                char *duration_text;
-
                duration_start_measure(&duration);
 
-               if (!p)
-               {
-                       return ERROR_COMMAND_SYNTAX_ERROR;
-               }
-
-               if ((retval = flash_driver_erase(p, first, last)) == 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 %li in %s",
-                               first, last, strtoul(args[0], 0, 0), 
duration_text);
+                       command_print(cmd_ctx, "erased sectors %i through %i on 
flash bank %i in %s",
+                               first, last, bank_nr, duration_text);
                        free(duration_text);
                }
        }
        else
-       {
                return ERROR_COMMAND_SYNTAX_ERROR;
-       }
 
        return ERROR_OK;
 }
@@ -601,40 +623,47 @@
 {
        if (argc > 3)
        {
-               int first = strtoul(args[1], NULL, 0);
-               int last = strtoul(args[2], NULL, 0);
+               uint32_t bank_nr;
+               uint32_t first;
+               uint32_t last;
+               int retval;
                int set;
-               int retval;
-               flash_bank_t *p = get_flash_bank_by_num(strtoul(args[0], NULL, 
0));
+
+               if ((retval = parse_u32(args[0], &bank_nr)) != ERROR_OK)
+                       return retval;
+
+               flash_bank_t *p = get_flash_bank_by_num(bank_nr);
                if (!p)
-               {
-                       command_print(cmd_ctx, "flash bank '#%s' is out of 
bounds", args[0]);
                        return ERROR_OK;
-               }
 
+               if ((retval = parse_u32(args[1], &first)) != ERROR_OK)
+                       return retval;
+               if (strcmp(args[2], "last") == 0)
+                       last = p->num_sectors - 1;
+               else
+                       if ((retval = parse_u32(args[2], &last)) != ERROR_OK)
+                               return retval;
+
                if (strcmp(args[3], "on") == 0)
                        set = 1;
                else if (strcmp(args[3], "off") == 0)
                        set = 0;
                else
-               {
                        return ERROR_COMMAND_SYNTAX_ERROR;
-               }
 
+               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 %li",
+               if (retval == ERROR_OK) {
+                       command_print(cmd_ctx, "%s protection for sectors %i 
through %i on flash bank %i",
                                (set) ? "set" : "cleared", first,
-                               last, strtoul(args[0], 0, 0));
+                               last, bank_nr);
                }
        }
        else
-       {
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-       }
-
        return ERROR_OK;
 }
 
Index: doc/openocd.texi
===================================================================
--- doc/openocd.texi    (revision 2736)
+++ doc/openocd.texi    (working copy)
@@ -3071,7 +3071,8 @@
 @anchor{flash erase_sector}
 @deffn Command {flash erase_sector} num first last
 Erase sectors in bank @var{num}, starting at sector @var{first} up to and 
including
-...@var{last}. Sector numbering starts at 0.
+...@var{last}. Sector numbering starts at 0. Defining a @var{last} sector of 
"last" is
+equivalent to defining (max_sectors-1), i.e. erasing the entire bank.
 The @var{num} parameter is a value shown by @command{flash banks}.
 @end deffn
 
@@ -3144,7 +3145,8 @@
 @anchor{flash protect}
 @deffn Command {flash protect} num first last (on|off)
 Enable (@var{on}) or disable (@var{off}) protection of flash sectors
-...@var{first} to @var{last} of flash bank @var{num}.
+...@var{first} to @var{last} of flash bank @var{num}. Defining a @var{last} 
sector of "last"
+is equivalent to defining (max_sectors-1), i.e. protecting the entire bank.
 The @var{num} parameter is a value shown by @command{flash banks}.
 @end deffn
 
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to