X-Git-Url: https://git.ao2.it/libam7xxx.git/blobdiff_plain/521c3915354a7119b67969fe9824b31710d732ca..d47271bd71355511535687f47e8a0f6c3784b8dc:/src/am7xxx.c diff --git a/src/am7xxx.c b/src/am7xxx.c index e809c55..f37ad70 100644 --- a/src/am7xxx.c +++ b/src/am7xxx.c @@ -64,37 +64,61 @@ static void log_message(am7xxx_context *ctx, #define debug(ctx, ...) log_message(ctx, AM7XXX_LOG_DEBUG, __func__, 0, __VA_ARGS__) #define trace(ctx, ...) log_message(ctx, AM7XXX_LOG_TRACE, NULL, 0, __VA_ARGS__) +#define AM7XXX_QUIRK_NO_POWER_MODE (1 << 0) +#define AM7XXX_QUIRK_NO_ZOOM_MODE (1 << 1) + 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 */ + unsigned long quirks; }; -static struct am7xxx_usb_device_descriptor supported_devices[] = { +static const 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, + }, + { + .name = "Philips/Sagemcom PicoPix 2330", + .vendor_id = 0x21e7, + .product_id = 0x0019, + .configuration = 1, + .interface_number = 0, + .quirks = AM7XXX_QUIRK_NO_POWER_MODE | AM7XXX_QUIRK_NO_ZOOM_MODE, }, }; @@ -606,17 +630,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; @@ -665,7 +693,7 @@ AM7XXX_PUBLIC int am7xxx_init(am7xxx_context **ctx) if (ret < 0) goto out_free_context; - libusb_set_debug((*ctx)->usb_context, 3); + libusb_set_debug((*ctx)->usb_context, LIBUSB_LOG_LEVEL_INFO); ret = scan_devices(*ctx, SCAN_OP_BUILD_DEVLIST , 0, NULL); if (ret < 0) { @@ -758,7 +786,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; } @@ -933,6 +961,12 @@ AM7XXX_PUBLIC int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode po .unknown3 = 0x10, }; + if (dev->desc->quirks & AM7XXX_QUIRK_NO_POWER_MODE) { + debug(dev->ctx, + "setting power mode is unsupported on this device\n"); + return 0; + } + switch(power) { case AM7XXX_POWER_OFF: h.header_data.power.bit2 = 0; @@ -987,6 +1021,12 @@ AM7XXX_PUBLIC int am7xxx_set_zoom_mode(am7xxx_device *dev, am7xxx_zoom_mode zoom .unknown3 = 0x10, }; + if (dev->desc->quirks & AM7XXX_QUIRK_NO_ZOOM_MODE) { + debug(dev->ctx, + "setting zoom mode is unsupported on this device\n"); + return 0; + } + switch(zoom) { case AM7XXX_ZOOM_ORIGINAL: h.header_data.zoom.bit1 = 0;