diff options
author | ntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2008-07-15 10:21:43 +0000 |
---|---|---|
committer | ntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2008-07-15 10:21:43 +0000 |
commit | b979c22bcca1b815e7616a11499277a38f5c3b58 (patch) | |
tree | 88b6939de144aadf1cc5fdd67d25c9c700374fe9 /src/flash/stm32x.c | |
parent | acce2bcccb67252c2ff1bafc14e5417cf2aaf0f0 (diff) | |
download | riscv-openocd-b979c22bcca1b815e7616a11499277a38f5c3b58.zip riscv-openocd-b979c22bcca1b815e7616a11499277a38f5c3b58.tar.gz riscv-openocd-b979c22bcca1b815e7616a11499277a38f5c3b58.tar.bz2 |
- stm32 flash driver correctly handles early silicon
git-svn-id: svn://svn.berlios.de/openocd/trunk@808 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/flash/stm32x.c')
-rw-r--r-- | src/flash/stm32x.c | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/src/flash/stm32x.c b/src/flash/stm32x.c index ae5701a..a8125f4 100644 --- a/src/flash/stm32x.c +++ b/src/flash/stm32x.c @@ -630,41 +630,47 @@ int stm32x_probe(struct flash_bank_s *bank) target_read_u32(target, 0xE0042000, &device_id); LOG_INFO( "device id = 0x%08x", device_id ); - switch (device_id & 0x7ff) - { - case 0x410: - /* medium density - we have 1k pages - * 4 pages for a protection area */ - page_size = 1024; - stm32x_info->ppage_size = 4; - break; - - case 0x414: - /* high density - we have 2k pages - * 2 pages for a protection area */ - page_size = 2048; - stm32x_info->ppage_size = 2; - break; - - default: - LOG_WARNING( "Cannot identify target as a STM32 family." ); - return ERROR_FLASH_OPERATION_FAILED; - } - /* get flash size from target */ if (target_read_u16(target, 0x1FFFF7E0, &num_pages) != ERROR_OK) { - /* failed reading flash size, default to 128k */ - LOG_WARNING( "STM32 flash size failed, probe inaccurate - assuming 128k flash" ); - num_pages = 128; + /* failed reading flash size, default to max target family */ + num_pages = 0xffff; } - /* check for early silicon rev A */ - if ((device_id >> 16) == 0 ) + if ((device_id & 0x7ff) == 0x410) + { + /* medium density - we have 1k pages + * 4 pages for a protection area */ + page_size = 1024; + stm32x_info->ppage_size = 4; + + /* check for early silicon */ + if (num_pages == 0xffff) + { + /* number of sectors incorrect on revA */ + LOG_WARNING( "STM32 flash size failed, probe inaccurate - assuming 128k flash" ); + num_pages = 128; + } + } + else if ((device_id & 0x7ff) == 0x414) + { + /* high density - we have 2k pages + * 2 pages for a protection area */ + page_size = 2048; + stm32x_info->ppage_size = 2; + + /* check for early silicon */ + if (num_pages == 0xffff) + { + /* number of sectors incorrect on revZ */ + LOG_WARNING( "STM32 flash size failed, probe inaccurate - assuming 512k flash" ); + num_pages = 512; + } + } + else { - /* number of sectors incorrect on revA */ - LOG_WARNING( "STM32 Rev A Silicon detected, probe inaccurate - assuming 128k flash" ); - num_pages = 128; + LOG_WARNING( "Cannot identify target as a STM32 family." ); + return ERROR_FLASH_OPERATION_FAILED; } LOG_INFO( "flash size = %dkbytes", num_pages ); |