- stm32 flash driver correctly handles early silicon
authorntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 15 Jul 2008 10:21:43 +0000 (10:21 +0000)
committerntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 15 Jul 2008 10:21:43 +0000 (10:21 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@808 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/flash/stm32x.c

index ae5701a22ca6bcd2a26b8a59d16911c1460c03dd..a8125f4766d26dd53fe1115abdef140719ef1a2c 100644 (file)
@@ -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 );