X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fstm32lx.c;h=ab61538ffe2267321a4385f1469720b2d4ecf0b0;hp=3863144029959d4c9461189a34dd90ec9871c71c;hb=9a8edbfa8bd83d58a1904dfd35a00f9793d99314;hpb=531fbf0ef25e75884f2ade2acafcf010cb3d7d2a diff --git a/src/flash/nor/stm32lx.c b/src/flash/nor/stm32lx.c index 3863144029..ab61538ffe 100644 --- a/src/flash/nor/stm32lx.c +++ b/src/flash/nor/stm32lx.c @@ -463,6 +463,7 @@ static int stm32lx_probe(struct flash_bank *bank) struct stm32lx_flash_bank *stm32lx_info = bank->driver_priv; int i; uint16_t flash_size_in_kb; + uint16_t max_flash_size_in_kb; uint32_t device_id; stm32lx_info->probed = 0; @@ -474,31 +475,28 @@ static int stm32lx_probe(struct flash_bank *bank) LOG_DEBUG("device id = 0x%08" PRIx32 "", device_id); + /* set max flash size depending on family */ + switch (device_id & 0xfff) { + case 0x416: + max_flash_size_in_kb = 128; + break; + case 0x436: + max_flash_size_in_kb = 384; + break; + default: + LOG_WARNING("Cannot identify target as a STM32L family."); + return ERROR_FAIL; + } + /* get flash size from target. */ retval = target_read_u16(target, F_SIZE, &flash_size_in_kb); - if (retval != ERROR_OK) { - LOG_WARNING("failed reading flash size, default to max target family"); - /* failed reading flash size, default to max target family */ - flash_size_in_kb = 0xffff; - } - if ((device_id & 0xfff) == 0x416) { - /* check for early silicon */ - if (flash_size_in_kb == 0xffff) { - /* number of sectors may be incorrrect on early silicon */ - LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 128k flash"); - flash_size_in_kb = 128; - } - } else if ((device_id & 0xfff) == 0x436) { - /* check for early silicon */ - if (flash_size_in_kb == 0xffff) { - /* number of sectors may be incorrrect on early silicon */ - LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 384k flash"); - flash_size_in_kb = 384; - } - } else { - LOG_WARNING("Cannot identify target as a STM32L family."); - return ERROR_FAIL; + /* 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; } /* STM32L - we have 32 sectors, 16 pages per sector -> 512 pages