From: Spencer Oliver Date: Tue, 26 Feb 2013 11:57:02 +0000 (+0000) Subject: stm32: update stm32f1x driver for f0x and f3x option bytes X-Git-Tag: v0.7.0-rc1~66 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=f14cf545ebd9de51465332dbfcbce38a45286f98;p=openocd stm32: update stm32f1x driver for f0x and f3x option bytes The stm32f0 and stm32f3 share the same option byte location, but the format differs. Adding an option_offset fixes the broken options_read cmd and incorrectly setting Hardware Watchdog when unlocking a f3x device. Change-Id: I82d66b6198294ea9eedb44ca8b2fb368c0cb15e8 Signed-off-by: Spencer Oliver Reviewed-on: http://openocd.zylin.com/1184 Tested-by: jenkins Reviewed-by: Freddie Chopin --- diff --git a/src/flash/nor/stm32f1x.c b/src/flash/nor/stm32f1x.c index 13affcda..8f2e69e6 100644 --- a/src/flash/nor/stm32f1x.c +++ b/src/flash/nor/stm32f1x.c @@ -124,6 +124,7 @@ struct stm32x_flash_bank { uint32_t register_base; uint16_t default_rdp; int user_data_offset; + int option_offset; }; static int stm32x_mass_erase(struct flash_bank *bank); @@ -204,7 +205,7 @@ static int stm32x_wait_status_busy(struct flash_bank *bank, int timeout) return retval; } -int stm32x_check_operation_supported(struct flash_bank *bank) +static int stm32x_check_operation_supported(struct flash_bank *bank) { struct stm32x_flash_bank *stm32x_info = bank->driver_priv; @@ -231,7 +232,7 @@ static int stm32x_read_options(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - stm32x_info->option_bytes.user_options = (uint16_t)0xFFF0 | ((optiondata >> 2) & 0x0f); + stm32x_info->option_bytes.user_options = (optiondata >> stm32x_info->option_offset >> 2) & 0xffff; stm32x_info->option_bytes.user_data = (optiondata >> stm32x_info->user_data_offset) & 0xffff; stm32x_info->option_bytes.RDP = (optiondata & (1 << OPT_READOUT)) ? 0xFFFF : 0x5AA5; @@ -857,6 +858,7 @@ static int stm32x_probe(struct flash_bank *bank) stm32x_info->probed = 0; stm32x_info->register_base = FLASH_REG_BASE_B0; stm32x_info->user_data_offset = 10; + stm32x_info->option_offset = 0; /* default factory protection level */ stm32x_info->default_rdp = 0x5AA5; @@ -900,6 +902,7 @@ static int stm32x_probe(struct flash_bank *bank) stm32x_info->ppage_size = 2; max_flash_size_in_kb = 256; stm32x_info->user_data_offset = 16; + stm32x_info->option_offset = 6; stm32x_info->default_rdp = 0x55AA; break; case 0x428: /* value line High density */ @@ -918,6 +921,7 @@ static int stm32x_probe(struct flash_bank *bank) stm32x_info->ppage_size = 2; max_flash_size_in_kb = 256; stm32x_info->user_data_offset = 16; + stm32x_info->option_offset = 6; stm32x_info->default_rdp = 0x55AA; break; case 0x440: /* stm32f0x */ @@ -925,6 +929,7 @@ static int stm32x_probe(struct flash_bank *bank) stm32x_info->ppage_size = 4; max_flash_size_in_kb = 64; stm32x_info->user_data_offset = 16; + stm32x_info->option_offset = 6; stm32x_info->default_rdp = 0x55AA; break; default: @@ -1329,6 +1334,8 @@ COMMAND_HANDLER(stm32x_handle_options_read_command) return retval; command_print(CMD_CTX, "Option Byte: 0x%" PRIx32 "", optionbyte); + int user_data = optionbyte; + if (buf_get_u32((uint8_t *)&optionbyte, OPT_ERROR, 1)) command_print(CMD_CTX, "Option Byte Complement Error"); @@ -1337,6 +1344,9 @@ COMMAND_HANDLER(stm32x_handle_options_read_command) else command_print(CMD_CTX, "Readout Protection Off"); + /* user option bytes are offset depending on variant */ + optionbyte >>= stm32x_info->option_offset; + if (buf_get_u32((uint8_t *)&optionbyte, OPT_RDWDGSW, 1)) command_print(CMD_CTX, "Software Watchdog"); else @@ -1360,9 +1370,9 @@ COMMAND_HANDLER(stm32x_handle_options_read_command) } command_print(CMD_CTX, "User Option0: 0x%02" PRIx8, - (optionbyte >> stm32x_info->user_data_offset) & 0xff); + (user_data >> stm32x_info->user_data_offset) & 0xff); command_print(CMD_CTX, "User Option1: 0x%02" PRIx8, - (optionbyte >> (stm32x_info->user_data_offset + 8)) & 0xff); + (user_data >> (stm32x_info->user_data_offset + 8)) & 0xff); return ERROR_OK; }