stlink: simplify api version handling
[openocd.git] / src / jtag / drivers / stlink_usb.c
index 852fa59a59dc118bc82fc2b6a6e455d66d0ea47c..5c5fde952177b4ac48ff83c1e346297a3ec44bc8 100644 (file)
@@ -87,8 +87,8 @@ struct stlink_usb_version {
        int jtag;
        /** */
        int swim;
-       /** highest supported jtag api version */
-       enum stlink_jtag_api_version jtag_api_max;
+       /** jtag api version supported */
+       enum stlink_jtag_api_version jtag_api;
        /** one bit for each feature supported. See macros STLINK_F_* */
        uint32_t flags;
 };
@@ -123,8 +123,6 @@ struct stlink_usb_handle_s {
        uint16_t vid;
        /** */
        uint16_t pid;
-       /** this is the currently used jtag api */
-       enum stlink_jtag_api_version jtag_api;
        /** */
        struct {
                /** whether SWO tracing is enabled or not */
@@ -280,6 +278,7 @@ enum stlink_mode {
 #define STLINK_F_HAS_TRACE              (1UL << 0)
 #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)
 
 /* aliases */
 #define STLINK_F_HAS_TARGET_VOLT        STLINK_F_HAS_TRACE
@@ -470,7 +469,7 @@ static int stlink_usb_error_check(void *handle)
        }
 
        /* TODO: no error checking yet on api V1 */
-       if (h->jtag_api == STLINK_JTAG_API_V1)
+       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                h->databuf[0] = STLINK_DEBUG_ERR_OK;
 
        switch (h->databuf[0]) {
@@ -662,14 +661,14 @@ static int stlink_usb_version(void *handle)
        case 1:
                /* ST-LINK/V1 from J11 switch to api-v2 (and support SWD) */
                if (h->version.jtag >= 11)
-                       h->version.jtag_api_max = STLINK_JTAG_API_V2;
+                       h->version.jtag_api = STLINK_JTAG_API_V2;
                else
-                       h->version.jtag_api_max = STLINK_JTAG_API_V1;
+                       h->version.jtag_api = STLINK_JTAG_API_V1;
 
                break;
        case 2:
                /* all ST-LINK/V2 and ST-Link/V2.1 use api-v2 */
-               h->version.jtag_api_max = STLINK_JTAG_API_V2;
+               h->version.jtag_api = STLINK_JTAG_API_V2;
 
                /* API for trace from J13 */
                /* API for target voltage from J13 */
@@ -684,6 +683,10 @@ static int stlink_usb_version(void *handle)
                if (h->version.jtag >= 24)
                        flags |= STLINK_F_HAS_JTAG_SET_FREQ;
 
+               /* API to read/write memory at 16 bit from J26 */
+               if (h->version.jtag >= 26)
+                       flags |= STLINK_F_HAS_MEM_16BIT;
+
                break;
        default:
                break;
@@ -693,7 +696,7 @@ static int stlink_usb_version(void *handle)
        LOG_INFO("STLINK v%d JTAG v%d API v%d SWIM v%d VID 0x%04X PID 0x%04X",
                h->version.stlink,
                h->version.jtag,
-               (h->version.jtag_api_max == STLINK_JTAG_API_V1) ? 1 : 2,
+               (h->version.jtag_api == STLINK_JTAG_API_V1) ? 1 : 2,
                h->version.swim,
                h->vid,
                h->pid);
@@ -815,7 +818,7 @@ static int stlink_usb_mode_enter(void *handle, enum stlink_mode type)
         * status
         * TODO: we need the test on api V1 too
         */
-       if (h->jtag_api == STLINK_JTAG_API_V2)
+       if (h->version.jtag_api == STLINK_JTAG_API_V2)
                rx_size = 2;
 
        stlink_usb_init_buffer(handle, h->rx_ep, rx_size);
@@ -823,7 +826,7 @@ static int stlink_usb_mode_enter(void *handle, enum stlink_mode type)
        switch (type) {
                case STLINK_MODE_DEBUG_JTAG:
                        h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
-                       if (h->jtag_api == STLINK_JTAG_API_V1)
+                       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_ENTER;
                        else
                                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_ENTER;
@@ -831,7 +834,7 @@ static int stlink_usb_mode_enter(void *handle, enum stlink_mode type)
                        break;
                case STLINK_MODE_DEBUG_SWD:
                        h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
-                       if (h->jtag_api == STLINK_JTAG_API_V1)
+                       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_ENTER;
                        else
                                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_ENTER;
@@ -1273,7 +1276,7 @@ static int stlink_usb_write_debug_reg(void *handle, uint32_t addr, uint32_t val)
        stlink_usb_init_buffer(handle, h->rx_ep, 2);
 
        h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
-       if (h->jtag_api == STLINK_JTAG_API_V1)
+       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_WRITEDEBUGREG;
        else
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_WRITEDEBUGREG;
@@ -1365,7 +1368,7 @@ static enum target_state stlink_usb_state(void *handle)
                h->reconnect_pending = false;
        }
 
-       if (h->jtag_api == STLINK_JTAG_API_V2) {
+       if (h->version.jtag_api == STLINK_JTAG_API_V2) {
                res = stlink_usb_v2_get_status(handle);
                if (res == TARGET_UNKNOWN)
                        h->reconnect_pending = true;
@@ -1482,7 +1485,7 @@ static int stlink_usb_reset(void *handle)
 
        h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
 
-       if (h->jtag_api == STLINK_JTAG_API_V1)
+       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_RESETSYS;
        else
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_RESETSYS;
@@ -1507,7 +1510,7 @@ static int stlink_usb_run(void *handle)
 
        assert(handle != NULL);
 
-       if (h->jtag_api == STLINK_JTAG_API_V2) {
+       if (h->version.jtag_api == STLINK_JTAG_API_V2) {
                res = stlink_usb_write_debug_reg(handle, DCB_DHCSR, DBGKEY|C_DEBUGEN);
 
                return res;
@@ -1529,7 +1532,7 @@ static int stlink_usb_halt(void *handle)
 
        assert(handle != NULL);
 
-       if (h->jtag_api == STLINK_JTAG_API_V2) {
+       if (h->version.jtag_api == STLINK_JTAG_API_V2) {
                res = stlink_usb_write_debug_reg(handle, DCB_DHCSR, DBGKEY|C_HALT|C_DEBUGEN);
 
                return res;
@@ -1550,7 +1553,7 @@ static int stlink_usb_step(void *handle)
 
        assert(handle != NULL);
 
-       if (h->jtag_api == STLINK_JTAG_API_V2) {
+       if (h->version.jtag_api == STLINK_JTAG_API_V2) {
                /* TODO: this emulates the v1 api, it should really use a similar auto mask isr
                 * that the Cortex-M3 currently does. */
                stlink_usb_write_debug_reg(handle, DCB_DHCSR, DBGKEY|C_HALT|C_MASKINTS|C_DEBUGEN);
@@ -1577,7 +1580,7 @@ static int stlink_usb_read_regs(void *handle)
        stlink_usb_init_buffer(handle, h->rx_ep, 84);
 
        h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
-       if (h->jtag_api == STLINK_JTAG_API_V1)
+       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_READALLREGS;
        else
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_READALLREGS;
@@ -1598,16 +1601,16 @@ static int stlink_usb_read_reg(void *handle, int num, uint32_t *val)
 
        assert(handle != NULL);
 
-       stlink_usb_init_buffer(handle, h->rx_ep, h->jtag_api == STLINK_JTAG_API_V1 ? 4 : 8);
+       stlink_usb_init_buffer(handle, h->rx_ep, h->version.jtag_api == STLINK_JTAG_API_V1 ? 4 : 8);
 
        h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
-       if (h->jtag_api == STLINK_JTAG_API_V1)
+       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_READREG;
        else
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_READREG;
        h->cmdbuf[h->cmdidx++] = num;
 
-       if (h->jtag_api == STLINK_JTAG_API_V1) {
+       if (h->version.jtag_api == STLINK_JTAG_API_V1) {
                res = stlink_usb_xfer(handle, h->databuf, 4);
                if (res != ERROR_OK)
                        return res;
@@ -1632,7 +1635,7 @@ static int stlink_usb_write_reg(void *handle, int num, uint32_t val)
        stlink_usb_init_buffer(handle, h->rx_ep, 2);
 
        h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
-       if (h->jtag_api == STLINK_JTAG_API_V1)
+       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_WRITEREG;
        else
                h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_WRITEREG;
@@ -1650,7 +1653,7 @@ static int stlink_usb_get_rw_status(void *handle)
 
        assert(handle != NULL);
 
-       if (h->jtag_api == STLINK_JTAG_API_V1)
+       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                return ERROR_OK;
 
        stlink_usb_init_buffer(handle, h->rx_ep, 2);
@@ -1746,9 +1749,7 @@ static int stlink_usb_read_mem16(void *handle, uint32_t addr, uint16_t len,
 
        assert(handle != NULL);
 
-       /* only supported by stlink/v2 and for firmware >= 26 */
-       if (h->jtag_api == STLINK_JTAG_API_V1 ||
-               (h->jtag_api == STLINK_JTAG_API_V2 && h->version.jtag < 26))
+       if (!(h->version.flags & STLINK_F_HAS_MEM_16BIT))
                return ERROR_COMMAND_NOTFOUND;
 
        /* data must be a multiple of 2 and half-word aligned */
@@ -1785,9 +1786,7 @@ static int stlink_usb_write_mem16(void *handle, uint32_t addr, uint16_t len,
 
        assert(handle != NULL);
 
-       /* only supported by stlink/v2 and for firmware >= 26 */
-       if (h->jtag_api == STLINK_JTAG_API_V1 ||
-               (h->jtag_api == STLINK_JTAG_API_V2 && h->version.jtag < 26))
+       if (!(h->version.flags & STLINK_F_HAS_MEM_16BIT))
                return ERROR_COMMAND_NOTFOUND;
 
        /* data must be a multiple of 2 and half-word aligned */
@@ -1899,8 +1898,7 @@ static int stlink_usb_read_mem(void *handle, uint32_t addr, uint32_t size,
        count *= size;
 
        /* switch to 8 bit if stlink does not support 16 bit memory read */
-       if (size == 2 && (h->jtag_api == STLINK_JTAG_API_V1 ||
-               (h->jtag_api == STLINK_JTAG_API_V2 && h->version.jtag < 26)))
+       if (size == 2 && !(h->version.flags & STLINK_F_HAS_MEM_16BIT))
                size = 1;
 
        while (count) {
@@ -1985,8 +1983,7 @@ static int stlink_usb_write_mem(void *handle, uint32_t addr, uint32_t size,
        count *= size;
 
        /* switch to 8 bit if stlink does not support 16 bit memory read */
-       if (size == 2 && (h->jtag_api == STLINK_JTAG_API_V1 ||
-               (h->jtag_api == STLINK_JTAG_API_V2 && h->version.jtag < 26)))
+       if (size == 2 && !(h->version.flags & STLINK_F_HAS_MEM_16BIT))
                size = 1;
 
        while (count) {
@@ -2243,7 +2240,6 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd)
 {
        int err, retry_count = 1;
        struct stlink_usb_handle_s *h;
-       enum stlink_jtag_api_version api;
 
        LOG_DEBUG("stlink_usb_open");
 
@@ -2351,7 +2347,7 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd)
 
        switch (h->transport) {
                case HL_TRANSPORT_SWD:
-                       if (h->version.jtag_api_max == STLINK_JTAG_API_V1)
+                       if (h->version.jtag_api == STLINK_JTAG_API_V1)
                                err = ERROR_FAIL;
                        /* fall-through */
                case HL_TRANSPORT_JTAG:
@@ -2372,13 +2368,6 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd)
                goto error_open;
        }
 
-       api = h->version.jtag_api_max;
-
-       LOG_INFO("using stlink api v%d", api);
-
-       /* set the used jtag api, this will default to the newest supported version */
-       h->jtag_api = api;
-
        /* initialize the debug hardware */
        err = stlink_usb_init_mode(h, param->connect_under_reset);
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)