diff options
author | Spencer Oliver <spen@spen-soft.co.uk> | 2012-11-13 12:01:35 +0000 |
---|---|---|
committer | Freddie Chopin <freddie.chopin@gmail.com> | 2012-12-10 16:17:25 +0000 |
commit | 2d75ff3151ab659f3cd10a7dd7b0aef54d041e5e (patch) | |
tree | 0e3b74a2e243716200c16830cf05b14b4cfa459a | |
parent | 67a848424b94a2508a81f651adf32b279fa79b11 (diff) |
stlink: enable connect under reset
Currently if the target supports srst_nogate we wait until target assert_reset
until we get a chance to assert the srst.
However sometimes we will not get this far if the target has already failed
the initial scan.
This has been tested on stm32.
Change-Id: I2c4486942a011534d3e2044788563669bf457b60
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/972
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
Tested-by: jenkins
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
-rw-r--r-- | src/jtag/stlink/stlink_interface.c | 21 | ||||
-rw-r--r-- | src/jtag/stlink/stlink_interface.h | 1 | ||||
-rw-r--r-- | src/jtag/stlink/stlink_transport.c | 7 |
3 files changed, 27 insertions, 2 deletions
diff --git a/src/jtag/stlink/stlink_interface.c b/src/jtag/stlink/stlink_interface.c index c06d86cf..15574dd3 100644 --- a/src/jtag/stlink/stlink_interface.c +++ b/src/jtag/stlink/stlink_interface.c @@ -43,7 +43,11 @@ int stlink_interface_open(enum stlink_transports tr) /* set transport mode */ stlink_if.param.transport = tr; - return stlink_if.layout->open(&stlink_if); + int result = stlink_if.layout->open(&stlink_if); + if (result != ERROR_OK) + return result; + + return stlink_interface_init_reset(); } int stlink_interface_init_target(struct target *t) @@ -127,6 +131,21 @@ static int stlink_interface_execute_queue(void) return ERROR_OK; } +int stlink_interface_init_reset(void) +{ + enum reset_types jtag_reset_config = jtag_get_reset_config(); + + if (jtag_reset_config & RESET_CNCT_UNDER_SRST) { + if (jtag_reset_config & RESET_SRST_NO_GATING) { + jtag_add_reset(0, 1); + stlink_if.layout->api->assert_srst(stlink_if.fd, 0); + } else + LOG_WARNING("\'srst_nogate\' reset_config option is required"); + } + + return ERROR_OK; +} + COMMAND_HANDLER(stlink_interface_handle_device_desc_command) { LOG_DEBUG("stlink_interface_handle_device_desc_command"); diff --git a/src/jtag/stlink/stlink_interface.h b/src/jtag/stlink/stlink_interface.h index ee2fefff..1bb33d5b 100644 --- a/src/jtag/stlink/stlink_interface.h +++ b/src/jtag/stlink/stlink_interface.h @@ -56,5 +56,6 @@ struct stlink_interface_s { int stlink_interface_open(enum stlink_transports tr); /** */ int stlink_interface_init_target(struct target *t); +int stlink_interface_init_reset(void); #endif diff --git a/src/jtag/stlink/stlink_transport.c b/src/jtag/stlink/stlink_transport.c index dc3c6810..d83496af 100644 --- a/src/jtag/stlink/stlink_transport.c +++ b/src/jtag/stlink/stlink_transport.c @@ -39,6 +39,11 @@ COMMAND_HANDLER(stlink_transport_jtag_command) return ERROR_OK; } +COMMAND_HANDLER(stlink_transport_reset_command) +{ + return stlink_interface_init_reset(); +} + static const struct command_registration stlink_transport_stlink_subcommand_handlers[] = { { @@ -71,7 +76,7 @@ stlink_transport_jtag_subcommand_handlers[] = { { .name = "arp_init-reset", .mode = COMMAND_ANY, - .handler = stlink_transport_jtag_command, + .handler = stlink_transport_reset_command, .usage = "" }, { |