cortexm: Store CPUID in target structure.

This commit is contained in:
Uwe Bonnes 2020-11-05 18:44:04 +01:00 committed by UweBonnes
parent 824a1d8abc
commit 653d486ee2
6 changed files with 35 additions and 33 deletions

View File

@ -297,41 +297,37 @@ bool cortexm_probe(ADIv5_AP_t *ap)
* that is, the actual values are found in the Technical Reference Manual * that is, the actual values are found in the Technical Reference Manual
* for each Cortex-M core. * for each Cortex-M core.
*/ */
uint32_t cpuid = target_mem_read32(t, CORTEXM_CPUID); t->cpuid = target_mem_read32(t, CORTEXM_CPUID);
uint16_t partno = (cpuid >> 4) & 0xfff; uint32_t cpuid_partno = t->cpuid & CPUID_PARTNO_MASK;
switch (cpuid_partno) {
switch (partno) { case CORTEX_M33:
case 0xd21:
t->core = "M33"; t->core = "M33";
break; break;
case CORTEX_M23:
case 0xd20:
t->core = "M23"; t->core = "M23";
break; break;
case CORTEX_M3:
case 0xc23:
t->core = "M3"; t->core = "M3";
break; break;
case CORTEX_M4:
case 0xc24:
t->core = "M4"; t->core = "M4";
break; break;
case CORTEX_M7:
case 0xc27:
t->core = "M7"; t->core = "M7";
if ((((cpuid >> 20) & 0xf) == 0) && (((cpuid >> 0) & 0xf) < 2)) { if (((t->cpuid & CPUID_REVISION_MASK) == 0) &&
(t->cpuid & CPUID_PATCH_MASK) < 2) {
DEBUG_WARN("Silicon bug: Single stepping will enter pending " DEBUG_WARN("Silicon bug: Single stepping will enter pending "
"exception handler with this M7 core revision!\n"); "exception handler with this M7 core revision!\n");
} }
break; break;
case CORTEX_M0P:
case 0xc60:
t->core = "M0+"; t->core = "M0+";
break; break;
case CORTEX_M0:
case 0xc20:
t->core = "M0"; t->core = "M0";
break; break;
default:
DEBUG_WARN("Unexpected CortexM CPUID partno %04x\n", cpuid_partno);
} }
t->attach = cortexm_attach; t->attach = cortexm_attach;

View File

@ -171,6 +171,19 @@ extern long cortexm_wait_timeout;
#define CORTEXM_TOPT_INHIBIT_SRST (1 << 2) #define CORTEXM_TOPT_INHIBIT_SRST (1 << 2)
enum cortexm_types {
CORTEX_M0 = 0xc200,
CORTEX_M0P = 0xc600,
CORTEX_M3 = 0xc230,
CORTEX_M4 = 0xc240,
CORTEX_M7 = 0xc270,
CORTEX_M23 = 0xd200,
CORTEX_M33 = 0xd210,
};
#define CPUID_PARTNO_MASK 0xfff0
#define CPUID_REVISION_MASK 0x00f00000
#define CPUID_PATCH_MASK 0xf
bool cortexm_probe(ADIv5_AP_t *ap); bool cortexm_probe(ADIv5_AP_t *ap);
ADIv5_AP_t *cortexm_ap(target *t); ADIv5_AP_t *cortexm_ap(target *t);

View File

