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
1 changed files with 34 additions and 27 deletions

View File

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