aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Fertser <fercerpav@gmail.com>2013-09-28 14:23:15 +0400
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>2014-08-11 21:25:56 +0000
commitc7384117c66e8f18896ca09ab8095d6da16bb1e5 (patch)
tree2513a1c61d2d8c6d92171a238281189ca3962f4a /src
parentf701c0cbeb346df4cda378d3b4d5136aabba3b37 (diff)
downloadriscv-openocd-c7384117c66e8f18896ca09ab8095d6da16bb1e5.zip
riscv-openocd-c7384117c66e8f18896ca09ab8095d6da16bb1e5.tar.gz
riscv-openocd-c7384117c66e8f18896ca09ab8095d6da16bb1e5.tar.bz2
Allow transports to override the selected target (hla configs unification)
This should allow to share common configs for both regular access and high-level adapters. Use the newly-added functionality in stlink and icdi drivers, amend the configs accordingly. Runtime-tested with a TI tm4c123g board. Change-Id: Ibb88266a4ca25f06f6c073e916c963f017447bad Signed-off-by: Paul Fertser <fercerpav@gmail.com> [gus@projectgus.com: context-specific deprecation warnings] Signed-off-by: Angus Gratton <gus@projectgus.com> [andrew.smirnov@gmail.com: additional nrf51.cfg mods] Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Tested-by: Andrey Skvortsov <andrej.skvortzov@gmail.com> Reviewed-on: http://openocd.zylin.com/1664 Tested-by: jenkins Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/jtag/drivers/stlink_usb.c10
-rw-r--r--src/jtag/drivers/ti_icdi_usb.c8
-rw-r--r--src/jtag/hla/hla_interface.c32
-rw-r--r--src/jtag/hla/hla_interface.h1
-rw-r--r--src/jtag/hla/hla_layout.h4
-rw-r--r--src/jtag/hla/hla_tcl.c24
-rw-r--r--src/jtag/hla/hla_transport.c8
-rw-r--r--src/target/target.c10
-rw-r--r--src/transport/transport.h8
9 files changed, 99 insertions, 6 deletions
diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index 5574a40..fd5f283 100644
--- a/src/jtag/drivers/stlink_usb.c
+++ b/src/jtag/drivers/stlink_usb.c
@@ -1571,6 +1571,12 @@ static int stlink_usb_write_mem(void *handle, uint32_t addr, uint32_t size,
}
/** */
+static int stlink_usb_override_target(const char *targetname)
+{
+ return !strcmp(targetname, "cortex_m");
+}
+
+/** */
static int stlink_usb_close(void *fd)
{
struct stlink_usb_handle_s *h = fd;
@@ -1798,5 +1804,7 @@ struct hl_layout_api_s stlink_usb_layout_api = {
/** */
.write_mem = stlink_usb_write_mem,
/** */
- .write_debug_reg = stlink_usb_write_debug_reg
+ .write_debug_reg = stlink_usb_write_debug_reg,
+ /** */
+ .override_target = stlink_usb_override_target,
};
diff --git a/src/jtag/drivers/ti_icdi_usb.c b/src/jtag/drivers/ti_icdi_usb.c
index 20b3081..2f4af7a 100644
--- a/src/jtag/drivers/ti_icdi_usb.c
+++ b/src/jtag/drivers/ti_icdi_usb.c
@@ -645,6 +645,11 @@ static int icdi_usb_write_mem(void *handle, uint32_t addr, uint32_t size,
return retval;
}
+static int icdi_usb_override_target(const char *targetname)
+{
+ return !strcmp(targetname, "cortex_m");
+}
+
static int icdi_usb_close(void *handle)
{
struct icdi_usb_handle_s *h = handle;
@@ -770,5 +775,6 @@ struct hl_layout_api_s icdi_usb_layout_api = {
.write_reg = icdi_usb_write_reg,
.read_mem = icdi_usb_read_mem,
.write_mem = icdi_usb_write_mem,
- .write_debug_reg = icdi_usb_write_debug_reg
+ .write_debug_reg = icdi_usb_write_debug_reg,
+ .override_target = icdi_usb_override_target,
};
diff --git a/src/jtag/hla/hla_interface.c b/src/jtag/hla/hla_interface.c
index a33be54..964b074 100644
--- a/src/jtag/hla/hla_interface.c
+++ b/src/jtag/hla/hla_interface.c
@@ -145,6 +145,35 @@ int hl_interface_init_reset(void)
return ERROR_OK;
}
+static int dummy_khz(int khz, int *jtag_speed)
+{
+ *jtag_speed = khz;
+ return ERROR_OK;
+}
+
+static int dummy_speed_div(int speed, int *khz)
+{
+ *khz = speed;
+ return ERROR_OK;
+}
+
+static int dummy_speed(int speed)
+{
+ return ERROR_OK;
+}
+
+int hl_interface_override_target(const char **targetname)
+{
+ if (hl_if.layout->api->override_target) {
+ if (hl_if.layout->api->override_target(*targetname)) {
+ *targetname = "hla_target";
+ return ERROR_OK;
+ } else
+ return ERROR_FAIL;
+ }
+ return ERROR_FAIL;
+}
+
COMMAND_HANDLER(hl_interface_handle_device_desc_command)
{
LOG_DEBUG("hl_interface_handle_device_desc_command");
@@ -286,4 +315,7 @@ struct jtag_interface hl_interface = {
.init = hl_interface_init,
.quit = hl_interface_quit,
.execute_queue = hl_interface_execute_queue,
+ .speed = &dummy_speed,
+ .khz = &dummy_khz,
+ .speed_div = &dummy_speed_div,
};
diff --git a/src/jtag/hla/hla_interface.h b/src/jtag/hla/hla_interface.h
index 13c169f..f83269b 100644
--- a/src/jtag/hla/hla_interface.h
+++ b/src/jtag/hla/hla_interface.h
@@ -67,5 +67,6 @@ int hl_interface_open(enum hl_transports tr);
int hl_interface_init_target(struct target *t);
int hl_interface_init_reset(void);
+int hl_interface_override_target(const char **targetname);
#endif /* _HL_INTERFACE */
diff --git a/src/jtag/hla/hla_layout.h b/src/jtag/hla/hla_layout.h
index 9a991b6..6d79d58 100644
--- a/src/jtag/hla/hla_layout.h
+++ b/src/jtag/hla/hla_layout.h
@@ -74,7 +74,9 @@ struct hl_layout_api_s {
*/
int (*idcode) (void *handle, uint32_t *idcode);
/** */
- enum target_state (*state) (void *handle);
+ int (*override_target) (const char *targetname);
+ /** */
+ enum target_state (*state) (void *fd);
};
/** */
diff --git a/src/jtag/hla/hla_tcl.c b/src/jtag/hla/hla_tcl.c
index 88cfc59..20082f3 100644
--- a/src/jtag/hla/hla_tcl.c
+++ b/src/jtag/hla/hla_tcl.c
@@ -59,7 +59,13 @@ static int jim_newtap_expected_id(Jim_Nvp *n, Jim_GetOptInfo *goi,
return JIM_OK;
}
-#define NTAP_OPT_EXPECTED_ID 0
+#define NTAP_OPT_IRLEN 0
+#define NTAP_OPT_IRMASK 1
+#define NTAP_OPT_IRCAPTURE 2
+#define NTAP_OPT_ENABLED 3
+#define NTAP_OPT_DISABLED 4
+#define NTAP_OPT_EXPECTED_ID 5
+#define NTAP_OPT_VERSION 6
static int jim_hl_newtap_cmd(Jim_GetOptInfo *goi)
{
@@ -69,8 +75,14 @@ static int jim_hl_newtap_cmd(Jim_GetOptInfo *goi)
Jim_Nvp *n;
char *cp;
const Jim_Nvp opts[] = {
- {.name = "-expected-id", .value = NTAP_OPT_EXPECTED_ID},
- {.name = NULL, .value = -1},
+ { .name = "-irlen", .value = NTAP_OPT_IRLEN },
+ { .name = "-irmask", .value = NTAP_OPT_IRMASK },
+ { .name = "-ircapture", .value = NTAP_OPT_IRCAPTURE },
+ { .name = "-enable", .value = NTAP_OPT_ENABLED },
+ { .name = "-disable", .value = NTAP_OPT_DISABLED },
+ { .name = "-expected-id", .value = NTAP_OPT_EXPECTED_ID },
+ { .name = "-ignore-version", .value = NTAP_OPT_VERSION },
+ { .name = NULL, .value = -1},
};
pTap = calloc(1, sizeof(struct jtag_tap));
@@ -121,6 +133,12 @@ static int jim_hl_newtap_cmd(Jim_GetOptInfo *goi)
return e;
}
break;
+ case NTAP_OPT_IRLEN:
+ case NTAP_OPT_IRMASK:
+ case NTAP_OPT_IRCAPTURE:
+ /* dummy read to ignore the next argument */
+ Jim_GetOpt_Wide(goi, NULL);
+ break;
} /* switch (n->value) */
} /* while (goi->argc) */
diff --git a/src/jtag/hla/hla_transport.c b/src/jtag/hla/hla_transport.c
index e3c003d..ae7cbb1 100644
--- a/src/jtag/hla/hla_transport.c
+++ b/src/jtag/hla/hla_transport.c
@@ -134,6 +134,12 @@ static const struct command_registration stlink_transport_command_handlers[] = {
.usage = "",
.chain = hl_transport_jtag_subcommand_handlers,
},
+ {
+ .name = "jtag_ntrst_delay",
+ .mode = COMMAND_ANY,
+ .handler = hl_transport_jtag_command,
+ .usage = "",
+ },
COMMAND_REGISTRATION_DONE
};
@@ -204,12 +210,14 @@ static struct transport hl_swd_transport = {
.name = "hla_swd",
.select = hl_transport_select,
.init = hl_transport_init,
+ .override_target = hl_interface_override_target,
};
static struct transport hl_jtag_transport = {
.name = "hla_jtag",
.select = hl_transport_select,
.init = hl_transport_init,
+ .override_target = hl_interface_override_target,
};
static struct transport stlink_swim_transport = {
diff --git a/src/target/target.c b/src/target/target.c
index 151e8a3..92411c8 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -55,6 +55,7 @@
#include "trace.h"
#include "image.h"
#include "rtos/rtos.h"
+#include "transport/transport.h"
/* default halt wait timeout (ms) */
#define DEFAULT_HALT_TIMEOUT 5000
@@ -5066,6 +5067,15 @@ static int target_create(Jim_GetOptInfo *goi)
if (e != JIM_OK)
return e;
cp = cp2;
+ struct transport *tr = get_current_transport();
+ if (tr->override_target) {
+ e = tr->override_target(&cp);
+ if (e != ERROR_OK) {
+ LOG_ERROR("The selected transport doesn't support this target");
+ return JIM_ERR;
+ }
+ LOG_INFO("The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD");
+ }
/* now does target type exist */
for (x = 0 ; target_types[x] ; x++) {
if (0 == strcmp(cp, target_types[x]->name)) {
diff --git a/src/transport/transport.h b/src/transport/transport.h
index afb7b12..daf4960 100644
--- a/src/transport/transport.h
+++ b/src/transport/transport.h
@@ -66,6 +66,14 @@ struct transport {
int (*init)(struct command_context *ctx);
/**
+ * Optional. If defined, allows transport to override target
+ * name prior to initialisation.
+ *
+ * @returns ERROR_OK on success, or an error code on failure.
+ */
+ int (*override_target)(const char **targetname);
+
+ /**
* Transports are stored in a singly linked list.
*/
struct transport *next;