This is an automated email from Gerrit.

Spencer Oliver ([email protected]) just uploaded a new patch set to Gerrit, 
which you can find at http://openocd.zylin.com/1315

-- gerrit

commit 75ab95e1c64a1df56530af1f289e38cf7730fe2c
Author: Spencer Oliver <[email protected]>
Date:   Thu Apr 11 11:15:32 2013 +0100

    stlink: fix connect under reset issues
    
    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 <[email protected]>

diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index ce7ff41..72b31c9 100644
--- a/src/jtag/drivers/stlink_usb.c
+++ b/src/jtag/drivers/stlink_usb.c
@@ -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");
diff --git a/src/jtag/hla/hla_interface.c b/src/jtag/hla/hla_interface.c
index 53ad8e7..8453a6f 100644
--- a/src/jtag/hla/hla_interface.c
+++ b/src/jtag/hla/hla_interface.c
@@ -37,12 +37,21 @@
 
 #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;
diff --git a/src/jtag/hla/hla_interface.h b/src/jtag/hla/hla_interface.h
index 5b63ab8..980c6d9 100644
--- a/src/jtag/hla/hla_interface.h
+++ b/src/jtag/hla/hla_interface.h
@@ -46,6 +46,8 @@ struct hl_interface_param_s {
        enum hl_transports transport;
        /** */
        int max_buffer;
+       /** */
+       bool connect_under_reset;
 };
 
 struct hl_interface_s {

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to