X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Flibusb0_common.c;h=5b1248d2635b1faaa1840bd6145ecfa3c6ef8d87;hb=bf4cf766310768198cfa766467d47bdb180f9b27;hp=b44b7861b7b70f20747430d453a5eaded02d8764;hpb=7568a91c8e2398a113f0b40a2a24a1b91ed12c95;p=openocd.git diff --git a/src/jtag/drivers/libusb0_common.c b/src/jtag/drivers/libusb0_common.c index b44b7861b7..5b1248d263 100644 --- a/src/jtag/drivers/libusb0_common.c +++ b/src/jtag/drivers/libusb0_common.c @@ -145,14 +145,23 @@ int jtag_libusb_set_configuration(jtag_libusb_device_handle *devh, udev->config[configuration].bConfigurationValue); } -int jtag_libusb_get_endpoints(struct jtag_libusb_device *udev, +int jtag_libusb_choose_interface(struct jtag_libusb_device_handle *devh, unsigned int *usb_read_ep, - unsigned int *usb_write_ep) + unsigned int *usb_write_ep, + int bclass, int subclass, int protocol) { + struct jtag_libusb_device *udev = jtag_libusb_get_device(devh); struct usb_interface *iface = udev->config->interface; struct usb_interface_descriptor *desc = iface->altsetting; + *usb_read_ep = *usb_write_ep = 0; + for (int i = 0; i < desc->bNumEndpoints; i++) { + if ((bclass > 0 && desc->bInterfaceClass != bclass) || + (subclass > 0 && desc->bInterfaceSubClass != subclass) || + (protocol > 0 && desc->bInterfaceProtocol != protocol)) + continue; + uint8_t epnum = desc->endpoint[i].bEndpointAddress; bool is_input = epnum & 0x80; LOG_DEBUG("usb ep %s %02x", is_input ? "in" : "out", epnum); @@ -160,9 +169,15 @@ int jtag_libusb_get_endpoints(struct jtag_libusb_device *udev, *usb_read_ep = epnum; else *usb_write_ep = epnum; + + if (*usb_read_ep && *usb_write_ep) { + LOG_DEBUG("Claiming interface %d", (int)desc->bInterfaceNumber); + usb_claim_interface(devh, (int)desc->bInterfaceNumber); + return ERROR_OK; + } } - return 0; + return ERROR_FAIL; } int jtag_libusb_get_pid(struct jtag_libusb_device *dev, uint16_t *pid)