aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSpencer Oliver <spen@spen-soft.co.uk>2012-11-20 16:05:46 +0000
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>2012-12-31 19:08:25 +0000
commit6bd9e3b94f6c8b00ff171c1be241d8aa4bd83e9a (patch)
tree0ea0abdbea90d5a39c2e4a450f6917d2a7b30a70
parentbf2b0a03614ab8185eddb06c66e184b305b4fe75 (diff)
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>
-rw-r--r--src/flash/nor/stm32f1x.c67
1 files changed, 37 insertions, 30 deletions
diff --git a/src/flash/nor/stm32f1x.c b/src/flash/nor/stm32f1x.c
index 37335eb7..8e5bf79a 100644
--- a/src/flash/nor/stm32f1x.c
+++ b/src/flash/nor/stm32f1x.c
@@ -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.
- */
-
- /* OPT_RDWDGSW */
- if (strcmp(CMD_ARGV[1], "SWWDG") == 0)
- optionbyte |= (1 << 0);
- else /* REVISIT must be "HWWDG" then ... */
- optionbyte &= ~(1 << 0);
-
- /* OPT_RDRSTSTOP */
- if (strcmp(CMD_ARGV[2], "NORSTSTOP") == 0)
- optionbyte |= (1 << 1);
- else /* REVISIT must be "RSTSTNDBY" then ... */
- optionbyte &= ~(1 << 1);
-
- /* 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);
+ retval = stm32x_read_options(bank);
+ if (ERROR_OK != retval)
+ return retval;
+
+ /* start with current options */
+ optionbyte = stm32x_info->option_bytes.user_options;
+
+ /* skip over flash bank */
+ CMD_ARGC--;
+ CMD_ARGV++;
+
+ 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) {