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