From 28f740d63ac653a38666e2aa11e2ebdb198606db Mon Sep 17 00:00:00 2001 From: GWater Date: Sun, 10 Aug 2008 19:01:23 +0200 Subject: [PATCH] Auto-exposure for ov96xx sensors. MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit This patch adds the auto-exposure setting/feature for all webcams with a sensor from the ov96xx series. These are currently: - 0c45:624e (SOI968 ≈ OV9628) - 0c45:624f (OV9650) - 0c45:6288 (OV9655) Signed-off-by: GWater --- microdia-dev.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ microdia-usb.c | 4 ++++ 2 files changed, 53 insertions(+), 0 deletions(-) diff --git a/microdia-dev.c b/microdia-dev.c index dd4a800..80376cd 100644 --- a/microdia-dev.c +++ b/microdia-dev.c @@ -11235,3 +11235,52 @@ int microdia_6260_flip_detect(struct usb_microdia *dev) return ret; } + + +/** + * @brief Set autoexposure for ov96xx sensors + * + * @param dev + * + * @returns 0 or negative error value + * + * @author GWater + * + * For all OV96xx and SOI968 sensors. + */ +int ov96xx_set_autoexposure(struct usb_microdia *dev) +{ + __u8 buf[1]; + int ret = 0; + + /* Read current value of the I2C-register + * controlling AutoExposureControl: + */ + ret = sn9c20x_read_i2c_data(dev, dev->sensor_slave_address, + 1, 0x13, dev->sensor_flags, buf); + if (ret < 0) { + UDIA_ERROR("Error: setting of auto exposure failed: " + "error while reading from I2C-register 0x13"); + return ret; + } + + /* Determine new value for register 0x13: */ + if (dev->vsettings.auto_exposure == 1) { + /* Enable automatic exposure: */ + buf[0] |= 0x01; + } else if (dev->vsettings.auto_exposure == 0) { + /* Disable automatic exposure: */ + buf[0] &= ~0x01; + } else + return -EINVAL; + + /* Write new value to I2C-register 0x13: */ + ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, + 1, 0x13, dev->sensor_flags, buf); + if (ret < 0) { + UDIA_ERROR("Error: setting of auto exposure failed: " + "error while writing to I2C-register 0x13"); + return ret; + } + return 0; +} diff --git a/microdia-usb.c b/microdia-usb.c index 63c0822..b54b87d 100644 --- a/microdia-usb.c +++ b/microdia-usb.c @@ -257,6 +257,7 @@ extern int microdia_6242_stop_stream(struct usb_microdia *dev); extern int microdia_624e_initialize(struct usb_microdia *dev); extern int microdia_624e_start_stream(struct usb_microdia *dev); extern int microdia_624e_stop_stream(struct usb_microdia *dev); +extern int ov96xx_set_autoexposure(struct usb_microdia *dev); extern int microdia_624f_initialize(struct usb_microdia *dev); extern int microdia_624f_stop_stream(struct usb_microdia *dev); extern int microdia_624f_start_stream(struct usb_microdia *dev); @@ -310,6 +311,7 @@ struct microdia_camera cameras[] = { .initialize = microdia_624e_initialize, .start_stream = microdia_624e_start_stream, .stop_stream = microdia_624e_stop_stream, + .set_auto_exposure = ov96xx_set_autoexposure, }, { .model = CAMERA_MODEL(USB_0C45_VID, USB_624F_PID), @@ -322,6 +324,7 @@ struct microdia_camera cameras[] = { .stop_stream = microdia_624f_stop_stream, .flip_detect = microdia_624f_flip_detect, .set_exposure = microdia_624f_set_exposure, + .set_auto_exposure = ov96xx_set_autoexposure, }, { .model = CAMERA_MODEL(USB_0C45_VID, USB_6260_PID), @@ -367,6 +370,7 @@ struct microdia_camera cameras[] = { .initialize = microdia_6288_initialize, .start_stream = microdia_6288_start_stream, .stop_stream = microdia_6288_stop_stream, + .set_auto_exposure = ov96xx_set_autoexposure, }, { .model = CAMERA_MODEL(USB_0C45_VID, USB_62B3_PID), -- 1.5.5.1