From: Antonio Ospite Date: Sat, 29 Jun 2013 22:22:07 +0000 (+0200) Subject: am7xxx: add quirks for devices not supporting some operations X-Git-Tag: v0.1.4~23 X-Git-Url: https://git.ao2.it/libam7xxx.git/commitdiff_plain/f641ad3eaaada89be7816332f2804dad9d9ecd39?ds=sidebyside;hp=--cc am7xxx: add quirks for devices not supporting some operations 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 --- f641ad3eaaada89be7816332f2804dad9d9ecd39 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;