This is an automated email from Gerrit. Paul Fertser ([email protected]) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/1664
-- gerrit commit 02163928ef0ea5d845850b32d081ec2a65cc3064 Author: Paul Fertser <[email protected]> Date: Sat Sep 28 14:23:15 2013 +0400 [RFC] Allow transports to override the selected target This should allow to share common configs for both regular access and high-level adapters. Is this direction viable? I haven't tested it on real hardware yet, but so far it looks like less of a kludge than the current dual configs deal. I might be missing something obvious though. Change-Id: Ibb88266a4ca25f06f6c073e916c963f017447bad Signed-off-by: Paul Fertser <[email protected]> diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c index 31f08cb..ffd9018 100644 --- a/src/jtag/drivers/stlink_usb.c +++ b/src/jtag/drivers/stlink_usb.c @@ -1589,6 +1589,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; @@ -1809,5 +1815,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 0d7d943..f06be9b 100644 --- a/src/jtag/drivers/ti_icdi_usb.c +++ b/src/jtag/drivers/ti_icdi_usb.c @@ -646,6 +646,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; @@ -773,5 +778,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 0176a48..063f5a4 100644 --- a/src/jtag/hla/hla_interface.c +++ b/src/jtag/hla/hla_interface.c @@ -141,6 +141,18 @@ int hl_interface_init_reset(void) 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"); diff --git a/src/jtag/hla/hla_interface.h b/src/jtag/hla/hla_interface.h index fcf1d9e..5e4eaaa 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 d7b5d93..d7b503f 100644 --- a/src/jtag/hla/hla_layout.h +++ b/src/jtag/hla/hla_layout.h @@ -65,6 +65,8 @@ struct hl_layout_api_s { /** */ int (*idcode) (void *fd, uint32_t *idcode); /** */ + 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 7bfa6a6..f603afa 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..50c04b7 100644 --- a/src/jtag/hla/hla_transport.c +++ b/src/jtag/hla/hla_transport.c @@ -48,7 +48,13 @@ COMMAND_HANDLER(hl_transport_reset_command) } static const struct command_registration -hl_transport_stlink_subcommand_handlers[] = { +hl_transport_jtag_subcommand_handlers[] = { + { + .name = "init", + .mode = COMMAND_ANY, + .handler = hl_transport_jtag_command, + .usage = "" + }, { .name = "newtap", .mode = COMMAND_CONFIG, @@ -58,18 +64,6 @@ hl_transport_stlink_subcommand_handlers[] = { .usage = "basename tap_type '-irlen' count " "['-expected_id' number] ", }, - - COMMAND_REGISTRATION_DONE -}; - -static const struct command_registration -hl_transport_jtag_subcommand_handlers[] = { - { - .name = "init", - .mode = COMMAND_ANY, - .handler = hl_transport_jtag_command, - .usage = "" - }, { .name = "arp_init", .mode = COMMAND_ANY, @@ -120,19 +114,17 @@ hl_transport_jtag_subcommand_handlers[] = { }; static const struct command_registration stlink_transport_command_handlers[] = { - { - .name = "hla", + .name = "jtag", .mode = COMMAND_ANY, - .help = "perform hl adapter actions", .usage = "", - .chain = hl_transport_stlink_subcommand_handlers, + .chain = hl_transport_jtag_subcommand_handlers, }, { - .name = "jtag", + .name = "jtag_ntrst_delay", .mode = COMMAND_ANY, + .handler = hl_transport_jtag_command, .usage = "", - .chain = hl_transport_jtag_subcommand_handlers, }, COMMAND_REGISTRATION_DONE }; @@ -204,12 +196,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 0eb5788..4be7982 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 @@ -4971,6 +4972,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 a7a73d1..d255a4f 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/target/stellaris.cfg b/tcl/target/stellaris.cfg index 9804bde..78a9451 100644 --- a/tcl/target/stellaris.cfg +++ b/tcl/target/stellaris.cfg @@ -12,6 +12,9 @@ if { [info exists DEVICECLASS] } { set _DEVICECLASS 0xff } +global _TRANSPORT +set _TRANSPORT [ transport select ] + # Luminary chips support both JTAG and SWD transports. # Adapt based on what transport is active. source [find target/swj-dp.tcl] @@ -146,7 +149,7 @@ $_TARGETNAME configure -event reset-start { # /openocd-development/2008-August/003065.html # - global _DEVICECLASS + global _DEVICECLASS _TRANSPORT if {$_DEVICECLASS != 0xff} { set device_class $_DEVICECLASS @@ -156,13 +159,16 @@ $_TARGETNAME configure -event reset-start { if {$device_class == 0 || $device_class == 1 || $device_class == 3 || $device_class == 5} { - # Sandstorm, Fury, DustDevil and Blizzard are able to use NVIC SYSRESETREQ - cortex_m reset_config sysresetreq + if { [ string first "hla" $_TRANSPORT] == -1 } { + # Sandstorm, Fury, DustDevil and Blizzard are able to use NVIC SYSRESETREQ + cortex_m reset_config sysresetreq + } } else { - # Tempest and Firestorm default to using NVIC VECTRESET - # peripherals will need reseting manually, see proc reset_peripherals - cortex_m reset_config vectreset - + if { [ string first "hla" $_TRANSPORT] == -1 } { + # Tempest and Firestorm default to using NVIC VECTRESET + # peripherals will need reseting manually, see proc reset_peripherals + cortex_m reset_config vectreset + } # reset peripherals, based on code in # http://www.ti.com/lit/er/spmz573a/spmz573a.pdf reset_peripherals $device_class diff --git a/tcl/target/stm32f1x.cfg b/tcl/target/stm32f1x.cfg index 12d33d5..8076d7c 100644 --- a/tcl/target/stm32f1x.cfg +++ b/tcl/target/stm32f1x.cfg @@ -20,19 +20,27 @@ if { [info exists WORKAREASIZE] } { set _WORKAREASIZE 0x1000 } +set _TRANSPORT [ transport select ] + # JTAG speed should be <= F_CPU/6. F_CPU after reset is 8MHz, so use F_JTAG = 1MHz adapter_khz 1000 adapter_nsrst_delay 100 -jtag_ntrst_delay 100 +if { [ string last "swd" $_TRANSPORT] == -1 } { + jtag_ntrst_delay 100 +} #jtag scan chain if { [info exists CPUTAPID] } { set _CPUTAPID $CPUTAPID } else { - # See STM Document RM0008 - # Section 26.6.3 - set _CPUTAPID 0x3ba00477 + if { [ string last "swd" $_TRANSPORT] == -1 } { + # See STM Document RM0008 Section 26.6.3 + set _CPUTAPID 0x3ba00477 + } { + # this is the SW-DP tap id not the jtag tap id + set _CPUTAPID 0x1ba01477 + } } jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID @@ -76,6 +84,8 @@ $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE set _FLASHNAME $_CHIPNAME.flash flash bank $_FLASHNAME stm32f1x 0x08000000 0 0 0 $_TARGETNAME -# if srst is not fitted use SYSRESETREQ to -# perform a soft reset -cortex_m reset_config sysresetreq +if { [ string first "hla" $_TRANSPORT] == -1 } { + # if srst is not fitted use SYSRESETREQ to + # perform a soft reset + cortex_m reset_config sysresetreq +} -- ------------------------------------------------------------------------------ October Webinars: Code for Performance Free Intel webinars can help you accelerate application performance. Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from the latest Intel processors and coprocessors. See abstracts and register > http://pubads.g.doubleclick.net/gampad/clk?id=60133471&iu=/4140/ostg.clktrk _______________________________________________ OpenOCD-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openocd-devel
