am7xxx: add quirks for devices not supporting some operations
[libam7xxx.git] / src / am7xxx.c
index a5e53de..f37ad70 100644 (file)
@@ -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[] = {
@@ -108,6 +112,14 @@ static const struct am7xxx_usb_device_descriptor supported_devices[] = {
                .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,
+       },
 };
 
 /* The header size on the wire is known to be always 24 bytes, regardless of
@@ -681,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) {
@@ -949,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;
@@ -1003,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;