flash/nor/stm32f1x: Ability to change user option bytes.
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>log_output
parent
7a3eec2b4d
commit
9f576d3f48
|
@ -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}.
|
The @var{num} parameter is a value shown by @command{flash banks}.
|
||||||
@end deffn
|
@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.
|
Writes the stm32 option byte with the specified values.
|
||||||
The @var{num} parameter is a value shown by @command{flash banks}.
|
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
|
@end deffn
|
||||||
|
|
||||||
@deffn Command {stm32f1x options_load} num
|
@deffn Command {stm32f1x options_load} num
|
||||||
|
|
|
@ -1313,7 +1313,8 @@ 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;
|
||||||
uint16_t optionbyte;
|
uint8_t optionbyte;
|
||||||
|
uint16_t useropt;
|
||||||
|
|
||||||
if (CMD_ARGC < 2)
|
if (CMD_ARGC < 2)
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
|
@ -1342,6 +1343,7 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
|
||||||
|
|
||||||
/* start with current options */
|
/* start with current options */
|
||||||
optionbyte = stm32x_info->option_bytes.user;
|
optionbyte = stm32x_info->option_bytes.user;
|
||||||
|
useropt = stm32x_info->option_bytes.data;
|
||||||
|
|
||||||
/* skip over flash bank */
|
/* skip over flash bank */
|
||||||
CMD_ARGC--;
|
CMD_ARGC--;
|
||||||
|
@ -1360,6 +1362,13 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
|
||||||
optionbyte |= (1 << 2);
|
optionbyte |= (1 << 2);
|
||||||
else if (strcmp("RSTSTNDBY", CMD_ARGV[0]) == 0)
|
else if (strcmp("RSTSTNDBY", CMD_ARGV[0]) == 0)
|
||||||
optionbyte &= ~(1 << 2);
|
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) {
|
else if (stm32x_info->has_dual_banks) {
|
||||||
if (strcmp("BOOT0", CMD_ARGV[0]) == 0)
|
if (strcmp("BOOT0", CMD_ARGV[0]) == 0)
|
||||||
optionbyte |= (1 << 3);
|
optionbyte |= (1 << 3);
|
||||||
|
@ -1379,6 +1388,7 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
|
||||||
}
|
}
|
||||||
|
|
||||||
stm32x_info->option_bytes.user = optionbyte;
|
stm32x_info->option_bytes.user = optionbyte;
|
||||||
|
stm32x_info->option_bytes.data = useropt;
|
||||||
|
|
||||||
if (stm32x_write_options(bank) != ERROR_OK) {
|
if (stm32x_write_options(bank) != ERROR_OK) {
|
||||||
command_print(CMD_CTX, "stm32x failed to write options");
|
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,
|
.mode = COMMAND_EXEC,
|
||||||
.usage = "bank_id ('SWWDG'|'HWWDG') "
|
.usage = "bank_id ('SWWDG'|'HWWDG') "
|
||||||
"('RSTSTNDBY'|'NORSTSTNDBY') "
|
"('RSTSTNDBY'|'NORSTSTNDBY') "
|
||||||
"('RSTSTOP'|'NORSTSTOP')",
|
"('RSTSTOP'|'NORSTSTOP') ('USEROPT' user_data)",
|
||||||
.help = "Replace bits in device option bytes.",
|
.help = "Replace bits in device option bytes.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue