24 #include <config-usb.h>
26 #ifndef USB1_HAS_LIBUSB_ERROR_NAME
30 sprintf(
buffer,
"error %d", errcode);
35 static libusb_context *ctx =
nullptr;
49 int rc = libusb_init(&ctx);
52 fprintf(stderr,
"USBDevice: Can't initialize libusb\n");
65 libusb_device **usb_devices;
66 struct libusb_device_descriptor descriptor;
67 ssize_t total = libusb_get_device_list(ctx, &usb_devices);
70 fprintf(stderr,
"USBDevice: Can't get device list\n");
73 for (
int i = 0; i < total; i++)
75 libusb_device *
device = usb_devices[i];
76 if (!libusb_get_device_descriptor(
device, &descriptor))
78 if (descriptor.idVendor == vendor && descriptor.idProduct == product)
80 if (index == searchindex)
83 libusb_free_device_list(usb_devices, 1);
84 fprintf(stderr,
"Found device %04x/%04x/%d\n", descriptor.idVendor, descriptor.idProduct, index);
89 fprintf(stderr,
"Skipping device %04x/%04x/%d\n", descriptor.idVendor, descriptor.idProduct, index);
95 fprintf(stderr,
"Skipping device %04x/%04x\n", descriptor.idVendor, descriptor.idProduct);
99 libusb_free_device_list(usb_devices, 1);
112 if (libusb_kernel_driver_active(
usb_handle, 0) == 1)
114 rc = libusb_detach_kernel_driver(
usb_handle, 0);
117 fprintf(stderr,
"USBDevice: libusb_detach_kernel_driver -> %s\n",
libusb_error_name(rc));
125 fprintf(stderr,
"USBDevice: libusb_claim_interface -> %s\n",
libusb_error_name(rc));
140 struct libusb_config_descriptor *config;
141 struct libusb_interface_descriptor *interface;
142 int rc = libusb_get_config_descriptor(
dev, 0, &config);
145 fprintf(stderr,
"USBDevice: libusb_get_config_descriptor -> %s\n",
libusb_error_name(rc));
149 interface = (struct libusb_interface_descriptor *) & (config->interface[0].altsetting[0]);
150 for (
int i = 0; i < interface->bNumEndpoints; i++)
152 fprintf(stderr,
"Endpoint %04x %04x\n", interface->endpoint[i].bEndpointAddress,
153 interface->endpoint[i].bmAttributes);
154 int dir = interface->endpoint[i].bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK;
155 if (dir == LIBUSB_ENDPOINT_IN)
157 fprintf(stderr,
"Got an input endpoint\n");
159 InputType = interface->endpoint[i].bmAttributes & LIBUSB_TRANSFER_TYPE_MASK;
161 else if (dir == LIBUSB_ENDPOINT_OUT)
163 fprintf(stderr,
"Got an output endpoint\n");
165 OutputType = interface->endpoint[i].bmAttributes & LIBUSB_TRANSFER_TYPE_MASK;
177 fprintf(stderr,
"USBDevice: libusb_interrupt_transfer -> %s\n",
libusb_error_name(rc));
179 return rc < 0 ? rc : transferred;
188 fprintf(stderr,
"USBDevice: libusb_interrupt_transfer -> %s\n",
libusb_error_name(rc));
190 return rc < 0 ? rc : transferred;
199 fprintf(stderr,
"USBDevice: libusb_bulk_transfer -> %s\n",
libusb_error_name(rc));
201 return rc < 0 ? rc : transferred;
210 fprintf(stderr,
"USBDevice: libusb_bulk_transfer -> %s\n",
libusb_error_name(rc));
212 return rc < 0 ? rc : transferred;
216 unsigned int index,
unsigned char *data,
unsigned char len)
218 int rc = libusb_control_transfer(
usb_handle, request_type, request, value, index, data, len, 5000);
221 fprintf(stderr,
"USBDevice: libusb_control_transfer -> %s\n",
libusb_error_name(rc));
int WriteBulk(unsigned char *buf, int nbytes, int timeout)
int WriteInterrupt(unsigned char *, int, int)
int ReadBulk(unsigned char *buf, int nbytes, int timeout)
libusb_device_handle * usb_handle
int ReadInterrupt(unsigned char *, int, int)
int ControlMessage(unsigned char request_type, unsigned char request, unsigned int value, unsigned int index, unsigned char *data, unsigned char len)
libusb_device * FindDevice(int, int, int)
const char *LIBUSB_CALL libusb_error_name(int errcode)
std::vector< uint8_t > buffer
Namespace to encapsulate INDI client, drivers, and mediator classes.