X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fstm32f1x.c;h=5ad0b62279d37d0f5578b55ef0c93b87cb627722;hp=13affcda71589ba43dbb0b68ab2aba05c14b56ea;hb=7655e15ea53322b5ba7d19a3b02fb533bd849d93;hpb=bd5df8520b5d1755c8c8a86a0f64d3aa452729ca diff --git a/src/flash/nor/stm32f1x.c b/src/flash/nor/stm32f1x.c index 13affcda71..5ad0b62279 100644 --- a/src/flash/nor/stm32f1x.c +++ b/src/flash/nor/stm32f1x.c @@ -21,7 +21,7 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H @@ -124,6 +124,8 @@ struct stm32x_flash_bank { uint32_t register_base; uint16_t default_rdp; int user_data_offset; + int option_offset; + uint32_t user_bank_size; }; static int stm32x_mass_erase(struct flash_bank *bank); @@ -146,6 +148,7 @@ FLASH_BANK_COMMAND_HANDLER(stm32x_flash_bank_command) stm32x_info->probed = 0; stm32x_info->has_dual_banks = false; stm32x_info->register_base = FLASH_REG_BASE_B0; + stm32x_info->user_bank_size = bank->size; return ERROR_OK; } @@ -204,7 +207,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 +234,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 +860,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 +904,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,13 +923,16 @@ 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 */ + case 0x444: page_size = 1024; 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: @@ -958,9 +966,9 @@ static int stm32x_probe(struct flash_bank *bank) /* if the user sets the size manually then ignore the probed value * this allows us to work around devices that have a invalid flash size register value */ - if (bank->size) { + if (stm32x_info->user_bank_size) { LOG_INFO("ignoring flash probed value, using configured bank size"); - flash_size_in_kb = bank->size / 1024; + flash_size_in_kb = stm32x_info->user_bank_size / 1024; } LOG_INFO("flash size = %dkbytes", flash_size_in_kb); @@ -1187,7 +1195,8 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size) snprintf(buf, buf_size, "unknown"); break; } - } else if ((device_id & 0xfff) == 0x440) { + } else if (((device_id & 0xfff) == 0x440) || + ((device_id & 0xfff) == 0x444)) { printed = snprintf(buf, buf_size, "stm32f0x - Rev: "); buf += printed; buf_size -= printed; @@ -1329,6 +1338,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 +1348,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 +1374,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; }