flash/nor/stm32f1x: Ability to change user option bytes. 63/4663/5
authorJan Vojtech <honza.vojtech@gmail.com>
Tue, 4 Sep 2018 09:50:09 +0000 (11:50 +0200)
committerMatthias Welwarsky <matthias@welwarsky.de>
Thu, 7 Feb 2019 07:52:44 +0000 (07:52 +0000)
Adds ability to change the user data in STM32F1x/STM32F3x MCU's option byte.
Since OpenOCD prints the content of user data in option byte registers, it
is seems logical to also provide a way how to change this data.

Change-Id: Ie6cb756b4f11b5c6dabd34bc89434a358eb758ff
Signed-off-by: Jan Vojtech <honza.vojtech@gmail.com>
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/4663
Tested-by: jenkins
Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
doc/openocd.texi
src/flash/nor/stm32f1x.c

index aa37b37..6c6dc9c 100644 (file)
@@ -6607,9 +6607,10 @@ or upon executing the @command{stm32f1x options_load} command.
 The @var{num} parameter is a value shown by @command{flash banks}.
 @end deffn
 
-@deffn Command {stm32f1x options_write} num (@option{SWWDG}|@option{HWWDG}) (@option{RSTSTNDBY}|@option{NORSTSTNDBY}) (@option{RSTSTOP}|@option{NORSTSTOP})
+@deffn Command {stm32f1x options_write} num (@option{SWWDG}|@option{HWWDG}) (@option{RSTSTNDBY}|@option{NORSTSTNDBY}) (@option{RSTSTOP}|@option{NORSTSTOP}) (@option{USEROPT} user_data)
 Writes the stm32 option byte with the specified values.
 The @var{num} parameter is a value shown by @command{flash banks}.
+The @var{user_data} parameter is content of higher 16 bits of the option byte register (Data0 and Data1 as one 16bit number).
 @end deffn
 
 @deffn Command {stm32f1x options_load} num
index ae29915..cd060da 100644 (file)
@@ -1313,7 +1313,8 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
 {
        struct target *target = NULL;
        struct stm32x_flash_bank *stm32x_info = NULL;
-       uint16_t optionbyte;
+       uint8_t optionbyte;
+       uint16_t useropt;
 
        if (CMD_ARGC < 2)
                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -1342,6 +1343,7 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
 
        /* start with current options */
        optionbyte = stm32x_info->option_bytes.user;
+       useropt = stm32x_info->option_bytes.data;
 
        /* skip over flash bank */
        CMD_ARGC--;
@@ -1360,6 +1362,13 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
                        optionbyte |= (1 << 2);
                else if (strcmp("RSTSTNDBY", CMD_ARGV[0]) == 0)
                        optionbyte &= ~(1 << 2);
+               else if (strcmp("USEROPT", CMD_ARGV[0]) == 0) {
+                       if (CMD_ARGC < 2)
+                               return ERROR_COMMAND_SYNTAX_ERROR;
+                       COMMAND_PARSE_NUMBER(u16, CMD_ARGV[1], useropt);
+                       CMD_ARGC--;
+                       CMD_ARGV++;
+               }
                else if (stm32x_info->has_dual_banks) {
                        if (strcmp("BOOT0", CMD_ARGV[0]) == 0)
                                optionbyte |= (1 << 3);
@@ -1379,6 +1388,7 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
        }
 
        stm32x_info->option_bytes.user = optionbyte;
+       stm32x_info->option_bytes.data = useropt;
 
        if (stm32x_write_options(bank) != ERROR_OK) {
                command_print(CMD_CTX, "stm32x failed to write options");
@@ -1536,7 +1546,7 @@ static const struct command_registration stm32x_exec_command_handlers[] = {
                .mode = COMMAND_EXEC,
                .usage = "bank_id ('SWWDG'|'HWWDG') "
                        "('RSTSTNDBY'|'NORSTSTNDBY') "
-                       "('RSTSTOP'|'NORSTSTOP')",
+                       "('RSTSTOP'|'NORSTSTOP') ('USEROPT' user_data)",
                .help = "Replace bits in device option bytes.",
        },
        {