]> git.sur5r.net Git - openocd/commitdiff
stlink: fix connect under reset issues
authorSpencer Oliver <spen@spen-soft.co.uk>
Thu, 11 Apr 2013 10:15:32 +0000 (11:15 +0100)
committerSpencer Oliver <spen@spen-soft.co.uk>
Wed, 17 Apr 2013 09:52:25 +0000 (09:52 +0000)
We need to make sure that srst is asserted before we attempt to switch into
jtag or swd mode otherwise we receive a error (-9) - invalid device id.

Change-Id: I625166c751cfba8e8a5290f40122bb9afc9dbb39
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/1315
Tested-by: jenkins
src/jtag/drivers/stlink_usb.c
src/jtag/hla/hla_interface.c
src/jtag/hla/hla_interface.h

index ce7ff413277282bda881dccf5b2fac7f7fae05ca..72b31c96a6e65a7a0bc1fed6b7ba6e4dd5eb34ee 100644 (file)
@@ -579,8 +579,10 @@ static int stlink_usb_mode_leave(void *handle, enum stlink_mode type)
        return ERROR_OK;
 }
 
+static int stlink_usb_assert_srst(void *handle, int srst);
+
 /** */
-static int stlink_usb_init_mode(void *handle)
+static int stlink_usb_init_mode(void *handle, bool connect_under_reset)
 {
        int res;
        uint8_t mode;
@@ -674,6 +676,12 @@ static int stlink_usb_init_mode(void *handle)
                return ERROR_FAIL;
        }
 
+       if (connect_under_reset) {
+               res = stlink_usb_assert_srst(handle, 0);
+               if (res != ERROR_OK)
+                       return res;
+       }
+
        res = stlink_usb_mode_enter(handle, emode);
 
        if (res != ERROR_OK)
@@ -1314,7 +1322,7 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd)
        h->jtag_api = api;
 
        /* initialize the debug hardware */
-       err = stlink_usb_init_mode(h);
+       err = stlink_usb_init_mode(h, param->connect_under_reset);
 
        if (err != ERROR_OK) {
                LOG_ERROR("init mode failed");
index 53ad8e71739fbbdfbbecf092973993806f542ca7..8453a6ff5395dedab8e2b2bd60bc9e45a528ebfb 100644 (file)
 
 #include <target/target.h>
 
-static struct hl_interface_s hl_if = { {0, 0, 0, 0, 0, 0, 0}, 0, 0 };
+static struct hl_interface_s hl_if = { {0, 0, 0, 0, 0, HL_TRANSPORT_UNKNOWN, 0, false}, 0, 0 };
 
 int hl_interface_open(enum hl_transports tr)
 {
        LOG_DEBUG("hl_interface_open");
 
+       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)
+                       hl_if.param.connect_under_reset = true;
+               else
+                       LOG_WARNING("\'srst_nogate\' reset_config option is required");
+       }
+
        /* set transport mode */
        hl_if.param.transport = tr;
 
@@ -117,14 +126,11 @@ static int hl_interface_execute_queue(void)
 
 int hl_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);
-                       hl_if.layout->api->assert_srst(hl_if.fd, 0);
-               } else
-                       LOG_WARNING("\'srst_nogate\' reset_config option is required");
+       /* incase the adapter has not already handled asserting srst
+        * we will attempt it again */
+       if (hl_if.param.connect_under_reset) {
+               jtag_add_reset(0, 1);
+               hl_if.layout->api->assert_srst(hl_if.fd, 0);
        }
 
        return ERROR_OK;
index 5b63ab855cbf3dcf94efd0352989915ca9c5c654..980c6d9c097ed7dcf05290d9a58ea5ffd098d317 100644 (file)
@@ -46,6 +46,8 @@ struct hl_interface_param_s {
        enum hl_transports transport;
        /** */
        int max_buffer;
+       /** */
+       bool connect_under_reset;
 };
 
 struct hl_interface_s {