From 3e2967c75a1676d830fce23f28c541d95ebd5ff7 Mon Sep 17 00:00:00 2001 From: Antonio Borneo Date: Mon, 24 Sep 2018 12:25:30 +0200 Subject: [PATCH] stlink: add STLINK_F_HAS_GETLASTRWSTATUS2 Starting from stlink V2J15 the API STLINK_DEBUG_APIV2_GETLASTRWSTATUS is obsoleted and replaced by the new API STLINK_DEBUG_APIV2_GETLASTRWSTATUS2. Manage the two cases to be prepared for an eventual future removal of the obsolete API. Change-Id: Ic4498a652865b2eb6148825138c2f6855a06ba47 Signed-off-by: Antonio Borneo Reviewed-on: http://openocd.zylin.com/4714 Tested-by: jenkins Reviewed-by: Spencer Oliver --- src/jtag/drivers/stlink_usb.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c index f05ffadf9e..14db1b5d70 100644 --- a/src/jtag/drivers/stlink_usb.c +++ b/src/jtag/drivers/stlink_usb.c @@ -242,6 +242,8 @@ struct stlink_usb_handle_s { #define STLINK_DEBUG_APIV2_GETLASTRWSTATUS 0x3B #define STLINK_DEBUG_APIV2_DRIVE_NRST 0x3C +#define STLINK_DEBUG_APIV2_GETLASTRWSTATUS2 0x3E + #define STLINK_DEBUG_APIV2_START_TRACE_RX 0x40 #define STLINK_DEBUG_APIV2_STOP_TRACE_RX 0x41 #define STLINK_DEBUG_APIV2_GET_TRACE_NB 0x42 @@ -279,6 +281,7 @@ enum stlink_mode { #define STLINK_F_HAS_SWD_SET_FREQ (1UL << 1) #define STLINK_F_HAS_JTAG_SET_FREQ (1UL << 2) #define STLINK_F_HAS_MEM_16BIT (1UL << 3) +#define STLINK_F_HAS_GETLASTRWSTATUS2 (1UL << 4) /* aliases */ #define STLINK_F_HAS_TARGET_VOLT STLINK_F_HAS_TRACE @@ -675,6 +678,10 @@ static int stlink_usb_version(void *handle) if (h->version.jtag >= 13) flags |= STLINK_F_HAS_TRACE; + /* preferred API to get last R/W status from J15 */ + if (h->version.jtag >= 15) + flags |= STLINK_F_HAS_GETLASTRWSTATUS2; + /* API to set SWD frequency from J22 */ if (h->version.jtag >= 22) flags |= STLINK_F_HAS_SWD_SET_FREQ; @@ -1659,9 +1666,15 @@ static int stlink_usb_get_rw_status(void *handle) stlink_usb_init_buffer(handle, h->rx_ep, 2); h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND; - h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_GETLASTRWSTATUS; + if (h->version.flags & STLINK_F_HAS_GETLASTRWSTATUS2) { + h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_GETLASTRWSTATUS2; - res = stlink_usb_xfer(handle, h->databuf, 2); + res = stlink_usb_xfer(handle, h->databuf, 12); + } else { + h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_GETLASTRWSTATUS; + + res = stlink_usb_xfer(handle, h->databuf, 2); + } if (res != ERROR_OK) return res; -- 2.30.2