aboutsummaryrefslogtreecommitdiff
path: root/src/jtag/drivers/libusb1_common.c
diff options
context:
space:
mode:
authorOleksij Rempel <o.rempel@pengutronix.de>2018-06-27 14:54:21 +0200
committerMatthias Welwarsky <matthias@welwarsky.de>2019-02-07 07:51:30 +0000
commita1b308abd4b867e9d3127dee5b9c5906bdf24f99 (patch)
treeef12b3cda33e623e1e8e7271176f0ac463d2b3f2 /src/jtag/drivers/libusb1_common.c
parentdeaf3d264123391d8fe5c4cccbf8fb8852e1be23 (diff)
jtag: drivers: provide initial support for usb path filtering
With this patch drivers will be able to use usb path filtering. The path format is identical to the format provided by linux kernel: bus-port.port.... With this format it should be easier just to copy and paste path found in dmesg. Change-Id: I8bafa6fcb7a66ff68cc961a376f97f4f3dee35aa Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> Reviewed-on: http://openocd.zylin.com/4580 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
Diffstat (limited to 'src/jtag/drivers/libusb1_common.c')
-rw-r--r--src/jtag/drivers/libusb1_common.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/jtag/drivers/libusb1_common.c b/src/jtag/drivers/libusb1_common.c
index ec52a1bc..d96ac769 100644
--- a/src/jtag/drivers/libusb1_common.c
+++ b/src/jtag/drivers/libusb1_common.c
@@ -20,8 +20,15 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include "log.h"
+#include <jtag/drivers/jtag_usb_common.h>
#include "libusb1_common.h"
+#include "log.h"
+
+/*
+ * comment from libusb:
+ * As per the USB 3.0 specs, the current maximum limit for the depth is 7.
+ */
+#define MAX_USB_PORTS 7
static struct libusb_context *jtag_libusb_context; /**< Libusb context **/
static libusb_device **devs; /**< The usb device list **/
@@ -38,6 +45,31 @@ static bool jtag_libusb_match(struct libusb_device_descriptor *dev_desc,
return false;
}
+#ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
+static bool jtag_libusb_location_equal(libusb_device *device)
+{
+ uint8_t port_path[MAX_USB_PORTS];
+ uint8_t dev_bus;
+ int path_len;
+
+ path_len = libusb_get_port_numbers(device, port_path, MAX_USB_PORTS);
+ if (path_len == LIBUSB_ERROR_OVERFLOW) {
+ LOG_WARNING("cannot determine path to usb device! (more than %i ports in path)\n",
+ MAX_USB_PORTS);
+ return false;
+ }
+ dev_bus = libusb_get_bus_number(device);
+
+ return jtag_usb_location_equal(dev_bus, port_path, path_len);
+}
+#else /* HAVE_LIBUSB_GET_PORT_NUMBERS */
+static bool jtag_libusb_location_equal(libusb_device *device)
+{
+ return true;
+}
+#endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
+
+
/* Returns true if the string descriptor indexed by str_index in device matches string */
static bool string_descriptor_equal(libusb_device_handle *device, uint8_t str_index,
const char *string)
@@ -89,6 +121,9 @@ int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[],
if (!jtag_libusb_match(&dev_desc, vids, pids))
continue;
+ if (jtag_usb_get_location() && !jtag_libusb_location_equal(devs[idx]))
+ continue;
+
errCode = libusb_open(devs[idx], &libusb_handle);
if (errCode) {