X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Flibusb0_common.c;h=9cf85b70e9ff2a3382bd7adc079072342b42a112;hb=refs%2Fchanges%2F98%2F4698%2F3;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..9cf85b70e9 100644 --- a/src/jtag/drivers/libusb0_common.c +++ b/src/jtag/drivers/libusb0_common.c @@ -14,9 +14,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 . * ***************************************************************************/ #ifdef HAVE_CONFIG_H @@ -69,7 +67,7 @@ int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[], const char *serial, struct jtag_libusb_device_handle **out) { - int retval = -ENODEV; + int retval = ERROR_FAIL; struct jtag_libusb_device_handle *libusb_handle; usb_init(); @@ -85,7 +83,7 @@ int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[], libusb_handle = usb_open(dev); if (NULL == libusb_handle) { - retval = -errno; + LOG_ERROR("usb_open() failed with %s", usb_strerror()); continue; } @@ -96,7 +94,7 @@ int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[], continue; } *out = libusb_handle; - retval = 0; + retval = ERROR_OK; break; } } @@ -145,14 +143,24 @@ 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, int trans_type) { + 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) || + (trans_type > 0 && (desc->endpoint[i].bmAttributes & 0x3) != trans_type)) + 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 +168,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)