* 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,
                 */
                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);
 
        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;
 }
 
  * 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 */
 };
 
 /**
 
        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;