summaryrefslogtreecommitdiff
path: root/src/flash/stm32x.c
diff options
context:
space:
mode:
authorntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-07-15 10:21:43 +0000
committerntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-07-15 10:21:43 +0000
commitb979c22bcca1b815e7616a11499277a38f5c3b58 (patch)
tree88b6939de144aadf1cc5fdd67d25c9c700374fe9 /src/flash/stm32x.c
parentacce2bcccb67252c2ff1bafc14e5417cf2aaf0f0 (diff)
downloadopenocd+libswd-b979c22bcca1b815e7616a11499277a38f5c3b58.tar.gz
openocd+libswd-b979c22bcca1b815e7616a11499277a38f5c3b58.tar.bz2
openocd+libswd-b979c22bcca1b815e7616a11499277a38f5c3b58.tar.xz
openocd+libswd-b979c22bcca1b815e7616a11499277a38f5c3b58.zip
- 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.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/src/flash/stm32x.c b/src/flash/stm32x.c
index ae5701a2..a8125f47 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 );