flash: EFM32 GG/LG page size detection fix16/1116/2
authorRoman D <me@iamroman.org>
Fri, 18 Jan 2013 06:53:43 +0000 (18 10:53 +0400)
committerSpencer Oliver <spen@spen-soft.co.uk>
Fri, 18 Jan 2013 09:19:21 +0000 (18 09:19 +0000)
Fixed flash page size detection according to EFM32 GG/LG errata.
MEM_INFO_PAGE_SIZE register containts invalid value in devices with
revision number lower than 18 and should not be used.

Change-Id: Idb2832246efcbbec2fd98a5c458f72a36df386fb
Signed-off-by: Roman D <me@iamroman.org>
Reviewed-on: http://openocd.zylin.com/1116
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
src/flash/nor/efm32.c

index 5756649..37cb79b 100644 (file)
@@ -169,14 +169,22 @@ static int efm32x_read_info(struct flash_bank *bank,
                efm32_info->page_size = 512;
        else if (EFM_FAMILY_ID_GIANT_GECKO == efm32_info->part_family ||
                        EFM_FAMILY_ID_LEOPARD_GECKO == efm32_info->part_family) {
-               uint8_t pg_size = 0;
-
-               ret = target_read_u8(bank->target, EFM32_MSC_DI_PAGE_SIZE,
-                       &pg_size);
-               if (ERROR_OK != ret)
-                       return ret;
-
-               efm32_info->page_size = (1 << ((pg_size+10) & 0xff));
+               if (efm32_info->prod_rev >= 18) {
+                       uint8_t pg_size = 0;
+                       ret = target_read_u8(bank->target, EFM32_MSC_DI_PAGE_SIZE,
+                               &pg_size);
+                       if (ERROR_OK != ret)
+                               return ret;
+
+                       efm32_info->page_size = (1 << ((pg_size+10) & 0xff));
+               } else {
+                       /* EFM32 GG/LG errata: MEM_INFO_PAGE_SIZE is invalid
+                          for MCUs with PROD_REV < 18 */
+                       if (efm32_info->flash_sz_kib < 512)
+                               efm32_info->page_size = 2048;
+                       else
+                               efm32_info->page_size = 4096;
+               }
 
                if ((2048 != efm32_info->page_size) &&
                                (4096 != efm32_info->page_size)) {