X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fstm32l4x.c;h=762df74daf7753fdfbc84827187987cd9978c104;hp=4e5f925b3ce7d1b6d54c86b2e881fe66ec5a30e2;hb=5be455a710c57bbbbd49c2d671b42098db7be5dc;hpb=d0e763ac7ef6aa17b17bd00ccdfbccfb4eacda69 diff --git a/src/flash/nor/stm32l4x.c b/src/flash/nor/stm32l4x.c index 4e5f925b3c..762df74daf 100644 --- a/src/flash/nor/stm32l4x.c +++ b/src/flash/nor/stm32l4x.c @@ -599,6 +599,7 @@ static int stm32l4_probe(struct flash_bank *bank) struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv; int i; uint16_t flash_size_in_kb = 0xffff; + uint16_t max_flash_size_in_kb; uint32_t device_id; uint32_t options; uint32_t base_address = 0x08000000; @@ -614,6 +615,10 @@ static int stm32l4_probe(struct flash_bank *bank) /* set max flash size depending on family */ switch (device_id & 0xfff) { case 0x415: + max_flash_size_in_kb = 1024; + break; + case 0x435: + max_flash_size_in_kb = 256; break; default: LOG_WARNING("Cannot identify target as a STM32L4 family."); @@ -623,6 +628,19 @@ static int stm32l4_probe(struct flash_bank *bank) /* get flash size from target. */ retval = target_read_u16(target, FLASH_SIZE_REG, &flash_size_in_kb); + /* failed reading flash size or flash size invalid (early silicon), + * default to max target family */ + if (retval != ERROR_OK || flash_size_in_kb == 0xffff || flash_size_in_kb == 0) { + LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming %dk flash", + max_flash_size_in_kb); + flash_size_in_kb = max_flash_size_in_kb; + } + + LOG_INFO("flash size = %dkbytes", flash_size_in_kb); + + /* did we assign flash size? */ + assert(flash_size_in_kb != 0xffff); + /* get options to for DUAL BANK. */ retval = target_read_u32(target, STM32_FLASH_OPTR, &options); @@ -632,8 +650,6 @@ static int stm32l4_probe(struct flash_bank *bank) else stm32l4_info->option_bytes.bank_b_start = flash_size_in_kb << 9; - LOG_INFO("flash size = %dkbytes", flash_size_in_kb); - /* did we assign flash size? */ assert((flash_size_in_kb != 0xffff) && flash_size_in_kb); @@ -685,7 +701,7 @@ static int get_stm32l4_info(struct flash_bank *bank, char *buf, int buf_size) if (retval != ERROR_OK) return retval; - uint16_t device_id = dbgmcu_idcode & 0xffff; + uint16_t device_id = dbgmcu_idcode & 0xfff; uint8_t rev_id = dbgmcu_idcode >> 28; uint8_t rev_minor = 0; int i; @@ -700,10 +716,14 @@ static int get_stm32l4_info(struct flash_bank *bank, char *buf, int buf_size) const char *device_str; switch (device_id) { - case 0x6415: + case 0x415: device_str = "STM32L4xx"; break; + case 0x435: + device_str = "STM32L43x"; + break; + default: snprintf(buf, buf_size, "Cannot identify target as a STM32L4\n"); return ERROR_FAIL;