diff options
author | Paul Fertser <fercerpav@gmail.com> | 2013-09-28 14:23:15 +0400 |
---|---|---|
committer | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2014-08-11 21:25:56 +0000 |
commit | c7384117c66e8f18896ca09ab8095d6da16bb1e5 (patch) | |
tree | 2513a1c61d2d8c6d92171a238281189ca3962f4a | |
parent | f701c0cbeb346df4cda378d3b4d5136aabba3b37 (diff) |
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>
67 files changed, 487 insertions, 594 deletions
diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c index 5574a40b..fd5f2834 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 20b30817..2f4af7a4 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 a33be54b..964b0744 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 13c169f2..f83269bf 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 9a991b65..6d79d581 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 88cfc590..20082f38 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 e3c003dc..ae7cbb1a 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 151e8a37..92411c8c 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 afb7b125..daf49604 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; diff --git a/tcl/board/ek-lm4f120xl.cfg b/tcl/board/ek-lm4f120xl.cfg index aa6935c9..b2ebfa8c 100644 --- a/tcl/board/ek-lm4f120xl.cfg +++ b/tcl/board/ek-lm4f120xl.cfg @@ -10,6 +10,8 @@ # source [find interface/ti-icdi.cfg] +transport select hla_jtag + set WORKAREASIZE 0x8000 set CHIPNAME lm4f120h5qr -source [find target/stellaris_icdi.cfg] +source [find target/stellaris.cfg] diff --git a/tcl/board/ek-lm4f232.cfg b/tcl/board/ek-lm4f232.cfg index ebbc01d3..2e3fc7ca 100644 --- a/tcl/board/ek-lm4f232.cfg +++ b/tcl/board/ek-lm4f232.cfg @@ -10,6 +10,8 @@ # source [find interface/ti-icdi.cfg] +transport select hla_jtag + set WORKAREASIZE 0x8000 set CHIPNAME lm4f23x -source [find target/stellaris_icdi.cfg] +source [find target/stellaris.cfg] diff --git a/tcl/board/ek-tm4c123gxl.cfg b/tcl/board/ek-tm4c123gxl.cfg index f7b7d9f7..4fc1050c 100644 --- a/tcl/board/ek-tm4c123gxl.cfg +++ b/tcl/board/ek-tm4c123gxl.cfg @@ -6,6 +6,8 @@ source [find interface/ti-icdi.cfg] +transport select hla_jtag + set WORKAREASIZE 0x8000 set CHIPNAME tm4c123gh6pm -source [find target/stellaris_icdi.cfg] +source [find target/stellaris.cfg] diff --git a/tcl/board/st_nucleo_f030r8.cfg b/tcl/board/st_nucleo_f030r8.cfg index 5589c9c0..5e1233f9 100644 --- a/tcl/board/st_nucleo_f030r8.cfg +++ b/tcl/board/st_nucleo_f030r8.cfg @@ -3,7 +3,9 @@ source [find interface/stlink-v2-1.cfg] -source [find target/stm32f0x_stlink.cfg] +transport select hla_swd + +source [find target/stm32f0x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/st_nucleo_f103rb.cfg b/tcl/board/st_nucleo_f103rb.cfg index 8876db78..d5024cc6 100644 --- a/tcl/board/st_nucleo_f103rb.cfg +++ b/tcl/board/st_nucleo_f103rb.cfg @@ -3,7 +3,9 @@ source [find interface/stlink-v2-1.cfg] -source [find target/stm32f1x_stlink.cfg] +transport select hla_swd + +source [find target/stm32f1x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/st_nucleo_f334r8.cfg b/tcl/board/st_nucleo_f334r8.cfg index e9540f1c..e0dfb689 100644 --- a/tcl/board/st_nucleo_f334r8.cfg +++ b/tcl/board/st_nucleo_f334r8.cfg @@ -3,7 +3,9 @@ source [find interface/stlink-v2-1.cfg] -source [find target/stm32f3x_stlink.cfg] +transport select hla_swd + +source [find target/stm32f3x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/st_nucleo_f401re.cfg b/tcl/board/st_nucleo_f401re.cfg index da84f143..728a1555 100644 --- a/tcl/board/st_nucleo_f401re.cfg +++ b/tcl/board/st_nucleo_f401re.cfg @@ -3,7 +3,9 @@ source [find interface/stlink-v2-1.cfg] -source [find target/stm32f4x_stlink.cfg] +transport select hla_swd + +source [find target/stm32f4x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm320518_eval_stlink.cfg b/tcl/board/stm320518_eval_stlink.cfg index 804ff2c3..0e2ac598 100644 --- a/tcl/board/stm320518_eval_stlink.cfg +++ b/tcl/board/stm320518_eval_stlink.cfg @@ -6,13 +6,15 @@ source [find interface/stlink-v2.cfg] +transport select hla_swd + # increase working area to 8KB set WORKAREASIZE 0x2000 # chip name set CHIPNAME STM32F051R8T6 -source [find target/stm32f0x_stlink.cfg] +source [find target/stm32f0x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm3220g_eval_stlink.cfg b/tcl/board/stm3220g_eval_stlink.cfg index 578a0e8a..55856cf0 100644 --- a/tcl/board/stm3220g_eval_stlink.cfg +++ b/tcl/board/stm3220g_eval_stlink.cfg @@ -6,13 +6,15 @@ source [find interface/stlink-v2.cfg] +transport select hla_swd + # increase working area to 128KB set WORKAREASIZE 0x20000 # chip name set CHIPNAME STM32F207IGH6 -source [find target/stm32f2x_stlink.cfg] +source [find target/stm32f2x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm3241g_eval_stlink.cfg b/tcl/board/stm3241g_eval_stlink.cfg index 4e3beb92..72b2d32c 100644 --- a/tcl/board/stm3241g_eval_stlink.cfg +++ b/tcl/board/stm3241g_eval_stlink.cfg @@ -6,13 +6,15 @@ source [find interface/stlink-v2.cfg] +transport select hla_swd + # increase working area to 128KB set WORKAREASIZE 0x20000 # chip name set CHIPNAME STM32F417IGH6 -source [find target/stm32f4x_stlink.cfg] +source [find target/stm32f4x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm32429i_eval_stlink.cfg b/tcl/board/stm32429i_eval_stlink.cfg index ad3ea808..117409aa 100644 --- a/tcl/board/stm32429i_eval_stlink.cfg +++ b/tcl/board/stm32429i_eval_stlink.cfg @@ -6,13 +6,15 @@ source [find interface/stlink-v2.cfg] +transport select hla_swd + # increase working area to 128KB set WORKAREASIZE 0x20000 # chip name set CHIPNAME STM32F429NIH6 -source [find target/stm32f4x_stlink.cfg] +source [find target/stm32f4x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm32439i_eval_stlink.cfg b/tcl/board/stm32439i_eval_stlink.cfg index 5b57e1a1..efc47f7d 100644 --- a/tcl/board/stm32439i_eval_stlink.cfg +++ b/tcl/board/stm32439i_eval_stlink.cfg @@ -6,13 +6,15 @@ source [find interface/stlink-v2.cfg] +transport select hla_swd + # increase working area to 128KB set WORKAREASIZE 0x20000 # chip name set CHIPNAME STM32F439NIH6 -source [find target/stm32f4x_stlink.cfg] +source [find target/stm32f4x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm32f0discovery.cfg b/tcl/board/stm32f0discovery.cfg index 678eea68..66086cdd 100644 --- a/tcl/board/stm32f0discovery.cfg +++ b/tcl/board/stm32f0discovery.cfg @@ -3,8 +3,10 @@ source [find interface/stlink-v2.cfg] +transport select hla_swd + set WORKAREASIZE 0x2000 -source [find target/stm32f0x_stlink.cfg] +source [find target/stm32f0x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm32f3discovery.cfg b/tcl/board/stm32f3discovery.cfg index 5fd59508..24a9261f 100644 --- a/tcl/board/stm32f3discovery.cfg +++ b/tcl/board/stm32f3discovery.cfg @@ -3,7 +3,9 @@ source [find interface/stlink-v2.cfg] -source [find target/stm32f3x_stlink.cfg] +transport select hla_swd + +source [find target/stm32f3x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm32f429discovery.cfg b/tcl/board/stm32f429discovery.cfg index 32c3a81f..220298ec 100644 --- a/tcl/board/stm32f429discovery.cfg +++ b/tcl/board/stm32f429discovery.cfg @@ -5,7 +5,9 @@ source [find interface/stlink-v2.cfg] -source [find target/stm32f4x_stlink.cfg] +transport select hla_swd + +source [find target/stm32f4x.cfg] # use hardware reset, connect under reset supported reset_config srst_only srst_nogate diff --git a/tcl/board/stm32f4discovery.cfg b/tcl/board/stm32f4discovery.cfg index ae54e18c..990ee328 100644 --- a/tcl/board/stm32f4discovery.cfg +++ b/tcl/board/stm32f4discovery.cfg @@ -3,7 +3,9 @@ source [find interface/stlink-v2.cfg] -source [find target/stm32f4x_stlink.cfg] +transport select hla_swd + +source [find target/stm32f4x.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm32ldiscovery.cfg b/tcl/board/stm32ldiscovery.cfg index 33181192..bb85a0bc 100644 --- a/tcl/board/stm32ldiscovery.cfg +++ b/tcl/board/stm32ldiscovery.cfg @@ -3,8 +3,10 @@ source [find interface/stlink-v2.cfg] +transport select hla_swd + set WORKAREASIZE 0x4000 -source [find target/stm32lx_stlink.cfg] +source [find target/stm32lx.cfg] # use hardware reset, connect under reset reset_config srst_only srst_nogate diff --git a/tcl/board/stm32vldiscovery.cfg b/tcl/board/stm32vldiscovery.cfg index 72182fa9..19b42aef 100644 --- a/tcl/board/stm32vldiscovery.cfg +++ b/tcl/board/stm32vldiscovery.cfg @@ -3,6 +3,8 @@ source [find interface/stlink-v1.cfg] |