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

-- 

Reply via email to