There are devices out there with different bConfigurationValue or
bInterfaceNumber, having the ability to specify these setting on
a per-device basis makes it easier to add support for them.
const char *name;
uint16_t vendor_id;
uint16_t product_id;
const char *name;
uint16_t vendor_id;
uint16_t product_id;
+ uint8_t configuration; /* The bConfigurationValue of the device */
+ uint8_t interface_number; /* The bInterfaceNumber of the device */
};
static struct am7xxx_usb_device_descriptor supported_devices[] = {
};
static struct am7xxx_usb_device_descriptor supported_devices[] = {
.name = "Acer C110",
.vendor_id = 0x1de1,
.product_id = 0xc101,
.name = "Acer C110",
.vendor_id = 0x1de1,
.product_id = 0xc101,
+ .configuration = 2,
+ .interface_number = 0,
},
{
.name = "Acer C112",
.vendor_id = 0x1de1,
.product_id = 0x5501,
},
{
.name = "Acer C112",
.vendor_id = 0x1de1,
.product_id = 0x5501,
+ .configuration = 2,
+ .interface_number = 0,
},
{
.name ="Aiptek PocketCinema T25",
.vendor_id = 0x08ca,
.product_id = 0x2144,
},
{
.name ="Aiptek PocketCinema T25",
.vendor_id = 0x08ca,
.product_id = 0x2144,
+ .configuration = 2,
+ .interface_number = 0,
},
{
.name = "Philips/Sagemcom PicoPix 1020",
.vendor_id = 0x21e7,
.product_id = 0x000e,
},
{
.name = "Philips/Sagemcom PicoPix 1020",
.vendor_id = 0x21e7,
.product_id = 0x000e,
+ .configuration = 2,
+ .interface_number = 0,
},
{
.name = "Philips/Sagemcom PicoPix 2055",
.vendor_id = 0x21e7,
.product_id = 0x0016,
},
{
.name = "Philips/Sagemcom PicoPix 2055",
.vendor_id = 0x21e7,
.product_id = 0x0016,
+ .configuration = 2,
+ .interface_number = 0,
* close it again before bailing out.
*/
* close it again before bailing out.
*/
- ret = libusb_set_configuration((*dev)->usb_device, 2);
+ ret = libusb_set_configuration((*dev)->usb_device,
+ (*dev)->desc->configuration);
if (ret < 0) {
debug(ctx, "libusb_set_configuration failed\n");
if (ret < 0) {
debug(ctx, "libusb_set_configuration failed\n");
- debug(ctx, "Cannot set configuration 2\n");
+ debug(ctx, "Cannot set configuration %hhu\n",
+ (*dev)->desc->configuration);
- ret = libusb_claim_interface((*dev)->usb_device, 0);
+ ret = libusb_claim_interface((*dev)->usb_device,
+ (*dev)->desc->interface_number);
if (ret < 0) {
debug(ctx, "libusb_claim_interface failed\n");
if (ret < 0) {
debug(ctx, "libusb_claim_interface failed\n");
- debug(ctx, "Cannot claim interface 0\n");
+ debug(ctx, "Cannot claim interface %hhu\n",
+ (*dev)->desc->interface_number);
out_libusb_close:
libusb_close((*dev)->usb_device);
(*dev)->usb_device = NULL;
out_libusb_close:
libusb_close((*dev)->usb_device);
(*dev)->usb_device = NULL;
return -EINVAL;
}
if (dev->usb_device) {
return -EINVAL;
}
if (dev->usb_device) {
- libusb_release_interface(dev->usb_device, 0);
+ libusb_release_interface(dev->usb_device, dev->desc->interface_number);
libusb_close(dev->usb_device);
dev->usb_device = NULL;
}
libusb_close(dev->usb_device);
dev->usb_device = NULL;
}