This is an automated email from Gerrit. "Carlos Sanchez <carlossanc...@geotab.com>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/8007
-- gerrit commit be0be9618dda0cb2d3258a32610e8199c8182e92 Author: Sven van Ashbrook <svenvanasbro...@geotab.com> Date: Wed Apr 27 14:45:04 2022 -0400 flash/nor/kinetis: add separate probe_chip() and tcl .cfg for NXP S32K devices Prepare adding support for NXP S32K: - add a separate tcl target .cfg: s32k.cfg - patch the common kinetis kx.cfg to allow for optional s32k - create a stubbed-out s32k_probe_chip callback Note that the S32K's identification register layout is incompatible with Kinetis's. Change-Id: Ida5f158d8a376ccb00bf2ae699927795309ebc90 Signed-off-by: Sven van Ashbrook <svenvanasbro...@geotab.com> diff --git a/src/flash/nor/kinetis.c b/src/flash/nor/kinetis.c index 7137b4aa07..f17f76766f 100644 --- a/src/flash/nor/kinetis.c +++ b/src/flash/nor/kinetis.c @@ -256,7 +256,6 @@ struct kinetis_chip { struct target *target; bool probed; - uint32_t sim_sdid; uint32_t sim_fcfg1; uint32_t sim_fcfg2; uint32_t fcfg2_maxaddr0_shifted; @@ -310,6 +309,8 @@ struct kinetis_chip { unsigned num_banks; struct kinetis_flash_bank banks[KINETIS_MAX_BANKS]; + + int (*probe_chip)(struct kinetis_chip *k_chip); }; struct kinetis_type { @@ -392,6 +393,7 @@ const struct flash_driver kinetis_flash; static int kinetis_write_inner(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count); static int kinetis_probe_chip(struct kinetis_chip *k_chip); +static int s32k_probe_chip(struct kinetis_chip *k_chip); static int kinetis_auto_probe(struct flash_bank *bank); @@ -877,6 +879,9 @@ static int kinetis_chip_options(struct kinetis_chip *k_chip, int argc, const cha if (strcmp(argv[i], "-sim-base") == 0) { if (i + 1 < argc) k_chip->sim_base = strtoul(argv[++i], NULL, 0); + } else if (strcmp(argv[i], "-chipname") == 0) { + if (i + 1 < argc && strcmp(argv[++i], "s32k") == 0) + k_chip->probe_chip = s32k_probe_chip; } else LOG_ERROR("Unsupported flash bank option %s", argv[i]); } @@ -905,6 +910,7 @@ FLASH_BANK_COMMAND_HANDLER(kinetis_flash_bank_command) } k_chip->target = target; + k_chip->probe_chip = kinetis_probe_chip; /* only the first defined bank can define chip options */ retval = kinetis_chip_options(k_chip, CMD_ARGC - 6, CMD_ARGV + 6); @@ -1140,7 +1146,7 @@ static int kinetis_disable_wdog(struct kinetis_chip *k_chip) int retval; if (!k_chip->probed) { - retval = kinetis_probe_chip(k_chip); + retval = k_chip->probe_chip(k_chip); if (retval != ERROR_OK) return retval; } @@ -2048,6 +2054,14 @@ static int kinetis_write(struct flash_bank *bank, const uint8_t *buffer, } +static int s32k_probe_chip(struct kinetis_chip *k_chip) +{ + LOG_ERROR("NXP S32K is unsupported"); + + return ERROR_FLASH_OPER_UNSUPPORTED; +} + + static int kinetis_probe_chip(struct kinetis_chip *k_chip) { int result; @@ -2056,6 +2070,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) uint32_t ee_size = 0; uint32_t pflash_size_k, nvm_size_k, dflash_size_k; uint32_t pflash_size_m; + uint32_t sim_sdid; unsigned num_blocks = 0; unsigned maxaddr_shift = 13; struct target *target = k_chip->target; @@ -2075,13 +2090,13 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) name[0] = '\0'; if (k_chip->sim_base) - result = target_read_u32(target, k_chip->sim_base + SIM_SDID_OFFSET, &k_chip->sim_sdid); + result = target_read_u32(target, k_chip->sim_base + SIM_SDID_OFFSET, &sim_sdid); else { - result = target_read_u32(target, SIM_BASE + SIM_SDID_OFFSET, &k_chip->sim_sdid); + result = target_read_u32(target, SIM_BASE + SIM_SDID_OFFSET, &sim_sdid); if (result == ERROR_OK) k_chip->sim_base = SIM_BASE; else { - result = target_read_u32(target, SIM_BASE_KL28 + SIM_SDID_OFFSET, &k_chip->sim_sdid); + result = target_read_u32(target, SIM_BASE_KL28 + SIM_SDID_OFFSET, &sim_sdid); if (result == ERROR_OK) k_chip->sim_base = SIM_BASE_KL28; } @@ -2089,9 +2104,9 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) if (result != ERROR_OK) return result; - if ((k_chip->sim_sdid & (~KINETIS_SDID_K_SERIES_MASK)) == 0) { + if ((sim_sdid & ~KINETIS_SDID_K_SERIES_MASK) == 0) { /* older K-series MCU */ - uint32_t mcu_type = k_chip->sim_sdid & KINETIS_K_SDID_TYPE_MASK; + uint32_t mcu_type = sim_sdid & KINETIS_K_SDID_TYPE_MASK; k_chip->cache_type = KINETIS_CACHE_K; k_chip->watchdog_type = KINETIS_WDOG_K; @@ -2172,7 +2187,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) case KINETIS_K_SDID_K40_M100: case KINETIS_K_SDID_K60_M100: { - uint32_t revid = (k_chip->sim_sdid & KINETIS_K_REVID_MASK) >> KINETIS_K_REVID_SHIFT; + uint32_t revid = (sim_sdid & KINETIS_K_REVID_MASK) >> KINETIS_K_REVID_SHIFT; /* highest bit set corresponds to rev 2.x */ if (revid <= 7) { k_chip->sysmodectrlr_type = KINETIS_MC; @@ -2184,16 +2199,16 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) } else { /* Newer K-series or KL series MCU */ - familyid = (k_chip->sim_sdid & KINETIS_SDID_FAMILYID_MASK) >> KINETIS_SDID_FAMILYID_SHIFT; - subfamid = (k_chip->sim_sdid & KINETIS_SDID_SUBFAMID_MASK) >> KINETIS_SDID_SUBFAMID_SHIFT; + familyid = (sim_sdid & KINETIS_SDID_FAMILYID_MASK) >> KINETIS_SDID_FAMILYID_SHIFT; + subfamid = (sim_sdid & KINETIS_SDID_SUBFAMID_MASK) >> KINETIS_SDID_SUBFAMID_SHIFT; - switch (k_chip->sim_sdid & KINETIS_SDID_SERIESID_MASK) { + switch (sim_sdid & KINETIS_SDID_SERIESID_MASK) { case KINETIS_SDID_SERIESID_K: use_nvm_marking = true; k_chip->cache_type = KINETIS_CACHE_K; k_chip->watchdog_type = KINETIS_WDOG_K; - switch (k_chip->sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK)) { + switch (sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK)) { case KINETIS_SDID_FAMILYID_K0X | KINETIS_SDID_SUBFAMID_KX2: /* K02FN64, K02FN128: FTFA, 2kB sectors */ k_chip->pflash_sector_size = 2<<10; @@ -2209,7 +2224,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) if (result != ERROR_OK) return result; - if (((k_chip->sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K24FN1M) && + if (((sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K24FN1M) && ((sopt1 & KINETIS_SOPT1_RAMSIZE_MASK) == KINETIS_SOPT1_RAMSIZE_K24FN1M)) { /* MK24FN1M */ k_chip->pflash_sector_size = 4<<10; @@ -2219,9 +2234,9 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) subfamid = 4; /* errata 1N83J fix */ break; } - if ((k_chip->sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K22FN128 - || (k_chip->sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K22FN256 - || (k_chip->sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K22FN512) { + if ((sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K22FN128 + || (sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K22FN256 + || (sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K22FN512) { /* K22 with new-style SDID - smaller pflash with FTFA, 2kB sectors */ k_chip->pflash_sector_size = 2<<10; /* autodetect 1 or 2 blocks */ @@ -2233,7 +2248,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) } case KINETIS_SDID_FAMILYID_K2X | KINETIS_SDID_SUBFAMID_KX4: k_chip->pflash_sector_size = 4<<10; - if ((k_chip->sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K24FN256) { + if ((sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K24FN256) { /* K24FN256 - smaller pflash with FTFA */ num_blocks = 1; k_chip->flash_support = FS_PROGRAM_LONGWORD; @@ -2325,7 +2340,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) k_chip->watchdog_type = KINETIS_WDOG_COP; cpu_mhz = 48; - switch (k_chip->sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK)) { + switch (sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK)) { case KINETIS_SDID_FAMILYID_K1X | KINETIS_SDID_SUBFAMID_KX3: case KINETIS_SDID_FAMILYID_K2X | KINETIS_SDID_SUBFAMID_KX3: subfamid = 7; @@ -2347,7 +2362,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) case KINETIS_SDID_SERIESID_KW: /* Newer KW-series (all KW series except KW2xD, KW01Z) */ cpu_mhz = 48; - switch (k_chip->sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK)) { + switch (sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK)) { case KINETIS_SDID_FAMILYID_K4X | KINETIS_SDID_SUBFAMID_KX0: /* KW40Z */ case KINETIS_SDID_FAMILYID_K3X | KINETIS_SDID_SUBFAMID_KX0: @@ -2386,7 +2401,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) case KINETIS_SDID_SERIESID_KV: /* KV-series */ k_chip->watchdog_type = KINETIS_WDOG_K; - switch (k_chip->sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK)) { + switch (sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK)) { case KINETIS_SDID_FAMILYID_K1X | KINETIS_SDID_SUBFAMID_KX0: /* KV10: FTFA, 1kB sectors */ k_chip->pflash_sector_size = 1<<10; @@ -2451,7 +2466,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) case KINETIS_SDID_SERIESID_KE: /* KE1x-series */ k_chip->watchdog_type = KINETIS_WDOG32_KE1X; - switch (k_chip->sim_sdid & + switch (sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK | KINETIS_SDID_PROJECTID_MASK)) { case KINETIS_SDID_FAMILYID_K1X | KINETIS_SDID_SUBFAMID_KX4 | KINETIS_SDID_PROJECTID_KE1XZ: case KINETIS_SDID_FAMILYID_K1X | KINETIS_SDID_SUBFAMID_KX5 | KINETIS_SDID_PROJECTID_KE1XZ: @@ -2495,7 +2510,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) } if (k_chip->pflash_sector_size == 0) { - LOG_ERROR("MCU is unsupported, SDID 0x%08" PRIx32, k_chip->sim_sdid); + LOG_ERROR("MCU is unsupported, SDID 0x%08" PRIx32, sim_sdid); return ERROR_FLASH_OPER_UNSUPPORTED; } @@ -2507,7 +2522,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) if (result != ERROR_OK) return result; - LOG_DEBUG("SDID: 0x%08" PRIX32 " FCFG1: 0x%08" PRIX32 " FCFG2: 0x%08" PRIX32, k_chip->sim_sdid, + LOG_DEBUG("SDID: 0x%08" PRIX32 " FCFG1: 0x%08" PRIX32 " FCFG2: 0x%08" PRIX32, sim_sdid, k_chip->sim_fcfg1, k_chip->sim_fcfg2); fcfg1_nvmsize = (uint8_t)((k_chip->sim_fcfg1 >> 28) & 0x0f); @@ -2693,7 +2708,7 @@ static int kinetis_probe(struct flash_bank *bank) k_bank->probed = false; if (!k_chip->probed) { - result = kinetis_probe_chip(k_chip); + result = k_chip->probe_chip(k_chip); if (result != ERROR_OK) return result; } diff --git a/tcl/target/kx.cfg b/tcl/target/kx.cfg index c87116b728..f359de11d7 100644 --- a/tcl/target/kx.cfg +++ b/tcl/target/kx.cfg @@ -40,7 +40,7 @@ target create $_TARGETNAME cortex_m -dap $_CHIPNAME.dap $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 set _FLASHNAME $_CHIPNAME.pflash -flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME +flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME -chipname $_CHIPNAME kinetis create_banks adapter speed 1000 diff --git a/tcl/target/s32k.cfg b/tcl/target/s32k.cfg new file mode 100644 index 0000000000..6f6b2773ce --- /dev/null +++ b/tcl/target/s32k.cfg @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +# +# Freescale S32K devices +# + +set CHIPNAME s32k +set CPUTAPID 0x0995001d +source [find target/kx.cfg] \ No newline at end of file --