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
