flash: allow stm32f1x options_write args in any order

Currently we have to supply the arg's to this cmd in a set order, this
change fixes that issue.

Change-Id: I14a15732e1917a91009e1ac14fba39ca1523c739
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/992
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
This commit is contained in:
Spencer Oliver 2012-11-20 16:05:46 +00:00 committed by Andreas Fritiofson
parent bf2b0a0361
commit 6bd9e3b94f

View File

@ -1364,9 +1364,9 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
{ {
struct target *target = NULL; struct target *target = NULL;
struct stm32x_flash_bank *stm32x_info = NULL; struct stm32x_flash_bank *stm32x_info = NULL;
uint32_t optionbyte = 0xF0; uint16_t optionbyte;
if (CMD_ARGC < 4) if (CMD_ARGC < 2)
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
struct flash_bank *bank; struct flash_bank *bank;
@ -1387,34 +1387,41 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
if (ERROR_OK != retval) if (ERROR_OK != retval)
return retval; return retval;
/* REVISIT: ignores some options which we will display... retval = stm32x_read_options(bank);
* and doesn't insist on the specified syntax. if (ERROR_OK != retval)
*/ return retval;
/* OPT_RDWDGSW */ /* start with current options */
if (strcmp(CMD_ARGV[1], "SWWDG") == 0) optionbyte = stm32x_info->option_bytes.user_options;
optionbyte |= (1 << 0);
else /* REVISIT must be "HWWDG" then ... */
optionbyte &= ~(1 << 0);
/* OPT_RDRSTSTOP */ /* skip over flash bank */
if (strcmp(CMD_ARGV[2], "NORSTSTOP") == 0) CMD_ARGC--;
optionbyte |= (1 << 1); CMD_ARGV++;
else /* REVISIT must be "RSTSTNDBY" then ... */
optionbyte &= ~(1 << 1);
/* OPT_RDRSTSTDBY */ while (CMD_ARGC) {
if (strcmp(CMD_ARGV[3], "NORSTSTNDBY") == 0) if (strcmp("SWWDG", CMD_ARGV[0]) == 0)
optionbyte |= (1 << 2); optionbyte |= (1 << 0);
else /* REVISIT must be "RSTSTOP" then ... */ else if (strcmp("HWWDG", CMD_ARGV[0]) == 0)
optionbyte &= ~(1 << 2); optionbyte &= ~(1 << 0);
else if (strcmp("NORSTSTOP", CMD_ARGV[0]) == 0)
if (CMD_ARGC > 4 && stm32x_info->has_dual_banks) { optionbyte &= ~(1 << 1);
/* OPT_BFB2 */ else if (strcmp("RSTSTNDBY", CMD_ARGV[0]) == 0)
if (strcmp(CMD_ARGV[4], "BOOT0") == 0) optionbyte &= ~(1 << 1);
optionbyte |= (1 << 3); else if (strcmp("NORSTSTNDBY", CMD_ARGV[0]) == 0)
else optionbyte &= ~(1 << 2);
optionbyte &= ~(1 << 3); else if (strcmp("RSTSTOP", CMD_ARGV[0]) == 0)
optionbyte &= ~(1 << 2);
else if (stm32x_info->has_dual_banks) {
if (strcmp("BOOT0", CMD_ARGV[0]) == 0)
optionbyte |= (1 << 3);
else if (strcmp("BOOT1", CMD_ARGV[0]) == 0)
optionbyte &= ~(1 << 3);
else
return ERROR_COMMAND_SYNTAX_ERROR;
} else
return ERROR_COMMAND_SYNTAX_ERROR;
CMD_ARGC--;
CMD_ARGV++;
} }
if (stm32x_erase_options(bank) != ERROR_OK) { if (stm32x_erase_options(bank) != ERROR_OK) {