aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jtag/drivers/stlink_usb.c30
-rw-r--r--src/jtag/stlink/stlink_layout.h2
2 files changed, 32 insertions, 0 deletions
diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index 6fe958e8..d40436a0 100644
--- a/src/jtag/drivers/stlink_usb.c
+++ b/src/jtag/drivers/stlink_usb.c
@@ -719,6 +719,8 @@ static enum target_state stlink_usb_v2_get_status(void *handle)
if (status & S_HALT)
return TARGET_HALTED;
+ else if (status & S_RESET_ST)
+ return TARGET_RESET;
return TARGET_RUNNING;
}
@@ -783,6 +785,32 @@ static int stlink_usb_reset(void *handle)
return h->databuf[0] == STLINK_DEBUG_ERR_OK ? ERROR_OK : ERROR_FAIL;
}
+static int stlink_usb_assert_srst(void *handle, int srst)
+{
+ int res;
+ struct stlink_usb_handle_s *h;
+
+ assert(handle != NULL);
+
+ h = (struct stlink_usb_handle_s *)handle;
+
+ if (h->jtag_api == STLINK_JTAG_API_V1)
+ return ERROR_COMMAND_NOTFOUND;
+
+ stlink_usb_init_buffer(handle, STLINK_RX_EP, 2);
+
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_DRIVE_NRST;
+ h->cmdbuf[h->cmdidx++] = srst;
+
+ res = stlink_usb_xfer(handle, h->databuf, 2);
+
+ if (res != ERROR_OK)
+ return res;
+
+ return h->databuf[0] == STLINK_DEBUG_ERR_OK ? ERROR_OK : ERROR_FAIL;
+}
+
/** */
static int stlink_usb_run(void *handle)
{
@@ -1223,6 +1251,8 @@ struct stlink_layout_api_s stlink_usb_layout_api = {
/** */
.reset = stlink_usb_reset,
/** */
+ .assert_srst = stlink_usb_assert_srst,
+ /** */
.run = stlink_usb_run,
/** */
.halt = stlink_usb_halt,
diff --git a/src/jtag/stlink/stlink_layout.h b/src/jtag/stlink/stlink_layout.h
index 59e6174c..e0da75c7 100644
--- a/src/jtag/stlink/stlink_layout.h
+++ b/src/jtag/stlink/stlink_layout.h
@@ -37,6 +37,8 @@ struct stlink_layout_api_s {
/** */
int (*reset) (void *fd);
/** */
+ int (*assert_srst) (void *fd, int srst);
+ /** */
int (*run) (void *fd);
/** */
int (*halt) (void *fd);