Hi!

Here is a patch that implements reading V4L2_CID_AUTOGAIN and
V4L2_CID_EXPOSURE using the VIDIOC_G_CTRL ioctl.

I have tested it with a Logitech QC 4000 Pro camera, which is detected
as a 740 model.

Signed-off-by: Peter Osterlund <[EMAIL PROTECTED]>
---

 drivers/usb/media/pwc/pwc-ctrl.c |   27 +++++++++++++++++++++++++++
 drivers/usb/media/pwc/pwc-v4l.c  |   10 ++++++++++
 drivers/usb/media/pwc/pwc.h      |    1 +
 3 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/media/pwc/pwc-ctrl.c b/drivers/usb/media/pwc/pwc-ctrl.c
index 2716b7b..4f1d8e5 100644
--- a/drivers/usb/media/pwc/pwc-ctrl.c
+++ b/drivers/usb/media/pwc/pwc-ctrl.c
@@ -722,6 +722,33 @@ int pwc_set_shutter_speed(struct pwc_dev
        return ret;
 }      
 
+int pwc_get_shutter_speed(struct pwc_device *pdev, int *value)
+{
+       unsigned char buf[2];
+       int ret;
+       
+       ret = RecvControlMsg(GET_STATUS_CTL, READ_SHUTTER_FORMATTER, 2);
+       if (ret < 0)
+               return ret;
+       *value = buf[0] + (buf[1] << 8);
+       switch(pdev->type) {
+       case 675:
+       case 680:
+       case 690:
+               /* speed ranges from 0x0 to 0x290 (656) */
+               *value *= 100;
+               break;
+       case 720:
+       case 730:
+       case 740:
+       case 750:
+               /* speed seems to range from 0x0 to 0xff */
+               *value <<= 8;
+               break;
+       }
+       return 0;
+}
+
 
 /* POWER */
 
diff --git a/drivers/usb/media/pwc/pwc-v4l.c b/drivers/usb/media/pwc/pwc-v4l.c
index fc61e32..e554a10 100644
--- a/drivers/usb/media/pwc/pwc-v4l.c
+++ b/drivers/usb/media/pwc/pwc-v4l.c
@@ -646,7 +646,17 @@ int pwc_video_do_ioctl(struct inode *ino
                                        c->value >>= 8;
                                        return 0;
                                case V4L2_CID_AUTOGAIN:
+                                       ret = pwc_get_agc(pdev, &c->value);
+                                       if (ret<0)
+                                               return -EINVAL;
+                                       c->value = (c->value < 0)?1:0;
+                                       return 0;
                                case V4L2_CID_EXPOSURE:
+                                       ret = pwc_get_shutter_speed(pdev, 
&c->value);
+                                       if (ret<0)
+                                               return -EINVAL;
+                                       c->value >>= 8;
+                                       return 0;
                                case V4L2_CID_PRIVATE_SAVE_USER:
                                case V4L2_CID_PRIVATE_RESTORE_USER:
                                case V4L2_CID_PRIVATE_RESTORE_FACTORY:
diff --git a/drivers/usb/media/pwc/pwc.h b/drivers/usb/media/pwc/pwc.h
index e1c18d0..918e581 100644
--- a/drivers/usb/media/pwc/pwc.h
+++ b/drivers/usb/media/pwc/pwc.h
@@ -286,6 +286,7 @@ extern int pwc_set_awb(struct pwc_device
 extern int pwc_set_agc(struct pwc_device *pdev, int mode, int value);
 extern int pwc_get_agc(struct pwc_device *pdev, int *value);
 extern int pwc_set_shutter_speed(struct pwc_device *pdev, int mode, int value);
+extern int pwc_get_shutter_speed(struct pwc_device *pdev, int *value);
 
 /* Power down or up the camera; not supported by all models */
 extern int pwc_camera_power(struct pwc_device *pdev, int power);

-- 
Peter Osterlund - [EMAIL PROTECTED]
http://web.telia.com/~u89404340
_______________________________________________
pwc mailing list
[email protected]
http://lists.saillard.org/mailman/listinfo/pwc

Reply via email to