aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/flash/nor/efm32.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/flash/nor/efm32.c b/src/flash/nor/efm32.c
index 57566499..37cb79b4 100644
--- a/src/flash/nor/efm32.c
+++ b/src/flash/nor/efm32.c
@@ -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)) {