Browse Source

flash: EFM32 GG/LG page size detection fix

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>
tags/v0.7.0-rc1
Roman D 11 years ago
committed by Spencer Oliver
parent
commit
3ad078cb60
1 changed files with 16 additions and 8 deletions
  1. +16
    -8
      src/flash/nor/efm32.c

+ 16
- 8
src/flash/nor/efm32.c View 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)) {


Loading…
Cancel
Save