cortex_m: Discover the AP to use, just like Cortex-A
This required fixing the AP ID parsing in dap_find_ap() to match IHI0031C. The AXI type was added too. Change-Id: I44577a7848df37586e650dce0fb57ac26f5f858c Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/3146 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
This commit is contained in:
parent
cd12c423dc
commit
beb843d28d
|
@ -825,9 +825,10 @@ int dap_find_ap(struct adiv5_dap *dap, enum ap_type type_to_find, uint8_t *ap_nu
|
||||||
* 31-28 : Revision
|
* 31-28 : Revision
|
||||||
* 27-24 : JEDEC bank (0x4 for ARM)
|
* 27-24 : JEDEC bank (0x4 for ARM)
|
||||||
* 23-17 : JEDEC code (0x3B for ARM)
|
* 23-17 : JEDEC code (0x3B for ARM)
|
||||||
* 16 : Mem-AP
|
* 16-13 : Class (0b1000=Mem-AP)
|
||||||
* 15-8 : Reserved
|
* 12-8 : Reserved
|
||||||
* 7-0 : AP Identity (1=AHB-AP 2=APB-AP 0x10=JTAG-AP)
|
* 7-4 : AP Variant (non-zero for JTAG-AP)
|
||||||
|
* 3-0 : AP Type (0=JTAG-AP 1=AHB-AP 2=APB-AP 4=AXI-AP)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Reading register for a non-existant AP should not cause an error,
|
/* Reading register for a non-existant AP should not cause an error,
|
||||||
|
@ -835,11 +836,12 @@ int dap_find_ap(struct adiv5_dap *dap, enum ap_type type_to_find, uint8_t *ap_nu
|
||||||
*/
|
*/
|
||||||
if ((retval == ERROR_OK) && /* Register read success */
|
if ((retval == ERROR_OK) && /* Register read success */
|
||||||
((id_val & 0x0FFF0000) == 0x04770000) && /* Jedec codes match */
|
((id_val & 0x0FFF0000) == 0x04770000) && /* Jedec codes match */
|
||||||
((id_val & 0xFF) == type_to_find)) { /* type matches*/
|
((id_val & 0xF) == type_to_find)) { /* type matches*/
|
||||||
|
|
||||||
LOG_DEBUG("Found %s at AP index: %d (IDR=0x%08" PRIX32 ")",
|
LOG_DEBUG("Found %s at AP index: %d (IDR=0x%08" PRIX32 ")",
|
||||||
(type_to_find == AP_TYPE_AHB_AP) ? "AHB-AP" :
|
(type_to_find == AP_TYPE_AHB_AP) ? "AHB-AP" :
|
||||||
(type_to_find == AP_TYPE_APB_AP) ? "APB-AP" :
|
(type_to_find == AP_TYPE_APB_AP) ? "APB-AP" :
|
||||||
|
(type_to_find == AP_TYPE_AXI_AP) ? "AXI-AP" :
|
||||||
(type_to_find == AP_TYPE_JTAG_AP) ? "JTAG-AP" : "Unknown",
|
(type_to_find == AP_TYPE_JTAG_AP) ? "JTAG-AP" : "Unknown",
|
||||||
ap, id_val);
|
ap, id_val);
|
||||||
|
|
||||||
|
@ -851,6 +853,7 @@ int dap_find_ap(struct adiv5_dap *dap, enum ap_type type_to_find, uint8_t *ap_nu
|
||||||
LOG_DEBUG("No %s found",
|
LOG_DEBUG("No %s found",
|
||||||
(type_to_find == AP_TYPE_AHB_AP) ? "AHB-AP" :
|
(type_to_find == AP_TYPE_AHB_AP) ? "AHB-AP" :
|
||||||
(type_to_find == AP_TYPE_APB_AP) ? "APB-AP" :
|
(type_to_find == AP_TYPE_APB_AP) ? "APB-AP" :
|
||||||
|
(type_to_find == AP_TYPE_AXI_AP) ? "AXI-AP" :
|
||||||
(type_to_find == AP_TYPE_JTAG_AP) ? "JTAG-AP" : "Unknown");
|
(type_to_find == AP_TYPE_JTAG_AP) ? "JTAG-AP" : "Unknown");
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -279,9 +279,10 @@ struct dap_ops {
|
||||||
* Access Port types
|
* Access Port types
|
||||||
*/
|
*/
|
||||||
enum ap_type {
|
enum ap_type {
|
||||||
AP_TYPE_AHB_AP = 0x01, /* AHB Memory-AP */
|
AP_TYPE_JTAG_AP = 0x0, /* JTAG-AP - JTAG master for controlling other JTAG devices */
|
||||||
AP_TYPE_APB_AP = 0x02, /* APB Memory-AP */
|
AP_TYPE_AHB_AP = 0x1, /* AHB Memory-AP */
|
||||||
AP_TYPE_JTAG_AP = 0x10 /* JTAG-AP - JTAG master for controlling other JTAG devices */
|
AP_TYPE_APB_AP = 0x2, /* APB Memory-AP */
|
||||||
|
AP_TYPE_AXI_AP = 0x4, /* AXI Memory-AP */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1903,6 +1903,13 @@ int cortex_m_examine(struct target *target)
|
||||||
struct adiv5_dap *swjdp = cortex_m->armv7m.arm.dap;
|
struct adiv5_dap *swjdp = cortex_m->armv7m.arm.dap;
|
||||||
struct armv7m_common *armv7m = target_to_armv7m(target);
|
struct armv7m_common *armv7m = target_to_armv7m(target);
|
||||||
|
|
||||||
|
/* Search for the MEM-AP */
|
||||||
|
retval = dap_find_ap(swjdp, AP_TYPE_AHB_AP, &armv7m->debug_ap);
|
||||||
|
if (retval != ERROR_OK) {
|
||||||
|
LOG_ERROR("Could not find MEM-AP to control the core");
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
/* Leave (only) generic DAP stuff for debugport_init(); */
|
/* Leave (only) generic DAP stuff for debugport_init(); */
|
||||||
swjdp->ap[armv7m->debug_ap].memaccess_tck = 8;
|
swjdp->ap[armv7m->debug_ap].memaccess_tck = 8;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue