This is an automated email from Gerrit.

Matthias Welwarsky ([email protected]) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/4468

-- gerrit

commit 4c3dcaddf4b8ba895a22555f024947b53d882e90
Author: Matthias Welwarsky <[email protected]>
Date:   Wed Mar 14 14:13:54 2018 +0100

    dap unfracking WIP
    
    Change-Id: I322cf3969b5407c25d1d3962f9d9b9bc1df067d9
    Signed-off-by: Matthias Welwarsky <[email protected]>

diff --git a/src/openocd.c b/src/openocd.c
index 8745eb0..ef6c6bb 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -38,6 +38,7 @@
 #include <pld/pld.h>
 #include <flash/mflash.h>
 #include <target/arm_cti.h>
+#include <target/arm_adi_v5.h>
 
 #include <server/server.h>
 #include <server/gdb_server.h>
@@ -151,6 +152,10 @@ COMMAND_HANDLER(handle_init_command)
        if (ERROR_OK != retval)
                return ERROR_FAIL;
 
+       retval = dap_init_all();
+       if (ERROR_OK != retval)
+               return ERROR_FAIL;
+
        LOG_DEBUG("Examining targets...");
        if (target_examine() != ERROR_OK)
                LOG_DEBUG("target examination failed");
@@ -254,6 +259,7 @@ struct command_context *setup_command_handler(Jim_Interp 
*interp)
                &pld_register_commands,
                &mflash_register_commands,
                &cti_register_commands,
+               &dap_register_commands,
                NULL
        };
        for (unsigned i = 0; NULL != command_registrants[i]; i++) {
diff --git a/src/target/Makefile.am b/src/target/Makefile.am
index d2aab0a..206b281 100644
--- a/src/target/Makefile.am
+++ b/src/target/Makefile.am
@@ -88,6 +88,7 @@ ARM_DEBUG_SRC = \
        %D%/arm_simulator.c \
        %D%/arm_semihosting.c \
        %D%/arm_adi_v5.c \
+       %D%/arm_dap.c \
        %D%/armv7a_cache.c \
        %D%/armv7a_cache_l2x.c \
        %D%/adi_v5_jtag.c \
diff --git a/src/target/aarch64.c b/src/target/aarch64.c
index e9c822d..c77ed84 100644
--- a/src/target/aarch64.c
+++ b/src/target/aarch64.c
@@ -42,6 +42,7 @@ enum halt_mode {
 
 struct aarch64_private_config {
        struct arm_cti *cti;
+       struct adiv5_dap *dap;
 };
 
 static int aarch64_poll(struct target *target);
@@ -2210,10 +2211,6 @@ static int aarch64_examine_first(struct target *target)
        uint32_t tmp0, tmp1, tmp2, tmp3;
        debug = ttypr = cpuid = 0;
 
-       retval = dap_dp_init(swjdp);
-       if (retval != ERROR_OK)
-               return retval;
-
        /* Search for the APB-AB - it is needed for access to debug registers */
        retval = dap_find_ap(swjdp, AP_TYPE_APB_AP, &armv8->debug_ap);
        if (retval != ERROR_OK) {
@@ -2358,18 +2355,13 @@ static int aarch64_init_target(struct command_context 
*cmd_ctx,
 }
 
 static int aarch64_init_arch_info(struct target *target,
-       struct aarch64_common *aarch64, struct jtag_tap *tap)
+       struct aarch64_common *aarch64, struct adiv5_dap *dap)
 {
        struct armv8_common *armv8 = &aarch64->armv8_common;
 
        /* Setup struct aarch64_common */
        aarch64->common_magic = AARCH64_COMMON_MAGIC;
-       /*  tap has no dap initialized */
-       if (!tap->dap) {
-               tap->dap = dap_init();
-               tap->dap->tap = tap;
-       }
-       armv8->arm.dap = tap->dap;
+       armv8->arm.dap = dap;
 
        /* register arch-specific functions */
        armv8->examine_debug_reason = NULL;
@@ -2385,9 +2377,9 @@ static int aarch64_init_arch_info(struct target *target,
 
 static int aarch64_target_create(struct target *target, Jim_Interp *interp)
 {
+       struct aarch64_private_config *pc = target->private_config;
        struct aarch64_common *aarch64 = calloc(1, sizeof(struct 
aarch64_common));
-
-       return aarch64_init_arch_info(target, aarch64, target->tap);
+       return aarch64_init_arch_info(target, aarch64, pc->dap);
 }
 
 static int aarch64_mmu(struct target *target, int *enabled)
@@ -2407,58 +2399,107 @@ static int aarch64_virt2phys(struct target *target, 
target_addr_t virt,
        return armv8_mmu_translate_va_pa(target, virt, phys, 1);
 }
 
+/*
+ * private target configuration items
+ */
+enum aarch64_cfg_param {
+       CFG_CTI,
+       CFG_DAP
+};
+
+static const Jim_Nvp nvp_config_opts[] = {
+       { .name = "-cti", .value = CFG_CTI },
+       { .name = "-dap", .value = CFG_DAP },
+       { .name = NULL, .value = -1 }
+};
+
 static int aarch64_jim_configure(struct target *target, Jim_GetOptInfo *goi)
 {
        struct aarch64_private_config *pc;
-       const char *arg;
+       Jim_Nvp *n;
        int e;
 
-       /* check if argv[0] is for us */
-       arg = Jim_GetString(goi->argv[0], NULL);
-       if (strcmp(arg, "-cti"))
-               return JIM_CONTINUE;
-
-       /* pop the argument from argv */
-       e = Jim_GetOpt_String(goi, &arg, NULL);
-       if (e != JIM_OK)
-               return e;
-
-       /* check if we have another option */
-       if (goi->argc == 0) {
-               Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-cti 
?cti-name?");
-               return JIM_ERR;
+       pc = (struct aarch64_private_config *)target->private_config;
+       if (pc == NULL) {
+                       pc = calloc(1, sizeof(struct aarch64_private_config));
+                       target->private_config = pc;
        }
 
-       pc = (struct aarch64_private_config *)target->private_config;
+       /* parse config or cget options ... */
+       while (goi->argc > 0) {
+               Jim_SetEmptyResult(goi->interp);
 
-       if (goi->isconfigure) {
-               Jim_Obj *o_cti;
-               struct arm_cti *cti;
-               e = Jim_GetOpt_Obj(goi, &o_cti);
+               /* check first if topmost item is for us */
+               e = Jim_Nvp_name2value_obj(goi->interp, nvp_config_opts,
+                               goi->argv[0], &n);
+               if (e != JIM_OK)
+                       return JIM_CONTINUE;
+
+               e = Jim_GetOpt_Obj(goi, NULL);
                if (e != JIM_OK)
                        return e;
-               cti = cti_instance_by_jim_obj(goi->interp, o_cti);
-               if (cti == NULL)
-                       return JIM_ERR;
 
-               if (pc == NULL) {
-                       pc = calloc(1, sizeof(struct aarch64_private_config));
-                       target->private_config = pc;
+               switch (n->value) {
+               case CFG_DAP: {
+                       if (goi->isconfigure) {
+                               Jim_Obj *o_t;
+                               struct adiv5_dap *dap;
+                               e = Jim_GetOpt_Obj(goi, &o_t);
+                               if (e != JIM_OK)
+                                       return e;
+                               dap = dap_instance_by_jim_obj(goi->interp, o_t);
+                               if (dap == NULL)
+                                       return JIM_ERR;
+                               pc->dap = dap;
+                               /* fill in target->tap */
+                               target->tap = dap->tap;
+                       } else {
+                               if (goi->argc != 0) {
+                                       Jim_WrongNumArgs(goi->interp,
+                                                       goi->argc, goi->argv,
+                                                       "NO PARAMS");
+                                       return JIM_ERR;
+                               }
+
+                               if (pc == NULL || pc->dap == NULL) {
+                                       Jim_SetResultString(goi->interp, "DAP 
not configured", -1);
+                                       return JIM_ERR;
+                               }
+                               Jim_SetResultString(goi->interp, 
adiv5_dap_name(pc->dap), -1);
+                       }
+                       break;
                }
-               pc->cti = cti;
-       } else {
-               if (goi->argc != 0) {
-                       Jim_WrongNumArgs(goi->interp,
-                                       goi->argc, goi->argv,
-                                       "NO PARAMS");
-                       return JIM_ERR;
+               case CFG_CTI: {
+                       if (goi->isconfigure) {
+                               Jim_Obj *o_cti;
+                               struct arm_cti *cti;
+                               e = Jim_GetOpt_Obj(goi, &o_cti);
+                               if (e != JIM_OK)
+                                       return e;
+                               cti = cti_instance_by_jim_obj(goi->interp, 
o_cti);
+                               if (cti == NULL)
+                                       return JIM_ERR;
+                               pc->cti = cti;
+                       } else {
+                               if (goi->argc != 0) {
+                                       Jim_WrongNumArgs(goi->interp,
+                                                       goi->argc, goi->argv,
+                                                       "NO PARAMS");
+                                       return JIM_ERR;
+                               }
+
+                               if (pc == NULL || pc->cti == NULL) {
+                                       Jim_SetResultString(goi->interp, "CTI 
not configured", -1);
+                                       return JIM_ERR;
+                               }
+                               Jim_SetResultString(goi->interp, 
arm_cti_name(pc->cti), -1);
+                       }
+                       break;
                }
 
-               if (pc == NULL || pc->cti == NULL) {
-                       Jim_SetResultString(goi->interp, "CTI not configured", 
-1);
-                       return JIM_ERR;
+               default:
+                       return JIM_CONTINUE;
                }
-               Jim_SetResultString(goi->interp, arm_cti_name(pc->cti), -1);
        }
 
        return JIM_OK;
diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c
index dfbc5ad..a0b6e5d 100644
--- a/src/target/arm_adi_v5.c
+++ b/src/target/arm_adi_v5.c
@@ -1471,9 +1471,8 @@ int adiv5_jim_configure(struct target *target, 
Jim_GetOptInfo *goi)
 
 COMMAND_HANDLER(handle_dap_info_command)
 {
-       struct target *target = get_current_target(CMD_CTX);
-       struct arm *arm = target_to_arm(target);
-       struct adiv5_dap *dap = arm->dap;
+       struct arm_dap_object *obj = CMD_DATA;
+       struct adiv5_dap *dap = &obj->dap;
        uint32_t apsel;
 
        switch (CMD_ARGC) {
@@ -1494,9 +1493,8 @@ COMMAND_HANDLER(handle_dap_info_command)
 
 COMMAND_HANDLER(dap_baseaddr_command)
 {
-       struct target *target = get_current_target(CMD_CTX);
-       struct arm *arm = target_to_arm(target);
-       struct adiv5_dap *dap = arm->dap;
+       struct arm_dap_object *obj = CMD_DATA;
+       struct adiv5_dap *dap = &obj->dap;
 
        uint32_t apsel, baseaddr;
        int retval;
@@ -1534,9 +1532,8 @@ COMMAND_HANDLER(dap_baseaddr_command)
 
 COMMAND_HANDLER(dap_memaccess_command)
 {
-       struct target *target = get_current_target(CMD_CTX);
-       struct arm *arm = target_to_arm(target);
-       struct adiv5_dap *dap = arm->dap;
+       struct arm_dap_object *obj = CMD_DATA;
+       struct adiv5_dap *dap = &obj->dap;
 
        uint32_t memaccess_tck;
 
@@ -1560,9 +1557,8 @@ COMMAND_HANDLER(dap_memaccess_command)
 
 COMMAND_HANDLER(dap_apsel_command)
 {
-       struct target *target = get_current_target(CMD_CTX);
-       struct arm *arm = target_to_arm(target);
-       struct adiv5_dap *dap = arm->dap;
+       struct arm_dap_object *obj = CMD_DATA;
+       struct adiv5_dap *dap = &obj->dap;
 
        uint32_t apsel, apid;
        int retval;
@@ -1598,9 +1594,8 @@ COMMAND_HANDLER(dap_apsel_command)
 
 COMMAND_HANDLER(dap_apcsw_command)
 {
-       struct target *target = get_current_target(CMD_CTX);
-       struct arm *arm = target_to_arm(target);
-       struct adiv5_dap *dap = arm->dap;
+       struct arm_dap_object *obj = CMD_DATA;
+       struct adiv5_dap *dap = &obj->dap;
 
        uint32_t apcsw = dap->ap[dap->apsel].csw_default, sprot = 0;
 
@@ -1631,9 +1626,8 @@ COMMAND_HANDLER(dap_apcsw_command)
 
 COMMAND_HANDLER(dap_apid_command)
 {
-       struct target *target = get_current_target(CMD_CTX);
-       struct arm *arm = target_to_arm(target);
-       struct adiv5_dap *dap = arm->dap;
+       struct arm_dap_object *obj = CMD_DATA;
+       struct adiv5_dap *dap = &obj->dap;
 
        uint32_t apsel, apid;
        int retval;
@@ -1666,9 +1660,8 @@ COMMAND_HANDLER(dap_apid_command)
 
 COMMAND_HANDLER(dap_apreg_command)
 {
-       struct target *target = get_current_target(CMD_CTX);
-       struct arm *arm = target_to_arm(target);
-       struct adiv5_dap *dap = arm->dap;
+       struct arm_dap_object *obj = CMD_DATA;
+       struct adiv5_dap *dap = &obj->dap;
 
        uint32_t apsel, reg, value;
        int retval;
@@ -1705,9 +1698,8 @@ COMMAND_HANDLER(dap_apreg_command)
 
 COMMAND_HANDLER(dap_ti_be_32_quirks_command)
 {
-       struct target *target = get_current_target(CMD_CTX);
-       struct arm *arm = target_to_arm(target);
-       struct adiv5_dap *dap = arm->dap;
+       struct arm_dap_object *obj = CMD_DATA;
+       struct adiv5_dap *dap = &obj->dap;
 
        uint32_t enable = dap->ti_be_32_quirks;
 
@@ -1729,7 +1721,7 @@ COMMAND_HANDLER(dap_ti_be_32_quirks_command)
        return 0;
 }
 
-static const struct command_registration dap_commands[] = {
+const struct command_registration dap_instance_commands[] = {
        {
                .name = "info",
                .handler = handle_dap_info_command,
@@ -1802,7 +1794,7 @@ const struct command_registration dap_command_handlers[] 
= {
                .mode = COMMAND_EXEC,
                .help = "DAP command group",
                .usage = "",
-               .chain = dap_commands,
+               .chain = dap_instance_commands,
        },
        COMMAND_REGISTRATION_DONE
 };
diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h
index 657427b..467ca61 100644
--- a/src/target/arm_adi_v5.h
+++ b/src/target/arm_adi_v5.h
@@ -510,6 +510,19 @@ int dap_to_swd(struct target *target);
 int dap_to_jtag(struct target *target);
 
 extern const struct command_registration dap_command_handlers[];
+extern const struct command_registration dap_instance_commands[];
+
+/* DAP command support */
+struct arm_dap_object {
+       struct list_head lh;
+       struct adiv5_dap dap;
+       char *name;
+};
+
+extern struct adiv5_dap *dap_instance_by_jim_obj(Jim_Interp *interp, Jim_Obj 
*o);
+extern int dap_register_commands(struct command_context *cmd_ctx);
+extern const char *adiv5_dap_name(struct adiv5_dap *self);
+extern int dap_init_all(void);
 
 struct adiv5_private_config {
        int ap_num;
diff --git a/src/target/arm_cti.c b/src/target/arm_cti.c
index 6834a34..547b961 100644
--- a/src/target/arm_cti.c
+++ b/src/target/arm_cti.c
@@ -365,22 +365,21 @@ static const struct command_registration 
cti_instance_command_handlers[] = {
 };
 
 enum cti_cfg_param {
-       CFG_CHAIN_POSITION,
+       CFG_DAP,
        CFG_AP_NUM,
        CFG_CTIBASE
 };
 
 static const Jim_Nvp nvp_config_opts[] = {
-       { .name = "-chain-position",   .value = CFG_CHAIN_POSITION },
-       { .name = "-ctibase",          .value = CFG_CTIBASE },
-       { .name = "-ap-num",           .value = CFG_AP_NUM },
+       { .name = "-dap",     .value = CFG_DAP },
+       { .name = "-ctibase", .value = CFG_CTIBASE },
+       { .name = "-ap-num",  .value = CFG_AP_NUM },
        { .name = NULL, .value = -1 }
 };
 
 static int cti_configure(Jim_GetOptInfo *goi, struct arm_cti_object *cti)
 {
-       struct jtag_tap *tap = NULL;
-       struct adiv5_dap *dap;
+       struct adiv5_dap *dap = NULL;
        Jim_Nvp *n;
        jim_wide w;
        int e;
@@ -395,14 +394,14 @@ static int cti_configure(Jim_GetOptInfo *goi, struct 
arm_cti_object *cti)
                        return e;
                }
                switch (n->value) {
-               case CFG_CHAIN_POSITION: {
+               case CFG_DAP: {
                        Jim_Obj *o_t;
                        e = Jim_GetOpt_Obj(goi, &o_t);
                        if (e != JIM_OK)
                                return e;
-                       tap = jtag_tap_by_jim_obj(goi->interp, o_t);
-                       if (tap == NULL) {
-                               Jim_SetResultString(goi->interp, 
"-chain-position is invalid", -1);
+                       dap = dap_instance_by_jim_obj(goi->interp, o_t);
+                       if (dap == NULL) {
+                               Jim_SetResultString(goi->interp, "-dap is 
invalid", -1);
                                return JIM_ERR;
                        }
                        /* loop for more */
@@ -424,18 +423,11 @@ static int cti_configure(Jim_GetOptInfo *goi, struct 
arm_cti_object *cti)
                }
        }
 
-       if (tap == NULL) {
-               Jim_SetResultString(goi->interp, "-chain-position required when 
creating CTI", -1);
+       if (dap == NULL) {
+               Jim_SetResultString(goi->interp, "-dap required when creating 
CTI", -1);
                return JIM_ERR;
        }
 
-       if (tap->dap == NULL) {
-               dap = dap_init();
-               dap->tap = tap;
-               tap->dap = dap;
-       } else
-               dap = tap->dap;
-
        cti->cti.ap = dap_ap(dap, cti->ap_num);
 
        return JIM_OK;
diff --git a/src/target/arm_dap.c b/src/target/arm_dap.c
new file mode 100644
index 0000000..5caa92b
--- /dev/null
+++ b/src/target/arm_dap.c
@@ -0,0 +1,274 @@
+/***************************************************************************
+ *   Copyright (C) 2016 by Matthias Welwarsky                              *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include "target/arm_adi_v5.h"
+#include "helper/list.h"
+#include "helper/command.h"
+
+static LIST_HEAD(all_dap);
+
+static void dap_instance_init(struct adiv5_dap *dap)
+{
+       int i;
+       /* Set up with safe defaults */
+       for (i = 0; i <= 255; i++) {
+               dap->ap[i].dap = dap;
+               dap->ap[i].ap_num = i;
+               /* memaccess_tck max is 255 */
+               dap->ap[i].memaccess_tck = 255;
+               /* Number of bits for tar autoincrement, impl. dep. at least 10 
*/
+               dap->ap[i].tar_autoincr_block = (1<<10);
+       }
+       INIT_LIST_HEAD(&dap->cmd_journal);
+}
+
+const char *adiv5_dap_name(struct adiv5_dap *self)
+{
+       struct arm_dap_object *obj = container_of(self, struct arm_dap_object, 
dap);
+       return obj->name;
+}
+
+struct adiv5_dap *dap_instance_by_jim_obj(Jim_Interp *interp, Jim_Obj *o)
+{
+       struct arm_dap_object *obj = NULL;
+       const char *name;
+       bool found = false;
+
+       name = Jim_GetString(o, NULL);
+
+       list_for_each_entry(obj, &all_dap, lh) {
+               if (!strcmp(name, obj->name)) {
+                       found = true;
+                       break;
+               }
+       }
+
+       if (found)
+               return &obj->dap;
+       return NULL;
+}
+
+int dap_init_all(void)
+{
+       struct arm_dap_object *obj;
+       int retval;
+
+       LOG_DEBUG("Initializing all DAPs ...");
+
+       list_for_each_entry(obj, &all_dap, lh) {
+               retval = dap_dp_init(&obj->dap);
+               if (retval != ERROR_OK)
+                       return retval;
+       }
+
+       return ERROR_OK;
+}
+
+enum dap_cfg_param {
+       CFG_CHAIN_POSITION,
+};
+
+static const Jim_Nvp nvp_config_opts[] = {
+       { .name = "-chain-position",   .value = CFG_CHAIN_POSITION },
+       { .name = NULL, .value = -1 }
+};
+
+static int dap_configure(Jim_GetOptInfo *goi, struct arm_dap_object *dap)
+{
+       struct jtag_tap *tap = NULL;
+       Jim_Nvp *n;
+       int e;
+
+       /* parse config or cget options ... */
+       while (goi->argc > 0) {
+               Jim_SetEmptyResult(goi->interp);
+
+               e = Jim_GetOpt_Nvp(goi, nvp_config_opts, &n);
+               if (e != JIM_OK) {
+                       Jim_GetOpt_NvpUnknown(goi, nvp_config_opts, 0);
+                       return e;
+               }
+               switch (n->value) {
+               case CFG_CHAIN_POSITION: {
+                       Jim_Obj *o_t;
+                       e = Jim_GetOpt_Obj(goi, &o_t);
+                       if (e != JIM_OK)
+                               return e;
+                       tap = jtag_tap_by_jim_obj(goi->interp, o_t);
+                       if (tap == NULL) {
+                               Jim_SetResultString(goi->interp, 
"-chain-position is invalid", -1);
+                               return JIM_ERR;
+                       }
+                       /* loop for more */
+                       break;
+               }
+               default:
+                       break;
+               }
+       }
+
+       if (tap == NULL) {
+               Jim_SetResultString(goi->interp, "-chain-position required when 
creating DAP", -1);
+               return JIM_ERR;
+       }
+
+       dap_instance_init(&dap->dap);
+       tap->dap = &dap->dap;
+       dap->dap.tap = tap;
+
+       return JIM_OK;
+}
+
+static int dap_create(Jim_GetOptInfo *goi)
+{
+       struct command_context *cmd_ctx;
+       static struct arm_dap_object *dap;
+       Jim_Obj *new_cmd;
+       Jim_Cmd *cmd;
+       const char *cp;
+       int e;
+
+       cmd_ctx = current_command_context(goi->interp);
+       assert(cmd_ctx != NULL);
+
+       if (goi->argc < 3) {
+               Jim_WrongNumArgs(goi->interp, 1, goi->argv, "?name? 
..options...");
+               return JIM_ERR;
+       }
+       /* COMMAND */
+       Jim_GetOpt_Obj(goi, &new_cmd);
+       /* does this command exist? */
+       cmd = Jim_GetCommand(goi->interp, new_cmd, JIM_ERRMSG);
+       if (cmd) {
+               cp = Jim_GetString(new_cmd, NULL);
+               Jim_SetResultFormatted(goi->interp, "Command: %s Exists", cp);
+               return JIM_ERR;
+       }
+
+       /* Create it */
+       dap = calloc(1, sizeof(struct arm_dap_object));
+       if (dap == NULL)
+               return JIM_ERR;
+
+       e = dap_configure(goi, dap);
+       if (e != JIM_OK) {
+               free(dap);
+               return e;
+       }
+
+       cp = Jim_GetString(new_cmd, NULL);
+       dap->name = strdup(cp);
+
+       /* now - create the new dap name command */
+       const struct command_registration dap_subcommands[] = {
+               {
+                       .chain = dap_instance_commands,
+               },
+               COMMAND_REGISTRATION_DONE
+       };
+       const struct command_registration dap_commands[] = {
+               {
+                       .name = cp,
+                       .mode = COMMAND_ANY,
+                       .help = "dap instance command group",
+                       .usage = "",
+                       .chain = dap_subcommands,
+               },
+               COMMAND_REGISTRATION_DONE
+       };
+       e = register_commands(cmd_ctx, NULL, dap_commands);
+       if (ERROR_OK != e)
+               return JIM_ERR;
+
+       struct command *c = command_find_in_context(cmd_ctx, cp);
+       assert(c);
+       command_set_handler_data(c, dap);
+
+       list_add_tail(&dap->lh, &all_dap);
+
+       return (ERROR_OK == e) ? JIM_OK : JIM_ERR;
+}
+
+static int jim_dap_create(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+       Jim_GetOptInfo goi;
+       Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
+       if (goi.argc < 2) {
+               Jim_WrongNumArgs(goi.interp, goi.argc, goi.argv,
+                       "<name> [<dap_options> ...]");
+               return JIM_ERR;
+       }
+       return dap_create(&goi);
+}
+
+static int jim_dap_names(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+       struct arm_dap_object *obj;
+
+       if (argc != 1) {
+               Jim_WrongNumArgs(interp, 1, argv, "Too many parameters");
+               return JIM_ERR;
+       }
+       Jim_SetResult(interp, Jim_NewListObj(interp, NULL, 0));
+       list_for_each_entry(obj, &all_dap, lh) {
+               Jim_ListAppendElement(interp, Jim_GetResult(interp),
+                       Jim_NewStringObj(interp, obj->name, -1));
+       }
+       return JIM_OK;
+}
+
+
+static const struct command_registration dap_subcommand_handlers[] = {
+       {
+               .name = "create",
+               .mode = COMMAND_ANY,
+               .jim_handler = jim_dap_create,
+               .usage = "name '-chain-position' name [options ...]",
+               .help = "Creates a new DAP object",
+       },
+       {
+               .name = "names",
+               .mode = COMMAND_ANY,
+               .jim_handler = jim_dap_names,
+               .usage = "",
+               .help = "Lists all registered DAP objects by name",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+
+static const struct command_registration dap_commands[] = {
+       {
+               .name = "dap",
+               .mode = COMMAND_CONFIG,
+               .help = "DAP commands",
+               .chain = dap_subcommand_handlers,
+       },
+       COMMAND_REGISTRATION_DONE
+};
+
+int dap_register_commands(struct command_context *cmd_ctx)
+{
+       return register_commands(cmd_ctx, NULL, dap_commands);
+}
diff --git a/src/target/armv8.c b/src/target/armv8.c
index b88f37d..3321dd6 100644
--- a/src/target/armv8.c
+++ b/src/target/armv8.c
@@ -1609,13 +1609,9 @@ struct reg *armv8_reg_current(struct arm *arm, unsigned 
regnum)
 }
 
 const struct command_registration armv8_command_handlers[] = {
-       {
-               .chain = dap_command_handlers,
-       },
        COMMAND_REGISTRATION_DONE
 };
 
-
 int armv8_get_gdb_reg_list(struct target *target,
        struct reg **reg_list[], int *reg_list_size,
        enum target_register_class reg_class)
diff --git a/tcl/target/hi6220.cfg b/tcl/target/hi6220.cfg
index 13d8586..4d27f65 100644
--- a/tcl/target/hi6220.cfg
+++ b/tcl/target/hi6220.cfg
@@ -16,7 +16,10 @@ if { [info exists DAP_TAPID] } {
 }
 
 # declare the one JTAG tap to access the DAP
-jtag newtap $_CHIPNAME dap -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 
$_DAP_TAPID -ignore-version -enable
+jtag newtap $_CHIPNAME tap -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 
$_DAP_TAPID -ignore-version
+
+# create the DAP
+dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.tap
 
 # declare the 8 main application cores
 set _TARGETNAME $_CHIPNAME.cpu
@@ -34,10 +37,10 @@ set $_TARGETNAME.cti(7) 0x801DB000
 set _cores 8
 for { set _core 0 } { $_core < $_cores } { incr _core 1 } {
 
-    cti create cti$_core -chain-position $_CHIPNAME.dap -ctibase [set 
$_TARGETNAME.cti($_core)] -ap-num 0
+    cti create cti$_core -dap $_CHIPNAME.dap -ctibase [set 
$_TARGETNAME.cti($_core)] -ap-num 0
 
     set _command "target create ${_TARGETNAME}$_core aarch64 \
-                         -chain-position $_CHIPNAME.dap -coreid $_core -cti 
cti$_core"
+                         -dap $_CHIPNAME.dap -coreid $_core -cti cti$_core"
 
     if { $_core != 0 } {
         # non-boot core examination may fail
@@ -54,10 +57,10 @@ for { set _core 0 } { $_core < $_cores } { incr _core 1 } {
 
 eval $_smp_command
 
-cti create cti.sys -chain-position hi6220.dap -ap-num 0 -ctibase 0x80003000
+cti create cti.sys -dap $_CHIPNAME.dap -ap-num 0 -ctibase 0x80003000
 
 # declare the auxiliary Cortex-M3 core on AP #2 (runs mcuimage.bin)
-target create ${_TARGETNAME}.m3 cortex_m -chain-position $_CHIPNAME.dap 
-ap-num 2 -defer-examine
+# target create ${_TARGETNAME}.m3 cortex_m -dap $_CHIPNAME.dap -ap-num 2 
-defer-examine
 
 # declare the auxiliary Cortex-A7 core
-target create ${_TARGETNAME}.a7 cortex_a -chain-position $_CHIPNAME.dap 
-dbgbase 0x80210000 -defer-examine
+# target create ${_TARGETNAME}.a7 cortex_a -dap $_CHIPNAME.dap -dbgbase 
0x80210000 -defer-examine
diff --git a/tcl/target/xilinx_ultrascale.cfg b/tcl/target/xilinx_ultrascale.cfg
index 9be198d..9056c97 100644
--- a/tcl/target/xilinx_ultrascale.cfg
+++ b/tcl/target/xilinx_ultrascale.cfg
@@ -17,7 +17,8 @@ if { [info exists DAP_TAPID] } {
     set _DAP_TAPID 0x5ba00477
 }
 
-jtag newtap $_CHIPNAME dap -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 
$_DAP_TAPID
+jtag newtap $_CHIPNAME tap -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 
$_DAP_TAPID
+dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.tap
 
 #
 # PS tap
@@ -53,6 +54,7 @@ jtag configure $_CHIPNAME.ps -event setup {
 
 set _TARGETNAME $_CHIPNAME.a53
 set _CTINAME $_CHIPNAME.cti
+set _smp_command ""
 
 set DBGBASE {0x80410000 0x80510000 0x80610000 0x80710000}
 set CTIBASE {0x80420000 0x80520000 0x80620000 0x80720000}
@@ -60,10 +62,10 @@ set _cores 4
 
 for { set _core 0 } { $_core < $_cores } { incr _core } {
 
-    cti create $_CTINAME.$_core -chain-position $_CHIPNAME.dap -ap-num 1 \
+    cti create $_CTINAME.$_core -dap $_CHIPNAME.dap -ap-num 1 \
         -ctibase [lindex $CTIBASE $_core]
 
-    set _command "target create $_TARGETNAME.$_core aarch64 -chain-position 
$_CHIPNAME.dap \
+    set _command "target create $_TARGETNAME.$_core aarch64 -dap 
$_CHIPNAME.dap \
         -dbgbase [lindex $DBGBASE $_core] -cti $_CTINAME.$_core"
 
     if { $_core != 0 } {

-- 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to