diff options
author | Spencer Oliver <spen@spen-soft.co.uk> | 2012-11-20 16:05:46 +0000 |
---|---|---|
committer | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2012-12-31 19:08:25 +0000 |
commit | 6bd9e3b94f6c8b00ff171c1be241d8aa4bd83e9a (patch) | |
tree | 0ea0abdbea90d5a39c2e4a450f6917d2a7b30a70 /src/flash | |
parent | bf2b0a03614ab8185eddb06c66e184b305b4fe75 (diff) | |
download | riscv-openocd-6bd9e3b94f6c8b00ff171c1be241d8aa4bd83e9a.zip riscv-openocd-6bd9e3b94f6c8b00ff171c1be241d8aa4bd83e9a.tar.gz riscv-openocd-6bd9e3b94f6c8b00ff171c1be241d8aa4bd83e9a.tar.bz2 |
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>
Diffstat (limited to 'src/flash')
-rw-r--r-- | src/flash/nor/stm32f1x.c | 67 |
1 files changed, 37 insertions, 30 deletions
diff --git a/src/flash/nor/stm32f1x.c b/src/flash/nor/stm32f1x.c index 37335eb..8e5bf79 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) { |