jtag: drivers: stlink: handle all versions with single config
[openocd.git] / src / jtag / drivers / stlink_usb.c
index e129e8099e1e29020b11bd6580f740b11c9ca006..64868ea9e3d2eed26775196d85f20f93c730feda 100644 (file)
@@ -18,9 +18,7 @@
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -135,9 +133,19 @@ struct stlink_usb_handle_s {
 #define STLINK_DEBUG_ERR_OK            0x80
 #define STLINK_DEBUG_ERR_FAULT         0x81
 #define STLINK_SWD_AP_WAIT             0x10
+#define STLINK_SWD_AP_FAULT            0x11
+#define STLINK_SWD_AP_ERROR            0x12
+#define STLINK_SWD_AP_PARITY_ERROR     0x13
 #define STLINK_JTAG_WRITE_ERROR        0x0c
 #define STLINK_JTAG_WRITE_VERIF_ERROR  0x0d
 #define STLINK_SWD_DP_WAIT             0x14
+#define STLINK_SWD_DP_FAULT            0x15
+#define STLINK_SWD_DP_ERROR            0x16
+#define STLINK_SWD_DP_PARITY_ERROR     0x17
+
+#define STLINK_SWD_AP_WDATA_ERROR      0x18
+#define STLINK_SWD_AP_STICKY_ERROR     0x19
+#define STLINK_SWD_AP_STICKYORUN_ERROR 0x1a
 
 #define STLINK_CORE_RUNNING            0x80
 #define STLINK_CORE_HALTED             0x81
@@ -208,7 +216,7 @@ struct stlink_usb_handle_s {
 #define STLINK_DEBUG_APIV2_DRIVE_NRST_HIGH  0x01
 #define STLINK_DEBUG_APIV2_DRIVE_NRST_PULSE 0x02
 
-#define STLINK_TRACE_SIZE               1024
+#define STLINK_TRACE_SIZE               4096
 #define STLINK_TRACE_MAX_HZ             2000000
 #define STLINK_TRACE_MIN_VERSION        13
 
@@ -390,7 +398,7 @@ static int stlink_usb_error_check(void *handle)
                        LOG_DEBUG("wait status SWD_AP_WAIT (0x%x)", STLINK_SWD_AP_WAIT);
                        return ERROR_WAIT;
                case STLINK_SWD_DP_WAIT:
-                       LOG_DEBUG("wait status SWD_DP_WAIT (0x%x)", STLINK_SWD_AP_WAIT);
+                       LOG_DEBUG("wait status SWD_DP_WAIT (0x%x)", STLINK_SWD_DP_WAIT);
                        return ERROR_WAIT;
                case STLINK_JTAG_WRITE_ERROR:
                        LOG_DEBUG("Write error");
@@ -398,6 +406,38 @@ static int stlink_usb_error_check(void *handle)
                case STLINK_JTAG_WRITE_VERIF_ERROR:
                        LOG_DEBUG("Verify error");
                        return ERROR_FAIL;
+               case STLINK_SWD_AP_FAULT:
+                       /* git://git.ac6.fr/openocd commit 657e3e885b9ee10
+                        * returns ERROR_OK with the comment:
+                        * Change in error status when reading outside RAM.
+                        * This fix allows CDT plugin to visualize memory.
+                        */
+                       LOG_DEBUG("STLINK_SWD_AP_FAULT");
+                       return ERROR_FAIL;
+               case STLINK_SWD_AP_ERROR:
+                       LOG_DEBUG("STLINK_SWD_AP_ERROR");
+                       return ERROR_FAIL;
+               case STLINK_SWD_AP_PARITY_ERROR:
+                       LOG_DEBUG("STLINK_SWD_AP_PARITY_ERROR");
+                       return ERROR_FAIL;
+               case STLINK_SWD_DP_FAULT:
+                       LOG_DEBUG("STLINK_SWD_DP_FAULT");
+                       return ERROR_FAIL;
+               case STLINK_SWD_DP_ERROR:
+                       LOG_DEBUG("STLINK_SWD_DP_ERROR");
+                       return ERROR_FAIL;
+               case STLINK_SWD_DP_PARITY_ERROR:
+                       LOG_DEBUG("STLINK_SWD_DP_PARITY_ERROR");
+                       return ERROR_FAIL;
+               case STLINK_SWD_AP_WDATA_ERROR:
+                       LOG_DEBUG("STLINK_SWD_AP_WDATA_ERROR");
+                       return ERROR_FAIL;
+               case STLINK_SWD_AP_STICKY_ERROR:
+                       LOG_DEBUG("STLINK_SWD_AP_STICKY_ERROR");
+                       return ERROR_FAIL;
+               case STLINK_SWD_AP_STICKYORUN_ERROR:
+                       LOG_DEBUG("STLINK_SWD_AP_STICKYORUN_ERROR");
+                       return ERROR_FAIL;
                default:
                        LOG_DEBUG("unknown/unexpected STLINK status code 0x%x", h->databuf[0]);
                        return ERROR_FAIL;
@@ -1122,7 +1162,7 @@ static int stlink_usb_step(void *handle)
 
        if (h->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. */
+                * that the Cortex-M3 currently does. */
                stlink_usb_write_debug_reg(handle, DCB_DHCSR, DBGKEY|C_HALT|C_MASKINTS|C_DEBUGEN);
                stlink_usb_write_debug_reg(handle, DCB_DHCSR, DBGKEY|C_STEP|C_MASKINTS|C_DEBUGEN);
                return stlink_usb_write_debug_reg(handle, DCB_DHCSR, DBGKEY|C_HALT|C_DEBUGEN);
@@ -1610,13 +1650,11 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd)
 
        h->transport = param->transport;
 
-       const uint16_t vids[] = { param->vid, 0 };
-       const uint16_t pids[] = { param->pid, 0 };
-       const char *serial = param->serial;
-
-       LOG_DEBUG("transport: %d vid: 0x%04x pid: 0x%04x serial: %s",
-                       param->transport, param->vid, param->pid,
-                       param->serial ? param->serial : "");
+       for (unsigned i = 0; param->vid[i]; i++) {
+               LOG_DEBUG("transport: %d vid: 0x%04x pid: 0x%04x serial: %s",
+                         param->transport, param->vid[i], param->pid[i],
+                         param->serial ? param->serial : "");
+       }
 
        /*
          On certain host USB configurations(e.g. MacBook Air)
@@ -1628,7 +1666,7 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd)
          in order to become operational.
         */
        do {
-               if (jtag_libusb_open(vids, pids, serial, &h->fd) != ERROR_OK) {
+               if (jtag_libusb_open(param->vid, param->pid, param->serial, &h->fd) != ERROR_OK) {
                        LOG_ERROR("open failed");
                        goto error_open;
                }
@@ -1643,8 +1681,14 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd)
                /* RX EP is common for all versions */
                h->rx_ep = STLINK_RX_EP;
 
+               uint16_t pid;
+               if (jtag_libusb_get_pid(jtag_libusb_get_device(h->fd), &pid) != ERROR_OK) {
+                       LOG_DEBUG("libusb_get_pid failed");
+                       goto error_open;
+               }
+
                /* wrap version for first read */
-               switch (param->pid) {
+               switch (pid) {
                        case STLINK_V1_PID:
                                h->version.stlink = 1;
                                h->tx_ep = STLINK_TX_EP;
@@ -1696,12 +1740,6 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd)
                }
        } while (1);
 
-       /* compare usb vid/pid */
-       if ((param->vid != h->vid) || (param->pid != h->pid))
-               LOG_INFO("vid/pid are not identical: 0x%04X/0x%04X 0x%04X/0x%04X",
-                       param->vid, param->pid,
-                       h->vid, h->pid);
-
        /* check if mode is supported */
        err = ERROR_OK;
 

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)