From f641ad3eaaada89be7816332f2804dad9d9ecd39 Mon Sep 17 00:00:00 2001 From: Antonio Ospite Date: Sun, 30 Jun 2013 00:22:07 +0200 Subject: [PATCH 1/1] am7xxx: add quirks for devices not supporting some operations MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit For instance Philips/SagemoCm PicoPix PPX 2330 does not support power modes and zoom modes, and the device even gets confused when trying to use them; so for reliable operation it is better to just skip these operations on such devices. Thanks-to: Grégory Lemesre --- src/am7xxx.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/am7xxx.c b/src/am7xxx.c index 1f75c60..f37ad70 100644 --- a/src/am7xxx.c +++ b/src/am7xxx.c @@ -64,12 +64,16 @@ 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 const struct am7xxx_usb_device_descriptor supported_devices[] = { @@ -114,6 +118,7 @@ static const struct am7xxx_usb_device_descriptor supported_devices[] = { .product_id = 0x0019, .configuration = 1, .interface_number = 0, + .quirks = AM7XXX_QUIRK_NO_POWER_MODE | AM7XXX_QUIRK_NO_ZOOM_MODE, }, }; @@ -956,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; @@ -1010,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; -- 2.1.4