am7xxx: make libam7xxx work with Philips/Sagemcom PPX projectors
authorAntonio Ospite <ospite@studenti.unina.it>
Fri, 7 Dec 2012 10:59:32 +0000 (11:59 +0100)
committerAntonio Ospite <ospite@studenti.unina.it>
Fri, 7 Dec 2012 11:54:25 +0000 (12:54 +0100)
Philips/Sagemcom PicoPix projectors require that the DEVINFO packet is
the first one to be sent to the device in order for it to successfully
return the correct device information.

Call am7xxx_get_device_info() from am7xxx_open_device() to fulfill the
requirement from above. The device info will be cached by
am7xxx_get_device_info() and further calls to the latter will return the
correct data too.

src/am7xxx.c

index 632136a..96fd2b9 100644 (file)
@@ -703,12 +703,28 @@ AM7XXX_PUBLIC int am7xxx_open_device(am7xxx_context *ctx, am7xxx_device **dev,
        ret = scan_devices(ctx, SCAN_OP_OPEN_DEVICE, device_index, dev);
        if (ret < 0) {
                errno = ENODEV;
        ret = scan_devices(ctx, SCAN_OP_OPEN_DEVICE, device_index, dev);
        if (ret < 0) {
                errno = ENODEV;
+               goto out;
        } else if (ret > 0) {
                warning(ctx, "device %d already open\n", device_index);
                errno = EBUSY;
                ret = -EBUSY;
        } else if (ret > 0) {
                warning(ctx, "device %d already open\n", device_index);
                errno = EBUSY;
                ret = -EBUSY;
+               goto out;
        }
 
        }
 
+       /* Philips/Sagemcom PicoPix projectors require that the DEVINFO packet
+        * is the first one to be sent to the device in order for it to
+        * successfully return the correct device information.
+        *
+        * So, if there is not a cached version of it (from a previous open),
+        * we ask for device info at open time,
+        */
+       if ((*dev)->device_info == NULL) {
+               ret = am7xxx_get_device_info(*dev, NULL);
+               if (ret < 0)
+                       error(ctx, "cannot get device info\n");
+       }
+
+out:
        return ret;
 }
 
        return ret;
 }