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
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development