aboutsummaryrefslogtreecommitdiff
path: root/src/jtag/core.c
diff options
context:
space:
mode:
authorSimon Qian <simonqian.openocd@gmail.com>2012-03-17 15:21:59 +0800
committerSpencer Oliver <spen@spen-soft.co.uk>2012-04-10 12:14:00 +0000
commit7743e0fb4390d09c315ce9c6edbb2c3ba6b8c2d9 (patch)
treefcd0917e249482eff2ddbe4b246a1f29a504d93a /src/jtag/core.c
parenta2935397b48ce2a1bbb8e49258b340479e0b9c8e (diff)
topic: add reset functions for SWD
Add swd_init_reset and swd_add_reset. Add adapter_assert_reset and adapter_deassert_reset, and call them instead of JTAG reset functions. Change-Id: Ib2551c6fbb45513e0ae0dc331cfe3ee3f922298a Signed-off-by: Simon Qian <simonqian.openocd@gmail.com> Reviewed-on: http://openocd.zylin.com/526 Tested-by: jenkins Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com> Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/jtag/core.c')
-rw-r--r--src/jtag/core.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/jtag/core.c b/src/jtag/core.c
index a36345b7..99a9eb75 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -33,6 +33,7 @@
#endif
#include "jtag.h"
+#include "swd.h"
#include "interface.h"
#include <transport/transport.h>
@@ -606,6 +607,46 @@ void jtag_add_clocks(int num_cycles)
}
}
+void swd_add_reset(int req_srst)
+{
+ if (req_srst) {
+ if (!(jtag_reset_config & RESET_HAS_SRST)) {
+ LOG_ERROR("BUG: can't assert SRST");
+ jtag_set_error(ERROR_FAIL);
+ return;
+ }
+ req_srst = 1;
+ }
+
+ /* Maybe change SRST signal state */
+ if (jtag_srst != req_srst) {
+ int retval;
+
+ retval = interface_jtag_add_reset(0, req_srst);
+ if (retval != ERROR_OK)
+ jtag_set_error(retval);
+ else
+ retval = jtag_execute_queue();
+
+ if (retval != ERROR_OK) {
+ LOG_ERROR("TRST/SRST error");
+ return;
+ }
+
+ /* SRST resets everything hooked up to that signal */
+ jtag_srst = req_srst;
+ if (jtag_srst) {
+ LOG_DEBUG("SRST line asserted");
+ if (adapter_nsrst_assert_width)
+ jtag_add_sleep(adapter_nsrst_assert_width * 1000);
+ } else {
+ LOG_DEBUG("SRST line released");
+ if (adapter_nsrst_delay)
+ jtag_add_sleep(adapter_nsrst_delay * 1000);
+ }
+ }
+}
+
void jtag_add_reset(int req_tlr_or_trst, int req_srst)
{
int trst_with_tlr = 0;
@@ -1455,6 +1496,20 @@ int adapter_quit(void)
return ERROR_OK;
}
+int swd_init_reset(struct command_context *cmd_ctx)
+{
+ int retval = adapter_init(cmd_ctx);
+ if (retval != ERROR_OK)
+ return retval;
+
+ LOG_DEBUG("Initializing with hard SRST reset");
+
+ if (jtag_reset_config & RESET_HAS_SRST)
+ swd_add_reset(1);
+ swd_add_reset(0);
+ retval = jtag_execute_queue();
+ return retval;
+}
int jtag_init_reset(struct command_context *cmd_ctx)
{
@@ -1738,3 +1793,32 @@ bool transport_is_jtag(void)
{
return get_current_transport() == &jtag_transport;
}
+
+void adapter_assert_reset(void)
+{
+ if (transport_is_jtag()) {
+ if (jtag_reset_config & RESET_SRST_PULLS_TRST)
+ jtag_add_reset(1, 1);
+ else
+ jtag_add_reset(0, 1);
+ } else if (transport_is_swd())
+ swd_add_reset(1);
+ else if (get_current_transport() != NULL)
+ LOG_ERROR("reset is not supported on %s",
+ get_current_transport()->name);
+ else
+ LOG_ERROR("transport is not selected");
+}
+
+void adapter_deassert_reset(void)
+{
+ if (transport_is_jtag())
+ jtag_add_reset(0, 0);
+ else if (transport_is_swd())
+ swd_add_reset(0);
+ else if (get_current_transport() != NULL)
+ LOG_ERROR("reset is not supported on %s",
+ get_current_transport()->name);
+ else
+ LOG_ERROR("transport is not selected");
+}