From: Antonio Ospite Date: Sat, 23 Mar 2013 21:55:04 +0000 (+0100) Subject: am7xxx: improve setting USB configuration and interface_number X-Git-Tag: v0.1.4~37^2~1 X-Git-Url: https://git.ao2.it/libam7xxx.git/commitdiff_plain/5069775cc1ff848f0f311ddaebaf8dc930d2aa15?ds=sidebyside;hp=--cc am7xxx: improve setting USB configuration and interface_number 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. --- 5069775cc1ff848f0f311ddaebaf8dc930d2aa15 diff --git a/src/am7xxx.c b/src/am7xxx.c index e809c55..94765c1 100644 --- a/src/am7xxx.c +++ b/src/am7xxx.c @@ -68,6 +68,8 @@ struct am7xxx_usb_device_descriptor { 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[] = { @@ -75,26 +77,36 @@ static struct am7xxx_usb_device_descriptor supported_devices[] = { .name = "Acer C110", .vendor_id = 0x1de1, .product_id = 0xc101, + .configuration = 2, + .interface_number = 0, }, { .name = "Acer C112", .vendor_id = 0x1de1, .product_id = 0x5501, + .configuration = 2, + .interface_number = 0, }, { .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, + .configuration = 2, + .interface_number = 0, }, { .name = "Philips/Sagemcom PicoPix 2055", .vendor_id = 0x21e7, .product_id = 0x0016, + .configuration = 2, + .interface_number = 0, }, }; @@ -606,17 +618,21 @@ static int scan_devices(am7xxx_context *ctx, scan_op op, * 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"); - debug(ctx, "Cannot set configuration 2\n"); + debug(ctx, "Cannot set configuration %hhu\n", + (*dev)->desc->configuration); goto out_libusb_close; } - 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"); - 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; @@ -758,7 +774,7 @@ AM7XXX_PUBLIC int am7xxx_close_device(am7xxx_device *dev) 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; }