flash Kinetis: add cache invalidate for KLx series
Change-Id: I0177a052cbc380e01405dc139538b731b4f0ed62 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/3565 Tested-by: jenkins Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>gitignore-build
parent
22b4a0f40d
commit
61c18ee486
|
@ -102,6 +102,7 @@
|
|||
#define WDOG_STCTRH 0x40052000
|
||||
#define SMC_PMCTRL 0x4007E001
|
||||
#define SMC_PMSTAT 0x4007E003
|
||||
#define MCM_PLACR 0xF000300C
|
||||
|
||||
/* Values */
|
||||
#define PM_STAT_RUN 0x01
|
||||
|
@ -231,7 +232,8 @@ struct kinetis_flash_bank {
|
|||
FS_PROGRAM_SECTOR = 1,
|
||||
FS_PROGRAM_LONGWORD = 2,
|
||||
FS_PROGRAM_PHRASE = 4, /* Unsupported */
|
||||
FS_INVALIDATE_CACHE = 8,
|
||||
FS_INVALIDATE_CACHE_K = 8,
|
||||
FS_INVALIDATE_CACHE_L = 0x10,
|
||||
} flash_support;
|
||||
};
|
||||
|
||||
|
@ -1178,12 +1180,13 @@ static int kinetis_check_run_mode(struct target *target)
|
|||
static void kinetis_invalidate_flash_cache(struct flash_bank *bank)
|
||||
{
|
||||
struct kinetis_flash_bank *kinfo = bank->driver_priv;
|
||||
uint8_t pfb01cr_byte2 = 0xf0;
|
||||
|
||||
if (!(kinfo->flash_support & FS_INVALIDATE_CACHE))
|
||||
return;
|
||||
if (kinfo->flash_support & FS_INVALIDATE_CACHE_K)
|
||||
target_write_u8(bank->target, FMC_PFB01CR + 2, 0xf0);
|
||||
|
||||
else if (kinfo->flash_support & FS_INVALIDATE_CACHE_L)
|
||||
target_write_u8(bank->target, MCM_PLACR + 1, 0x04);
|
||||
|
||||
target_write_memory(bank->target, FMC_PFB01CR + 2, 1, 1, &pfb01cr_byte2);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1546,7 +1549,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
pflash_sector_size_bytes = 1<<10;
|
||||
nvm_sector_size_bytes = 1<<10;
|
||||
num_blocks = 2;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
case KINETIS_K_SDID_K10_M72:
|
||||
case KINETIS_K_SDID_K20_M72:
|
||||
|
@ -1559,7 +1562,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
pflash_sector_size_bytes = 2<<10;
|
||||
nvm_sector_size_bytes = 1<<10;
|
||||
num_blocks = 2;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE_K;
|
||||
kinfo->max_flash_prog_size = 1<<10;
|
||||
break;
|
||||
case KINETIS_K_SDID_K10_M100:
|
||||
|
@ -1575,7 +1578,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
pflash_sector_size_bytes = 2<<10;
|
||||
nvm_sector_size_bytes = 2<<10;
|
||||
num_blocks = 2;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
case KINETIS_K_SDID_K21_M120:
|
||||
case KINETIS_K_SDID_K22_M120:
|
||||
|
@ -1584,7 +1587,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
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 | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
case KINETIS_K_SDID_K10_M120:
|
||||
case KINETIS_K_SDID_K20_M120:
|
||||
|
@ -1594,7 +1597,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
pflash_sector_size_bytes = 4<<10;
|
||||
nvm_sector_size_bytes = 4<<10;
|
||||
num_blocks = 4;
|
||||
kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR("Unsupported K-family FAMID");
|
||||
|
@ -1608,7 +1611,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
/* K02FN64, K02FN128: FTFA, 2kB sectors */
|
||||
pflash_sector_size_bytes = 2<<10;
|
||||
num_blocks = 1;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
|
||||
case KINETIS_SDID_FAMILYID_K2X | KINETIS_SDID_SUBFAMID_KX2: {
|
||||
|
@ -1623,7 +1626,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
/* MK24FN1M */
|
||||
pflash_sector_size_bytes = 4<<10;
|
||||
num_blocks = 2;
|
||||
kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE_K;
|
||||
kinfo->max_flash_prog_size = 1<<10;
|
||||
break;
|
||||
}
|
||||
|
@ -1633,7 +1636,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
/* K22 with new-style SDID - smaller pflash with FTFA, 2kB sectors */
|
||||
pflash_sector_size_bytes = 2<<10;
|
||||
/* autodetect 1 or 2 blocks */
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
}
|
||||
LOG_ERROR("Unsupported Kinetis K22 DIEID");
|
||||
|
@ -1644,12 +1647,12 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
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 | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
}
|
||||
/* K24FN1M without errata 7534 */
|
||||
num_blocks = 2;
|
||||
kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE_K;
|
||||
kinfo->max_flash_prog_size = 1<<10;
|
||||
break;
|
||||
|
||||
|
@ -1663,7 +1666,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
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 | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
|
||||
case KINETIS_SDID_FAMILYID_K2X | KINETIS_SDID_SUBFAMID_KX6:
|
||||
|
@ -1674,7 +1677,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
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 | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_PHRASE | FS_PROGRAM_SECTOR | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR("Unsupported Kinetis FAMILYID SUBFAMID");
|
||||
|
@ -1686,7 +1689,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
pflash_sector_size_bytes = 1<<10;
|
||||
nvm_sector_size_bytes = 1<<10;
|
||||
/* autodetect 1 or 2 blocks */
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE_L;
|
||||
break;
|
||||
|
||||
case KINETIS_SDID_SERIESID_KV:
|
||||
|
@ -1696,14 +1699,14 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
/* KV10: FTFA, 1kB sectors */
|
||||
pflash_sector_size_bytes = 1<<10;
|
||||
num_blocks = 1;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE_L;
|
||||
break;
|
||||
|
||||
case KINETIS_SDID_FAMILYID_K1X | KINETIS_SDID_SUBFAMID_KX1:
|
||||
/* KV11: FTFA, 2kB sectors */
|
||||
pflash_sector_size_bytes = 2<<10;
|
||||
num_blocks = 1;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE_L;
|
||||
break;
|
||||
|
||||
case KINETIS_SDID_FAMILYID_K3X | KINETIS_SDID_SUBFAMID_KX0:
|
||||
|
@ -1712,7 +1715,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
/* KV31: FTFA, 2kB sectors, 2 blocks */
|
||||
pflash_sector_size_bytes = 2<<10;
|
||||
/* autodetect 1 or 2 blocks */
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
|
||||
case KINETIS_SDID_FAMILYID_K4X | KINETIS_SDID_SUBFAMID_KX2:
|
||||
|
@ -1721,7 +1724,7 @@ static int kinetis_probe(struct flash_bank *bank)
|
|||
/* KV4x: FTFA, 4kB sectors */
|
||||
pflash_sector_size_bytes = 4<<10;
|
||||
num_blocks = 1;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE;
|
||||
kinfo->flash_support = FS_PROGRAM_LONGWORD | FS_INVALIDATE_CACHE_K;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
Loading…
Reference in New Issue