jtag: drivers: stlink: ignore write verify error
[openocd.git] / src / jtag / drivers / stlink_usb.c
index 3865b3b7da90bbaeff15851c141575bfcab7d426..99f96b9c9c9c521678d2835e1a8cd79f866d5f81 100644 (file)
@@ -425,10 +425,6 @@ static int stlink_usb_error_check(void *handle)
 
        assert(handle != NULL);
 
-       /* TODO: no error checking yet on api V1 */
-       if (h->jtag_api == STLINK_JTAG_API_V1)
-               h->databuf[0] = STLINK_DEBUG_ERR_OK;
-
        if (h->transport == HL_TRANSPORT_SWIM) {
                switch (h->databuf[0]) {
                        case STLINK_SWIM_ERR_OK:
@@ -441,6 +437,10 @@ static int stlink_usb_error_check(void *handle)
                }
        }
 
+       /* TODO: no error checking yet on api V1 */
+       if (h->jtag_api == STLINK_JTAG_API_V1)
+               h->databuf[0] = STLINK_DEBUG_ERR_OK;
+
        switch (h->databuf[0]) {
                case STLINK_DEBUG_ERR_OK:
                        return ERROR_OK;
@@ -457,8 +457,8 @@ static int stlink_usb_error_check(void *handle)
                        LOG_DEBUG("Write error");
                        return ERROR_FAIL;
                case STLINK_JTAG_WRITE_VERIF_ERROR:
-                       LOG_DEBUG("Verify error");
-                       return ERROR_FAIL;
+                       LOG_DEBUG("Write verify error, ignoring");
+                       return ERROR_OK;
                case STLINK_SWD_AP_FAULT:
                        /* git://git.ac6.fr/openocd commit 657e3e885b9ee10
                         * returns ERROR_OK with the comment:
@@ -904,23 +904,29 @@ static int stlink_usb_init_mode(void *handle, bool connect_under_reset)
                return ERROR_FAIL;
        }
 
+       /* preliminary SRST assert:
+        * We want SRST is asserted before activating debug signals (mode_enter).
+        * As the required mode has not been set, the adapter may not know what pin to use.
+        * Tested firmware STLINK v2 JTAG v29 API v2 SWIM v0 uses T_NRST pin by default
+        * Tested firmware STLINK v2 JTAG v27 API v2 SWIM v6 uses T_NRST pin by default
+        * after power on, SWIM_RST stays unchanged */
+       if (connect_under_reset && emode != STLINK_MODE_DEBUG_SWIM)
+               stlink_usb_assert_srst(handle, 0);
+               /* do not check the return status here, we will
+                  proceed and enter the desired mode below
+                  and try asserting srst again. */
+
+       res = stlink_usb_mode_enter(handle, emode);
+       if (res != ERROR_OK)
+               return res;
+
+       /* assert SRST again: a little bit late but now the adapter knows for sure what pin to use */
        if (connect_under_reset) {
-               /* if we are going to use swim we need to switch mode early */
-               if (emode == STLINK_MODE_DEBUG_SWIM) {
-                       res = stlink_usb_mode_enter(handle, emode);
-                       if (res != ERROR_OK)
-                               return res;
-               }
                res = stlink_usb_assert_srst(handle, 0);
                if (res != ERROR_OK)
                        return res;
        }
 
-       res = stlink_usb_mode_enter(handle, emode);
-
-       if (res != ERROR_OK)
-               return res;
-
        res = stlink_usb_current_mode(handle, &mode);
 
        if (res != ERROR_OK)
@@ -1949,8 +1955,43 @@ static int stlink_speed(void *handle, int khz, bool query)
 /** */
 static int stlink_usb_close(void *handle)
 {
+       int res;
+       uint8_t mode;
+       enum stlink_mode emode;
        struct stlink_usb_handle_s *h = handle;
 
+       if (h && h->fd)
+               res = stlink_usb_current_mode(handle, &mode);
+       else
+               res = ERROR_FAIL;
+       /* do not exit if return code != ERROR_OK,
+          it prevents us from closing jtag_libusb */
+
+       if (res == ERROR_OK) {
+               /* try to exit current mode */
+               switch (mode) {
+                       case STLINK_DEV_DFU_MODE:
+                               emode = STLINK_MODE_DFU;
+                               break;
+                       case STLINK_DEV_DEBUG_MODE:
+                               emode = STLINK_MODE_DEBUG_SWD;
+                               break;
+                       case STLINK_DEV_SWIM_MODE:
+                               emode = STLINK_MODE_DEBUG_SWIM;
+                               break;
+                       case STLINK_DEV_BOOTLOADER_MODE:
+                       case STLINK_DEV_MASS_MODE:
+                       default:
+                               emode = STLINK_MODE_UNKNOWN;
+                               break;
+               }
+
+               if (emode != STLINK_MODE_UNKNOWN)
+                       stlink_usb_mode_leave(handle, emode);
+                       /* do not check return code, it prevent
+                       us from closing jtag_libusb */
+       }
+
        if (h && h->fd)
                jtag_libusb_close(h->fd);
 

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)