jtag/drivers: Extension of jtag_libusb_open
[openocd.git] / src / jtag / drivers / libusb_helper.c
index 72eed995e013cfdc5080fcdf77fbaf9c0cc149ac..9d788ee3944b906e7a8a26f0fd7679157ee4b017 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
+// SPDX-License-Identifier: GPL-2.0-or-later
 
 /***************************************************************************
  *   Copyright (C) 2009 by Zachary T Welch <zw@superlucidity.net>          *
@@ -50,7 +50,7 @@ static int jtag_libusb_error(int err)
        }
 }
 
-static bool jtag_libusb_match_ids(struct libusb_device_descriptor *dev_desc,
+bool jtag_libusb_match_ids(struct libusb_device_descriptor *dev_desc,
                const uint16_t vids[], const uint16_t pids[])
 {
        for (unsigned i = 0; vids[i]; i++) {
@@ -146,12 +146,13 @@ static bool jtag_libusb_match_serial(struct libusb_device_handle *device,
 }
 
 int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[],
-               struct libusb_device_handle **out,
+               const char *product, struct libusb_device_handle **out,
                adapter_get_alternate_serial_fn adapter_get_alternate_serial)
 {
        int cnt, idx, err_code;
        int retval = ERROR_FAIL;
        bool serial_mismatch = false;
+       bool product_mismatch = false;
        struct libusb_device_handle *libusb_handle = NULL;
        const char *serial = adapter_get_required_serial();
 
@@ -188,10 +189,18 @@ int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[],
                        continue;
                }
 
+               if (product &&
+                               !string_descriptor_equal(libusb_handle, dev_desc.iProduct, product)) {
+                       product_mismatch = true;
+                       libusb_close(libusb_handle);
+                       continue;
+               }
+
                /* Success. */
                *out = libusb_handle;
                retval = ERROR_OK;
                serial_mismatch = false;
+               product_mismatch = false;
                break;
        }
        if (cnt >= 0)
@@ -200,6 +209,9 @@ int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[],
        if (serial_mismatch)
                LOG_INFO("No device matches the serial string");
 
+       if (product_mismatch)
+               LOG_INFO("No device matches the product string");
+
        if (retval != ERROR_OK)
                libusb_exit(jtag_libusb_context);
 
@@ -216,17 +228,22 @@ void jtag_libusb_close(struct libusb_device_handle *dev)
 
 int jtag_libusb_control_transfer(struct libusb_device_handle *dev, uint8_t request_type,
                uint8_t request, uint16_t value, uint16_t index, char *bytes,
-               uint16_t size, unsigned int timeout)
+               uint16_t size, unsigned int timeout, int *transferred)
 {
-       int transferred = 0;
-
-       transferred = libusb_control_transfer(dev, request_type, request, value, index,
+       int retval = libusb_control_transfer(dev, request_type, request, value, index,
                                (unsigned char *)bytes, size, timeout);
 
-       if (transferred < 0)
-               transferred = 0;
+       if (retval < 0) {
+               LOG_ERROR("libusb_control_transfer error: %s", libusb_error_name(retval));
+               if (transferred)
+                       *transferred = 0;
+               return jtag_libusb_error(retval);
+       }
 
-       return transferred;
+       if (transferred)
+               *transferred = retval;
+
+       return ERROR_OK;
 }
 
 int jtag_libusb_bulk_write(struct libusb_device_handle *dev, int ep, char *bytes,

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)