aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSpencer Oliver <spen@spen-soft.co.uk>2012-11-13 12:01:35 +0000
committerFreddie Chopin <freddie.chopin@gmail.com>2012-12-10 16:17:25 +0000
commit2d75ff3151ab659f3cd10a7dd7b0aef54d041e5e (patch)
tree0e3b74a2e243716200c16830cf05b14b4cfa459a /src
parent67a848424b94a2508a81f651adf32b279fa79b11 (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>
Diffstat (limited to 'src')
-rw-r--r--src/jtag/stlink/stlink_interface.c21
-rw-r--r--src/jtag/stlink/stlink_interface.h1
-rw-r--r--src/jtag/stlink/stlink_transport.c7
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 = ""
},
{