On Monday 21 September 2009, Johnny Halfmoon wrote:
> 
> 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:

Yes!  If I don't hear objections from anyone, I'll
check this in later today.

- Dave

> 
> = = = = = = = = = = = =
> 
> 
>  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