cortex_m: Discover the AP to use, just like Cortex-A 46/3146/2
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>
Sun, 6 Dec 2015 00:21:41 +0000 (01:21 +0100)
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>
Tue, 29 Dec 2015 20:28:24 +0000 (20:28 +0000)
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>
src/target/arm_adi_v5.c
src/target/arm_adi_v5.h
src/target/cortex_m.c

index 53c0c4e15ae0af1dfb8de12645ac31b6506c4f1c..3a81784e301548e72ce1e6bcf53de335b1155f13 100644 (file)
@@ -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
                 * 27-24 : JEDEC bank (0x4 for ARM)
                 * 23-17 : JEDEC code (0x3B for ARM)
-                * 16    : Mem-AP
-                * 15-8  : Reserved
-                *  7-0  : AP Identity (1=AHB-AP 2=APB-AP 0x10=JTAG-AP)
+                * 16-13 : Class (0b1000=Mem-AP)
+                * 12-8  : Reserved
+                *  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,
@@ -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 */
                        ((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 ")",
                                                (type_to_find == AP_TYPE_AHB_AP)  ? "AHB-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",
                                                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",
                                (type_to_find == AP_TYPE_AHB_AP)  ? "AHB-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");
        return ERROR_FAIL;
 }
index 32b723959ab140813802a014239a2bd4d94dd6af..85b622430c73643828142c6b3355ccef179dac8e 100644 (file)
@@ -279,9 +279,10 @@ struct dap_ops {
  * Access Port types
  */
 enum ap_type {
-       AP_TYPE_AHB_AP  = 0x01,  /* AHB Memory-AP */
-       AP_TYPE_APB_AP  = 0x02,  /* APB Memory-AP */
-       AP_TYPE_JTAG_AP = 0x10   /* JTAG-AP - JTAG master for controlling other JTAG devices */
+       AP_TYPE_JTAG_AP = 0x0,  /* JTAG-AP - JTAG master for controlling other JTAG devices */
+       AP_TYPE_AHB_AP  = 0x1,  /* AHB Memory-AP */
+       AP_TYPE_APB_AP  = 0x2,  /* APB Memory-AP */
+       AP_TYPE_AXI_AP  = 0x4,  /* AXI Memory-AP */
 };
 
 /**
index ec5caa288fe1a67c412970dc9091f8276033b8c9..7a7194a1174b25d3e17b1924bdcdc329527bee44 100644 (file)
@@ -1903,6 +1903,13 @@ int cortex_m_examine(struct target *target)
        struct adiv5_dap *swjdp = cortex_m->armv7m.arm.dap;
        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(); */
        swjdp->ap[armv7m->debug_ap].memaccess_tck = 8;
 

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)