Kinetis: new devices K02, K26, K63, K64, K66, correct K21 and K22 variants
[openocd.git] / src / flash / nor / kinetis.c
index 6485bc3fa3171de67d599dbab751903269f8598a..ba3f5ea69645684e13a953d6a8363501082a1d81 100644 (file)
 #define KINETIS_SDID_K_SERIES_MASK  0x0000FFFF
 
 #define KINETIS_SDID_DIEID_MASK 0x00000F80
-#define KINETIS_SDID_DIEID_K_A 0x00000100
-#define KINETIS_SDID_DIEID_K_B 0x00000200
-#define KINETIS_SDID_DIEID_KL  0x00000000
+
+#define KINETIS_SDID_DIEID_K22FN128    0x00000680 /* smaller pflash with FTFA */
+#define KINETIS_SDID_DIEID_K22FN256    0x00000A80
+#define KINETIS_SDID_DIEID_K22FN512    0x00000E80
+#define KINETIS_SDID_DIEID_K24FN256    0x00000700
+
 #define KINETIS_SDID_DIEID_K24FN1M     0x00000300 /* Detect Errata 7534 */
 
 /* We can't rely solely on the FAMID field to determine the MCU
@@ -1072,7 +1075,6 @@ static int kinetis_read_part_info(struct flash_bank *bank)
                        nvm_sector_size_bytes = 1<<10;
                        num_blocks = 2;
                        kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_PROGRAM_SECTOR;
-                       kinfo->max_flash_prog_size = 1<<10;
                        break;
                case KINETIS_K_SDID_K10_M72:
                case KINETIS_K_SDID_K20_M72:
@@ -1102,12 +1104,18 @@ static int kinetis_read_part_info(struct flash_bank *bank)
                        nvm_sector_size_bytes = 2<<10;
                        num_blocks = 2;
                        kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_PROGRAM_SECTOR;
-                       kinfo->max_flash_prog_size = 2<<10;
                        break;
-               case KINETIS_K_SDID_K10_M120:
-               case KINETIS_K_SDID_K20_M120:
                case KINETIS_K_SDID_K21_M120:
                case KINETIS_K_SDID_K22_M120:
+                       /* 4kB sectors (MK21FN1M0, MK21FX512, MK22FN1M0, MK22FX512) */
+                       pflash_sector_size_bytes = 4<<10;
+                       kinfo->max_flash_prog_size = 1<<10;
+                       nvm_sector_size_bytes = 4<<10;
+                       num_blocks = 2;
+                       kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR;
+                       break;
+               case KINETIS_K_SDID_K10_M120:
+               case KINETIS_K_SDID_K20_M120:
                case KINETIS_K_SDID_K60_M150:
                case KINETIS_K_SDID_K70_M150:
                        /* 4kB sectors */
@@ -1115,17 +1123,22 @@ static int kinetis_read_part_info(struct flash_bank *bank)
                        nvm_sector_size_bytes = 4<<10;
                        num_blocks = 4;
                        kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR;
-                       kinfo->max_flash_prog_size = 4<<10;
                        break;
                default:
                        LOG_ERROR("Unsupported K-family FAMID");
-                       return ERROR_FLASH_OPER_UNSUPPORTED;
                }
        } else {
                /* Newer K-series or KL series MCU */
                switch (kinfo->sim_sdid & KINETIS_SDID_SERIESID_MASK) {
                case KINETIS_SDID_SERIESID_K:
                        switch (kinfo->sim_sdid & (KINETIS_SDID_FAMILYID_MASK | KINETIS_SDID_SUBFAMID_MASK)) {
+                       case KINETIS_SDID_FAMILYID_K0X | KINETIS_SDID_SUBFAMID_KX2:
+                               /* K02FN64, K02FN128: FTFA, 2kB sectors */
+                               pflash_sector_size_bytes = 2<<10;
+                               num_blocks = 1;
+                               kinfo->flash_support = FS_PROGRAM_LONGWORD;
+                               break;
+
                        case KINETIS_SDID_FAMILYID_K2X | KINETIS_SDID_SUBFAMID_KX2: {
                                /* MK24FN1M reports as K22, this should detect it (according to errata note 1N83J) */
                                uint32_t sopt1;
@@ -1140,21 +1153,59 @@ static int kinetis_read_part_info(struct flash_bank *bank)
                                        num_blocks = 2;
                                        kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR;
                                        kinfo->max_flash_prog_size = 1<<10;
-                               } else {
-                                       /* K22 with new-style SDID? */
                                        break;
                                }
+                               if ((kinfo->sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K22FN128
+                                       || (kinfo->sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K22FN256
+                                       || (kinfo->sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K22FN512) {
+                                       /* K22 with new-style SDID - smaller pflash with FTFA, 2kB sectors */
+                                       pflash_sector_size_bytes = 2<<10;
+                                       num_blocks = 2;         /* 1 or 2 blocks */
+                                       kinfo->flash_support = FS_PROGRAM_LONGWORD;
+                                       break;
+                               }
+                               LOG_ERROR("Unsupported Kinetis K22 DIEID");
                                break;
                        }
                        case KINETIS_SDID_FAMILYID_K2X | KINETIS_SDID_SUBFAMID_KX4:
-                               /* K24FN256 */
                                pflash_sector_size_bytes = 4<<10;
-                               num_blocks = 1;
-                               kinfo->flash_support = FS_PROGRAM_LONGWORD;
+                               if ((kinfo->sim_sdid & (KINETIS_SDID_DIEID_MASK)) == KINETIS_SDID_DIEID_K24FN256) {
+                                       /* K24FN256 - smaller pflash with FTFA */
+                                       num_blocks = 1;
+                                       kinfo->flash_support = FS_PROGRAM_LONGWORD;
+                                       break;
+                               }
+                               /* K24FN1M without errata 7534 */
+                               num_blocks = 2;
+                               kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR;
                                kinfo->max_flash_prog_size = 1<<10;
                                break;
-                       default:
+
+                       case KINETIS_SDID_FAMILYID_K6X | KINETIS_SDID_SUBFAMID_KX3:
+                       case KINETIS_SDID_FAMILYID_K6X | KINETIS_SDID_SUBFAMID_KX1:     /* errata 7534 - should be K63 */
+                               /* K63FN1M0 */
+                       case KINETIS_SDID_FAMILYID_K6X | KINETIS_SDID_SUBFAMID_KX4:
+                       case KINETIS_SDID_FAMILYID_K6X | KINETIS_SDID_SUBFAMID_KX2:     /* errata 7534 - should be K64 */
+                               /* K64FN1M0, K64FX512 */
+                               pflash_sector_size_bytes = 4<<10;
+                               nvm_sector_size_bytes = 4<<10;
+                               kinfo->max_flash_prog_size = 1<<10;
+                               num_blocks = 2;
+                               kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR;
+                               break;
+
+                       case KINETIS_SDID_FAMILYID_K2X | KINETIS_SDID_SUBFAMID_KX6:
+                               /* K26FN2M0 */
+                       case KINETIS_SDID_FAMILYID_K6X | KINETIS_SDID_SUBFAMID_KX6:
+                               /* K66FN2M0, K66FX1M0 */
+                               pflash_sector_size_bytes = 4<<10;
+                               nvm_sector_size_bytes = 4<<10;
+                               kinfo->max_flash_prog_size = 1<<10;
+                               num_blocks = 4;
+                               kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR;
                                break;
+                       default:
+                               LOG_ERROR("Unsupported Kinetis FAMILYID SUBFAMID");
                        }
                        break;
                case KINETIS_SDID_SERIESID_KL:
@@ -1163,15 +1214,14 @@ static int kinetis_read_part_info(struct flash_bank *bank)
                        nvm_sector_size_bytes = 1<<10;
                        num_blocks = 1;
                        kinfo->flash_support = FS_PROGRAM_LONGWORD;
-                       kinfo->max_flash_prog_size = 1<<10;
                        break;
                default:
-                       break;
+                       LOG_ERROR("Unsupported K-series");
                }
        }
 
        if (pflash_sector_size_bytes == 0) {
-               LOG_ERROR("MCU is unsupported");
+               LOG_ERROR("MCU is unsupported, SDID 0x%08" PRIx32, kinfo->sim_sdid);
                return ERROR_FLASH_OPER_UNSUPPORTED;
        }
 
@@ -1372,6 +1422,17 @@ static int kinetis_read_part_info(struct flash_bank *bank)
                bank->sectors = NULL;
        }
 
+       if (kinfo->sector_size == 0) {
+               LOG_ERROR("Unknown sector size for bank %d", bank->bank_number);
+               return ERROR_FLASH_BANK_INVALID;
+       }
+
+       if (kinfo->flash_support & FS_PROGRAM_SECTOR
+                        && kinfo->max_flash_prog_size == 0) {
+               kinfo->max_flash_prog_size = kinfo->sector_size;
+               /* Program section size is equal to sector size by default */
+       }
+
        bank->num_sectors = bank->size / kinfo->sector_size;
        assert(bank->num_sectors > 0);
        bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)