This is an automated email from Gerrit. Jonas Norling ([email protected]) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/4171
-- gerrit commit eb1b579a6e9d76122cef487682a3a51dad26c211 Author: Jonas Norling <[email protected]> Date: Tue Jun 27 11:07:00 2017 +0200 efm32: Support for new EFM32 and EFR32 chips Add support for - EFM32 Pearl and Jade Gecko - Some variants of EFR32 Mighty, Blue and Flex Gecko. This is partially based on patches by Andreas Kemnade <[email protected]>, Karsten Tonnesen <[email protected]> and chrysn <[email protected]>. Change-Id: Iedc11d3a467d1127cfc70aabab9445f82f4c98ed Signed-off-by: [email protected] diff --git a/src/flash/nor/efm32.c b/src/flash/nor/efm32.c index 414b5c6..a009679 100644 --- a/src/flash/nor/efm32.c +++ b/src/flash/nor/efm32.c @@ -39,15 +39,20 @@ #include <target/cortex_m.h> /* keep family IDs in decimal */ +#define EFR_FAMILY_ID_MIGHTY_GECKO 16 /* EFR32MG1P */ +#define EFR_FAMILY_ID_BLUE_GECKO 20 /* EFR32BG1B */ +#define EFR_FAMILY_ID_FLEX_GECKO 37 /* EFR32FG12P */ #define EFM_FAMILY_ID_GECKO 71 #define EFM_FAMILY_ID_GIANT_GECKO 72 #define EFM_FAMILY_ID_TINY_GECKO 73 #define EFM_FAMILY_ID_LEOPARD_GECKO 74 #define EFM_FAMILY_ID_WONDER_GECKO 75 #define EFM_FAMILY_ID_ZERO_GECKO 76 -#define EFM_FAMILY_ID_HAPPY_GECKO 77 -#define EZR_FAMILY_ID_WONDER_GECKO 120 -#define EZR_FAMILY_ID_LEOPARD_GECKO 121 +#define EFM_FAMILY_ID_HAPPY_GECKO 77 +#define EFM_FAMILY_ID_PEARL_GECKO 81 /* EFM32PG1B */ +#define EFM_FAMILY_ID_JADE_GECKO 83 /* EFM32JG1B */ +#define EZR_FAMILY_ID_WONDER_GECKO 120 +#define EZR_FAMILY_ID_LEOPARD_GECKO 121 #define EFM32_FLASH_ERASE_TMO 100 #define EFM32_FLASH_WDATAREADY_TMO 100 @@ -70,7 +75,11 @@ #define EFM32_MSC_DI_PART_FAMILY (EFM32_MSC_DEV_INFO+0x1fe) #define EFM32_MSC_DI_PROD_REV (EFM32_MSC_DEV_INFO+0x1ff) +/* MSC register address for original EFM32 */ #define EFM32_MSC_REGBASE 0x400c0000 +/* MSC register address for Pearl, Jade, Blue, Mighty, Flex, ... */ +#define EFM32_MSC_REGBASE_NEW 0x400e0000 + #define EFM32_MSC_WRITECTRL_OFFSET 0x008 #define EFM32_MSC_WRITECTRL_WREN_MASK 0x1 #define EFM32_MSC_WRITECMD_OFFSET 0x00c @@ -87,6 +96,7 @@ #define EFM32_MSC_STATUS_WORDTIMEOUT_MASK 0x10 #define EFM32_MSC_STATUS_ERASEABORTED_MASK 0x20 #define EFM32_MSC_LOCK_OFFSET 0x03c +#define EFM32_MSC_LOCK_OFFSET_NEW 0x040 #define EFM32_MSC_LOCK_LOCKKEY 0x1b71 struct efm32x_flash_bank { @@ -209,6 +219,25 @@ static int efm32x_read_info(struct flash_bank *bank, LOG_ERROR("Invalid page size %u", efm32_info->page_size); return ERROR_FAIL; } + } else if (EFR_FAMILY_ID_MIGHTY_GECKO == efm32_info->part_family || + EFR_FAMILY_ID_BLUE_GECKO == efm32_info->part_family || + EFR_FAMILY_ID_FLEX_GECKO == efm32_info->part_family || + EFM_FAMILY_ID_PEARL_GECKO == efm32_info->part_family || + EFM_FAMILY_ID_JADE_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 (2048 != efm32_info->page_size) { + LOG_ERROR("Invalid page size %u", efm32_info->page_size); + return ERROR_FAIL; + } + + efm32x_info->msc_regbase = EFM32_MSC_REGBASE_NEW; + efm32x_info->msc_lock_offset = EFM32_MSC_LOCK_OFFSET_NEW; } else if (EFM_FAMILY_ID_WONDER_GECKO == efm32_info->part_family || EZR_FAMILY_ID_WONDER_GECKO == efm32_info->part_family || EZR_FAMILY_ID_LEOPARD_GECKO == efm32_info->part_family) { @@ -243,6 +272,11 @@ static int efm32x_decode_info(struct efm32_info *info, char *buf, int buf_size) case EZR_FAMILY_ID_LEOPARD_GECKO: printed = snprintf(buf, buf_size, "EZR32 "); break; + case EFR_FAMILY_ID_MIGHTY_GECKO: + case EFR_FAMILY_ID_BLUE_GECKO: + case EFR_FAMILY_ID_FLEX_GECKO: + printed = snprintf(buf, buf_size, "EFR32 "); + break; default: printed = snprintf(buf, buf_size, "EFM32 "); } @@ -254,6 +288,15 @@ static int efm32x_decode_info(struct efm32_info *info, char *buf, int buf_size) return ERROR_BUF_TOO_SMALL; switch (info->part_family) { + case EFR_FAMILY_ID_MIGHTY_GECKO: + printed = snprintf(buf, buf_size, "Mighty Gecko"); + break; + case EFR_FAMILY_ID_BLUE_GECKO: + printed = snprintf(buf, buf_size, "Blue Gecko"); + break; + case EFR_FAMILY_ID_FLEX_GECKO: + printed = snprintf(buf, buf_size, "Flex Gecko"); + break; case EFM_FAMILY_ID_GECKO: printed = snprintf(buf, buf_size, "Gecko"); break; @@ -263,6 +306,7 @@ static int efm32x_decode_info(struct efm32_info *info, char *buf, int buf_size) case EFM_FAMILY_ID_TINY_GECKO: printed = snprintf(buf, buf_size, "Tiny Gecko"); break; + case EFM_FAMILY_ID_LEOPARD_GECKO: case EZR_FAMILY_ID_LEOPARD_GECKO: printed = snprintf(buf, buf_size, "Leopard Gecko"); @@ -277,6 +321,12 @@ static int efm32x_decode_info(struct efm32_info *info, char *buf, int buf_size) case EFM_FAMILY_ID_HAPPY_GECKO: printed = snprintf(buf, buf_size, "Happy Gecko"); break; + case EFM_FAMILY_ID_PEARL_GECKO: + printed = snprintf(buf, buf_size, "Pearl Gecko"); + break; + case EFM_FAMILY_ID_JADE_GECKO: + printed = snprintf(buf, buf_size, "Jade Gecko"); + break; } buf += printed; -- ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ OpenOCD-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openocd-devel
