27 const uint16_t vids[],
const uint16_t pids[])
29 for (
unsigned i = 0; vids[i]; i++) {
30 if (dev->descriptor.idVendor == vids[i] &&
31 dev->descriptor.idProduct == pids[i]) {
44 char desc_string[256+1];
49 retval = usb_get_string_simple(device, str_index,
50 desc_string,
sizeof(desc_string)-1);
52 LOG_ERROR(
"usb_get_string_simple() failed with %d", retval);
57 desc_string[
sizeof(desc_string)-1] =
'\0';
59 matched = strncmp(
string, desc_string,
sizeof(desc_string)) == 0;
61 LOG_DEBUG(
"Device serial number '%s' doesn't match requested serial '%s'",
77 struct usb_bus *
busses = usb_get_busses();
78 for (
struct usb_bus *bus = busses; bus; bus = bus->next) {
79 for (
struct usb_device *dev = bus->devices;
80 dev; dev = dev->next) {
84 libusb_handle = usb_open(dev);
85 if (
NULL == libusb_handle) {
93 usb_close(libusb_handle);
111 uint8_t request, uint16_t wValue, uint16_t wIndex,
char *bytes,
112 uint16_t size,
unsigned int timeout)
116 transferred = usb_control_msg(dev, requestType, request, wValue, wIndex,
117 bytes, size, timeout);
126 int size,
int timeout)
128 return usb_bulk_write(dev, ep, bytes, size, timeout);
132 int size,
int timeout)
134 return usb_bulk_read(dev, ep, bytes, size, timeout);
142 return usb_set_configuration(devh,
143 udev->config[configuration].bConfigurationValue);
147 unsigned int *usb_read_ep,
148 unsigned int *usb_write_ep,
149 int bclass,
int subclass,
int protocol)
152 struct usb_interface *
iface = udev->config->interface;
155 *usb_read_ep = *usb_write_ep = 0;
159 (subclass > 0 && desc->bInterfaceSubClass != subclass) ||
163 uint8_t epnum = desc->endpoint[i].bEndpointAddress;
164 bool is_input = epnum & 0x80;
165 LOG_DEBUG(
"usb ep %s %02x", is_input ?
"in" :
"out", epnum);
167 *usb_read_ep = epnum;
169 *usb_write_ep = epnum;
171 if (*usb_read_ep && *usb_write_ep) {
186 *pid = dev->descriptor.idProduct;
int jtag_libusb_control_transfer(jtag_libusb_device_handle *dev, uint8_t requestType, uint8_t request, uint16_t wValue, uint16_t wIndex, char *bytes, uint16_t size, unsigned int timeout)
#define LOG_DEBUG(expr...)
uint8_t bInterfaceClass
Class code.
#define jtag_libusb_get_device(devh)
static const struct device_t * device
int jtag_libusb_get_pid(struct jtag_libusb_device *dev, uint16_t *pid)
int jtag_libusb_choose_interface(struct jtag_libusb_device_handle *devh, unsigned int *usb_read_ep, unsigned int *usb_write_ep, int bclass, int subclass, int protocol)
Find the first interface optionally matching class, subclass and protocol and claim it...
int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[], const char *serial, struct jtag_libusb_device_handle **out)
USB Interface Descriptor.
#define jtag_libusb_device_handle
uint8_t bInterfaceProtocol
Protocol code.
#define jtag_libusb_device
int jtag_libusb_set_configuration(jtag_libusb_device_handle *devh, int configuration)
int jtag_libusb_bulk_read(jtag_libusb_device_handle *dev, int ep, char *bytes, int size, int timeout)
void usb_init(void)
USB initialization.
#define LOG_ERROR(expr...)
static enum jaylink_target_interface iface
static bool string_descriptor_equal(usb_dev_handle *device, uint8_t str_index, const char *string)
uint8_t bInterfaceNumber
Interface number.
static struct jaylink_device_handle * devh
int jtag_libusb_bulk_write(jtag_libusb_device_handle *dev, int ep, char *bytes, int size, int timeout)
void jtag_libusb_close(jtag_libusb_device_handle *dev)
uint8_t bNumEndpoints
Number of endpoints used by this interface.
static bool jtag_libusb_match(struct jtag_libusb_device *dev, const uint16_t vids[], const uint16_t pids[])