@ -32,9 +32,6 @@
#define IAP_ENTRYPOINT 0x1FFF1FF1 #define IAP_ENTRYPOINT 0x1FFF1FF1
#define IAP_RAM_BASE 0x10000000 #define IAP_RAM_BASE 0x10000000
#define ARM_CPUID 0xE000ED00
#define CORTEX_M3_CPUID 0x412FC230 // Cortex-M3 r2p0
#define CORTEX_M3_CPUID_MASK 0xFF00FFF0
#define MEMMAP 0x400FC040 #define MEMMAP 0x400FC040
#define LPC17xx_JTAG_IDCODE 0x4BA00477 #define LPC17xx_JTAG_IDCODE 0x4BA00477
#define LPC17xx_SWDP_IDCODE 0x2BA01477 #define LPC17xx_SWDP_IDCODE 0x2BA01477
@ -82,8 +79,7 @@ lpc17xx_probe(target *t)
return false; return false;
} }
uint32_t cpuid = target_mem_read32(t, ARM_CPUID); if ((t->cpuid & CPUID_PARTNO_MASK) == CORTEX_M3) {
if (((cpuid & CORTEX_M3_CPUID_MASK) == (CORTEX_M3_CPUID & CORTEX_M3_CPUID_MASK))) {
/* /*
* Now that we're sure it's a Cortex-M3, we need to halt the * Now that we're sure it's a Cortex-M3, we need to halt the
* target and make an IAP call to get the part number. * target and make an IAP call to get the part number.

View File

@ -25,7 +25,6 @@
#include "lpc_common.h" #include "lpc_common.h"
#define LPC43XX_CHIPID 0x40043200 #define LPC43XX_CHIPID 0x40043200
#define ARM_CPUID 0xE000ED00
#define IAP_ENTRYPOINT_LOCATION 0x10400100 #define IAP_ENTRYPOINT_LOCATION 0x10400100
@ -80,19 +79,18 @@ void lpc43xx_add_flash(target *t, uint32_t iap_entry,
bool lpc43xx_probe(target *t) bool lpc43xx_probe(target *t)
{ {
uint32_t chipid, cpuid; uint32_t chipid;
uint32_t iap_entry; uint32_t iap_entry;
chipid = target_mem_read32(t, LPC43XX_CHIPID); chipid = target_mem_read32(t, LPC43XX_CHIPID);
cpuid = target_mem_read32(t, ARM_CPUID);
switch(chipid) { switch(chipid) {
case 0x4906002B: /* Parts with on-chip flash */ case 0x4906002B: /* Parts with on-chip flash */
case 0x7906002B: /* LM43S?? - Undocumented? */ case 0x7906002B: /* LM43S?? - Undocumented? */
switch (cpuid & 0xFF00FFF0) { switch (t->cpuid & 0xFF00FFF0) {
case 0x4100C240: case 0x4100C240:
t->driver = "LPC43xx Cortex-M4"; t->driver = "LPC43xx Cortex-M4";
if (cpuid == 0x410FC241) if (t->cpuid == 0x410FC241)
{ {
/* LPC4337 */ /* LPC4337 */
iap_entry = target_mem_read32(t, iap_entry = target_mem_read32(t,
@ -121,7 +119,7 @@ bool lpc43xx_probe(target *t)
return true; return true;
case 0x5906002B: /* Flashless parts */ case 0x5906002B: /* Flashless parts */
case 0x6906002B: case 0x6906002B:
switch (cpuid & 0xFF00FFF0) { switch (t->cpuid & 0xFF00FFF0) {
case 0x4100C240: case 0x4100C240:
t->driver = "LPC43xx Cortex-M4"; t->driver = "LPC43xx Cortex-M4";
break; break;

View File

@ -106,7 +106,6 @@ static int stm32f4_flash_write(struct target_flash *f,
#define DBGMCU_IDCODE 0xE0042000 #define DBGMCU_IDCODE 0xE0042000
#define DBGMCU_CR 0xE0042004 #define DBGMCU_CR 0xE0042004
#define DBG_SLEEP (1 << 0) #define DBG_SLEEP (1 << 0)
#define ARM_CPUID 0xE000ED00
#define AXIM_BASE 0x8000000 #define AXIM_BASE 0x8000000
#define ITCM_BASE 0x0200000 #define ITCM_BASE 0x0200000
@ -208,8 +207,7 @@ bool stm32f4_probe(target *t)
/* F405 revision A have a wrong IDCODE, use ARM_CPUID to make the /* F405 revision A have a wrong IDCODE, use ARM_CPUID to make the
* distinction with F205. Revision is also wrong (0x2000 instead * distinction with F205. Revision is also wrong (0x2000 instead
* of 0x1000). See F40x/F41x errata. */ * of 0x1000). See F40x/F41x errata. */
uint32_t cpuid = target_mem_read32(t, ARM_CPUID); if ((t->cpuid & 0xFFF0) == CORTEX_M4)
if ((cpuid & 0xFFF0) == 0xC240)
t->idcode = ID_STM32F40X; t->idcode = ID_STM32F40X;
} }
switch(t->idcode) { switch(t->idcode) {

View File

@ -120,7 +120,8 @@ struct target_s {
/* Other stuff */ /* Other stuff */
const char *driver; const char *driver;
const char *core; uint32_t cpuid;
char *core;
char cmdline[MAX_CMDLINE]; char cmdline[MAX_CMDLINE];
target_addr heapinfo[4]; target_addr heapinfo[4];
struct target_command_s *commands; struct target_command_s *commands;