int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[], struct jtag_libusb_device_handle **out) { int cnt, idx, errCode; if (libusb_init(&jtag_libusb_context) < 0) return -ENODEV; libusb_set_debug(jtag_libusb_context, 3); cnt = libusb_get_device_list(jtag_libusb_context, &devs); for (idx = 0; idx < cnt; idx++) { if (!jtag_libusb_match(devs[idx], vids, pids)) continue; errCode = libusb_open(devs[idx], out); /** Free the device list **/ libusb_free_device_list(devs, 1); if (errCode < 0) return errCode; return 0; } return -ENODEV; }
int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[], const char *serial, struct jtag_libusb_device_handle **out) { int cnt, idx, errCode; int retval = -ENODEV; struct jtag_libusb_device_handle *libusb_handle = NULL; if (libusb_init(&jtag_libusb_context) < 0) return -ENODEV; cnt = libusb_get_device_list(jtag_libusb_context, &devs); for (idx = 0; idx < cnt; idx++) { struct libusb_device_descriptor dev_desc; if (libusb_get_device_descriptor(devs[idx], &dev_desc) != 0) continue; if (!jtag_libusb_match(&dev_desc, vids, pids)) continue; errCode = libusb_open(devs[idx], &libusb_handle); if (errCode) { LOG_ERROR("libusb_open() failed with %s", libusb_error_name(errCode)); continue; } /* Device must be open to use libusb_get_string_descriptor_ascii. */ if (serial != NULL && !string_descriptor_equal(libusb_handle, dev_desc.iSerialNumber, serial)) { libusb_close(libusb_handle); continue; } /* Success. */ *out = libusb_handle; retval = 0; break; } if (cnt >= 0) libusb_free_device_list(devs, 1); return retval; }
int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[], struct jtag_libusb_device_handle **out) { usb_init(); usb_find_busses(); usb_find_devices(); struct usb_bus *busses = usb_get_busses(); for (struct usb_bus *bus = busses; bus; bus = bus->next) { for (struct usb_device *dev = bus->devices; dev; dev = dev->next) { if (!jtag_libusb_match(dev, vids, pids)) continue; *out = usb_open(dev); if (NULL == *out) return -errno; return 0; } } return -ENODEV; }
int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[], const char *serial, struct jtag_libusb_device_handle **out) { int retval = -ENODEV; struct jtag_libusb_device_handle *libusb_handle; usb_init(); usb_find_busses(); usb_find_devices(); struct usb_bus *busses = usb_get_busses(); for (struct usb_bus *bus = busses; bus; bus = bus->next) { for (struct usb_device *dev = bus->devices; dev; dev = dev->next) { if (!jtag_libusb_match(dev, vids, pids)) continue; libusb_handle = usb_open(dev); if (NULL == libusb_handle) { retval = -errno; continue; } /* Device must be open to use libusb_get_string_descriptor_ascii. */ if (serial != NULL && !string_descriptor_equal(libusb_handle, dev->descriptor.iSerialNumber, serial)) { usb_close(libusb_handle); continue; } *out = libusb_handle; retval = 0; break; } } return retval; }