stm32l4: Handle failing flash_size read like on other devices. 03/3503/2
authorUwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Sun, 22 May 2016 14:51:34 +0000 (16:51 +0200)
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>
Sat, 13 Aug 2016 23:37:56 +0000 (00:37 +0100)
Change-Id: I54d7cd3a8c80d0e4663c3c09457a4ff338a6f1a0
Signed-off-by: Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Reviewed-on: http://openocd.zylin.com/3503
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Tested-by: jenkins
src/flash/nor/stm32l4x.c

index 4e5f925..129b281 100644 (file)
@@ -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,7 @@ 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;
        default:
                LOG_WARNING("Cannot identify target as a STM32L4 family.");
@@ -623,6 +625,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 +647,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);