| From: German Galkin <galkinga@gmail.com> |
| Date: Sun, 7 Mar 2010 09:19:02 +0000 (-0300) |
| Subject: V4L/DVB: gspca - sn9c20x: Fix exposure control for HV7131R sensor |
| X-Git-Url: http://git.linuxtv.org/v4l-dvb.git?a=commitdiff_plain;h=0c05cee69fbef74a08f4f9804f0a3ca7ba39a3e2 |
| |
| V4L/DVB: gspca - sn9c20x: Fix exposure control for HV7131R sensor |
| |
| Make the range of exposure values (0-0x1770) distribute evenly through |
| HV7131R's exposure control bytes. |
| |
| Signed-off-by: German Galkin <galkinga@gmail.com> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c |
| index 4a1bc08..dce5ef8 100644 |
| |
| |
| @@ -1654,9 +1654,9 @@ static int set_exposure(struct gspca_dev *gspca_dev) |
| case SENSOR_HV7131R: |
| exp[0] |= (4 << 4); |
| exp[2] = 0x25; |
| - exp[3] = ((sd->exposure * 0xffffff) / 0xffff) >> 16; |
| - exp[4] = ((sd->exposure * 0xffffff) / 0xffff) >> 8; |
| - exp[5] = ((sd->exposure * 0xffffff) / 0xffff) & 0xff; |
| + exp[3] = (sd->exposure >> 5) & 0xff; |
| + exp[4] = (sd->exposure << 3) & 0xff; |
| + exp[5] = 0; |
| break; |
| default: |
| return 0; |
| From 1f6d33db111022345a85d8f441a22a5a46fc8ca2 Mon Sep 17 00:00:00 2001 |
| From: Brian Johnson <brijohn@gmail.com> |
| Date: Tue, 9 Mar 2010 19:53:05 -0500 |
| Subject: [PATCH] gspca - sn9c20x: use gspca's input device handling |
| |
| Drop custom code for handling the input button in |
| favor of using gspca's input hanlding mechinism. |
| |
| drivers/media/video/gspca/Kconfig | 6 -- |
| drivers/media/video/gspca/sn9c20x.c | 145 ++++++++--------------------------- |
| 2 files changed, 33 insertions(+), 118 deletions(-) |
| |
| diff --git a/drivers/media/video/gspca/Kconfig b/drivers/media/video/gspca/Kconfig |
| index e0060c1..5d920e5 100644 |
| |
| |
| @@ -172,12 +172,6 @@ config USB_GSPCA_SN9C20X |
| To compile this driver as a module, choose M here: the |
| module will be called gspca_sn9c20x. |
| |
| -config USB_GSPCA_SN9C20X_EVDEV |
| - bool "Enable evdev support" |
| - depends on USB_GSPCA_SN9C20X && INPUT |
| - ---help--- |
| - Say Y here in order to enable evdev support for sn9c20x webcam button. |
| - |
| config USB_GSPCA_SONIXB |
| tristate "SONIX Bayer USB Camera Driver" |
| depends on VIDEO_V4L2 && USB_GSPCA |
| diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c |
| index dce5ef8..d2a4902 100644 |
| |
| |
| @@ -18,10 +18,7 @@ |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| -#ifdef CONFIG_USB_GSPCA_SN9C20X_EVDEV |
| -#include <linux/kthread.h> |
| -#include <linux/freezer.h> |
| -#include <linux/usb/input.h> |
| +#ifdef CONFIG_INPUT |
| #include <linux/input.h> |
| #include <linux/slab.h> |
| #endif |
| @@ -54,6 +51,9 @@ MODULE_LICENSE("GPL"); |
| #define SENSOR_HV7131R 10 |
| #define SENSOR_MT9VPRB 20 |
| |
| +/* camera flags */ |
| +#define HAS_BUTTON 0x1 |
| + |
| /* specific webcam descriptor */ |
| struct sd { |
| struct gspca_dev gspca_dev; |
| @@ -87,11 +87,7 @@ struct sd { |
| u8 *jpeg_hdr; |
| u8 quality; |
| |
| -#ifdef CONFIG_USB_GSPCA_SN9C20X_EVDEV |
| - struct input_dev *input_dev; |
| - u8 input_gpio; |
| - struct task_struct *input_task; |
| -#endif |
| + u8 flags; |
| }; |
| |
| struct i2c_reg_u8 { |
| @@ -1420,87 +1416,6 @@ static int hv7131r_init_sensor(struct gspca_dev *gspca_dev) |
| return 0; |
| } |
| |
| -#ifdef CONFIG_USB_GSPCA_SN9C20X_EVDEV |
| -static int input_kthread(void *data) |
| -{ |
| - struct gspca_dev *gspca_dev = (struct gspca_dev *)data; |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wait); |
| - set_freezable(); |
| - for (;;) { |
| - if (kthread_should_stop()) |
| - break; |
| - |
| - if (reg_r(gspca_dev, 0x1005, 1) < 0) |
| - continue; |
| - |
| - input_report_key(sd->input_dev, |
| - KEY_CAMERA, |
| - gspca_dev->usb_buf[0] & sd->input_gpio); |
| - input_sync(sd->input_dev); |
| - |
| - wait_event_freezable_timeout(wait, |
| - kthread_should_stop(), |
| - msecs_to_jiffies(100)); |
| - } |
| - return 0; |
| -} |
| - |
| - |
| -static int sn9c20x_input_init(struct gspca_dev *gspca_dev) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - if (sd->input_gpio == 0) |
| - return 0; |
| - |
| - sd->input_dev = input_allocate_device(); |
| - if (!sd->input_dev) |
| - return -ENOMEM; |
| - |
| - sd->input_dev->name = "SN9C20X Webcam"; |
| - |
| - sd->input_dev->phys = kasprintf(GFP_KERNEL, "usb-%s-%s", |
| - gspca_dev->dev->bus->bus_name, |
| - gspca_dev->dev->devpath); |
| - |
| - if (!sd->input_dev->phys) |
| - return -ENOMEM; |
| - |
| - usb_to_input_id(gspca_dev->dev, &sd->input_dev->id); |
| - sd->input_dev->dev.parent = &gspca_dev->dev->dev; |
| - |
| - set_bit(EV_KEY, sd->input_dev->evbit); |
| - set_bit(KEY_CAMERA, sd->input_dev->keybit); |
| - |
| - if (input_register_device(sd->input_dev)) |
| - return -EINVAL; |
| - |
| - sd->input_task = kthread_run(input_kthread, gspca_dev, "sn9c20x/%s-%s", |
| - gspca_dev->dev->bus->bus_name, |
| - gspca_dev->dev->devpath); |
| - |
| - if (IS_ERR(sd->input_task)) |
| - return -EINVAL; |
| - |
| - return 0; |
| -} |
| - |
| -static void sn9c20x_input_cleanup(struct gspca_dev *gspca_dev) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - if (sd->input_task != NULL && !IS_ERR(sd->input_task)) |
| - kthread_stop(sd->input_task); |
| - |
| - if (sd->input_dev != NULL) { |
| - input_unregister_device(sd->input_dev); |
| - kfree(sd->input_dev->phys); |
| - input_free_device(sd->input_dev); |
| - sd->input_dev = NULL; |
| - } |
| -} |
| -#endif |
| - |
| static int set_cmatrix(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| @@ -2004,6 +1919,7 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| |
| sd->sensor = (id->driver_info >> 8) & 0xff; |
| sd->i2c_addr = id->driver_info & 0xff; |
| + sd->flags = (id->driver_info >> 16) & 0xff; |
| |
| switch (sd->sensor) { |
| case SENSOR_MT9M111: |
| @@ -2038,11 +1954,6 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| |
| sd->quality = 95; |
| |
| -#ifdef CONFIG_USB_GSPCA_SN9C20X_EVDEV |
| - sd->input_gpio = (id->driver_info >> 16) & 0xff; |
| - if (sn9c20x_input_init(gspca_dev) < 0) |
| - return -ENODEV; |
| -#endif |
| return 0; |
| } |
| |
| @@ -2342,6 +2253,24 @@ static void sd_dqcallback(struct gspca_dev *gspca_dev) |
| do_autoexposure(gspca_dev, avg_lum); |
| } |
| |
| +#ifdef CONFIG_INPUT |
| +static int sd_int_pkt_scan(struct gspca_dev *gspca_dev, |
| + u8 *data, /* interrupt packet */ |
| + int len) /* interrupt packet length */ |
| +{ |
| + struct sd *sd = (struct sd *) gspca_dev; |
| + int ret = -EINVAL; |
| + if (sd->flags & HAS_BUTTON && len == 1) { |
| + input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1); |
| + input_sync(gspca_dev->input_dev); |
| + input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0); |
| + input_sync(gspca_dev->input_dev); |
| + ret = 0; |
| + } |
| + return ret; |
| +} |
| +#endif |
| + |
| static void sd_pkt_scan(struct gspca_dev *gspca_dev, |
| u8 *data, /* isoc packet */ |
| int len) /* iso packet length */ |
| @@ -2408,6 +2337,9 @@ static const struct sd_desc sd_desc = { |
| .stopN = sd_stopN, |
| .stop0 = sd_stop0, |
| .pkt_scan = sd_pkt_scan, |
| +#ifdef CONFIG_INPUT |
| + .int_pkt_scan = sd_int_pkt_scan, |
| +#endif |
| .dq_callback = sd_dqcallback, |
| #ifdef CONFIG_VIDEO_ADV_DEBUG |
| .set_register = sd_dbg_s_register, |
| @@ -2416,8 +2348,8 @@ static const struct sd_desc sd_desc = { |
| .get_chip_ident = sd_chip_ident, |
| }; |
| |
| -#define SN9C20X(sensor, i2c_addr, button_mask) \ |
| - .driver_info = (button_mask << 16) \ |
| +#define SN9C20X(sensor, i2c_addr, flags) \ |
| + .driver_info = (flags << 16) \ |
| | (SENSOR_ ## sensor << 8) \ |
| | (i2c_addr) |
| |
| @@ -2425,7 +2357,7 @@ static const __devinitdata struct usb_device_id device_table[] = { |
| {USB_DEVICE(0x0c45, 0x6240), SN9C20X(MT9M001, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x6242), SN9C20X(MT9M111, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x6248), SN9C20X(OV9655, 0x30, 0)}, |
| - {USB_DEVICE(0x0c45, 0x624e), SN9C20X(SOI968, 0x30, 0x10)}, |
| + {USB_DEVICE(0x0c45, 0x624e), SN9C20X(SOI968, 0x30, HAS_BUTTON)}, |
| {USB_DEVICE(0x0c45, 0x624f), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x6251), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x6253), SN9C20X(OV9650, 0x30, 0)}, |
| @@ -2436,13 +2368,13 @@ static const __devinitdata struct usb_device_id device_table[] = { |
| {USB_DEVICE(0x0c45, 0x627f), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x6280), SN9C20X(MT9M001, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x6282), SN9C20X(MT9M111, 0x5d, 0)}, |
| - {USB_DEVICE(0x0c45, 0x6288), SN9C20X(OV9655, 0x30, 0)}, |
| + {USB_DEVICE(0x0c45, 0x6288), SN9C20X(OV9655, 0x30, HAS_BUTTON)}, |
| {USB_DEVICE(0x0c45, 0x628e), SN9C20X(SOI968, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x628f), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x62a0), SN9C20X(OV7670, 0x21, 0)}, |
| {USB_DEVICE(0x0c45, 0x62b0), SN9C20X(MT9VPRB, 0x00, 0)}, |
| {USB_DEVICE(0x0c45, 0x62b3), SN9C20X(OV9655, 0x30, 0)}, |
| - {USB_DEVICE(0x0c45, 0x62bb), SN9C20X(OV7660, 0x21, 0)}, |
| + {USB_DEVICE(0x0c45, 0x62bb), SN9C20X(OV7660, 0x21, HAS_BUTTON)}, |
| {USB_DEVICE(0x0c45, 0x62bc), SN9C20X(HV7131R, 0x11, 0)}, |
| {USB_DEVICE(0x045e, 0x00f4), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x145f, 0x013d), SN9C20X(OV7660, 0x21, 0)}, |
| @@ -2451,7 +2383,7 @@ static const __devinitdata struct usb_device_id device_table[] = { |
| {USB_DEVICE(0xa168, 0x0611), SN9C20X(HV7131R, 0x11, 0)}, |
| {USB_DEVICE(0xa168, 0x0613), SN9C20X(HV7131R, 0x11, 0)}, |
| {USB_DEVICE(0xa168, 0x0618), SN9C20X(HV7131R, 0x11, 0)}, |
| - {USB_DEVICE(0xa168, 0x0614), SN9C20X(MT9M111, 0x5d, 0)}, |
| + {USB_DEVICE(0xa168, 0x0614), SN9C20X(MT9M111, 0x5d, HAS_BUTTON)}, |
| {USB_DEVICE(0xa168, 0x0615), SN9C20X(MT9M111, 0x5d, 0)}, |
| {USB_DEVICE(0xa168, 0x0617), SN9C20X(MT9M111, 0x5d, 0)}, |
| {} |
| @@ -2466,22 +2398,11 @@ static int sd_probe(struct usb_interface *intf, |
| THIS_MODULE); |
| } |
| |
| -static void sd_disconnect(struct usb_interface *intf) |
| -{ |
| -#ifdef CONFIG_USB_GSPCA_SN9C20X_EVDEV |
| - struct gspca_dev *gspca_dev = usb_get_intfdata(intf); |
| - |
| - sn9c20x_input_cleanup(gspca_dev); |
| -#endif |
| - |
| - gspca_disconnect(intf); |
| -} |
| - |
| static struct usb_driver sd_driver = { |
| .name = MODULE_NAME, |
| .id_table = device_table, |
| .probe = sd_probe, |
| - .disconnect = sd_disconnect, |
| + .disconnect = gspca_disconnect, |
| #ifdef CONFIG_PM |
| .suspend = gspca_suspend, |
| .resume = gspca_resume, |
| -- |
| 1.6.1 |
| |
| From ed53494aab1eadefa6b6c1413d59805839fb6fcf Mon Sep 17 00:00:00 2001 |
| From: Brian Johnson <brijohn@gmail.com> |
| Date: Tue, 9 Mar 2010 19:53:12 -0500 |
| Subject: [PATCH] gspca - sn9c20x: Add support for camera LEDs |
| |
| |
| drivers/media/video/gspca/sn9c20x.c | 18 +++++++++++++++--- |
| 1 files changed, 15 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c |
| index d2a4902..0e8a64d 100644 |
| |
| |
| @@ -53,6 +53,7 @@ MODULE_LICENSE("GPL"); |
| |
| /* camera flags */ |
| #define HAS_BUTTON 0x1 |
| +#define LED_REVERSE 0x2 /* some cameras unset gpio to turn on leds */ |
| |
| /* specific webcam descriptor */ |
| struct sd { |
| @@ -730,7 +731,8 @@ static u16 bridge_init[][2] = { |
| {0x11be, 0xf0}, {0x11bf, 0x00}, {0x118c, 0x1f}, |
| {0x118d, 0x1f}, {0x118e, 0x1f}, {0x118f, 0x1f}, |
| {0x1180, 0x01}, {0x1181, 0x00}, {0x1182, 0x01}, |
| - {0x1183, 0x00}, {0x1184, 0x50}, {0x1185, 0x80} |
| + {0x1183, 0x00}, {0x1184, 0x50}, {0x1185, 0x80}, |
| + {0x1007, 0x00} |
| }; |
| |
| /* Gain = (bit[3:0] / 16 + 1) * (bit[4] + 1) * (bit[5] + 1) * (bit[6] + 1) */ |
| @@ -1973,6 +1975,11 @@ static int sd_init(struct gspca_dev *gspca_dev) |
| } |
| } |
| |
| + if (sd->flags & LED_REVERSE) |
| + reg_w1(gspca_dev, 0x1006, 0x00); |
| + else |
| + reg_w1(gspca_dev, 0x1006, 0x20); |
| + |
| if (reg_w(gspca_dev, 0x10c0, i2c_init, 9) < 0) { |
| err("Device initialization failed"); |
| return -ENODEV; |
| @@ -2153,6 +2160,8 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| set_exposure(gspca_dev); |
| set_hvflip(gspca_dev); |
| |
| + reg_w1(gspca_dev, 0x1007, 0x20); |
| + |
| reg_r(gspca_dev, 0x1061, 1); |
| reg_w1(gspca_dev, 0x1061, gspca_dev->usb_buf[0] | 0x02); |
| return 0; |
| @@ -2160,6 +2169,8 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| |
| static void sd_stopN(struct gspca_dev *gspca_dev) |
| { |
| + reg_w1(gspca_dev, 0x1007, 0x00); |
| + |
| reg_r(gspca_dev, 0x1061, 1); |
| reg_w1(gspca_dev, 0x1061, gspca_dev->usb_buf[0] & ~0x02); |
| } |
| @@ -2349,7 +2360,7 @@ static const struct sd_desc sd_desc = { |
| }; |
| |
| #define SN9C20X(sensor, i2c_addr, flags) \ |
| - .driver_info = (flags << 16) \ |
| + .driver_info = ((flags & 0xff) << 16) \ |
| | (SENSOR_ ## sensor << 8) \ |
| | (i2c_addr) |
| |
| @@ -2357,7 +2368,8 @@ static const __devinitdata struct usb_device_id device_table[] = { |
| {USB_DEVICE(0x0c45, 0x6240), SN9C20X(MT9M001, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x6242), SN9C20X(MT9M111, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x6248), SN9C20X(OV9655, 0x30, 0)}, |
| - {USB_DEVICE(0x0c45, 0x624e), SN9C20X(SOI968, 0x30, HAS_BUTTON)}, |
| + {USB_DEVICE(0x0c45, 0x624e), SN9C20X(SOI968, 0x30, |
| + (HAS_BUTTON | LED_REVERSE))}, |
| {USB_DEVICE(0x0c45, 0x624f), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x6251), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x6253), SN9C20X(OV9650, 0x30, 0)}, |
| -- |
| 1.6.1 |
| |
| From c1dfdd5443097d4fbd773858a1c38d7b6b7dfcc1 Mon Sep 17 00:00:00 2001 |
| From: Brian Johnson <brijohn@gmail.com> |
| Date: Tue, 9 Mar 2010 19:55:51 -0500 |
| Subject: [PATCH] gspca - sn9c20x: Add upside down detection |
| |
| Add support for detecting webcams that are mounted |
| upside down in laptops. Currently the only two known |
| are two MSI modesl using the 0c45:624f. |
| |
| drivers/media/video/gspca/sn9c20x.c | 50 ++++++++++++++++++++++++++++------- |
| 1 files changed, 40 insertions(+), 10 deletions(-) |
| |
| diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c |
| index 0e8a64d..41c8916 100644 |
| |
| |
| @@ -26,6 +26,7 @@ |
| #include "jpeg.h" |
| |
| #include <media/v4l2-chip-ident.h> |
| +#include <linux/dmi.h> |
| |
| MODULE_AUTHOR("Brian Johnson <brijohn@gmail.com>, " |
| "microdia project <microdia@googlegroups.com>"); |
| @@ -54,6 +55,7 @@ MODULE_LICENSE("GPL"); |
| /* camera flags */ |
| #define HAS_BUTTON 0x1 |
| #define LED_REVERSE 0x2 /* some cameras unset gpio to turn on leds */ |
| +#define FLIP_DETECT 0x4 |
| |
| /* specific webcam descriptor */ |
| struct sd { |
| @@ -126,6 +128,25 @@ static int sd_getexposure(struct gspca_dev *gspca_dev, s32 *val); |
| static int sd_setautoexposure(struct gspca_dev *gspca_dev, s32 val); |
| static int sd_getautoexposure(struct gspca_dev *gspca_dev, s32 *val); |
| |
| +static const struct dmi_system_id flip_dmi_table[] = { |
| + { |
| + .ident = "MSI MS-1034", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."), |
| + DMI_MATCH(DMI_PRODUCT_NAME, "MS-1034"), |
| + DMI_MATCH(DMI_PRODUCT_VERSION, "0341") |
| + } |
| + }, |
| + { |
| + .ident = "MSI MS-1632", |
| + .matches = { |
| + DMI_MATCH(DMI_BOARD_VENDOR, "MSI"), |
| + DMI_MATCH(DMI_BOARD_NAME, "MS-1632") |
| + } |
| + }, |
| + {} |
| +}; |
| + |
| static const struct ctrl sd_ctrls[] = { |
| { |
| #define BRIGHTNESS_IDX 0 |
| @@ -1495,17 +1516,26 @@ static int set_redblue(struct gspca_dev *gspca_dev) |
| |
| static int set_hvflip(struct gspca_dev *gspca_dev) |
| { |
| - u8 value, tslb; |
| + u8 value, tslb, hflip, vflip; |
| u16 value2; |
| struct sd *sd = (struct sd *) gspca_dev; |
| + |
| + if ((sd->flags & FLIP_DETECT) && dmi_check_system(flip_dmi_table)) { |
| + hflip = !sd->hflip; |
| + vflip = !sd->vflip; |
| + } else { |
| + hflip = sd->hflip; |
| + vflip = sd->vflip; |
| + } |
| + |
| switch (sd->sensor) { |
| case SENSOR_OV9650: |
| i2c_r1(gspca_dev, 0x1e, &value); |
| value &= ~0x30; |
| tslb = 0x01; |
| - if (sd->hflip) |
| + if (hflip) |
| value |= 0x20; |
| - if (sd->vflip) { |
| + if (vflip) { |
| value |= 0x10; |
| tslb = 0x49; |
| } |
| @@ -1516,9 +1546,9 @@ static int set_hvflip(struct gspca_dev *gspca_dev) |
| case SENSOR_MT9V011: |
| i2c_r2(gspca_dev, 0x20, &value2); |
| value2 &= ~0xc0a0; |
| - if (sd->hflip) |
| + if (hflip) |
| value2 |= 0x8080; |
| - if (sd->vflip) |
| + if (vflip) |
| value2 |= 0x4020; |
| i2c_w2(gspca_dev, 0x20, value2); |
| break; |
| @@ -1526,18 +1556,18 @@ static int set_hvflip(struct gspca_dev *gspca_dev) |
| case SENSOR_MT9V112: |
| i2c_r2(gspca_dev, 0x20, &value2); |
| value2 &= ~0x0003; |
| - if (sd->hflip) |
| + if (hflip) |
| value2 |= 0x0002; |
| - if (sd->vflip) |
| + if (vflip) |
| value2 |= 0x0001; |
| i2c_w2(gspca_dev, 0x20, value2); |
| break; |
| case SENSOR_HV7131R: |
| i2c_r1(gspca_dev, 0x01, &value); |
| value &= ~0x03; |
| - if (sd->vflip) |
| + if (vflip) |
| value |= 0x01; |
| - if (sd->hflip) |
| + if (hflip) |
| value |= 0x02; |
| i2c_w1(gspca_dev, 0x01, value); |
| break; |
| @@ -2370,7 +2400,7 @@ static const __devinitdata struct usb_device_id device_table[] = { |
| {USB_DEVICE(0x0c45, 0x6248), SN9C20X(OV9655, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x624e), SN9C20X(SOI968, 0x30, |
| (HAS_BUTTON | LED_REVERSE))}, |
| - {USB_DEVICE(0x0c45, 0x624f), SN9C20X(OV9650, 0x30, 0)}, |
| + {USB_DEVICE(0x0c45, 0x624f), SN9C20X(OV9650, 0x30, FLIP_DETECT)}, |
| {USB_DEVICE(0x0c45, 0x6251), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x6253), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x6260), SN9C20X(OV7670, 0x21, 0)}, |
| -- |
| 1.6.1 |
| |
| From 2e25ca5a85c702d2d49df7f5b1e3ecd61e01bf3e Mon Sep 17 00:00:00 2001 |
| From: Brian Johnson <brijohn@gmail.com> |
| Date: Tue, 9 Mar 2010 19:55:59 -0500 |
| Subject: [PATCH] gspca - sn9c20x: Add support for cameras using the MT9M112 sensor |
| |
| Adds the following models: |
| - 0c45:624c |
| - 0c45:628c |
| - 0458:704a |
| - 0458:704c |
| |
| Documentation/video4linux/gspca.txt | 4 +++ |
| drivers/media/video/gspca/sn9c20x.c | 44 ++++++++++++++++++++++++++++++++-- |
| 2 files changed, 45 insertions(+), 3 deletions(-) |
| |
| diff --git a/Documentation/video4linux/gspca.txt b/Documentation/video4linux/gspca.txt |
| index 181b9e6..3bfab2e 100644 |
| |
| |
| @@ -50,6 +50,8 @@ zc3xx 0458:700f Genius VideoCam Web V2 |
| sonixj 0458:7025 Genius Eye 311Q |
| sn9c20x 0458:7029 Genius Look 320s |
| sonixj 0458:702e Genius Slim 310 NB |
| +sn9c20x 0458:704a Genius Slim 1320 |
| +sn9c20x 0458:704c Genius i-Look 1321 |
| sn9c20x 045e:00f4 LifeCam VX-6000 (SN9C20x + OV9650) |
| sonixj 045e:00f5 MicroSoft VX3000 |
| sonixj 045e:00f7 MicroSoft VX1000 |
| @@ -311,6 +313,7 @@ sonixj 0c45:614a Frontech E-Ccam (JIL-2225) |
| sn9c20x 0c45:6240 PC Camera (SN9C201 + MT9M001) |
| sn9c20x 0c45:6242 PC Camera (SN9C201 + MT9M111) |
| sn9c20x 0c45:6248 PC Camera (SN9C201 + OV9655) |
| +sn9c20x 0c45:624c PC Camera (SN9C201 + MT9M112) |
| sn9c20x 0c45:624e PC Camera (SN9C201 + SOI968) |
| sn9c20x 0c45:624f PC Camera (SN9C201 + OV9650) |
| sn9c20x 0c45:6251 PC Camera (SN9C201 + OV9650) |
| @@ -323,6 +326,7 @@ sn9c20x 0c45:627f PC Camera (SN9C201 + OV9650) |
| sn9c20x 0c45:6280 PC Camera (SN9C202 + MT9M001) |
| sn9c20x 0c45:6282 PC Camera (SN9C202 + MT9M111) |
| sn9c20x 0c45:6288 PC Camera (SN9C202 + OV9655) |
| +sn9c20x 0c45:628c PC Camera (SN9C201 + MT9M112) |
| sn9c20x 0c45:628e PC Camera (SN9C202 + SOI968) |
| sn9c20x 0c45:628f PC Camera (SN9C202 + OV9650) |
| sn9c20x 0c45:62a0 PC Camera (SN9C202 + OV7670) |
| diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c |
| index 41c8916..8684596 100644 |
| |
| |
| @@ -49,7 +49,8 @@ MODULE_LICENSE("GPL"); |
| #define SENSOR_MT9V112 7 |
| #define SENSOR_MT9M001 8 |
| #define SENSOR_MT9M111 9 |
| -#define SENSOR_HV7131R 10 |
| +#define SENSOR_MT9M112 10 |
| +#define SENSOR_HV7131R 11 |
| #define SENSOR_MT9VPRB 20 |
| |
| /* camera flags */ |
| @@ -730,6 +731,7 @@ static u16 i2c_ident[] = { |
| V4L2_IDENT_MT9V112, |
| V4L2_IDENT_MT9M001C12ST, |
| V4L2_IDENT_MT9M111, |
| + V4L2_IDENT_MT9M112, |
| V4L2_IDENT_HV7131R, |
| }; |
| |
| @@ -1061,6 +1063,13 @@ static struct i2c_reg_u16 mt9m111_init[] = { |
| {0xf0, 0x0000}, |
| }; |
| |
| +static struct i2c_reg_u16 mt9m112_init[] = { |
| + {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0008}, |
| + {0xf0, 0x0001}, {0x3a, 0x4300}, {0x9b, 0x4300}, |
| + {0x06, 0x708e}, {0xf0, 0x0002}, {0x2e, 0x0a1e}, |
| + {0xf0, 0x0000}, |
| +}; |
| + |
| static struct i2c_reg_u8 hv7131r_init[] = { |
| {0x02, 0x08}, {0x02, 0x00}, {0x01, 0x08}, |
| {0x02, 0x00}, {0x20, 0x00}, {0x21, 0xd0}, |
| @@ -1387,6 +1396,23 @@ static int mt9v_init_sensor(struct gspca_dev *gspca_dev) |
| return -ENODEV; |
| } |
| |
| +static int mt9m112_init_sensor(struct gspca_dev *gspca_dev) |
| +{ |
| + struct sd *sd = (struct sd *) gspca_dev; |
| + int i; |
| + for (i = 0; i < ARRAY_SIZE(mt9m112_init); i++) { |
| + if (i2c_w2(gspca_dev, mt9m112_init[i].reg, |
| + mt9m112_init[i].val) < 0) { |
| + err("MT9M112 sensor initialization failed"); |
| + return -ENODEV; |
| + } |
| + } |
| + gspca_dev->ctrl_dis = (1 << EXPOSURE_IDX) | (1 << AUTOGAIN_IDX) | (1 << GAIN_IDX); |
| + sd->hstart = 0; |
| + sd->vstart = 2; |
| + return 0; |
| +} |
| + |
| static int mt9m111_init_sensor(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| @@ -1552,6 +1578,7 @@ static int set_hvflip(struct gspca_dev *gspca_dev) |
| value2 |= 0x4020; |
| i2c_w2(gspca_dev, 0x20, value2); |
| break; |
| + case SENSOR_MT9M112: |
| case SENSOR_MT9M111: |
| case SENSOR_MT9V112: |
| i2c_r2(gspca_dev, 0x20, &value2); |
| @@ -1877,7 +1904,7 @@ static int sd_dbg_g_register(struct gspca_dev *gspca_dev, |
| if (reg->match.addr != sd->i2c_addr) |
| return -EINVAL; |
| if (sd->sensor >= SENSOR_MT9V011 && |
| - sd->sensor <= SENSOR_MT9M111) { |
| + sd->sensor <= SENSOR_MT9M112) { |
| if (i2c_r2(gspca_dev, reg->reg, (u16 *)®->val) < 0) |
| return -EINVAL; |
| } else { |
| @@ -1906,7 +1933,7 @@ static int sd_dbg_s_register(struct gspca_dev *gspca_dev, |
| if (reg->match.addr != sd->i2c_addr) |
| return -EINVAL; |
| if (sd->sensor >= SENSOR_MT9V011 && |
| - sd->sensor <= SENSOR_MT9M111) { |
| + sd->sensor <= SENSOR_MT9M112) { |
| if (i2c_w2(gspca_dev, reg->reg, reg->val) < 0) |
| return -EINVAL; |
| } else { |
| @@ -1954,6 +1981,7 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| sd->flags = (id->driver_info >> 16) & 0xff; |
| |
| switch (sd->sensor) { |
| + case SENSOR_MT9M112: |
| case SENSOR_MT9M111: |
| case SENSOR_OV9650: |
| case SENSOR_SOI968: |
| @@ -2050,6 +2078,11 @@ static int sd_init(struct gspca_dev *gspca_dev) |
| return -ENODEV; |
| info("MT9M111 sensor detected"); |
| break; |
| + case SENSOR_MT9M112: |
| + if (mt9m112_init_sensor(gspca_dev) < 0) |
| + return -ENODEV; |
| + info("MT9M112 sensor detected"); |
| + break; |
| case SENSOR_MT9M001: |
| if (mt9m001_init_sensor(gspca_dev) < 0) |
| return -ENODEV; |
| @@ -2109,6 +2142,7 @@ static void configure_sensor_output(struct gspca_dev *gspca_dev, int mode) |
| i2c_w1(gspca_dev, 0x12, (value & 0x7) | 0x40); |
| } |
| break; |
| + case SENSOR_MT9M112: |
| case SENSOR_MT9M111: |
| if (mode & MODE_SXGA) { |
| i2c_w2(gspca_dev, 0xf0, 0x0002); |
| @@ -2398,6 +2432,7 @@ static const __devinitdata struct usb_device_id device_table[] = { |
| {USB_DEVICE(0x0c45, 0x6240), SN9C20X(MT9M001, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x6242), SN9C20X(MT9M111, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x6248), SN9C20X(OV9655, 0x30, 0)}, |
| + {USB_DEVICE(0x0c45, 0x624c), SN9C20X(MT9M112, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x624e), SN9C20X(SOI968, 0x30, |
| (HAS_BUTTON | LED_REVERSE))}, |
| {USB_DEVICE(0x0c45, 0x624f), SN9C20X(OV9650, 0x30, FLIP_DETECT)}, |
| @@ -2411,6 +2446,7 @@ static const __devinitdata struct usb_device_id device_table[] = { |
| {USB_DEVICE(0x0c45, 0x6280), SN9C20X(MT9M001, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x6282), SN9C20X(MT9M111, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x6288), SN9C20X(OV9655, 0x30, HAS_BUTTON)}, |
| + {USB_DEVICE(0x0c45, 0x628c), SN9C20X(MT9M112, 0x5d, 0)}, |
| {USB_DEVICE(0x0c45, 0x628e), SN9C20X(SOI968, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x628f), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x0c45, 0x62a0), SN9C20X(OV7670, 0x21, 0)}, |
| @@ -2421,6 +2457,8 @@ static const __devinitdata struct usb_device_id device_table[] = { |
| {USB_DEVICE(0x045e, 0x00f4), SN9C20X(OV9650, 0x30, 0)}, |
| {USB_DEVICE(0x145f, 0x013d), SN9C20X(OV7660, 0x21, 0)}, |
| {USB_DEVICE(0x0458, 0x7029), SN9C20X(HV7131R, 0x11, 0)}, |
| + {USB_DEVICE(0x0458, 0x704a), SN9C20X(MT9M112, 0x5d, 0)}, |
| + {USB_DEVICE(0x0458, 0x704c), SN9C20X(MT9M112, 0x5d, 0)}, |
| {USB_DEVICE(0xa168, 0x0610), SN9C20X(HV7131R, 0x11, 0)}, |
| {USB_DEVICE(0xa168, 0x0611), SN9C20X(HV7131R, 0x11, 0)}, |
| {USB_DEVICE(0xa168, 0x0613), SN9C20X(HV7131R, 0x11, 0)}, |
| -- |
| 1.6.1 |
| |
| From 9a4ef004b953572b479c643f2314ea352b74d732 Mon Sep 17 00:00:00 2001 |
| From: Brian Johnson <brijohn@gmail.com> |
| Date: Tue, 9 Mar 2010 19:57:55 -0500 |
| Subject: [PATCH] gspca - sn9c20x: Fix bug with OV9655 code |
| |
| Fixed buggy init sequence for the OV9655 sensor. |
| Tested with a 0c45:6288 and 0c45:62b3. |
| |
| drivers/media/video/gspca/sn9c20x.c | 58 ++++++++++++++-------------------- |
| 1 files changed, 24 insertions(+), 34 deletions(-) |
| |
| diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c |
| index 8684596..69a3aa3 100644 |
| |
| |
| @@ -934,40 +934,30 @@ static struct i2c_reg_u8 ov9650_init[] = { |
| }; |
| |
| static struct i2c_reg_u8 ov9655_init[] = { |
| - {0x12, 0x80}, {0x12, 0x01}, {0x0d, 0x00}, {0x0e, 0x61}, |
| - {0x11, 0x80}, {0x13, 0xba}, {0x14, 0x2e}, {0x16, 0x24}, |
| - {0x1e, 0x04}, {0x1e, 0x04}, {0x1e, 0x04}, {0x27, 0x08}, |
| - {0x28, 0x08}, {0x29, 0x15}, {0x2c, 0x08}, {0x32, 0xbf}, |
| - {0x34, 0x3d}, {0x35, 0x00}, {0x36, 0xf8}, {0x38, 0x12}, |
| - {0x39, 0x57}, {0x3a, 0x00}, {0x3b, 0xcc}, {0x3c, 0x0c}, |
| - {0x3d, 0x19}, {0x3e, 0x0c}, {0x3f, 0x01}, {0x41, 0x40}, |
| - {0x42, 0x80}, {0x45, 0x46}, {0x46, 0x62}, {0x47, 0x2a}, |
| - {0x48, 0x3c}, {0x4a, 0xf0}, {0x4b, 0xdc}, {0x4c, 0xdc}, |
| - {0x4d, 0xdc}, {0x4e, 0xdc}, {0x69, 0x02}, {0x6c, 0x04}, |
| - {0x6f, 0x9e}, {0x70, 0x05}, {0x71, 0x78}, {0x77, 0x02}, |
| - {0x8a, 0x23}, {0x8c, 0x0d}, {0x90, 0x7e}, {0x91, 0x7c}, |
| - {0x9f, 0x6e}, {0xa0, 0x6e}, {0xa5, 0x68}, {0xa6, 0x60}, |
| - {0xa8, 0xc1}, {0xa9, 0xfa}, {0xaa, 0x92}, {0xab, 0x04}, |
| - {0xac, 0x80}, {0xad, 0x80}, {0xae, 0x80}, {0xaf, 0x80}, |
| - {0xb2, 0xf2}, {0xb3, 0x20}, {0xb5, 0x00}, {0xb6, 0xaf}, |
| - {0xbb, 0xae}, {0xbc, 0x44}, {0xbd, 0x44}, {0xbe, 0x3b}, |
| - {0xbf, 0x3a}, {0xc0, 0xe2}, {0xc1, 0xc8}, {0xc2, 0x01}, |
| + {0x12, 0x80}, {0x0e, 0x61}, {0x11, 0x80}, {0x13, 0xba}, |
| + {0x14, 0x2e}, {0x16, 0x24}, {0x1e, 0x04}, {0x27, 0x08}, |
| + {0x28, 0x08}, {0x29, 0x15}, {0x2c, 0x08}, {0x34, 0x3d}, |
| + {0x35, 0x00}, {0x38, 0x12}, {0x0f, 0x42}, {0x39, 0x57}, |
| + {0x3a, 0x00}, {0x3b, 0xcc}, {0x3c, 0x0c}, {0x3d, 0x19}, |
| + {0x3e, 0x0c}, {0x3f, 0x01}, {0x41, 0x40}, {0x42, 0x80}, |
| + {0x45, 0x46}, {0x46, 0x62}, {0x47, 0x2a}, {0x48, 0x3c}, |
| + {0x4a, 0xf0}, {0x4b, 0xdc}, {0x4c, 0xdc}, {0x4d, 0xdc}, |
| + {0x4e, 0xdc}, {0x6c, 0x04}, {0x6f, 0x9e}, {0x70, 0x05}, |
| + {0x71, 0x78}, {0x77, 0x02}, {0x8a, 0x23}, {0x90, 0x7e}, |
| + {0x91, 0x7c}, {0x9f, 0x6e}, {0xa0, 0x6e}, {0xa5, 0x68}, |
| + {0xa6, 0x60}, {0xa8, 0xc1}, {0xa9, 0xfa}, {0xaa, 0x92}, |
| + {0xab, 0x04}, {0xac, 0x80}, {0xad, 0x80}, {0xae, 0x80}, |
| + {0xaf, 0x80}, {0xb2, 0xf2}, {0xb3, 0x20}, {0xb5, 0x00}, |
| + {0xb6, 0xaf}, {0xbb, 0xae}, {0xbc, 0x44}, {0xbd, 0x44}, |
| + {0xbe, 0x3b}, {0xbf, 0x3a}, {0xc1, 0xc8}, {0xc2, 0x01}, |
| {0xc4, 0x00}, {0xc6, 0x85}, {0xc7, 0x81}, {0xc9, 0xe0}, |
| - {0xca, 0xe8}, {0xcc, 0xd8}, {0xcd, 0x93}, {0x12, 0x61}, |
| + {0xca, 0xe8}, {0xcc, 0xd8}, {0xcd, 0x93}, {0x2d, 0x00}, |
| + {0x2e, 0x00}, {0x01, 0x80}, {0x02, 0x80}, {0x12, 0x61}, |
| {0x36, 0xfa}, {0x8c, 0x8d}, {0xc0, 0xaa}, {0x69, 0x0a}, |
| - {0x03, 0x12}, {0x17, 0x14}, {0x18, 0x00}, {0x19, 0x01}, |
| - {0x1a, 0x3d}, {0x32, 0xbf}, {0x11, 0x80}, {0x2a, 0x10}, |
| - {0x2b, 0x0a}, {0x92, 0x00}, {0x93, 0x00}, {0x1e, 0x04}, |
| - {0x1e, 0x04}, {0x10, 0x7c}, {0x04, 0x03}, {0xa1, 0x00}, |
| - {0x2d, 0x00}, {0x2e, 0x00}, {0x00, 0x00}, {0x01, 0x80}, |
| - {0x02, 0x80}, {0x12, 0x61}, {0x36, 0xfa}, {0x8c, 0x8d}, |
| - {0xc0, 0xaa}, {0x69, 0x0a}, {0x03, 0x12}, {0x17, 0x14}, |
| - {0x18, 0x00}, {0x19, 0x01}, {0x1a, 0x3d}, {0x32, 0xbf}, |
| - {0x11, 0x80}, {0x2a, 0x10}, {0x2b, 0x0a}, {0x92, 0x00}, |
| - {0x93, 0x00}, {0x04, 0x01}, {0x10, 0x1f}, {0xa1, 0x00}, |
| - {0x00, 0x0a}, {0xa1, 0x00}, {0x10, 0x5d}, {0x04, 0x03}, |
| - {0x00, 0x01}, {0xa1, 0x00}, {0x10, 0x7c}, {0x04, 0x03}, |
| - {0x00, 0x03}, {0x00, 0x0a}, {0x00, 0x10}, {0x00, 0x13}, |
| + {0x03, 0x09}, {0x17, 0x16}, {0x18, 0x6e}, {0x19, 0x01}, |
| + {0x1a, 0x3e}, {0x32, 0x09}, {0x2a, 0x10}, {0x2b, 0x0a}, |
| + {0x92, 0x00}, {0x93, 0x00}, {0xa1, 0x00}, {0x10, 0x7c}, |
| + {0x04, 0x03}, {0x00, 0x13}, |
| }; |
| |
| static struct i2c_reg_u16 mt9v112_init[] = { |
| @@ -1267,8 +1257,8 @@ static int ov9655_init_sensor(struct gspca_dev *gspca_dev) |
| } |
| /* disable hflip and vflip */ |
| gspca_dev->ctrl_dis = (1 << HFLIP_IDX) | (1 << VFLIP_IDX); |
| - sd->hstart = 0; |
| - sd->vstart = 7; |
| + sd->hstart = 1; |
| + sd->vstart = 2; |
| return 0; |
| } |
| |
| -- |
| 1.6.1 |
| |
| From: Max Thrun <bear24rw@gmail.com> |
| Date: Sat, 27 Feb 2010 20:20:18 +0000 (-0300) |
| Subject: V4L/DVB: gspca- ov534: Remove ambiguous controls |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=c8e6b4f9f77d44edef3ef9ffd25957a204beb444 |
| |
| V4L/DVB: gspca- ov534: Remove ambiguous controls |
| |
| Remove Blue/Red Channel Target Value, they are meant for Black Level |
| Calibration but it is not completely clear how to use them. |
| |
| Signed-off-by: Max Thrun <bear24rw@gmail.com> |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index 957e05e..2a0e8a3 100644 |
| |
| |
| @@ -60,8 +60,6 @@ struct sd { |
| u8 contrast; |
| u8 gain; |
| u8 exposure; |
| - u8 redblc; |
| - u8 blueblc; |
| u8 hue; |
| u8 autogain; |
| u8 awb; |
| @@ -76,10 +74,6 @@ static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val); |
| -static int sd_setredblc(struct gspca_dev *gspca_dev, __s32 val); |
| -static int sd_getredblc(struct gspca_dev *gspca_dev, __s32 *val); |
| -static int sd_setblueblc(struct gspca_dev *gspca_dev, __s32 val); |
| -static int sd_getblueblc(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val); |
| @@ -156,34 +150,6 @@ static const struct ctrl sd_ctrls[] = { |
| }, |
| { /* 4 */ |
| { |
| - .id = V4L2_CID_RED_BALANCE, |
| - .type = V4L2_CTRL_TYPE_INTEGER, |
| - .name = "Red Balance", |
| - .minimum = 0, |
| - .maximum = 255, |
| - .step = 1, |
| -#define RED_BALANCE_DEF 128 |
| - .default_value = RED_BALANCE_DEF, |
| - }, |
| - .set = sd_setredblc, |
| - .get = sd_getredblc, |
| - }, |
| - { /* 5 */ |
| - { |
| - .id = V4L2_CID_BLUE_BALANCE, |
| - .type = V4L2_CTRL_TYPE_INTEGER, |
| - .name = "Blue Balance", |
| - .minimum = 0, |
| - .maximum = 255, |
| - .step = 1, |
| -#define BLUE_BALANCE_DEF 128 |
| - .default_value = BLUE_BALANCE_DEF, |
| - }, |
| - .set = sd_setblueblc, |
| - .get = sd_getblueblc, |
| - }, |
| - { /* 6 */ |
| - { |
| .id = V4L2_CID_HUE, |
| .type = V4L2_CTRL_TYPE_INTEGER, |
| .name = "Hue", |
| @@ -196,7 +162,7 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_sethue, |
| .get = sd_gethue, |
| }, |
| - { /* 7 */ |
| + { /* 5 */ |
| { |
| .id = V4L2_CID_AUTOGAIN, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| @@ -210,8 +176,8 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_setautogain, |
| .get = sd_getautogain, |
| }, |
| -#define AWB_IDX 8 |
| - { /* 8 */ |
| +#define AWB_IDX 6 |
| + { /* 6 */ |
| { |
| .id = V4L2_CID_AUTO_WHITE_BALANCE, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| @@ -225,7 +191,7 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_setawb, |
| .get = sd_getawb, |
| }, |
| - { /* 9 */ |
| + { /* 7 */ |
| { |
| .id = V4L2_CID_SHARPNESS, |
| .type = V4L2_CTRL_TYPE_INTEGER, |
| @@ -239,7 +205,7 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_setsharpness, |
| .get = sd_getsharpness, |
| }, |
| - { /* 10 */ |
| + { /* 8 */ |
| { |
| .id = V4L2_CID_HFLIP, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| @@ -253,7 +219,7 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_sethflip, |
| .get = sd_gethflip, |
| }, |
| - { /* 11 */ |
| + { /* 9 */ |
| { |
| .id = V4L2_CID_VFLIP, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| @@ -722,20 +688,6 @@ static void setexposure(struct gspca_dev *gspca_dev) |
| sccb_reg_write(gspca_dev, 0x10, val << 1); |
| } |
| |
| -static void setredblc(struct gspca_dev *gspca_dev) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - sccb_reg_write(gspca_dev, 0x43, sd->redblc); |
| -} |
| - |
| -static void setblueblc(struct gspca_dev *gspca_dev) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - sccb_reg_write(gspca_dev, 0x42, sd->blueblc); |
| -} |
| - |
| static void sethue(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| @@ -825,8 +777,6 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| sd->contrast = CONTRAST_DEF; |
| sd->gain = GAIN_DEF; |
| sd->exposure = EXPO_DEF; |
| - sd->redblc = RED_BALANCE_DEF; |
| - sd->blueblc = BLUE_BALANCE_DEF; |
| sd->hue = HUE_DEF; |
| #if AUTOGAIN_DEF != 0 |
| sd->autogain = AUTOGAIN_DEF; |
| @@ -907,8 +857,6 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| setautogain(gspca_dev); |
| setawb(gspca_dev); |
| setgain(gspca_dev); |
| - setredblc(gspca_dev); |
| - setblueblc(gspca_dev); |
| sethue(gspca_dev); |
| setexposure(gspca_dev); |
| setbrightness(gspca_dev); |
| @@ -1092,42 +1040,6 @@ static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val) |
| return 0; |
| } |
| |
| -static int sd_setredblc(struct gspca_dev *gspca_dev, __s32 val) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - sd->redblc = val; |
| - if (gspca_dev->streaming) |
| - setredblc(gspca_dev); |
| - return 0; |
| -} |
| - |
| -static int sd_getredblc(struct gspca_dev *gspca_dev, __s32 *val) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - *val = sd->redblc; |
| - return 0; |
| -} |
| - |
| -static int sd_setblueblc(struct gspca_dev *gspca_dev, __s32 val) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - sd->blueblc = val; |
| - if (gspca_dev->streaming) |
| - setblueblc(gspca_dev); |
| - return 0; |
| -} |
| - |
| -static int sd_getblueblc(struct gspca_dev *gspca_dev, __s32 *val) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - *val = sd->blueblc; |
| - return 0; |
| -} |
| - |
| static int sd_sethue(struct gspca_dev *gspca_dev, __s32 val) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| From: Antonio Ospite <ospite@studenti.unina.it> |
| Date: Sat, 27 Feb 2010 20:20:19 +0000 (-0300) |
| Subject: V4L/DVB: gspca - ov534: Remove hue control |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=6acd5f4ec11256cc11f8068f17121087765b5c7f |
| |
| V4L/DVB: gspca - ov534: Remove hue control |
| |
| Hue control doesn't work and the sensor datasheet is not clear about how |
| to set hue properly. |
| |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index 2a0e8a3..186827a 100644 |
| |
| |
| @@ -60,7 +60,6 @@ struct sd { |
| u8 contrast; |
| u8 gain; |
| u8 exposure; |
| - u8 hue; |
| u8 autogain; |
| u8 awb; |
| s8 sharpness; |
| @@ -82,8 +81,6 @@ static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_gethflip(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val); |
| -static int sd_sethue(struct gspca_dev *gspca_dev, __s32 val); |
| -static int sd_gethue(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setawb(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getawb(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val); |
| @@ -150,20 +147,6 @@ static const struct ctrl sd_ctrls[] = { |
| }, |
| { /* 4 */ |
| { |
| - .id = V4L2_CID_HUE, |
| - .type = V4L2_CTRL_TYPE_INTEGER, |
| - .name = "Hue", |
| - .minimum = 0, |
| - .maximum = 255, |
| - .step = 1, |
| -#define HUE_DEF 143 |
| - .default_value = HUE_DEF, |
| - }, |
| - .set = sd_sethue, |
| - .get = sd_gethue, |
| - }, |
| - { /* 5 */ |
| - { |
| .id = V4L2_CID_AUTOGAIN, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| .name = "Autogain", |
| @@ -176,8 +159,8 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_setautogain, |
| .get = sd_getautogain, |
| }, |
| -#define AWB_IDX 6 |
| - { /* 6 */ |
| +#define AWB_IDX 5 |
| + { /* 5 */ |
| { |
| .id = V4L2_CID_AUTO_WHITE_BALANCE, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| @@ -191,7 +174,7 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_setawb, |
| .get = sd_getawb, |
| }, |
| - { /* 7 */ |
| + { /* 6 */ |
| { |
| .id = V4L2_CID_SHARPNESS, |
| .type = V4L2_CTRL_TYPE_INTEGER, |
| @@ -205,7 +188,7 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_setsharpness, |
| .get = sd_getsharpness, |
| }, |
| - { /* 8 */ |
| + { /* 7 */ |
| { |
| .id = V4L2_CID_HFLIP, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| @@ -219,7 +202,7 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_sethflip, |
| .get = sd_gethflip, |
| }, |
| - { /* 9 */ |
| + { /* 8 */ |
| { |
| .id = V4L2_CID_VFLIP, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| @@ -688,13 +671,6 @@ static void setexposure(struct gspca_dev *gspca_dev) |
| sccb_reg_write(gspca_dev, 0x10, val << 1); |
| } |
| |
| -static void sethue(struct gspca_dev *gspca_dev) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - sccb_reg_write(gspca_dev, 0x01, sd->hue); |
| -} |
| - |
| static void setautogain(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| @@ -777,7 +753,6 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| sd->contrast = CONTRAST_DEF; |
| sd->gain = GAIN_DEF; |
| sd->exposure = EXPO_DEF; |
| - sd->hue = HUE_DEF; |
| #if AUTOGAIN_DEF != 0 |
| sd->autogain = AUTOGAIN_DEF; |
| #else |
| @@ -857,7 +832,6 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| setautogain(gspca_dev); |
| setawb(gspca_dev); |
| setgain(gspca_dev); |
| - sethue(gspca_dev); |
| setexposure(gspca_dev); |
| setbrightness(gspca_dev); |
| setcontrast(gspca_dev); |
| @@ -1040,24 +1014,6 @@ static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val) |
| return 0; |
| } |
| |
| -static int sd_sethue(struct gspca_dev *gspca_dev, __s32 val) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - sd->hue = val; |
| - if (gspca_dev->streaming) |
| - sethue(gspca_dev); |
| - return 0; |
| -} |
| - |
| -static int sd_gethue(struct gspca_dev *gspca_dev, __s32 *val) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - *val = sd->hue; |
| - return 0; |
| -} |
| - |
| static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| From: Max Thrun <bear24rw@gmail.com> |
| Date: Sat, 27 Feb 2010 20:20:20 +0000 (-0300) |
| Subject: V4L/DVB: gspca - ov534: Fix autogain control, enable it by default |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=0de1d89b747863562f1fdf7501b8e1fb5d54b33e |
| |
| V4L/DVB: gspca - ov534: Fix autogain control, enable it by default |
| |
| * Use 'agc' instead of 'autogain' in the code so to align the naming |
| as in AEC/AWB. |
| * Tweak brightness and contrast default values. |
| * Fix setting/resetting registers values for AGC. |
| * Set actual gain back when disabling AGC. |
| * Skip setting GAIN register when AGC is enabled. |
| * Enable AGC by default. |
| |
| Note that as Auto Gain Control is now enabled by default, if you are |
| using the driver for visual computing applications you might need to |
| disable it explicitly in your software. |
| |
| Signed-off-by: Max Thrun <bear24rw@gmail.com> |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index 186827a..4058e22 100644 |
| |
| |
| @@ -60,7 +60,7 @@ struct sd { |
| u8 contrast; |
| u8 gain; |
| u8 exposure; |
| - u8 autogain; |
| + u8 agc; |
| u8 awb; |
| s8 sharpness; |
| u8 hflip; |
| @@ -73,8 +73,8 @@ static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val); |
| -static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val); |
| -static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val); |
| +static int sd_setagc(struct gspca_dev *gspca_dev, __s32 val); |
| +static int sd_getagc(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val); |
| @@ -97,7 +97,7 @@ static const struct ctrl sd_ctrls[] = { |
| .minimum = 0, |
| .maximum = 255, |
| .step = 1, |
| -#define BRIGHTNESS_DEF 20 |
| +#define BRIGHTNESS_DEF 0 |
| .default_value = BRIGHTNESS_DEF, |
| }, |
| .set = sd_setbrightness, |
| @@ -111,7 +111,7 @@ static const struct ctrl sd_ctrls[] = { |
| .minimum = 0, |
| .maximum = 255, |
| .step = 1, |
| -#define CONTRAST_DEF 37 |
| +#define CONTRAST_DEF 32 |
| .default_value = CONTRAST_DEF, |
| }, |
| .set = sd_setcontrast, |
| @@ -149,15 +149,15 @@ static const struct ctrl sd_ctrls[] = { |
| { |
| .id = V4L2_CID_AUTOGAIN, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| - .name = "Autogain", |
| + .name = "Auto Gain", |
| .minimum = 0, |
| .maximum = 1, |
| .step = 1, |
| -#define AUTOGAIN_DEF 0 |
| - .default_value = AUTOGAIN_DEF, |
| +#define AGC_DEF 1 |
| + .default_value = AGC_DEF, |
| }, |
| - .set = sd_setautogain, |
| - .get = sd_getautogain, |
| + .set = sd_setagc, |
| + .get = sd_getagc, |
| }, |
| #define AWB_IDX 5 |
| { /* 5 */ |
| @@ -639,6 +639,9 @@ static void setgain(struct gspca_dev *gspca_dev) |
| struct sd *sd = (struct sd *) gspca_dev; |
| u8 val; |
| |
| + if (sd->agc) |
| + return; |
| + |
| val = sd->gain; |
| switch (val & 0x30) { |
| case 0x00: |
| @@ -671,18 +674,22 @@ static void setexposure(struct gspca_dev *gspca_dev) |
| sccb_reg_write(gspca_dev, 0x10, val << 1); |
| } |
| |
| -static void setautogain(struct gspca_dev *gspca_dev) |
| +static void setagc(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| |
| - if (sd->autogain) { |
| - sccb_reg_write(gspca_dev, 0x13, 0xf7); /* AGC,AEC,AWB ON */ |
| + if (sd->agc) { |
| + sccb_reg_write(gspca_dev, 0x13, |
| + sccb_reg_read(gspca_dev, 0x13) | 0x04); |
| sccb_reg_write(gspca_dev, 0x64, |
| sccb_reg_read(gspca_dev, 0x64) | 0x03); |
| } else { |
| - sccb_reg_write(gspca_dev, 0x13, 0xf0); /* AGC,AEC,AWB OFF */ |
| + sccb_reg_write(gspca_dev, 0x13, |
| + sccb_reg_read(gspca_dev, 0x13) & ~0x04); |
| sccb_reg_write(gspca_dev, 0x64, |
| - sccb_reg_read(gspca_dev, 0x64) & 0xfc); |
| + sccb_reg_read(gspca_dev, 0x64) & ~0x03); |
| + |
| + setgain(gspca_dev); |
| } |
| } |
| |
| @@ -753,8 +760,8 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| sd->contrast = CONTRAST_DEF; |
| sd->gain = GAIN_DEF; |
| sd->exposure = EXPO_DEF; |
| -#if AUTOGAIN_DEF != 0 |
| - sd->autogain = AUTOGAIN_DEF; |
| +#if AGC_DEF != 0 |
| + sd->agc = AGC_DEF; |
| #else |
| gspca_dev->ctrl_inac |= (1 << AWB_IDX); |
| #endif |
| @@ -829,7 +836,7 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| } |
| set_frame_rate(gspca_dev); |
| |
| - setautogain(gspca_dev); |
| + setagc(gspca_dev); |
| setawb(gspca_dev); |
| setgain(gspca_dev); |
| setexposure(gspca_dev); |
| @@ -1014,11 +1021,11 @@ static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val) |
| return 0; |
| } |
| |
| -static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val) |
| +static int sd_setagc(struct gspca_dev *gspca_dev, __s32 val) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| |
| - sd->autogain = val; |
| + sd->agc = val; |
| |
| if (gspca_dev->streaming) { |
| |
| @@ -1028,16 +1035,16 @@ static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val) |
| gspca_dev->ctrl_inac &= ~(1 << AWB_IDX); |
| else |
| gspca_dev->ctrl_inac |= (1 << AWB_IDX); |
| - setautogain(gspca_dev); |
| + setagc(gspca_dev); |
| } |
| return 0; |
| } |
| |
| -static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val) |
| +static int sd_getagc(struct gspca_dev *gspca_dev, __s32 *val) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| |
| - *val = sd->autogain; |
| + *val = sd->agc; |
| return 0; |
| } |
| |
| From: Max Thrun <bear24rw@gmail.com> |
| Date: Sat, 27 Feb 2010 20:20:21 +0000 (-0300) |
| Subject: V4L/DVB: gspca - ov534: Add Auto Exposure |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=9f886b52dd32c4eac5d5be13f74824856ff32baf |
| |
| V4L/DVB: gspca - ov534: Add Auto Exposure |
| |
| This also makes manual exposure actually work: it never worked before |
| because AEC was always enabled. |
| |
| Signed-off-by: Max Thrun <bear24rw@gmail.com> |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index 4058e22..2d89650 100644 |
| |
| |
| @@ -62,6 +62,7 @@ struct sd { |
| u8 exposure; |
| u8 agc; |
| u8 awb; |
| + u8 aec; |
| s8 sharpness; |
| u8 hflip; |
| u8 vflip; |
| @@ -83,6 +84,8 @@ static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setawb(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getawb(struct gspca_dev *gspca_dev, __s32 *val); |
| +static int sd_setaec(struct gspca_dev *gspca_dev, __s32 val); |
| +static int sd_getaec(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val); |
| @@ -176,6 +179,20 @@ static const struct ctrl sd_ctrls[] = { |
| }, |
| { /* 6 */ |
| { |
| + .id = V4L2_CID_EXPOSURE_AUTO, |
| + .type = V4L2_CTRL_TYPE_BOOLEAN, |
| + .name = "Auto Exposure", |
| + .minimum = 0, |
| + .maximum = 1, |
| + .step = 1, |
| +#define AEC_DEF 1 |
| + .default_value = AEC_DEF, |
| + }, |
| + .set = sd_setaec, |
| + .get = sd_getaec, |
| + }, |
| + { /* 7 */ |
| + { |
| .id = V4L2_CID_SHARPNESS, |
| .type = V4L2_CTRL_TYPE_INTEGER, |
| .name = "Sharpness", |
| @@ -188,7 +205,7 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_setsharpness, |
| .get = sd_getsharpness, |
| }, |
| - { /* 7 */ |
| + { /* 8 */ |
| { |
| .id = V4L2_CID_HFLIP, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| @@ -202,7 +219,7 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_sethflip, |
| .get = sd_gethflip, |
| }, |
| - { /* 8 */ |
| + { /* 9 */ |
| { |
| .id = V4L2_CID_VFLIP, |
| .type = V4L2_CTRL_TYPE_BOOLEAN, |
| @@ -703,6 +720,20 @@ static void setawb(struct gspca_dev *gspca_dev) |
| sccb_reg_write(gspca_dev, 0x63, 0xaa); /* AWB off */ |
| } |
| |
| +static void setaec(struct gspca_dev *gspca_dev) |
| +{ |
| + struct sd *sd = (struct sd *) gspca_dev; |
| + |
| + if (sd->aec) |
| + sccb_reg_write(gspca_dev, 0x13, |
| + sccb_reg_read(gspca_dev, 0x13) | 0x01); |
| + else { |
| + sccb_reg_write(gspca_dev, 0x13, |
| + sccb_reg_read(gspca_dev, 0x13) & ~0x01); |
| + setexposure(gspca_dev); |
| + } |
| +} |
| + |
| static void setsharpness(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| @@ -768,6 +799,7 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| #if AWB_DEF != 0 |
| sd->awb = AWB_DEF |
| #endif |
| + sd->aec = AEC_DEF; |
| #if SHARPNESS_DEF != 0 |
| sd->sharpness = SHARPNESS_DEF; |
| #endif |
| @@ -838,6 +870,7 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| |
| setagc(gspca_dev); |
| setawb(gspca_dev); |
| + setaec(gspca_dev); |
| setgain(gspca_dev); |
| setexposure(gspca_dev); |
| setbrightness(gspca_dev); |
| @@ -1066,6 +1099,24 @@ static int sd_getawb(struct gspca_dev *gspca_dev, __s32 *val) |
| return 0; |
| } |
| |
| +static int sd_setaec(struct gspca_dev *gspca_dev, __s32 val) |
| +{ |
| + struct sd *sd = (struct sd *) gspca_dev; |
| + |
| + sd->aec = val; |
| + if (gspca_dev->streaming) |
| + setaec(gspca_dev); |
| + return 0; |
| +} |
| + |
| +static int sd_getaec(struct gspca_dev *gspca_dev, __s32 *val) |
| +{ |
| + struct sd *sd = (struct sd *) gspca_dev; |
| + |
| + *val = sd->aec; |
| + return 0; |
| +} |
| + |
| static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| From: Antonio Ospite <ospite@studenti.unina.it> |
| Date: Mon, 1 Mar 2010 11:53:34 +0000 (-0300) |
| Subject: V4L/DVB: gspca - ov534: Fix and document setting manual exposure |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=c8b4264e60b378aa73dc59d434c930bc9345c890 |
| |
| V4L/DVB: gspca - ov534: Fix and document setting manual exposure |
| |
| Document that even if the state is a u8 value, both MSB and LSB are set |
| as sd->exposure represents half of the value we are going to set into |
| registers. |
| |
| Skip setting exposure when AEC is enabled. |
| |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index 2d89650..4fda098 100644 |
| |
| |
| @@ -686,6 +686,15 @@ static void setexposure(struct gspca_dev *gspca_dev) |
| struct sd *sd = (struct sd *) gspca_dev; |
| u8 val; |
| |
| + if (sd->aec) |
| + return; |
| + |
| + /* 'val' is one byte and represents half of the exposure value we are |
| + * going to set into registers, a two bytes value: |
| + * |
| + * MSB: ((u16) val << 1) >> 8 == val >> 7 |
| + * LSB: ((u16) val << 1) & 0xff == val << 1 |
| + */ |
| val = sd->exposure; |
| sccb_reg_write(gspca_dev, 0x08, val >> 7); |
| sccb_reg_write(gspca_dev, 0x10, val << 1); |
| From: Max Thrun <bear24rw@gmail.com> |
| Date: Sat, 27 Feb 2010 20:20:23 +0000 (-0300) |
| Subject: V4L/DVB: gspca - ov534: Fix Auto White Balance control |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=6a7410900b54e9af7f9282917a8bcbc9835ffaa1 |
| |
| V4L/DVB: gspca - ov534: Fix Auto White Balance control |
| |
| Set only the needed bits for AWB, and enable it by default. |
| |
| Signed-off-by: Max Thrun <bear24rw@gmail.com> |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index 4fda098..3b538d7 100644 |
| |
| |
| @@ -171,7 +171,7 @@ static const struct ctrl sd_ctrls[] = { |
| .minimum = 0, |
| .maximum = 1, |
| .step = 1, |
| -#define AWB_DEF 0 |
| +#define AWB_DEF 1 |
| .default_value = AWB_DEF, |
| }, |
| .set = sd_setawb, |
| @@ -723,10 +723,17 @@ static void setawb(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| |
| - if (sd->awb) |
| - sccb_reg_write(gspca_dev, 0x63, 0xe0); /* AWB on */ |
| - else |
| - sccb_reg_write(gspca_dev, 0x63, 0xaa); /* AWB off */ |
| + if (sd->awb) { |
| + sccb_reg_write(gspca_dev, 0x13, |
| + sccb_reg_read(gspca_dev, 0x13) | 0x02); |
| + sccb_reg_write(gspca_dev, 0x63, |
| + sccb_reg_read(gspca_dev, 0x63) | 0xc0); |
| + } else { |
| + sccb_reg_write(gspca_dev, 0x13, |
| + sccb_reg_read(gspca_dev, 0x13) & ~0x02); |
| + sccb_reg_write(gspca_dev, 0x63, |
| + sccb_reg_read(gspca_dev, 0x63) & ~0xc0); |
| + } |
| } |
| |
| static void setaec(struct gspca_dev *gspca_dev) |
| @@ -805,9 +812,7 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| #else |
| gspca_dev->ctrl_inac |= (1 << AWB_IDX); |
| #endif |
| -#if AWB_DEF != 0 |
| - sd->awb = AWB_DEF |
| -#endif |
| + sd->awb = AWB_DEF; |
| sd->aec = AEC_DEF; |
| #if SHARPNESS_DEF != 0 |
| sd->sharpness = SHARPNESS_DEF; |
| From: Max Thrun <bear24rw@gmail.com> |
| Date: Sat, 27 Feb 2010 20:20:24 +0000 (-0300) |
| Subject: V4L/DVB: gspca - ov534: Fixes for sharpness control |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=2bd647c5a4f8236b035f9db620930731ac77c957 |
| |
| V4L/DVB: gspca - ov534: Fixes for sharpness control |
| |
| * Adjust comments for sharpness control |
| * Set default value unconditionally, for readability |
| |
| Signed-off-by: Max Thrun <bear24rw@gmail.com> |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index 3b538d7..f2077ea 100644 |
| |
| |
| @@ -756,8 +756,8 @@ static void setsharpness(struct gspca_dev *gspca_dev) |
| u8 val; |
| |
| val = sd->sharpness; |
| - sccb_reg_write(gspca_dev, 0x91, val); /* vga noise */ |
| - sccb_reg_write(gspca_dev, 0x8e, val); /* qvga noise */ |
| + sccb_reg_write(gspca_dev, 0x91, val); /* Auto de-noise threshold */ |
| + sccb_reg_write(gspca_dev, 0x8e, val); /* De-noise threshold */ |
| } |
| |
| static void sethflip(struct gspca_dev *gspca_dev) |
| @@ -814,9 +814,7 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| #endif |
| sd->awb = AWB_DEF; |
| sd->aec = AEC_DEF; |
| -#if SHARPNESS_DEF != 0 |
| sd->sharpness = SHARPNESS_DEF; |
| -#endif |
| #if HFLIP_DEF != 0 |
| sd->hflip = HFLIP_DEF; |
| #endif |
| From: Max Thrun <bear24rw@gmail.com> |
| Date: Sat, 27 Feb 2010 20:20:25 +0000 (-0300) |
| Subject: V4L/DVB: gspca - ov534: Fix unsetting hflip and vflip bits |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=9398cf3859a02fcc3a310393857d5cfca61647f3 |
| |
| V4L/DVB: gspca - ov534: Fix unsetting hflip and vflip bits |
| |
| Also set default values unconditionally, for readability. |
| |
| Signed-off-by: Max Thrun <bear24rw@gmail.com> |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index f2077ea..8f01201 100644 |
| |
| |
| @@ -769,7 +769,7 @@ static void sethflip(struct gspca_dev *gspca_dev) |
| sccb_reg_read(gspca_dev, 0x0c) | 0x40); |
| else |
| sccb_reg_write(gspca_dev, 0x0c, |
| - sccb_reg_read(gspca_dev, 0x0c) & 0xbf); |
| + sccb_reg_read(gspca_dev, 0x0c) & ~0x40); |
| } |
| |
| static void setvflip(struct gspca_dev *gspca_dev) |
| @@ -781,7 +781,7 @@ static void setvflip(struct gspca_dev *gspca_dev) |
| sccb_reg_read(gspca_dev, 0x0c) | 0x80); |
| else |
| sccb_reg_write(gspca_dev, 0x0c, |
| - sccb_reg_read(gspca_dev, 0x0c) & 0x7f); |
| + sccb_reg_read(gspca_dev, 0x0c) & ~0x80); |
| } |
| |
| /* this function is called at probe time */ |
| @@ -815,12 +815,8 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| sd->awb = AWB_DEF; |
| sd->aec = AEC_DEF; |
| sd->sharpness = SHARPNESS_DEF; |
| -#if HFLIP_DEF != 0 |
| sd->hflip = HFLIP_DEF; |
| -#endif |
| -#if VFLIP_DEF != 0 |
| sd->vflip = VFLIP_DEF; |
| -#endif |
| |
| return 0; |
| } |
| From: Antonio Ospite <ospite@studenti.unina.it> |
| Date: Mon, 1 Mar 2010 11:54:33 +0000 (-0300) |
| Subject: V4L/DVB: gspca - ov534: Cosmetics: fix indentation and hex digits |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=521acb59f1fa8d6a2bd37f8262da2b789014ac71 |
| |
| V4L/DVB: gspca - ov534: Cosmetics: fix indentation and hex digits |
| |
| * Indent with tabs, not with spaces, nor with mixed style. |
| * Less indentation for controls index comments. |
| * Use lowercase hex digits. |
| |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index 8f01201..8783844 100644 |
| |
| |
| @@ -92,147 +92,147 @@ static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val); |
| |
| static const struct ctrl sd_ctrls[] = { |
| - { /* 0 */ |
| - { |
| - .id = V4L2_CID_BRIGHTNESS, |
| - .type = V4L2_CTRL_TYPE_INTEGER, |
| - .name = "Brightness", |
| - .minimum = 0, |
| - .maximum = 255, |
| - .step = 1, |
| + { /* 0 */ |
| + { |
| + .id = V4L2_CID_BRIGHTNESS, |
| + .type = V4L2_CTRL_TYPE_INTEGER, |
| + .name = "Brightness", |
| + .minimum = 0, |
| + .maximum = 255, |
| + .step = 1, |
| #define BRIGHTNESS_DEF 0 |
| - .default_value = BRIGHTNESS_DEF, |
| + .default_value = BRIGHTNESS_DEF, |
| + }, |
| + .set = sd_setbrightness, |
| + .get = sd_getbrightness, |
| }, |
| - .set = sd_setbrightness, |
| - .get = sd_getbrightness, |
| - }, |
| - { /* 1 */ |
| - { |
| - .id = V4L2_CID_CONTRAST, |
| - .type = V4L2_CTRL_TYPE_INTEGER, |
| - .name = "Contrast", |
| - .minimum = 0, |
| - .maximum = 255, |
| - .step = 1, |
| + { /* 1 */ |
| + { |
| + .id = V4L2_CID_CONTRAST, |
| + .type = V4L2_CTRL_TYPE_INTEGER, |
| + .name = "Contrast", |
| + .minimum = 0, |
| + .maximum = 255, |
| + .step = 1, |
| #define CONTRAST_DEF 32 |
| - .default_value = CONTRAST_DEF, |
| + .default_value = CONTRAST_DEF, |
| + }, |
| + .set = sd_setcontrast, |
| + .get = sd_getcontrast, |
| }, |
| - .set = sd_setcontrast, |
| - .get = sd_getcontrast, |
| - }, |
| - { /* 2 */ |
| - { |
| - .id = V4L2_CID_GAIN, |
| - .type = V4L2_CTRL_TYPE_INTEGER, |
| - .name = "Main Gain", |
| - .minimum = 0, |
| - .maximum = 63, |
| - .step = 1, |
| + { /* 2 */ |
| + { |
| + .id = V4L2_CID_GAIN, |
| + .type = V4L2_CTRL_TYPE_INTEGER, |
| + .name = "Main Gain", |
| + .minimum = 0, |
| + .maximum = 63, |
| + .step = 1, |
| #define GAIN_DEF 20 |
| - .default_value = GAIN_DEF, |
| + .default_value = GAIN_DEF, |
| + }, |
| + .set = sd_setgain, |
| + .get = sd_getgain, |
| }, |
| - .set = sd_setgain, |
| - .get = sd_getgain, |
| - }, |
| - { /* 3 */ |
| - { |
| - .id = V4L2_CID_EXPOSURE, |
| - .type = V4L2_CTRL_TYPE_INTEGER, |
| - .name = "Exposure", |
| - .minimum = 0, |
| - .maximum = 255, |
| - .step = 1, |
| + { /* 3 */ |
| + { |
| + .id = V4L2_CID_EXPOSURE, |
| + .type = V4L2_CTRL_TYPE_INTEGER, |
| + .name = "Exposure", |
| + .minimum = 0, |
| + .maximum = 255, |
| + .step = 1, |
| #define EXPO_DEF 120 |
| - .default_value = EXPO_DEF, |
| + .default_value = EXPO_DEF, |
| + }, |
| + .set = sd_setexposure, |
| + .get = sd_getexposure, |
| }, |
| - .set = sd_setexposure, |
| - .get = sd_getexposure, |
| - }, |
| - { /* 4 */ |
| - { |
| - .id = V4L2_CID_AUTOGAIN, |
| - .type = V4L2_CTRL_TYPE_BOOLEAN, |
| - .name = "Auto Gain", |
| - .minimum = 0, |
| - .maximum = 1, |
| - .step = 1, |
| + { /* 4 */ |
| + { |
| + .id = V4L2_CID_AUTOGAIN, |
| + .type = V4L2_CTRL_TYPE_BOOLEAN, |
| + .name = "Auto Gain", |
| + .minimum = 0, |
| + .maximum = 1, |
| + .step = 1, |
| #define AGC_DEF 1 |
| - .default_value = AGC_DEF, |
| + .default_value = AGC_DEF, |
| + }, |
| + .set = sd_setagc, |
| + .get = sd_getagc, |
| }, |
| - .set = sd_setagc, |
| - .get = sd_getagc, |
| - }, |
| #define AWB_IDX 5 |
| - { /* 5 */ |
| - { |
| - .id = V4L2_CID_AUTO_WHITE_BALANCE, |
| - .type = V4L2_CTRL_TYPE_BOOLEAN, |
| - .name = "Auto White Balance", |
| - .minimum = 0, |
| - .maximum = 1, |
| - .step = 1, |
| + { /* 5 */ |
| + { |
| + .id = V4L2_CID_AUTO_WHITE_BALANCE, |
| + .type = V4L2_CTRL_TYPE_BOOLEAN, |
| + .name = "Auto White Balance", |
| + .minimum = 0, |
| + .maximum = 1, |
| + .step = 1, |
| #define AWB_DEF 1 |
| - .default_value = AWB_DEF, |
| + .default_value = AWB_DEF, |
| + }, |
| + .set = sd_setawb, |
| + .get = sd_getawb, |
| }, |
| - .set = sd_setawb, |
| - .get = sd_getawb, |
| - }, |
| - { /* 6 */ |
| - { |
| - .id = V4L2_CID_EXPOSURE_AUTO, |
| - .type = V4L2_CTRL_TYPE_BOOLEAN, |
| - .name = "Auto Exposure", |
| - .minimum = 0, |
| - .maximum = 1, |
| - .step = 1, |
| + { /* 6 */ |
| + { |
| + .id = V4L2_CID_EXPOSURE_AUTO, |
| + .type = V4L2_CTRL_TYPE_BOOLEAN, |
| + .name = "Auto Exposure", |
| + .minimum = 0, |
| + .maximum = 1, |
| + .step = 1, |
| #define AEC_DEF 1 |
| - .default_value = AEC_DEF, |
| + .default_value = AEC_DEF, |
| + }, |
| + .set = sd_setaec, |
| + .get = sd_getaec, |
| }, |
| - .set = sd_setaec, |
| - .get = sd_getaec, |
| - }, |
| - { /* 7 */ |
| - { |
| - .id = V4L2_CID_SHARPNESS, |
| - .type = V4L2_CTRL_TYPE_INTEGER, |
| - .name = "Sharpness", |
| - .minimum = 0, |
| - .maximum = 63, |
| - .step = 1, |
| + { /* 7 */ |
| + { |
| + .id = V4L2_CID_SHARPNESS, |
| + .type = V4L2_CTRL_TYPE_INTEGER, |
| + .name = "Sharpness", |
| + .minimum = 0, |
| + .maximum = 63, |
| + .step = 1, |
| #define SHARPNESS_DEF 0 |
| - .default_value = SHARPNESS_DEF, |
| + .default_value = SHARPNESS_DEF, |
| + }, |
| + .set = sd_setsharpness, |
| + .get = sd_getsharpness, |
| }, |
| - .set = sd_setsharpness, |
| - .get = sd_getsharpness, |
| - }, |
| - { /* 8 */ |
| - { |
| - .id = V4L2_CID_HFLIP, |
| - .type = V4L2_CTRL_TYPE_BOOLEAN, |
| - .name = "HFlip", |
| - .minimum = 0, |
| - .maximum = 1, |
| - .step = 1, |
| + { /* 8 */ |
| + { |
| + .id = V4L2_CID_HFLIP, |
| + .type = V4L2_CTRL_TYPE_BOOLEAN, |
| + .name = "HFlip", |
| + .minimum = 0, |
| + .maximum = 1, |
| + .step = 1, |
| #define HFLIP_DEF 0 |
| - .default_value = HFLIP_DEF, |
| + .default_value = HFLIP_DEF, |
| + }, |
| + .set = sd_sethflip, |
| + .get = sd_gethflip, |
| }, |
| - .set = sd_sethflip, |
| - .get = sd_gethflip, |
| - }, |
| - { /* 9 */ |
| - { |
| - .id = V4L2_CID_VFLIP, |
| - .type = V4L2_CTRL_TYPE_BOOLEAN, |
| - .name = "VFlip", |
| - .minimum = 0, |
| - .maximum = 1, |
| - .step = 1, |
| + { /* 9 */ |
| + { |
| + .id = V4L2_CID_VFLIP, |
| + .type = V4L2_CTRL_TYPE_BOOLEAN, |
| + .name = "VFlip", |
| + .minimum = 0, |
| + .maximum = 1, |
| + .step = 1, |
| #define VFLIP_DEF 0 |
| - .default_value = VFLIP_DEF, |
| + .default_value = VFLIP_DEF, |
| + }, |
| + .set = sd_setvflip, |
| + .get = sd_getvflip, |
| }, |
| - .set = sd_setvflip, |
| - .get = sd_getvflip, |
| - }, |
| }; |
| |
| static const struct v4l2_pix_format ov772x_mode[] = { |
| @@ -641,14 +641,14 @@ static void setbrightness(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| |
| - sccb_reg_write(gspca_dev, 0x9B, sd->brightness); |
| + sccb_reg_write(gspca_dev, 0x9b, sd->brightness); |
| } |
| |
| static void setcontrast(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| |
| - sccb_reg_write(gspca_dev, 0x9C, sd->contrast); |
| + sccb_reg_write(gspca_dev, 0x9c, sd->contrast); |
| } |
| |
| static void setgain(struct gspca_dev *gspca_dev) |
| From: Mosalam Ebrahimi <m.ebrahimi@ieee.org> |
| Date: Mon, 8 Mar 2010 16:52:17 +0000 (-0300) |
| Subject: V4L/DVB: gspca - ov534: Add Powerline Frequency control |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=9bc3ac54da6a52969088caca9f6acdf682fa8ace |
| |
| V4L/DVB: gspca - ov534: Add Powerline Frequency control |
| |
| Note that setting this options to 50Hz can reduce the framerate, so it is |
| still disabled (60Hz) by default. |
| |
| Signed-off-by: Mosalam Ebrahimi <m.ebrahimi@ieee.org> |
| Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c |
| index 8783844..29af17e 100644 |
| |
| |
| @@ -66,7 +66,7 @@ struct sd { |
| s8 sharpness; |
| u8 hflip; |
| u8 vflip; |
| - |
| + u8 freqfltr; |
| }; |
| |
| /* V4L2 controls supported by the driver */ |
| @@ -90,6 +90,10 @@ static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val); |
| static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val); |
| static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val); |
| +static int sd_setfreqfltr(struct gspca_dev *gspca_dev, __s32 val); |
| +static int sd_getfreqfltr(struct gspca_dev *gspca_dev, __s32 *val); |
| +static int sd_querymenu(struct gspca_dev *gspca_dev, |
| + struct v4l2_querymenu *menu); |
| |
| static const struct ctrl sd_ctrls[] = { |
| { /* 0 */ |
| @@ -233,6 +237,20 @@ static const struct ctrl sd_ctrls[] = { |
| .set = sd_setvflip, |
| .get = sd_getvflip, |
| }, |
| + { /* 10 */ |
| + { |
| + .id = V4L2_CID_POWER_LINE_FREQUENCY, |
| + .type = V4L2_CTRL_TYPE_MENU, |
| + .name = "Light Frequency Filter", |
| + .minimum = 0, |
| + .maximum = 1, |
| + .step = 1, |
| +#define FREQFLTR_DEF 0 |
| + .default_value = FREQFLTR_DEF, |
| + }, |
| + .set = sd_setfreqfltr, |
| + .get = sd_getfreqfltr, |
| + }, |
| }; |
| |
| static const struct v4l2_pix_format ov772x_mode[] = { |
| @@ -784,6 +802,17 @@ static void setvflip(struct gspca_dev *gspca_dev) |
| sccb_reg_read(gspca_dev, 0x0c) & ~0x80); |
| } |
| |
| +static void setfreqfltr(struct gspca_dev *gspca_dev) |
| +{ |
| + struct sd *sd = (struct sd *) gspca_dev; |
| + |
| + if (sd->freqfltr == 0) |
| + sccb_reg_write(gspca_dev, 0x2b, 0x00); |
| + else |
| + sccb_reg_write(gspca_dev, 0x2b, 0x9e); |
| +} |
| + |
| + |
| /* this function is called at probe time */ |
| static int sd_config(struct gspca_dev *gspca_dev, |
| const struct usb_device_id *id) |
| @@ -817,6 +846,7 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| sd->sharpness = SHARPNESS_DEF; |
| sd->hflip = HFLIP_DEF; |
| sd->vflip = VFLIP_DEF; |
| + sd->freqfltr = FREQFLTR_DEF; |
| |
| return 0; |
| } |
| @@ -886,6 +916,7 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| setsharpness(gspca_dev); |
| setvflip(gspca_dev); |
| sethflip(gspca_dev); |
| + setfreqfltr(gspca_dev); |
| |
| ov534_set_led(gspca_dev, 1); |
| ov534_reg_write(gspca_dev, 0xe0, 0x00); |
| @@ -1179,6 +1210,43 @@ static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val) |
| return 0; |
| } |
| |
| +static int sd_setfreqfltr(struct gspca_dev *gspca_dev, __s32 val) |
| +{ |
| + struct sd *sd = (struct sd *) gspca_dev; |
| + |
| + sd->freqfltr = val; |
| + if (gspca_dev->streaming) |
| + setfreqfltr(gspca_dev); |
| + return 0; |
| +} |
| + |
| +static int sd_getfreqfltr(struct gspca_dev *gspca_dev, __s32 *val) |
| +{ |
| + struct sd *sd = (struct sd *) gspca_dev; |
| + |
| + *val = sd->freqfltr; |
| + return 0; |
| +} |
| + |
| +static int sd_querymenu(struct gspca_dev *gspca_dev, |
| + struct v4l2_querymenu *menu) |
| +{ |
| + switch (menu->id) { |
| + case V4L2_CID_POWER_LINE_FREQUENCY: |
| + switch (menu->index) { |
| + case 0: /* V4L2_CID_POWER_LINE_FREQUENCY_DISABLED */ |
| + strcpy((char *) menu->name, "Disabled"); |
| + return 0; |
| + case 1: /* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */ |
| + strcpy((char *) menu->name, "50 Hz"); |
| + return 0; |
| + } |
| + break; |
| + } |
| + |
| + return -EINVAL; |
| +} |
| + |
| /* get stream parameters (framerate) */ |
| static int sd_get_streamparm(struct gspca_dev *gspca_dev, |
| struct v4l2_streamparm *parm) |
| @@ -1230,6 +1298,7 @@ static const struct sd_desc sd_desc = { |
| .start = sd_start, |
| .stopN = sd_stopN, |
| .pkt_scan = sd_pkt_scan, |
| + .querymenu = sd_querymenu, |
| .get_streamparm = sd_get_streamparm, |
| .set_streamparm = sd_set_streamparm, |
| }; |
| gspca_spca561: Fix LED on rev12a cameras |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| Fix LED control on rev12a cameras and remove the unneeded |
| sd_stop0 callback function. |
| |
| Priority: normal |
| |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| |
| |
| |
| @@ -280,9 +280,9 @@ |
| }; |
| |
| static const __u16 spca561_161rev12A_data1[][2] = { |
| - {0x29, 0x8118}, /* white balance - was 21 */ |
| - {0x08, 0x8114}, /* white balance - was 01 */ |
| - {0x0e, 0x8112}, /* white balance - was 00 */ |
| + {0x29, 0x8118}, /* Control register (various enable bits) */ |
| + {0x08, 0x8114}, /* GPIO: Led off */ |
| + {0x0e, 0x8112}, /* 0x0e stream off 0x3e stream on */ |
| {0x00, 0x8102}, /* white balance - new */ |
| {0x92, 0x8804}, |
| {0x04, 0x8802}, /* windows uses 08 */ |
| @@ -294,15 +294,11 @@ |
| {0x07, 0x8601}, |
| {0x07, 0x8602}, |
| {0x04, 0x8501}, |
| - {0x21, 0x8118}, |
| |
| {0x07, 0x8201}, /* windows uses 02 */ |
| {0x08, 0x8200}, |
| {0x01, 0x8200}, |
| |
| - {0x00, 0x8114}, |
| - {0x01, 0x8114}, /* windows uses 00 */ |
| - |
| {0x90, 0x8604}, |
| {0x00, 0x8605}, |
| {0xb0, 0x8603}, |
| @@ -333,6 +329,9 @@ |
| {0xf0, 0x8505}, |
| {0x32, 0x850a}, |
| /* {0x99, 0x8700}, * - white balance - new (removed) */ |
| + /* HDG we used to do this in stop0, making the init state and the state |
| + after a start / stop different, so do this here instead. */ |
| + {0x29, 0x8118}, |
| {} |
| }; |
| |
| @@ -676,6 +675,9 @@ |
| setwhite(gspca_dev); |
| setgain(gspca_dev); |
| setexposure(gspca_dev); |
| + |
| + /* Led ON (bit 3 -> 0 */ |
| + reg_w_val(gspca_dev->dev, 0x8114, 0x00); |
| return 0; |
| } |
| static int sd_start_72a(struct gspca_dev *gspca_dev) |
| @@ -722,26 +724,14 @@ |
| |
| if (sd->chip_revision == Rev012A) { |
| reg_w_val(gspca_dev->dev, 0x8112, 0x0e); |
| + /* Led Off (bit 3 -> 1 */ |
| + reg_w_val(gspca_dev->dev, 0x8114, 0x08); |
| } else { |
| reg_w_val(gspca_dev->dev, 0x8112, 0x20); |
| /* reg_w_val(gspca_dev->dev, 0x8102, 0x00); ?? */ |
| } |
| } |
| |
| -/* called on streamoff with alt 0 and on disconnect */ |
| -static void sd_stop0(struct gspca_dev *gspca_dev) |
| -{ |
| - struct sd *sd = (struct sd *) gspca_dev; |
| - |
| - if (!gspca_dev->present) |
| - return; |
| - if (sd->chip_revision == Rev012A) { |
| - reg_w_val(gspca_dev->dev, 0x8118, 0x29); |
| - reg_w_val(gspca_dev->dev, 0x8114, 0x08); |
| - } |
| -/* reg_w_val(gspca_dev->dev, 0x8114, 0); */ |
| -} |
| - |
| static void do_autogain(struct gspca_dev *gspca_dev) |
| { |
| struct sd *sd = (struct sd *) gspca_dev; |
| @@ -1059,7 +1049,6 @@ |
| .init = sd_init_12a, |
| .start = sd_start_12a, |
| .stopN = sd_stopN, |
| - .stop0 = sd_stop0, |
| .pkt_scan = sd_pkt_scan, |
| }; |
| static const struct sd_desc sd_desc_72a = { |
| @@ -1070,7 +1059,6 @@ |
| .init = sd_init_72a, |
| .start = sd_start_72a, |
| .stopN = sd_stopN, |
| - .stop0 = sd_stop0, |
| .pkt_scan = sd_pkt_scan, |
| .dq_callback = do_autogain, |
| }; |
| |
| gspca_spca561: Add support for camera button |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| gspca_spca561: Add support for camera button |
| |
| Priority: normal |
| |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| |
| |
| |
| @@ -22,6 +22,7 @@ |
| |
| #define MODULE_NAME "spca561" |
| |
| +#include <linux/input.h> |
| #include "gspca.h" |
| |
| MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
| @@ -809,6 +810,23 @@ |
| switch (*data++) { /* sequence number */ |
| case 0: /* start of frame */ |
| gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0); |
| + |
| + /* This should never happen */ |
| + if (len < 2) { |
| + PDEBUG(D_ERR, "Short SOF packet, ignoring"); |
| + gspca_dev->last_packet_type = DISCARD_PACKET; |
| + return; |
| + } |
| + |
| +#ifdef CONFIG_INPUT |
| + if (data[0] & 0x20) { |
| + input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1); |
| + input_sync(gspca_dev->input_dev); |
| + input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0); |
| + input_sync(gspca_dev->input_dev); |
| + } |
| +#endif |
| + |
| if (data[1] & 0x10) { |
| /* compressed bayer */ |
| gspca_frame_add(gspca_dev, FIRST_PACKET, data, len); |
| @@ -1050,6 +1068,9 @@ |
| .start = sd_start_12a, |
| .stopN = sd_stopN, |
| .pkt_scan = sd_pkt_scan, |
| +#ifdef CONFIG_INPUT |
| + .other_input = 1, |
| +#endif |
| }; |
| static const struct sd_desc sd_desc_72a = { |
| .name = MODULE_NAME, |
| @@ -1061,6 +1082,9 @@ |
| .stopN = sd_stopN, |
| .pkt_scan = sd_pkt_scan, |
| .dq_callback = do_autogain, |
| +#ifdef CONFIG_INPUT |
| + .other_input = 1, |
| +#endif |
| }; |
| static const struct sd_desc *sd_desc[2] = { |
| &sd_desc_12a, |
| From: Jean-François Moine <moinejf@free.fr> |
| Date: Wed, 17 Mar 2010 18:25:32 +0000 (-0300) |
| Subject: V4L/DVB: gspca - sonixj: More static const and better array initialization |
| X-Git-Url: http://git.linuxtv.org/v4l-dvb.git?a=commitdiff_plain;h=5bcd8657cca97ad5a9c159659f6ba857e35960b8 |
| |
| V4L/DVB: gspca - sonixj: More static const and better array initialization |
| |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c |
| index 83d5773..eb43f22 100644 |
| |
| |
| @@ -66,17 +66,19 @@ struct sd { |
| #define BRIDGE_SN9C110 2 |
| #define BRIDGE_SN9C120 3 |
| u8 sensor; /* Type of image sensor chip */ |
| -#define SENSOR_ADCM1700 0 |
| -#define SENSOR_HV7131R 1 |
| -#define SENSOR_MI0360 2 |
| -#define SENSOR_MO4000 3 |
| -#define SENSOR_MT9V111 4 |
| -#define SENSOR_OM6802 5 |
| -#define SENSOR_OV7630 6 |
| -#define SENSOR_OV7648 7 |
| -#define SENSOR_OV7660 8 |
| -#define SENSOR_PO1030 9 |
| -#define SENSOR_SP80708 10 |
| +enum { |
| + SENSOR_ADCM1700, |
| + SENSOR_HV7131R, |
| + SENSOR_MI0360, |
| + SENSOR_MO4000, |
| + SENSOR_MT9V111, |
| + SENSOR_OM6802, |
| + SENSOR_OV7630, |
| + SENSOR_OV7648, |
| + SENSOR_OV7660, |
| + SENSOR_PO1030, |
| + SENSOR_SP80708, |
| +} sensors; |
| u8 i2c_addr; |
| |
| u8 *jpeg_hdr; |
| @@ -280,29 +282,47 @@ static const struct ctrl sd_ctrls[] = { |
| }; |
| |
| /* table of the disabled controls */ |
| -static __u32 ctrl_dis[] = { |
| - (1 << INFRARED_IDX) | (1 << VFLIP_IDX) | (1 << FREQ_IDX) | |
| - (1 << AUTOGAIN_IDX), /* SENSOR_ADCM1700 0 */ |
| - (1 << INFRARED_IDX) | (1 << FREQ_IDX), |
| - /* SENSOR_HV7131R 1 */ |
| - (1 << INFRARED_IDX) | (1 << VFLIP_IDX) | (1 << FREQ_IDX), |
| - /* SENSOR_MI0360 2 */ |
| - (1 << INFRARED_IDX) | (1 << VFLIP_IDX) | (1 << FREQ_IDX), |
| - /* SENSOR_MO4000 3 */ |
| - (1 << VFLIP_IDX) | (1 << FREQ_IDX), |
| - /* SENSOR_MT9V111 4 */ |
| - (1 << INFRARED_IDX) | (1 << VFLIP_IDX) | (1 << FREQ_IDX), |
| - /* SENSOR_OM6802 5 */ |
| - (1 << INFRARED_IDX), |
| - /* SENSOR_OV7630 6 */ |
| - (1 << INFRARED_IDX), |
| - /* SENSOR_OV7648 7 */ |
| - (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX), |
| - /* SENSOR_OV7660 8 */ |
| - (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX) | |
| - (1 << FREQ_IDX), /* SENSOR_PO1030 9 */ |
| - (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX) | |
| - (1 << FREQ_IDX), /* SENSOR_SP80708 10 */ |
| +static const __u32 ctrl_dis[] = { |
| +[SENSOR_ADCM1700] = (1 << AUTOGAIN_IDX) | |
| + (1 << INFRARED_IDX) | |
| + (1 << VFLIP_IDX) | |
| + (1 << FREQ_IDX), |
| + |
| +[SENSOR_HV7131R] = (1 << INFRARED_IDX) | |
| + (1 << FREQ_IDX), |
| + |
| +[SENSOR_MI0360] = (1 << INFRARED_IDX) | |
| + (1 << VFLIP_IDX) | |
| + (1 << FREQ_IDX), |
| + |
| +[SENSOR_MO4000] = (1 << INFRARED_IDX) | |
| + (1 << VFLIP_IDX) | |
| + (1 << FREQ_IDX), |
| + |
| +[SENSOR_MT9V111] = (1 << VFLIP_IDX) | |
| + (1 << FREQ_IDX), |
| + |
| +[SENSOR_OM6802] = (1 << INFRARED_IDX) | |
| + (1 << VFLIP_IDX) | |
| + (1 << FREQ_IDX), |
| + |
| +[SENSOR_OV7630] = (1 << INFRARED_IDX), |
| + |
| +[SENSOR_OV7648] = (1 << INFRARED_IDX), |
| + |
| +[SENSOR_OV7660] = (1 << AUTOGAIN_IDX) | |
| + (1 << INFRARED_IDX) | |
| + (1 << VFLIP_IDX), |
| + |
| +[SENSOR_PO1030] = (1 << AUTOGAIN_IDX) | |
| + (1 << INFRARED_IDX) | |
| + (1 << VFLIP_IDX) | |
| + (1 << FREQ_IDX), |
| + |
| +[SENSOR_SP80708] = (1 << AUTOGAIN_IDX) | |
| + (1 << INFRARED_IDX) | |
| + (1 << VFLIP_IDX) | |
| + (1 << FREQ_IDX), |
| }; |
| |
| static const struct v4l2_pix_format cif_mode[] = { |
| @@ -455,17 +475,17 @@ static const u8 sn_sp80708[0x1c] = { |
| |
| /* sequence specific to the sensors - !! index = SENSOR_xxx */ |
| static const u8 *sn_tb[] = { |
| - sn_adcm1700, |
| - sn_hv7131, |
| - sn_mi0360, |
| - sn_mo4000, |
| - sn_mt9v111, |
| - sn_om6802, |
| - sn_ov7630, |
| - sn_ov7648, |
| - sn_ov7660, |
| - sn_po1030, |
| - sn_sp80708 |
| +[SENSOR_ADCM1700] = sn_adcm1700, |
| +[SENSOR_HV7131R] = sn_hv7131, |
| +[SENSOR_MI0360] = sn_mi0360, |
| +[SENSOR_MO4000] = sn_mo4000, |
| +[SENSOR_MT9V111] = sn_mt9v111, |
| +[SENSOR_OM6802] = sn_om6802, |
| +[SENSOR_OV7630] = sn_ov7630, |
| +[SENSOR_OV7648] = sn_ov7648, |
| +[SENSOR_OV7660] = sn_ov7660, |
| +[SENSOR_PO1030] = sn_po1030, |
| +[SENSOR_SP80708] = sn_sp80708 |
| }; |
| |
| /* default gamma table */ |
| @@ -1068,18 +1088,18 @@ static const u8 sp80708_sensor_param1[][8] = { |
| {} |
| }; |
| |
| -static const u8 (*sensor_init[11])[8] = { |
| - adcm1700_sensor_init, /* ADCM1700 0 */ |
| - hv7131r_sensor_init, /* HV7131R 1 */ |
| - mi0360_sensor_init, /* MI0360 2 */ |
| - mo4000_sensor_init, /* MO4000 3 */ |
| - mt9v111_sensor_init, /* MT9V111 4 */ |
| - om6802_sensor_init, /* OM6802 5 */ |
| - ov7630_sensor_init, /* OV7630 6 */ |
| - ov7648_sensor_init, /* OV7648 7 */ |
| - ov7660_sensor_init, /* OV7660 8 */ |
| - po1030_sensor_init, /* PO1030 9 */ |
| - sp80708_sensor_init, /* SP80708 10 */ |
| +static const u8 (*sensor_init[])[8] = { |
| +[SENSOR_ADCM1700] = adcm1700_sensor_init, |
| +[SENSOR_HV7131R] = hv7131r_sensor_init, |
| +[SENSOR_MI0360] = mi0360_sensor_init, |
| +[SENSOR_MO4000] = mo4000_sensor_init, |
| +[SENSOR_MT9V111] = mt9v111_sensor_init, |
| +[SENSOR_OM6802] = om6802_sensor_init, |
| +[SENSOR_OV7630] = ov7630_sensor_init, |
| +[SENSOR_OV7648] = ov7648_sensor_init, |
| +[SENSOR_OV7660] = ov7660_sensor_init, |
| +[SENSOR_PO1030] = po1030_sensor_init, |
| +[SENSOR_SP80708] = sp80708_sensor_init, |
| }; |
| |
| /* read <len> bytes to gspca_dev->usb_buf */ |
| @@ -1702,7 +1722,7 @@ static void setcolors(struct gspca_dev *gspca_dev) |
| struct sd *sd = (struct sd *) gspca_dev; |
| int i, v; |
| u8 reg8a[12]; /* U & V gains */ |
| - static s16 uv[6] = { /* same as reg84 in signed decimal */ |
| + static const s16 uv[6] = { /* same as reg84 in signed decimal */ |
| -24, -38, 64, /* UR UG UB */ |
| 62, -51, -9 /* VR VG VB */ |
| }; |
| From: Jean-François Moine <moinejf@free.fr> |
| Date: Thu, 18 Mar 2010 08:15:30 +0000 (-0300) |
| Subject: V4L/DVB: gspca - sonixj: Add webcam 0c45:6142 with sensors gc0307 and po2030n |
| X-Git-Url: http://git.linuxtv.org/v4l-dvb.git?a=commitdiff_plain;h=7ece2ad1a65a3c92c2573ee5c79d45159cbd6183 |
| |
| V4L/DVB: gspca - sonixj: Add webcam 0c45:6142 with sensors gc0307 and po2030n |
| |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| |
| diff --git a/Documentation/video4linux/gspca.txt b/Documentation/video4linux/gspca.txt |
| index 181b9e6..9475e1e 100644 |
| |
| |
| @@ -305,6 +305,7 @@ sonixj 0c45:6138 Sn9c120 Mo4000 |
| sonixj 0c45:613a Microdia Sonix PC Camera |
| sonixj 0c45:613b Surfer SN-206 |
| sonixj 0c45:613c Sonix Pccam168 |
| +sonixj 0c45:6142 Hama PC-Webcam AC-150 |
| sonixj 0c45:6143 Sonix Pccam168 |
| sonixj 0c45:6148 Digitus DA-70811/ZSMC USB PC Camera ZS211/Microdia |
| sonixj 0c45:614a Frontech E-Ccam (JIL-2225) |
| diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c |
| index eb43f22..5e727aa 100644 |
| |
| |
| @@ -68,6 +68,7 @@ struct sd { |
| u8 sensor; /* Type of image sensor chip */ |
| enum { |
| SENSOR_ADCM1700, |
| + SENSOR_GC0307, |
| SENSOR_HV7131R, |
| SENSOR_MI0360, |
| SENSOR_MO4000, |
| @@ -77,6 +78,7 @@ enum { |
| SENSOR_OV7648, |
| SENSOR_OV7660, |
| SENSOR_PO1030, |
| + SENSOR_PO2030N, |
| SENSOR_SP80708, |
| } sensors; |
| u8 i2c_addr; |
| @@ -288,6 +290,11 @@ static const __u32 ctrl_dis[] = { |
| (1 << VFLIP_IDX) | |
| (1 << FREQ_IDX), |
| |
| +[SENSOR_GC0307] = (1 << AUTOGAIN_IDX) | |
| + (1 << INFRARED_IDX) | |
| + (1 << VFLIP_IDX) | |
| + (1 << FREQ_IDX), |
| + |
| [SENSOR_HV7131R] = (1 << INFRARED_IDX) | |
| (1 << FREQ_IDX), |
| |
| @@ -319,6 +326,11 @@ static const __u32 ctrl_dis[] = { |
| (1 << VFLIP_IDX) | |
| (1 << FREQ_IDX), |
| |
| +[SENSOR_PO2030N] = (1 << AUTOGAIN_IDX) | |
| + (1 << INFRARED_IDX) | |
| + (1 << VFLIP_IDX) | |
| + (1 << FREQ_IDX), |
| + |
| [SENSOR_SP80708] = (1 << AUTOGAIN_IDX) | |
| (1 << INFRARED_IDX) | |
| (1 << VFLIP_IDX) | |
| @@ -362,7 +374,17 @@ static const u8 sn_adcm1700[0x1c] = { |
| 0x06, 0x00, 0x00, 0x00 |
| }; |
| |
| -/*Data from sn9c102p+hv7131r */ |
| +static const u8 sn_gc0307[0x1c] = { |
| +/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ |
| + 0x00, 0x61, 0x62, 0x00, 0x1a, 0x00, 0x00, 0x00, |
| +/* reg8 reg9 rega regb regc regd rege regf */ |
| + 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| +/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ |
| + 0x03, 0x00, 0x03, 0x01, 0x08, 0x28, 0x1e, 0x02, |
| +/* reg18 reg19 reg1a reg1b */ |
| + 0x06, 0x00, 0x00, 0x00 |
| +}; |
| + |
| static const u8 sn_hv7131[0x1c] = { |
| /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ |
| 0x00, 0x03, 0x64, 0x00, 0x1a, 0x20, 0x20, 0x20, |
| @@ -462,6 +484,17 @@ static const u8 sn_po1030[0x1c] = { |
| 0x07, 0x00, 0x00, 0x00 |
| }; |
| |
| +static const u8 sn_po2030n[0x1c] = { |
| +/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ |
| + 0x00, 0x63, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00, |
| +/* reg8 reg9 rega regb regc regd rege regf */ |
| + 0x81, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| +/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ |
| + 0x03, 0x00, 0x00, 0x01, 0x14, 0x28, 0x1e, 0x00, |
| +/* reg18 reg19 reg1a reg1b */ |
| + 0x07, 0x00, 0x00, 0x00 |
| +}; |
| + |
| static const u8 sn_sp80708[0x1c] = { |
| /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ |
| 0x00, 0x63, 0x60, 0x00, 0x1a, 0x20, 0x20, 0x20, |
| @@ -476,6 +509,7 @@ static const u8 sn_sp80708[0x1c] = { |
| /* sequence specific to the sensors - !! index = SENSOR_xxx */ |
| static const u8 *sn_tb[] = { |
| [SENSOR_ADCM1700] = sn_adcm1700, |
| +[SENSOR_GC0307] = sn_gc0307, |
| [SENSOR_HV7131R] = sn_hv7131, |
| [SENSOR_MI0360] = sn_mi0360, |
| [SENSOR_MO4000] = sn_mo4000, |
| @@ -485,6 +519,7 @@ static const u8 *sn_tb[] = { |
| [SENSOR_OV7648] = sn_ov7648, |
| [SENSOR_OV7660] = sn_ov7660, |
| [SENSOR_PO1030] = sn_po1030, |
| +[SENSOR_PO2030N] = sn_po2030n, |
| [SENSOR_SP80708] = sn_sp80708 |
| }; |
| |
| @@ -503,8 +538,13 @@ static const u8 gamma_spec_1[17] = { |
| 0x08, 0x3a, 0x52, 0x65, 0x75, 0x83, 0x91, 0x9d, |
| 0xa9, 0xb4, 0xbe, 0xc8, 0xd2, 0xdb, 0xe4, 0xed, 0xf5 |
| }; |
| -/* gamma for sensor SP80708 */ |
| +/* gamma for sensor GC0307 */ |
| static const u8 gamma_spec_2[17] = { |
| + 0x14, 0x37, 0x50, 0x6a, 0x7c, 0x8d, 0x9d, 0xab, |
| + 0xb5, 0xbf, 0xc2, 0xcb, 0xd1, 0xd6, 0xdb, 0xe1, 0xeb |
| +}; |
| +/* gamma for sensor SP80708 */ |
| +static const u8 gamma_spec_3[17] = { |
| 0x0a, 0x2d, 0x4e, 0x68, 0x7d, 0x8f, 0x9f, 0xab, |
| 0xb7, 0xc2, 0xcc, 0xd3, 0xd8, 0xde, 0xe2, 0xe5, 0xe6 |
| }; |
| @@ -552,6 +592,64 @@ static const u8 adcm1700_sensor_param1[][8] = { |
| {0xb0, 0x51, 0x32, 0x00, 0xa2, 0x00, 0x00, 0x10}, |
| {} |
| }; |
| +static const u8 gc0307_sensor_init[][8] = { |
| + {0xa0, 0x21, 0x43, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x44, 0xa2, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x01, 0x6a, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x02, 0x70, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x11, 0x05, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x08, 0x02, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x09, 0x01, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x0a, 0xe8, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x0b, 0x02, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x0d, 0x22, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x0f, 0xb2, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x12, 0x70, 0x00, 0x00, 0x00, 0x10}, |
| + {0xdd, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*delay 10ms*/ |
| + {0xa0, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x15, 0xb8, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x16, 0x13, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x17, 0x52, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x18, 0x50, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x1e, 0x0d, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x1f, 0x32, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x61, 0x90, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x63, 0x70, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x65, 0x98, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x67, 0x90, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x04, 0x96, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x45, 0x27, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x47, 0x2c, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x43, 0x47, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x44, 0xd8, 0x00, 0x00, 0x00, 0x10}, |
| + {} |
| +}; |
| +static const u8 gc0307_sensor_param1[][8] = { |
| + {0xa0, 0x21, 0x68, 0x13, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd0, 0x21, 0x61, 0x80, 0x00, 0x80, 0x00, 0x10}, |
| + {0xc0, 0x21, 0x65, 0x80, 0x00, 0x80, 0x00, 0x10}, |
| + {0xc0, 0x21, 0x63, 0xa0, 0x00, 0xa6, 0x00, 0x10}, |
| +/*param3*/ |
| + {0xa0, 0x21, 0x01, 0x6e, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa0, 0x21, 0x02, 0x88, 0x00, 0x00, 0x00, 0x10}, |
| + |
| + {0xa0, 0x21, 0x68, 0x22, 0x00, 0x00, 0x00, 0x10}, |
| + {0xdd, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, |
| + {0xa0, 0x21, 0x03, 0x07, 0x00, 0x00, 0x00, 0x10}, |
| + {0xdd, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, |
| + {0xa0, 0x21, 0x04, 0x91, 0x00, 0x00, 0x00, 0x10}, |
| + {} |
| +}; |
| + |
| static const u8 hv7131r_sensor_init[][8] = { |
| {0xc1, 0x11, 0x01, 0x08, 0x01, 0x00, 0x00, 0x10}, |
| {0xb1, 0x11, 0x34, 0x17, 0x7f, 0x00, 0x00, 0x10}, |
| @@ -1003,6 +1101,82 @@ static const u8 po1030_sensor_param1[][8] = { |
| {} |
| }; |
| |
| +static const u8 po2030n_sensor_init[][8] = { |
| + {0xa1, 0x6e, 0x1e, 0x1a, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x1f, 0x99, 0x00, 0x00, 0x00, 0x10}, |
| + {0xdd, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 10ms */ |
| + {0xa1, 0x6e, 0x1e, 0x0a, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x1f, 0x19, 0x00, 0x00, 0x00, 0x10}, |
| + {0xdd, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 10ms */ |
| + {0xa1, 0x6e, 0x20, 0x44, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x04, 0x03, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x05, 0x70, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x07, 0x25, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x08, 0x00, 0xd0, 0x00, 0x08, 0x10}, |
| + {0xd1, 0x6e, 0x0c, 0x03, 0x50, 0x01, 0xe8, 0x10}, |
| + {0xd1, 0x6e, 0x1d, 0x20, 0x0a, 0x19, 0x44, 0x10}, |
| + {0xd1, 0x6e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x25, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x29, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x31, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x35, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x39, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x41, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x49, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x4d, 0x00, 0x00, 0x00, 0xed, 0x10}, |
| + {0xd1, 0x6e, 0x51, 0x17, 0x4a, 0x2f, 0xc0, 0x10}, |
| + {0xd1, 0x6e, 0x55, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x59, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x61, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x69, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x71, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x75, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x79, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x81, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x85, 0x00, 0x00, 0x00, 0x08, 0x10}, |
| + {0xd1, 0x6e, 0x89, 0x01, 0xe8, 0x00, 0x01, 0x10}, |
| + {0xa1, 0x6e, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x25, 0x00, 0x00, 0x00, 0x01, 0x10}, |
| + {0xd1, 0x6e, 0x29, 0xe6, 0x00, 0xbd, 0x03, 0x10}, |
| + {0xd1, 0x6e, 0x2d, 0x41, 0x38, 0x68, 0x40, 0x10}, |
| + {0xd1, 0x6e, 0x31, 0x2b, 0x00, 0x36, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x35, 0x30, 0x30, 0x08, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x39, 0x00, 0x00, 0x33, 0x06, 0x10}, |
| + {0xb1, 0x6e, 0x3d, 0x06, 0x02, 0x00, 0x00, 0x10}, |
| + {} |
| +}; |
| +static const u8 po2030n_sensor_param1[][8] = { |
| + {0xa1, 0x6e, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x10}, |
| + {0xdd, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 8ms */ |
| + {0xa1, 0x6e, 0x1b, 0xf4, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x15, 0x04, 0x00, 0x00, 0x00, 0x10}, |
| + {0xd1, 0x6e, 0x16, 0x50, 0x40, 0x49, 0x40, 0x10}, |
| +/*param2*/ |
| + {0xa1, 0x6e, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x04, 0x03, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x05, 0x6f, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x07, 0x25, 0x00, 0x00, 0x00, 0x10}, |
| + {0xa1, 0x6e, 0x15, 0x04, 0x00, 0x00, 0x00, 0x10}, |
| + {0xc1, 0x6e, 0x16, 0x52, 0x40, 0x48, 0x00, 0x10}, |
| +/*after start*/ |
| + {0xa1, 0x6e, 0x15, 0x0f, 0x00, 0x00, 0x00, 0x10}, |
| + {0xdd, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 5ms */ |
| + {0xa1, 0x6e, 0x1a, 0x05, 0x00, 0x00, 0x00, 0x10}, |
| + {0xdd, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 5ms */ |
| + {0xa1, 0x6e, 0x1b, 0x53, 0x00, 0x00, 0x00, 0x10}, |
| + {} |
| +}; |
| + |
| static const u8 sp80708_sensor_init[][8] = { |
| {0xa1, 0x18, 0x06, 0xf9, 0x00, 0x00, 0x00, 0x10}, |
| {0xa1, 0x18, 0x09, 0x1f, 0x00, 0x00, 0x00, 0x10}, |
| @@ -1090,6 +1264,7 @@ static const u8 sp80708_sensor_param1[][8] = { |
| |
| static const u8 (*sensor_init[])[8] = { |
| [SENSOR_ADCM1700] = adcm1700_sensor_init, |
| +[SENSOR_GC0307] = gc0307_sensor_init, |
| [SENSOR_HV7131R] = hv7131r_sensor_init, |
| [SENSOR_MI0360] = mi0360_sensor_init, |
| [SENSOR_MO4000] = mo4000_sensor_init, |
| @@ -1099,6 +1274,7 @@ static const u8 (*sensor_init[])[8] = { |
| [SENSOR_OV7648] = ov7648_sensor_init, |
| [SENSOR_OV7660] = ov7660_sensor_init, |
| [SENSOR_PO1030] = po1030_sensor_init, |
| +[SENSOR_PO2030N] = po2030n_sensor_init, |
| [SENSOR_SP80708] = sp80708_sensor_init, |
| }; |
| |
| @@ -1168,7 +1344,8 @@ static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val) |
| PDEBUG(D_USBO, "i2c_w2 [%02x] = %02x", reg, val); |
| switch (sd->sensor) { |
| case SENSOR_ADCM1700: |
| - case SENSOR_OM6802: /* i2c command = a0 (100 kHz) */ |
| + case SENSOR_OM6802: |
| + case SENSOR_GC0307: /* i2c command = a0 (100 kHz) */ |
| gspca_dev->usb_buf[0] = 0x80 | (2 << 4); |
| break; |
| default: /* i2c command = a1 (400 kHz) */ |
| @@ -1215,7 +1392,8 @@ static void i2c_r(struct gspca_dev *gspca_dev, u8 reg, int len) |
| |
| switch (sd->sensor) { |
| case SENSOR_ADCM1700: |
| - case SENSOR_OM6802: /* i2c command = 90 (100 kHz) */ |
| + case SENSOR_OM6802: |
| + case SENSOR_GC0307: /* i2c command = a0 (100 kHz) */ |
| mode[0] = 0x80 | 0x10; |
| break; |
| default: /* i2c command = 91 (400 kHz) */ |
| @@ -1354,6 +1532,46 @@ static void ov7648_probe(struct gspca_dev *gspca_dev) |
| gspca_dev->usb_buf[3], gspca_dev->usb_buf[4]); |
| } |
| |
| +/* 0c45:6142 sensor may be po2030n, gc0305 or gc0307 */ |
| +static void po2030n_probe(struct gspca_dev *gspca_dev) |
| +{ |
| + struct sd *sd = (struct sd *) gspca_dev; |
| + |
| + /* check gc0307 */ |
| + reg_w1(gspca_dev, 0x17, 0x62); |
| + reg_w1(gspca_dev, 0x01, 0x08); |
| + reg_w1(gspca_dev, 0x02, 0x22); |
| + sd->i2c_addr = 0x21; |
| + i2c_r(gspca_dev, 0x00, 1); |
| + |
| + reg_w1(gspca_dev, 0x01, 0x29); /* reset */ |
| + reg_w1(gspca_dev, 0x17, 0x42); |
| + |
| + if (gspca_dev->usb_buf[4] == 0x99) { /* gc0307 (?) */ |
| + PDEBUG(D_PROBE, "Sensor gc0307"); |
| + sd->sensor = SENSOR_GC0307; |
| + return; |
| + } |
| + |
| + /* check po2030n */ |
| + reg_w1(gspca_dev, 0x17, 0x62); |
| + reg_w1(gspca_dev, 0x01, 0x0a); |
| + sd->i2c_addr = 0x6e; |
| + i2c_r(gspca_dev, 0x00, 2); |
| + |
| + reg_w1(gspca_dev, 0x01, 0x29); |
| + reg_w1(gspca_dev, 0x17, 0x42); |
| + |
| + if (gspca_dev->usb_buf[3] == 0x20 |
| + && gspca_dev->usb_buf[4] == 0x30) |
| + PDEBUG(D_PROBE, "Sensor po2030n"); |
| +/* sd->sensor = SENSOR_PO2030N; */ |
| + else |
| + PDEBUG(D_PROBE, "Unknown sensor ID %02x%02x", |
| + gspca_dev->usb_buf[3], |
| + gspca_dev->usb_buf[4]); |
| +} |
| + |
| static void bridge_init(struct gspca_dev *gspca_dev, |
| const u8 *sn9c1xx) |
| { |
| @@ -1374,8 +1592,10 @@ static void bridge_init(struct gspca_dev *gspca_dev, |
| reg_w(gspca_dev, 0x08, &sn9c1xx[8], 2); |
| reg_w(gspca_dev, 0x17, &sn9c1xx[0x17], 5); |
| switch (sd->sensor) { |
| + case SENSOR_GC0307: |
| case SENSOR_OV7660: |
| case SENSOR_PO1030: |
| + case SENSOR_PO2030N: |
| case SENSOR_SP80708: |
| reg9a = reg9a_spec; |
| break; |
| @@ -1396,6 +1616,14 @@ static void bridge_init(struct gspca_dev *gspca_dev, |
| reg_w1(gspca_dev, 0x01, 0x42); |
| reg_w1(gspca_dev, 0x01, 0x42); |
| break; |
| + case SENSOR_GC0307: |
| + msleep(50); |
| + reg_w1(gspca_dev, 0x01, 0x61); |
| + reg_w1(gspca_dev, 0x17, 0x22); |
| + reg_w1(gspca_dev, 0x01, 0x60); |
| + reg_w1(gspca_dev, 0x01, 0x40); |
| + msleep(50); |
| + break; |
| case SENSOR_MT9V111: |
| reg_w1(gspca_dev, 0x01, 0x61); |
| reg_w1(gspca_dev, 0x17, 0x61); |
| @@ -1438,6 +1666,12 @@ static void bridge_init(struct gspca_dev *gspca_dev, |
| reg_w1(gspca_dev, 0x01, 0x60); |
| reg_w1(gspca_dev, 0x01, 0x40); |
| break; |
| + case SENSOR_PO2030N: |
| + reg_w1(gspca_dev, 0x01, 0x63); |
| + reg_w1(gspca_dev, 0x17, 0x20); |
| + reg_w1(gspca_dev, 0x01, 0x62); |
| + reg_w1(gspca_dev, 0x01, 0x42); |
| + break; |
| case SENSOR_OV7660: |
| /* fall thru */ |
| case SENSOR_SP80708: |
| @@ -1545,6 +1779,9 @@ static int sd_init(struct gspca_dev *gspca_dev) |
| case SENSOR_OV7648: |
| ov7648_probe(gspca_dev); |
| break; |
| + case SENSOR_PO2030N: |
| + po2030n_probe(gspca_dev); |
| + break; |
| } |
| regGpio[1] = 0x70; |
| reg_w(gspca_dev, 0x01, regGpio, 2); |
| @@ -1763,9 +2000,12 @@ static void setgamma(struct gspca_dev *gspca_dev) |
| case SENSOR_MT9V111: |
| gamma_base = gamma_spec_1; |
| break; |
| - case SENSOR_SP80708: |
| + case SENSOR_GC0307: |
| gamma_base = gamma_spec_2; |
| break; |
| + case SENSOR_SP80708: |
| + gamma_base = gamma_spec_3; |
| + break; |
| default: |
| gamma_base = gamma_def; |
| break; |
| @@ -1956,9 +2196,15 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| static const u8 CA[] = { 0x28, 0xd8, 0x14, 0xec }; |
| static const u8 CA_adcm1700[] = |
| { 0x14, 0xec, 0x0a, 0xf6 }; |
| + static const u8 CA_po2030n[] = |
| + { 0x1e, 0xe2, 0x14, 0xec }; |
| static const u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd }; /* MI0360 */ |
| + static const u8 CE_gc0307[] = |
| + { 0x32, 0xce, 0x2d, 0xd3 }; |
| static const u8 CE_ov76xx[] = |
| { 0x32, 0xdd, 0x32, 0xdd }; |
| + static const u8 CE_po2030n[] = |
| + { 0x14, 0xe7, 0x1e, 0xdd }; |
| |
| /* create the JPEG header */ |
| sd->jpeg_hdr = kmalloc(JPEG_HDR_SZ, GFP_KERNEL); |
| @@ -2015,6 +2261,9 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| } |
| reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]); |
| switch (sd->sensor) { |
| + case SENSOR_GC0307: |
| + reg17 = 0xa2; |
| + break; |
| case SENSOR_MT9V111: |
| reg17 = 0xe0; |
| break; |
| @@ -2029,6 +2278,7 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| reg17 = 0xa0; |
| break; |
| case SENSOR_PO1030: |
| + case SENSOR_PO2030N: |
| reg17 = 0xa0; |
| break; |
| default: |
| @@ -2053,12 +2303,16 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| case SENSOR_SP80708: |
| reg_w1(gspca_dev, 0x9a, 0x05); |
| break; |
| + case SENSOR_GC0307: |
| case SENSOR_MT9V111: |
| reg_w1(gspca_dev, 0x9a, 0x07); |
| break; |
| case SENSOR_OV7648: |
| reg_w1(gspca_dev, 0x9a, 0x0a); |
| break; |
| + case SENSOR_PO2030N: |
| + reg_w1(gspca_dev, 0x9a, 0x06); |
| + break; |
| default: |
| reg_w1(gspca_dev, 0x9a, 0x08); |
| break; |
| @@ -2083,6 +2337,11 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| reg1 = 0x46; |
| reg17 = 0xe2; |
| break; |
| + case SENSOR_GC0307: |
| + init = gc0307_sensor_param1; |
| + reg17 = 0xa2; |
| + reg1 = 0x44; |
| + break; |
| case SENSOR_MO4000: |
| if (mode) { |
| /* reg1 = 0x46; * 320 clk 48Mhz 60fp/s */ |
| @@ -2132,6 +2391,11 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| reg17 = 0xa2; |
| reg1 = 0x44; |
| break; |
| + case SENSOR_PO2030N: |
| + init = po2030n_sensor_param1; |
| + reg1 = 0x46; |
| + reg17 = 0xa2; |
| + break; |
| default: |
| /* case SENSOR_SP80708: */ |
| init = sp80708_sensor_param1; |
| @@ -2151,10 +2415,18 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| } |
| |
| reg_w(gspca_dev, 0xc0, C0, 6); |
| - if (sd->sensor == SENSOR_ADCM1700) |
| + switch (sd->sensor) { |
| + case SENSOR_ADCM1700: |
| + case SENSOR_GC0307: |
| reg_w(gspca_dev, 0xca, CA_adcm1700, 4); |
| - else |
| + break; |
| + case SENSOR_PO2030N: |
| + reg_w(gspca_dev, 0xca, CA_po2030n, 4); |
| + break; |
| + default: |
| reg_w(gspca_dev, 0xca, CA, 4); |
| + break; |
| + } |
| switch (sd->sensor) { |
| case SENSOR_ADCM1700: |
| case SENSOR_OV7630: |
| @@ -2162,6 +2434,12 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| case SENSOR_OV7660: |
| reg_w(gspca_dev, 0xce, CE_ov76xx, 4); |
| break; |
| + case SENSOR_GC0307: |
| + reg_w(gspca_dev, 0xce, CE_gc0307, 4); |
| + break; |
| + case SENSOR_PO2030N: |
| + reg_w(gspca_dev, 0xce, CE_po2030n, 4); |
| + break; |
| default: |
| reg_w(gspca_dev, 0xce, CE, 4); |
| /* ?? {0x1e, 0xdd, 0x2d, 0xe7} */ |
| @@ -2199,6 +2477,9 @@ static void sd_stopN(struct gspca_dev *gspca_dev) |
| |
| data = 0x0b; |
| switch (sd->sensor) { |
| + case SENSOR_GC0307: |
| + data = 0x29; |
| + break; |
| case SENSOR_HV7131R: |
| i2c_w8(gspca_dev, stophv7131); |
| data = 0x2b; |
| @@ -2675,7 +2956,7 @@ static const __devinitdata struct usb_device_id device_table[] = { |
| #endif |
| {USB_DEVICE(0x0c45, 0x613c), BS(SN9C120, HV7131R)}, |
| {USB_DEVICE(0x0c45, 0x613e), BS(SN9C120, OV7630)}, |
| -/* {USB_DEVICE(0x0c45, 0x6142), BS(SN9C120, PO2030N)}, *sn9c120b*/ |
| + {USB_DEVICE(0x0c45, 0x6142), BS(SN9C120, PO2030N)}, /*sn9c120b*/ |
| {USB_DEVICE(0x0c45, 0x6143), BS(SN9C120, SP80708)}, /*sn9c120b*/ |
| {USB_DEVICE(0x0c45, 0x6148), BS(SN9C120, OM6802)}, /*sn9c120b*/ |
| {USB_DEVICE(0x0c45, 0x614a), BS(SN9C120, ADCM1700)}, /*sn9c120b*/ |
| From: Jean-François Moine <moinejf@free.fr> |
| Date: Fri, 2 Apr 2010 10:12:42 +0000 (+0200) |
| Subject: gspca - vc032x: Change the ov7670 format to YUYV. |
| X-Git-Url: http://git.linuxtv.org/jfrancois/gspca.git?a=commitdiff_plain;h=510d87cf78323250749ee9b95631f28f1d942020 |
| |
| gspca - vc032x: Change the ov7670 format to YUYV. |
| |
| Signed-off-by: Jean-François Moine <moinejf@free.fr> |
| |
| |
| diff --git a/drivers/media/video/gspca/vc032x.c b/drivers/media/video/gspca/vc032x.c |
| index 7fde145..732c3df 100644 |
| |
| |
| @@ -1971,268 +1971,489 @@ static const u8 ov7660_NoFliker[][4] = { |
| {} |
| }; |
| |
| -static const u8 ov7670_initVGA_JPG[][4] = { |
| +static const u8 ov7670_InitVGA[][4] = { |
| {0xb3, 0x01, 0x05, 0xcc}, |
| - {0x00, 0x00, 0x30, 0xdd}, {0xb0, 0x03, 0x19, 0xcc}, |
| + {0x00, 0x00, 0x30, 0xdd}, |
| + {0xb0, 0x03, 0x19, 0xcc}, |
| + {0x00, 0x00, 0x10, 0xdd}, |
| + {0xb0, 0x04, 0x02, 0xcc}, |
| {0x00, 0x00, 0x10, 0xdd}, |
| - {0xb0, 0x04, 0x02, 0xcc}, {0x00, 0x00, 0x10, 0xdd}, |
| - {0xb3, 0x00, 0x66, 0xcc}, {0xb3, 0x00, 0x67, 0xcc}, |
| + {0xb3, 0x00, 0x66, 0xcc}, |
| + {0xb3, 0x00, 0x67, 0xcc}, |
| + {0xb0, 0x16, 0x01, 0xcc}, |
| {0xb3, 0x35, 0xa1, 0xcc}, /* i2c add: 21 */ |
| {0xb3, 0x34, 0x01, 0xcc}, |
| - {0xb3, 0x05, 0x01, 0xcc}, {0xb3, 0x06, 0x01, 0xcc}, |
| - {0xb3, 0x08, 0x01, 0xcc}, {0xb3, 0x09, 0x0c, 0xcc}, |
| - {0xb3, 0x02, 0x02, 0xcc}, {0xb3, 0x03, 0x1f, 0xcc}, |
| - {0xb3, 0x14, 0x00, 0xcc}, {0xb3, 0x15, 0x00, 0xcc}, |
| - {0xb3, 0x16, 0x02, 0xcc}, {0xb3, 0x17, 0x7f, 0xcc}, |
| - {0xb3, 0x04, 0x05, 0xcc}, {0xb3, 0x20, 0x00, 0xcc}, |
| - {0xb3, 0x21, 0x00, 0xcc}, {0xb3, 0x22, 0x01, 0xcc}, |
| - {0xb3, 0x23, 0xe0, 0xcc}, {0xbc, 0x00, 0x41, 0xcc}, |
| - {0xbc, 0x01, 0x01, 0xcc}, {0x00, 0x12, 0x80, 0xaa}, |
| - {0x00, 0x00, 0x20, 0xdd}, {0x00, 0x12, 0x00, 0xaa}, |
| - {0x00, 0x11, 0x40, 0xaa}, {0x00, 0x6b, 0x0a, 0xaa}, |
| - {0x00, 0x3a, 0x04, 0xaa}, {0x00, 0x40, 0xc0, 0xaa}, |
| - {0x00, 0x8c, 0x00, 0xaa}, {0x00, 0x7a, 0x29, 0xaa}, |
| - {0x00, 0x7b, 0x0e, 0xaa}, {0x00, 0x7c, 0x1a, 0xaa}, |
| - {0x00, 0x7d, 0x31, 0xaa}, {0x00, 0x7e, 0x53, 0xaa}, |
| - {0x00, 0x7f, 0x60, 0xaa}, {0x00, 0x80, 0x6b, 0xaa}, |
| - {0x00, 0x81, 0x73, 0xaa}, {0x00, 0x82, 0x7b, 0xaa}, |
| - {0x00, 0x83, 0x82, 0xaa}, {0x00, 0x84, 0x89, 0xaa}, |
| - {0x00, 0x85, 0x96, 0xaa}, {0x00, 0x86, 0xa1, 0xaa}, |
| - {0x00, 0x87, 0xb7, 0xaa}, {0x00, 0x88, 0xcc, 0xaa}, |
| - {0x00, 0x89, 0xe1, 0xaa}, {0x00, 0x13, 0xe0, 0xaa}, |
| - {0x00, 0x00, 0x00, 0xaa}, {0x00, 0x10, 0x00, 0xaa}, |
| - {0x00, 0x0d, 0x40, 0xaa}, {0x00, 0x14, 0x28, 0xaa}, |
| - {0x00, 0xa5, 0x05, 0xaa}, {0x00, 0xab, 0x07, 0xaa}, |
| - {0x00, 0x24, 0x95, 0xaa}, {0x00, 0x25, 0x33, 0xaa}, |
| - {0x00, 0x26, 0xe3, 0xaa}, {0x00, 0x9f, 0x88, 0xaa}, |
| - {0x00, 0xa0, 0x78, 0xaa}, {0x00, 0x55, 0x90, 0xaa}, |
| - {0x00, 0xa1, 0x03, 0xaa}, {0x00, 0xa6, 0xe0, 0xaa}, |
| - {0x00, 0xa7, 0xd8, 0xaa}, {0x00, 0xa8, 0xf0, 0xaa}, |
| - {0x00, 0xa9, 0x90, 0xaa}, {0x00, 0xaa, 0x14, 0xaa}, |
| - {0x00, 0x13, 0xe5, 0xaa}, {0x00, 0x0e, 0x61, 0xaa}, |
| - {0x00, 0x0f, 0x4b, 0xaa}, {0x00, 0x16, 0x02, 0xaa}, |
| + {0xb3, 0x05, 0x01, 0xcc}, |
| + {0xb3, 0x06, 0x01, 0xcc}, |
| + {0xb3, 0x08, 0x01, 0xcc}, |
| + {0xb3, 0x09, 0x0c, 0xcc}, |
| + {0xb3, 0x02, 0x02, 0xcc}, |
| + {0xb3, 0x03, 0x1f, 0xcc}, |
| + {0xb3, 0x14, 0x00, 0xcc}, |
| + {0xb3, 0x15, 0x00, 0xcc}, |
| + {0xb3, 0x16, 0x02, 0xcc}, |
| + {0xb3, 0x17, 0x7f, 0xcc}, |
| + {0xb3, 0x04, 0x05, 0xcc}, |
| + {0xb3, 0x20, 0x00, 0xcc}, |
| + {0xb3, 0x21, 0x00, 0xcc}, |
| + {0xb3, 0x22, 0x01, 0xcc}, |
| + {0xb3, 0x23, 0xe0, 0xcc}, |
| + {0xbc, 0x00, 0x41, 0xcc}, |
| + {0xbc, 0x01, 0x01, 0xcc}, |
| + {0x00, 0x12, 0x80, 0xaa}, |
| + {0x00, 0x00, 0x20, 0xdd}, |
| + {0x00, 0x12, 0x00, 0xaa}, |
| + {0x00, 0x11, 0x40, 0xaa}, |
| + {0x00, 0x6b, 0x0a, 0xaa}, |
| + {0x00, 0x3a, 0x04, 0xaa}, |
| + {0x00, 0x40, 0xc0, 0xaa}, |
| + {0x00, 0x8c, 0x00, 0xaa}, |
| + {0x00, 0x7a, 0x29, 0xaa}, |
| + {0x00, 0x7b, 0x0e, 0xaa}, |
| + {0x00, 0x7c, 0x1a, 0xaa}, |
| + {0x00, 0x7d, 0x31, 0xaa}, |
| + {0x00, 0x7e, 0x53, 0xaa}, |
| + {0x00, 0x7f, 0x60, 0xaa}, |
| + {0x00, 0x80, 0x6b, 0xaa}, |
| + {0x00, 0x81, 0x73, 0xaa}, |
| + {0x00, 0x82, 0x7b, 0xaa}, |
| + {0x00, 0x83, 0x82, 0xaa}, |
| + {0x00, 0x84, 0x89, 0xaa}, |
| + {0x00, 0x85, 0x96, 0xaa}, |
| + {0x00, 0x86, 0xa1, 0xaa}, |
| + {0x00, 0x87, 0xb7, 0xaa}, |
| + {0x00, 0x88, 0xcc, 0xaa}, |
| + {0x00, 0x89, 0xe1, 0xaa}, |
| + {0x00, 0x13, 0xe0, 0xaa}, |
| + {0x00, 0x00, 0x00, 0xaa}, |
| + {0x00, 0x10, 0x00, 0xaa}, |
| + {0x00, 0x0d, 0x40, 0xaa}, |
| + {0x00, 0x14, 0x28, 0xaa}, |
| + {0x00, 0xa5, 0x05, 0xaa}, |
| + {0x00, 0xab, 0x07, 0xaa}, |
| + {0x00, 0x24, 0x95, 0xaa}, |
| + {0x00, 0x25, 0x33, 0xaa}, |
| + {0x00, 0x26, 0xe3, 0xaa}, |
| + {0x00, 0x9f, 0x88, 0xaa}, |
| + {0x00, 0xa0, 0x78, 0xaa}, |
| + {0x00, 0x55, 0x90, 0xaa}, |
| + {0x00, 0xa1, 0x03, 0xaa}, |
| + {0x00, 0xa6, 0xe0, 0xaa}, |
| + {0x00, 0xa7, 0xd8, 0xaa}, |
| + {0x00, 0xa8, 0xf0, 0xaa}, |
| + {0x00, 0xa9, 0x90, 0xaa}, |
| + {0x00, 0xaa, 0x14, 0xaa}, |
| + {0x00, 0x13, 0xe5, 0xaa}, |
| + {0x00, 0x0e, 0x61, 0xaa}, |
| + {0x00, 0x0f, 0x4b, 0xaa}, |
| + {0x00, 0x16, 0x02, 0xaa}, |
| {0x00, 0x1e, 0x07, 0xaa}, /* MVFP */ |
| {0x00, 0x21, 0x02, 0xaa}, |
| - {0x00, 0x22, 0x91, 0xaa}, {0x00, 0x29, 0x07, 0xaa}, |
| - {0x00, 0x33, 0x0b, 0xaa}, {0x00, 0x35, 0x0b, 0xaa}, |
| - {0x00, 0x37, 0x1d, 0xaa}, {0x00, 0x38, 0x71, 0xaa}, |
| - {0x00, 0x39, 0x2a, 0xaa}, {0x00, 0x3c, 0x78, 0xaa}, |
| - {0x00, 0x4d, 0x40, 0xaa}, {0x00, 0x4e, 0x20, 0xaa}, |
| - {0x00, 0x74, 0x19, 0xaa}, {0x00, 0x8d, 0x4f, 0xaa}, |
| - {0x00, 0x8e, 0x00, 0xaa}, {0x00, 0x8f, 0x00, 0xaa}, |
| - {0x00, 0x90, 0x00, 0xaa}, {0x00, 0x91, 0x00, 0xaa}, |
| - {0x00, 0x96, 0x00, 0xaa}, {0x00, 0x9a, 0x80, 0xaa}, |
| - {0x00, 0xb0, 0x84, 0xaa}, {0x00, 0xb1, 0x0c, 0xaa}, |
| - {0x00, 0xb2, 0x0e, 0xaa}, {0x00, 0xb3, 0x82, 0xaa}, |
| - {0x00, 0xb8, 0x0a, 0xaa}, {0x00, 0x43, 0x14, 0xaa}, |
| - {0x00, 0x44, 0xf0, 0xaa}, {0x00, 0x45, 0x45, 0xaa}, |
| - {0x00, 0x46, 0x63, 0xaa}, {0x00, 0x47, 0x2d, 0xaa}, |
| - {0x00, 0x48, 0x46, 0xaa}, {0x00, 0x59, 0x88, 0xaa}, |
| - {0x00, 0x5a, 0xa0, 0xaa}, {0x00, 0x5b, 0xc6, 0xaa}, |
| - {0x00, 0x5c, 0x7d, 0xaa}, {0x00, 0x5d, 0x5f, 0xaa}, |
| - {0x00, 0x5e, 0x19, 0xaa}, {0x00, 0x6c, 0x0a, 0xaa}, |
| - {0x00, 0x6d, 0x55, 0xaa}, {0x00, 0x6e, 0x11, 0xaa}, |
| - {0x00, 0x6f, 0x9e, 0xaa}, {0x00, 0x69, 0x00, 0xaa}, |
| - {0x00, 0x6a, 0x40, 0xaa}, {0x00, 0x01, 0x40, 0xaa}, |
| - {0x00, 0x02, 0x40, 0xaa}, {0x00, 0x13, 0xe7, 0xaa}, |
| - {0x00, 0x5f, 0xf0, 0xaa}, {0x00, 0x60, 0xf0, 0xaa}, |
| - {0x00, 0x61, 0xf0, 0xaa}, {0x00, 0x27, 0xa0, 0xaa}, |
| - {0x00, 0x28, 0x80, 0xaa}, {0x00, 0x2c, 0x90, 0xaa}, |
| - {0x00, 0x4f, 0x66, 0xaa}, {0x00, 0x50, 0x66, 0xaa}, |
| - {0x00, 0x51, 0x00, 0xaa}, {0x00, 0x52, 0x22, 0xaa}, |
| - {0x00, 0x53, 0x5e, 0xaa}, {0x00, 0x54, 0x80, 0xaa}, |
| - {0x00, 0x58, 0x9e, 0xaa}, {0x00, 0x41, 0x08, 0xaa}, |
| - {0x00, 0x3f, 0x00, 0xaa}, {0x00, 0x75, 0x85, 0xaa}, |
| - {0x00, 0x76, 0xe1, 0xaa}, {0x00, 0x4c, 0x00, 0xaa}, |
| - {0x00, 0x77, 0x0a, 0xaa}, {0x00, 0x3d, 0x88, 0xaa}, |
| - {0x00, 0x4b, 0x09, 0xaa}, {0x00, 0xc9, 0x60, 0xaa}, |
| - {0x00, 0x41, 0x38, 0xaa}, {0x00, 0x62, 0x30, 0xaa}, |
| - {0x00, 0x63, 0x30, 0xaa}, {0x00, 0x64, 0x08, 0xaa}, |
| - {0x00, 0x94, 0x07, 0xaa}, {0x00, 0x95, 0x0b, 0xaa}, |
| - {0x00, 0x65, 0x00, 0xaa}, {0x00, 0x66, 0x05, 0xaa}, |
| - {0x00, 0x56, 0x50, 0xaa}, {0x00, 0x34, 0x11, 0xaa}, |
| - {0x00, 0xa4, 0x88, 0xaa}, {0x00, 0x96, 0x00, 0xaa}, |
| - {0x00, 0x97, 0x30, 0xaa}, {0x00, 0x98, 0x20, 0xaa}, |
| - {0x00, 0x99, 0x30, 0xaa}, {0x00, 0x9a, 0x84, 0xaa}, |
| - {0x00, 0x9b, 0x29, 0xaa}, {0x00, 0x9c, 0x03, 0xaa}, |
| - {0x00, 0x78, 0x04, 0xaa}, {0x00, 0x79, 0x01, 0xaa}, |
| - {0x00, 0xc8, 0xf0, 0xaa}, {0x00, 0x79, 0x0f, 0xaa}, |
| - {0x00, 0xc8, 0x00, 0xaa}, {0x00, 0x79, 0x10, 0xaa}, |
| - {0x00, 0xc8, 0x7e, 0xaa}, {0x00, 0x79, 0x0a, 0xaa}, |
| - {0x00, 0xc8, 0x80, 0xaa}, {0x00, 0x79, 0x0b, 0xaa}, |
| - {0x00, 0xc8, 0x01, 0xaa}, {0x00, 0x79, 0x0c, 0xaa}, |
| - {0x00, 0xc8, 0x0f, 0xaa}, {0x00, 0x79, 0x0d, 0xaa}, |
| - {0x00, 0xc8, 0x20, 0xaa}, {0x00, 0x79, 0x09, 0xaa}, |
| - {0x00, 0xc8, 0x80, 0xaa}, {0x00, 0x79, 0x02, 0xaa}, |
| - {0x00, 0xc8, 0xc0, 0xaa}, {0x00, 0x79, 0x03, 0xaa}, |
| - {0x00, 0xc8, 0x40, 0xaa}, {0x00, 0x79, 0x05, 0xaa}, |
| - {0x00, 0xc8, 0x30, 0xaa}, {0x00, 0x79, 0x26, 0xaa}, |
| - {0x00, 0x11, 0x40, 0xaa}, {0x00, 0x3a, 0x04, 0xaa}, |
| - {0x00, 0x12, 0x00, 0xaa}, {0x00, 0x40, 0xc0, 0xaa}, |
| - {0x00, 0x8c, 0x00, 0xaa}, {0x00, 0x17, 0x14, 0xaa}, |
| - {0x00, 0x18, 0x02, 0xaa}, {0x00, 0x32, 0x92, 0xaa}, |
| - {0x00, 0x19, 0x02, 0xaa}, {0x00, 0x1a, 0x7a, 0xaa}, |
| - {0x00, 0x03, 0x0a, 0xaa}, {0x00, 0x0c, 0x00, 0xaa}, |
| - {0x00, 0x3e, 0x00, 0xaa}, {0x00, 0x70, 0x3a, 0xaa}, |
| - {0x00, 0x71, 0x35, 0xaa}, {0x00, 0x72, 0x11, 0xaa}, |
| - {0x00, 0x73, 0xf0, 0xaa}, {0x00, 0xa2, 0x02, 0xaa}, |
| - {0x00, 0xb1, 0x00, 0xaa}, {0x00, 0xb1, 0x0c, 0xaa}, |
| + {0x00, 0x22, 0x91, 0xaa}, |
| + {0x00, 0x29, 0x07, 0xaa}, |
| + {0x00, 0x33, 0x0b, 0xaa}, |
| + {0x00, 0x35, 0x0b, 0xaa}, |
| + {0x00, 0x37, 0x1d, 0xaa}, |
| + {0x00, 0x38, 0x71, 0xaa}, |
| + {0x00, 0x39, 0x2a, 0xaa}, |
| + {0x00, 0x3c, 0x78, 0xaa}, |
| + {0x00, 0x4d, 0x40, 0xaa}, |
| + {0x00, 0x4e, 0x20, 0xaa}, |
| + {0x00, 0x74, 0x19, 0xaa}, |
| + {0x00, 0x8d, 0x4f, 0xaa}, |
| + {0x00, 0x8e, 0x00, 0xaa}, |
| + {0x00, 0x8f, 0x00, 0xaa}, |
| + {0x00, 0x90, 0x00, 0xaa}, |
| + {0x00, 0x91, 0x00, 0xaa}, |
| + {0x00, 0x96, 0x00, 0xaa}, |
| + {0x00, 0x9a, 0x80, 0xaa}, |
| + {0x00, 0xb0, 0x84, 0xaa}, |
| + {0x00, 0xb1, 0x0c, 0xaa}, |
| + {0x00, 0xb2, 0x0e, 0xaa}, |
| + {0x00, 0xb3, 0x82, 0xaa}, |
| + {0x00, 0xb8, 0x0a, 0xaa}, |
| + {0x00, 0x43, 0x14, 0xaa}, |
| + {0x00, 0x44, 0xf0, 0xaa}, |
| + {0x00, 0x45, 0x45, 0xaa}, |
| + {0x00, 0x46, 0x63, 0xaa}, |
| + {0x00, 0x47, 0x2d, 0xaa}, |
| + {0x00, 0x48, 0x46, 0xaa}, |
| + {0x00, 0x59, 0x88, 0xaa}, |
| + {0x00, 0x5a, 0xa0, 0xaa}, |
| + {0x00, 0x5b, 0xc6, 0xaa}, |
| + {0x00, 0x5c, 0x7d, 0xaa}, |
| + {0x00, 0x5d, 0x5f, 0xaa}, |
| + {0x00, 0x5e, 0x19, 0xaa}, |
| + {0x00, 0x6c, 0x0a, 0xaa}, |
| + {0x00, 0x6d, 0x55, 0xaa}, |
| + {0x00, 0x6e, 0x11, 0xaa}, |
| + {0x00, 0x6f, 0x9e, 0xaa}, |
| + {0x00, 0x69, 0x00, 0xaa}, |
| + {0x00, 0x6a, 0x40, 0xaa}, |
| + {0x00, 0x01, 0x40, 0xaa}, |
| + {0x00, 0x02, 0x40, 0xaa}, |
| + {0x00, 0x13, 0xe7, 0xaa}, |
| + {0x00, 0x5f, 0xf0, 0xaa}, |
| + {0x00, 0x60, 0xf0, 0xaa}, |
| + {0x00, 0x61, 0xf0, 0xaa}, |
| + {0x00, 0x27, 0xa0, 0xaa}, |
| + {0x00, 0x28, 0x80, 0xaa}, |
| + {0x00, 0x2c, 0x90, 0xaa}, |
| + {0x00, 0x4f, 0x66, 0xaa}, |
| + {0x00, 0x50, 0x66, 0xaa}, |
| + {0x00, 0x51, 0x00, 0xaa}, |
| + {0x00, 0x52, 0x22, 0xaa}, |
| + {0x00, 0x53, 0x5e, 0xaa}, |
| + {0x00, 0x54, 0x80, 0xaa}, |
| + {0x00, 0x58, 0x9e, 0xaa}, |
| + {0x00, 0x41, 0x08, 0xaa}, |
| + {0x00, 0x3f, 0x00, 0xaa}, |
| + {0x00, 0x75, 0x85, 0xaa}, |
| + {0x00, 0x76, 0xe1, 0xaa}, |
| + {0x00, 0x4c, 0x00, 0xaa}, |
| + {0x00, 0x77, 0x0a, 0xaa}, |
| + {0x00, 0x3d, 0x88, 0xaa}, |
| + {0x00, 0x4b, 0x09, 0xaa}, |
| + {0x00, 0xc9, 0x60, 0xaa}, |
| + {0x00, 0x41, 0x38, 0xaa}, |
| + {0x00, 0x62, 0x30, 0xaa}, |
| + {0x00, 0x63, 0x30, 0xaa}, |
| + {0x00, 0x64, 0x08, 0xaa}, |
| + {0x00, 0x94, 0x07, 0xaa}, |
| + {0x00, 0x95, 0x0b, 0xaa}, |
| + {0x00, 0x65, 0x00, 0xaa}, |
| + {0x00, 0x66, 0x05, 0xaa}, |
| + {0x00, 0x56, 0x50, 0xaa}, |
| + {0x00, 0x34, 0x11, 0xaa}, |
| + {0x00, 0xa4, 0x88, 0xaa}, |
| + {0x00, 0x96, 0x00, 0xaa}, |
| + {0x00, 0x97, 0x30, 0xaa}, |
| + {0x00, 0x98, 0x20, 0xaa}, |
| + {0x00, 0x99, 0x30, 0xaa}, |
| + {0x00, 0x9a, 0x84, 0xaa}, |
| + {0x00, 0x9b, 0x29, 0xaa}, |
| + {0x00, 0x9c, 0x03, 0xaa}, |
| + {0x00, 0x78, 0x04, 0xaa}, |
| + {0x00, 0x79, 0x01, 0xaa}, |
| + {0x00, 0xc8, 0xf0, 0xaa}, |
| + {0x00, 0x79, 0x0f, 0xaa}, |
| + {0x00, 0xc8, 0x00, 0xaa}, |
| + {0x00, 0x79, 0x10, 0xaa}, |
| + {0x00, 0xc8, 0x7e, 0xaa}, |
| + {0x00, 0x79, 0x0a, 0xaa}, |
| + {0x00, 0xc8, 0x80, 0xaa}, |
| + {0x00, 0x79, 0x0b, 0xaa}, |
| + {0x00, 0xc8, 0x01, 0xaa}, |
| + {0x00, 0x79, 0x0c, 0xaa}, |
| + {0x00, 0xc8, 0x0f, 0xaa}, |
| + {0x00, 0x79, 0x0d, 0xaa}, |
| + {0x00, 0xc8, 0x20, 0xaa}, |
| + {0x00, 0x79, 0x09, 0xaa}, |
| + {0x00, 0xc8, 0x80, 0xaa}, |
| + {0x00, 0x79, 0x02, 0xaa}, |
| + {0x00, 0xc8, 0xc0, 0xaa}, |
| + {0x00, 0x79, 0x03, 0xaa}, |
| + {0x00, 0xc8, 0x40, 0xaa}, |
| + {0x00, 0x79, 0x05, 0xaa}, |
| + {0x00, 0xc8, 0x30, 0xaa}, |
| + {0x00, 0x79, 0x26, 0xaa}, |
| + {0x00, 0x11, 0x40, 0xaa}, |
| + {0x00, 0x3a, 0x04, 0xaa}, |
| + {0x00, 0x12, 0x00, 0xaa}, |
| + {0x00, 0x40, 0xc0, 0xaa}, |
| + {0x00, 0x8c, 0x00, 0xaa}, |
| + {0x00, 0x17, 0x14, 0xaa}, |
| + {0x00, 0x18, 0x02, 0xaa}, |
| + {0x00, 0x32, 0x92, 0xaa}, |
| + {0x00, 0x19, 0x02, 0xaa}, |
| + {0x00, 0x1a, 0x7a, 0xaa}, |
| + {0x00, 0x03, 0x0a, 0xaa}, |
| + {0x00, 0x0c, 0x00, 0xaa}, |
| + {0x00, 0x3e, 0x00, 0xaa}, |
| + {0x00, 0x70, 0x3a, 0xaa}, |
| + {0x00, 0x71, 0x35, 0xaa}, |
| + {0x00, 0x72, 0x11, 0xaa}, |
| + {0x00, 0x73, 0xf0, 0xaa}, |
| + {0x00, 0xa2, 0x02, 0xaa}, |
| + {0x00, 0xb1, 0x00, 0xaa}, |
| + {0x00, 0xb1, 0x0c, 0xaa}, |
| {0x00, 0x1e, 0x37, 0xaa}, /* MVFP */ |
| {0x00, 0xaa, 0x14, 0xaa}, |
| - {0x00, 0x24, 0x80, 0xaa}, {0x00, 0x25, 0x74, 0xaa}, |
| - {0x00, 0x26, 0xd3, 0xaa}, {0x00, 0x0d, 0x00, 0xaa}, |
| - {0x00, 0x14, 0x18, 0xaa}, {0x00, 0x9d, 0x99, 0xaa}, |
| - {0x00, 0x9e, 0x7f, 0xaa}, {0x00, 0x64, 0x08, 0xaa}, |
| - {0x00, 0x94, 0x07, 0xaa}, {0x00, 0x95, 0x06, 0xaa}, |
| - {0x00, 0x66, 0x05, 0xaa}, {0x00, 0x41, 0x08, 0xaa}, |
| - {0x00, 0x3f, 0x00, 0xaa}, {0x00, 0x75, 0x07, 0xaa}, |
| - {0x00, 0x76, 0xe1, 0xaa}, {0x00, 0x4c, 0x00, 0xaa}, |
| - {0x00, 0x77, 0x00, 0xaa}, {0x00, 0x3d, 0xc2, 0xaa}, |
| - {0x00, 0x4b, 0x09, 0xaa}, {0x00, 0xc9, 0x60, 0xaa}, |
| - {0x00, 0x41, 0x38, 0xaa}, {0xb6, 0x00, 0x00, 0xcc}, |
| - {0xb6, 0x03, 0x02, 0xcc}, {0xb6, 0x02, 0x80, 0xcc}, |
| - {0xb6, 0x05, 0x01, 0xcc}, {0xb6, 0x04, 0xe0, 0xcc}, |
| - {0xb6, 0x12, 0xf8, 0xcc}, {0xb6, 0x13, 0x13, 0xcc}, |
| - {0xb6, 0x18, 0x02, 0xcc}, {0xb6, 0x17, 0x58, 0xcc}, |
| - {0xb6, 0x16, 0x00, 0xcc}, {0xb6, 0x22, 0x12, 0xcc}, |
| - {0xb6, 0x23, 0x0b, 0xcc}, {0xbf, 0xc0, 0x39, 0xcc}, |
| - {0xbf, 0xc1, 0x04, 0xcc}, {0xbf, 0xcc, 0x00, 0xcc}, |
| - {0xb3, 0x5c, 0x01, 0xcc}, {0xb3, 0x01, 0x45, 0xcc}, |
| + {0x00, 0x24, 0x80, 0xaa}, |
| + {0x00, 0x25, 0x74, 0xaa}, |
| + {0x00, 0x26, 0xd3, 0xaa}, |
| + {0x00, 0x0d, 0x00, 0xaa}, |
| + {0x00, 0x14, 0x18, 0xaa}, |
| + {0x00, 0x9d, 0x99, 0xaa}, |
| + {0x00, 0x9e, 0x7f, 0xaa}, |
| + {0x00, 0x64, 0x08, 0xaa}, |
| + {0x00, 0x94, 0x07, 0xaa}, |
| + {0x00, 0x95, 0x06, 0xaa}, |
| + {0x00, 0x66, 0x05, 0xaa}, |
| + {0x00, 0x41, 0x08, 0xaa}, |
| + {0x00, 0x3f, 0x00, 0xaa}, |
| + {0x00, 0x75, 0x07, 0xaa}, |
| + {0x00, 0x76, 0xe1, 0xaa}, |
| + {0x00, 0x4c, 0x00, 0xaa}, |
| + {0x00, 0x77, 0x00, 0xaa}, |
| + {0x00, 0x3d, 0xc2, 0xaa}, |
| + {0x00, 0x4b, 0x09, 0xaa}, |
| + {0x00, 0xc9, 0x60, 0xaa}, |
| + {0x00, 0x41, 0x38, 0xaa}, |
| + {0xbf, 0xc0, 0x26, 0xcc}, |
| + {0xbf, 0xc1, 0x02, 0xcc}, |
| + {0xbf, 0xcc, 0x04, 0xcc}, |
| + {0xb3, 0x5c, 0x01, 0xcc}, |
| + {0xb3, 0x01, 0x45, 0xcc}, |
| {0x00, 0x77, 0x05, 0xaa}, |
| {}, |
| }; |
| |
| -static const u8 ov7670_initQVGA_JPG[][4] = { |
| - {0xb3, 0x01, 0x05, 0xcc}, {0x00, 0x00, 0x30, 0xdd}, |
| - {0xb0, 0x03, 0x19, 0xcc}, {0x00, 0x00, 0x10, 0xdd}, |
| - {0xb0, 0x04, 0x02, 0xcc}, {0x00, 0x00, 0x10, 0xdd}, |
| - {0xb3, 0x00, 0x66, 0xcc}, {0xb3, 0x00, 0x67, 0xcc}, |
| - {0xb3, 0x35, 0xa1, 0xcc}, {0xb3, 0x34, 0x01, 0xcc}, |
| - {0xb3, 0x05, 0x01, 0xcc}, {0xb3, 0x06, 0x01, 0xcc}, |
| - {0xb3, 0x08, 0x01, 0xcc}, {0xb3, 0x09, 0x0c, 0xcc}, |
| - {0xb3, 0x02, 0x02, 0xcc}, {0xb3, 0x03, 0x1f, 0xcc}, |
| - {0xb3, 0x14, 0x00, 0xcc}, {0xb3, 0x15, 0x00, 0xcc}, |
| - {0xb3, 0x16, 0x02, 0xcc}, {0xb3, 0x17, 0x7f, 0xcc}, |
| - {0xb3, 0x04, 0x05, 0xcc}, {0xb3, 0x20, 0x00, 0xcc}, |
| - {0xb3, 0x21, 0x00, 0xcc}, {0xb3, 0x22, 0x01, 0xcc}, |
| - {0xb3, 0x23, 0xe0, 0xcc}, {0xbc, 0x00, 0xd1, 0xcc}, |
| - {0xbc, 0x01, 0x01, 0xcc}, {0x00, 0x12, 0x80, 0xaa}, |
| - {0x00, 0x00, 0x20, 0xdd}, {0x00, 0x12, 0x00, 0xaa}, |
| - {0x00, 0x11, 0x40, 0xaa}, {0x00, 0x6b, 0x0a, 0xaa}, |
| - {0x00, 0x3a, 0x04, 0xaa}, {0x00, 0x40, 0xc0, 0xaa}, |
| - {0x00, 0x8c, 0x00, 0xaa}, {0x00, 0x7a, 0x29, 0xaa}, |
| - {0x00, 0x7b, 0x0e, 0xaa}, {0x00, 0x7c, 0x1a, 0xaa}, |
| - {0x00, 0x7d, 0x31, 0xaa}, {0x00, 0x7e, 0x53, 0xaa}, |
| - {0x00, 0x7f, 0x60, 0xaa}, {0x00, 0x80, 0x6b, 0xaa}, |
| - {0x00, 0x81, 0x73, 0xaa}, {0x00, 0x82, 0x7b, 0xaa}, |
| - {0x00, 0x83, 0x82, 0xaa}, {0x00, 0x84, 0x89, 0xaa}, |
| - {0x00, 0x85, 0x96, 0xaa}, {0x00, 0x86, 0xa1, 0xaa}, |
| - {0x00, 0x87, 0xb7, 0xaa}, {0x00, 0x88, 0xcc, 0xaa}, |
| - {0x00, 0x89, 0xe1, 0xaa}, {0x00, 0x13, 0xe0, 0xaa}, |
| - {0x00, 0x00, 0x00, 0xaa}, {0x00, 0x10, 0x00, 0xaa}, |
| - {0x00, 0x0d, 0x40, 0xaa}, {0x00, 0x14, 0x28, 0xaa}, |
| - {0x00, 0xa5, 0x05, 0xaa}, {0x00, 0xab, 0x07, 0xaa}, |
| - {0x00, 0x24, 0x95, 0xaa}, {0x00, 0x25, 0x33, 0xaa}, |
| - {0x00, 0x26, 0xe3, 0xaa}, {0x00, 0x9f, 0x88, 0xaa}, |
| - {0x00, 0xa0, 0x78, 0xaa}, {0x00, 0x55, 0x90, 0xaa}, |
| - {0x00, 0xa1, 0x03, 0xaa}, {0x00, 0xa6, 0xe0, 0xaa}, |
| - {0x00, 0xa7, 0xd8, 0xaa}, {0x00, 0xa8, 0xf0, 0xaa}, |
| - {0x00, 0xa9, 0x90, 0xaa}, {0x00, 0xaa, 0x14, 0xaa}, |
| - {0x00, 0x13, 0xe5, 0xaa}, {0x00, 0x0e, 0x61, 0xaa}, |
| - {0x00, 0x0f, 0x4b, 0xaa}, {0x00, 0x16, 0x02, 0xaa}, |
| +static const u8 ov7670_InitQVGA[][4] = { |
| + {0xb3, 0x01, 0x05, 0xcc}, |
| + {0x00, 0x00, 0x30, 0xdd}, |
| + {0xb0, 0x03, 0x19, 0xcc}, |
| + {0x00, 0x00, 0x10, 0xdd}, |
| + {0xb0, 0x04, 0x02, 0xcc}, |
| + {0x00, 0x00, 0x10, 0xdd}, |
| + {0xb3, 0x00, 0x66, 0xcc}, |
| + {0xb3, 0x00, 0x67, 0xcc}, |
| + {0xb0, 0x16, 0x01, 0xcc}, |
| + {0xb3, 0x35, 0xa1, 0xcc}, /* i2c add: 21 */ |
| + {0xb3, 0x34, 0x01, 0xcc}, |
| + {0xb3, 0x05, 0x01, 0xcc}, |
| + {0xb3, 0x06, 0x01, 0xcc}, |
| + {0xb3, 0x08, 0x01, 0xcc}, |
| + {0xb3, 0x09, 0x0c, 0xcc}, |
| + {0xb3, 0x02, 0x02, 0xcc}, |
| + {0xb3, 0x03, 0x1f, 0xcc}, |
| + {0xb3, 0x14, 0x00, 0xcc}, |
| + {0xb3, 0x15, 0x00, 0xcc}, |
| + {0xb3, 0x16, 0x02, 0xcc}, |
| + {0xb3, 0x17, 0x7f, 0xcc}, |
| + {0xb3, 0x04, 0x05, 0xcc}, |
| + {0xb3, 0x20, 0x00, 0xcc}, |
| + {0xb3, 0x21, 0x00, 0xcc}, |
| + {0xb3, 0x22, 0x01, 0xcc}, |
| + {0xb3, 0x23, 0xe0, 0xcc}, |
| + {0xbc, 0x00, 0xd1, 0xcc}, |
| + {0xbc, 0x01, 0x01, 0xcc}, |
| + {0x00, 0x12, 0x80, 0xaa}, |
| + {0x00, 0x00, 0x20, 0xdd}, |
| + {0x00, 0x12, 0x00, 0xaa}, |
| + {0x00, 0x11, 0x40, 0xaa}, |
| + {0x00, 0x6b, 0x0a, 0xaa}, |
| + {0x00, 0x3a, 0x04, 0xaa}, |
| + {0x00, 0x40, 0xc0, 0xaa}, |
| + {0x00, 0x8c, 0x00, 0xaa}, |
| + {0x00, 0x7a, 0x29, 0xaa}, |
| + {0x00, 0x7b, 0x0e, 0xaa}, |
| + {0x00, 0x7c, 0x1a, 0xaa}, |
| + {0x00, 0x7d, 0x31, 0xaa}, |
| + {0x00, 0x7e, 0x53, 0xaa}, |
| + {0x00, 0x7f, 0x60, 0xaa}, |
| + {0x00, 0x80, 0x6b, 0xaa}, |
| + {0x00, 0x81, 0x73, 0xaa}, |
| + {0x00, 0x82, 0x7b, 0xaa}, |
| + {0x00, 0x83, 0x82, 0xaa}, |
| + {0x00, 0x84, 0x89, 0xaa}, |
| + {0x00, 0x85, 0x96, 0xaa}, |
| + {0x00, 0x86, 0xa1, 0xaa}, |
| + {0x00, 0x87, 0xb7, 0xaa}, |
| + {0x00, 0x88, 0xcc, 0xaa}, |
| + {0x00, 0x89, 0xe1, 0xaa}, |
| + {0x00, 0x13, 0xe0, 0xaa}, |
| + {0x00, 0x00, 0x00, 0xaa}, |
| + {0x00, 0x10, 0x00, 0xaa}, |
| + {0x00, 0x0d, 0x40, 0xaa}, |
| + {0x00, 0x14, 0x28, 0xaa}, |
| + {0x00, 0xa5, 0x05, 0xaa}, |
| + {0x00, 0xab, 0x07, 0xaa}, |
| + {0x00, 0x24, 0x95, 0xaa}, |
| + {0x00, 0x25, 0x33, 0xaa}, |
| + {0x00, 0x26, 0xe3, 0xaa}, |
| + {0x00, 0x9f, 0x88, 0xaa}, |
| + {0x00, 0xa0, 0x78, 0xaa}, |
| + {0x00, 0x55, 0x90, 0xaa}, |
| + {0x00, 0xa1, 0x03, 0xaa}, |
| + {0x00, 0xa6, 0xe0, 0xaa}, |
| + {0x00, 0xa7, 0xd8, 0xaa}, |
| + {0x00, 0xa8, 0xf0, 0xaa}, |
| + {0x00, 0xa9, 0x90, 0xaa}, |
| + {0x00, 0xaa, 0x14, 0xaa}, |
| + {0x00, 0x13, 0xe5, 0xaa}, |
| + {0x00, 0x0e, 0x61, 0xaa}, |
| + {0x00, 0x0f, 0x4b, 0xaa}, |
| + {0x00, 0x16, 0x02, 0xaa}, |
| {0x00, 0x1e, 0x07, 0xaa}, /* MVFP */ |
| {0x00, 0x21, 0x02, 0xaa}, |
| - {0x00, 0x22, 0x91, 0xaa}, {0x00, 0x29, 0x07, 0xaa}, |
| - {0x00, 0x33, 0x0b, 0xaa}, {0x00, 0x35, 0x0b, 0xaa}, |
| - {0x00, 0x37, 0x1d, 0xaa}, {0x00, 0x38, 0x71, 0xaa}, |
| - {0x00, 0x39, 0x2a, 0xaa}, {0x00, 0x3c, 0x78, 0xaa}, |
| - {0x00, 0x4d, 0x40, 0xaa}, {0x00, 0x4e, 0x20, 0xaa}, |
| - {0x00, 0x74, 0x19, 0xaa}, {0x00, 0x8d, 0x4f, 0xaa}, |
| - {0x00, 0x8e, 0x00, 0xaa}, {0x00, 0x8f, 0x00, 0xaa}, |
| - {0x00, 0x90, 0x00, 0xaa}, {0x00, 0x91, 0x00, 0xaa}, |
| - {0x00, 0x96, 0x00, 0xaa}, {0x00, 0x9a, 0x80, 0xaa}, |
| - {0x00, 0xb0, 0x84, 0xaa}, {0x00, 0xb1, 0x0c, 0xaa}, |
| - {0x00, 0xb2, 0x0e, 0xaa}, {0x00, 0xb3, 0x82, 0xaa}, |
| - {0x00, 0xb8, 0x0a, 0xaa}, {0x00, 0x43, 0x14, 0xaa}, |
| - {0x00, 0x44, 0xf0, 0xaa}, {0x00, 0x45, 0x45, 0xaa}, |
| - {0x00, 0x46, 0x63, 0xaa}, {0x00, 0x47, 0x2d, 0xaa}, |
| - {0x00, 0x48, 0x46, 0xaa}, {0x00, 0x59, 0x88, 0xaa}, |
| - {0x00, 0x5a, 0xa0, 0xaa}, {0x00, 0x5b, 0xc6, 0xaa}, |
| - {0x00, 0x5c, 0x7d, 0xaa}, {0x00, 0x5d, 0x5f, 0xaa}, |
| - {0x00, 0x5e, 0x19, 0xaa}, {0x00, 0x6c, 0x0a, 0xaa}, |
| - {0x00, 0x6d, 0x55, 0xaa}, {0x00, 0x6e, 0x11, 0xaa}, |
| - {0x00, 0x6f, 0x9e, 0xaa}, {0x00, 0x69, 0x00, 0xaa}, |
| - {0x00, 0x6a, 0x40, 0xaa}, {0x00, 0x01, 0x40, 0xaa}, |
| - {0x00, 0x02, 0x40, 0xaa}, {0x00, 0x13, 0xe7, 0xaa}, |
| - {0x00, 0x5f, 0xf0, 0xaa}, {0x00, 0x60, 0xf0, 0xaa}, |
| - {0x00, 0x61, 0xf0, 0xaa}, {0x00, 0x27, 0xa0, 0xaa}, |
| - {0x00, 0x28, 0x80, 0xaa}, {0x00, 0x2c, 0x90, 0xaa}, |
| - {0x00, 0x4f, 0x66, 0xaa}, {0x00, 0x50, 0x66, 0xaa}, |
| - {0x00, 0x51, 0x00, 0xaa}, {0x00, 0x52, 0x22, 0xaa}, |
| - {0x00, 0x53, 0x5e, 0xaa}, {0x00, 0x54, 0x80, 0xaa}, |
| - {0x00, 0x58, 0x9e, 0xaa}, {0x00, 0x41, 0x08, 0xaa}, |
| - {0x00, 0x3f, 0x00, 0xaa}, {0x00, 0x75, 0x85, 0xaa}, |
| - {0x00, 0x76, 0xe1, 0xaa}, {0x00, 0x4c, 0x00, 0xaa}, |
| - {0x00, 0x77, 0x0a, 0xaa}, {0x00, 0x3d, 0x88, 0xaa}, |
| - {0x00, 0x4b, 0x09, 0xaa}, {0x00, 0xc9, 0x60, 0xaa}, |
| - {0x00, 0x41, 0x38, 0xaa}, {0x00, 0x62, 0x30, 0xaa}, |
| - {0x00, 0x63, 0x30, 0xaa}, {0x00, 0x64, 0x08, 0xaa}, |
| - {0x00, 0x94, 0x07, 0xaa}, {0x00, 0x95, 0x0b, 0xaa}, |
| - {0x00, 0x65, 0x00, 0xaa}, {0x00, 0x66, 0x05, 0xaa}, |
| - {0x00, 0x56, 0x50, 0xaa}, {0x00, 0x34, 0x11, 0xaa}, |
| - {0x00, 0xa4, 0x88, 0xaa}, {0x00, 0x96, 0x00, 0xaa}, |
| - {0x00, 0x97, 0x30, 0xaa}, {0x00, 0x98, 0x20, 0xaa}, |
| - {0x00, 0x99, 0x30, 0xaa}, {0x00, 0x9a, 0x84, 0xaa}, |
| - {0x00, 0x9b, 0x29, 0xaa}, {0x00, 0x9c, 0x03, 0xaa}, |
| - {0x00, 0x78, 0x04, 0xaa}, {0x00, 0x79, 0x01, 0xaa}, |
| - {0x00, 0xc8, 0xf0, 0xaa}, {0x00, 0x79, 0x0f, 0xaa}, |
| - {0x00, 0xc8, 0x00, 0xaa}, {0x00, 0x79, 0x10, 0xaa}, |
| - {0x00, 0xc8, 0x7e, 0xaa}, {0x00, 0x79, 0x0a, 0xaa}, |
| - {0x00, 0xc8, 0x80, 0xaa}, {0x00, 0x79, 0x0b, 0xaa}, |
| - {0x00, 0xc8, 0x01, 0xaa}, {0x00, 0x79, 0x0c, 0xaa}, |
| - {0x00, 0xc8, 0x0f, 0xaa}, {0x00, 0x79, 0x0d, 0xaa}, |
| - {0x00, 0xc8, 0x20, 0xaa}, {0x00, 0x79, 0x09, 0xaa}, |
| - {0x00, 0xc8, 0x80, 0xaa}, {0x00, 0x79, 0x02, 0xaa}, |
| - {0x00, 0xc8, 0xc0, 0xaa}, {0x00, 0x79, 0x03, 0xaa}, |
| - {0x00, 0xc8, 0x40, 0xaa}, {0x00, 0x79, 0x05, 0xaa}, |
| - {0x00, 0xc8, 0x30, 0xaa}, {0x00, 0x79, 0x26, 0xaa}, |
| - {0x00, 0x11, 0x40, 0xaa}, {0x00, 0x3a, 0x04, 0xaa}, |
| - {0x00, 0x12, 0x00, 0xaa}, {0x00, 0x40, 0xc0, 0xaa}, |
| - {0x00, 0x8c, 0x00, 0xaa}, {0x00, 0x17, 0x14, 0xaa}, |
| - {0x00, 0x18, 0x02, 0xaa}, {0x00, 0x32, 0x92, 0xaa}, |
| - {0x00, 0x19, 0x02, 0xaa}, {0x00, 0x1a, 0x7a, 0xaa}, |
| - {0x00, 0x03, 0x0a, 0xaa}, {0x00, 0x0c, 0x00, 0xaa}, |
| - {0x00, 0x3e, 0x00, 0xaa}, {0x00, 0x70, 0x3a, 0xaa}, |
| - {0x00, 0x71, 0x35, 0xaa}, {0x00, 0x72, 0x11, 0xaa}, |
| - {0x00, 0x73, 0xf0, 0xaa}, {0x00, 0xa2, 0x02, 0xaa}, |
| - {0x00, 0xb1, 0x00, 0xaa}, {0x00, 0xb1, 0x0c, 0xaa}, |
| + {0x00, 0x22, 0x91, 0xaa}, |
| + {0x00, 0x29, 0x07, 0xaa}, |
| + {0x00, 0x33, 0x0b, 0xaa}, |
| + {0x00, 0x35, 0x0b, 0xaa}, |
| + {0x00, 0x37, 0x1d, 0xaa}, |
| + {0x00, 0x38, 0x71, 0xaa}, |
| + {0x00, 0x39, 0x2a, 0xaa}, |
| + {0x00, 0x3c, 0x78, 0xaa}, |
| + {0x00, 0x4d, 0x40, 0xaa}, |
| + {0x00, 0x4e, 0x20, 0xaa}, |
| + {0x00, 0x74, 0x19, 0xaa}, |
| + {0x00, 0x8d, 0x4f, 0xaa}, |
| + {0x00, 0x8e, 0x00, 0xaa}, |
| + {0x00, 0x8f, 0x00, 0xaa}, |
| + {0x00, 0x90, 0x00, 0xaa}, |
| + {0x00, 0x91, 0x00, 0xaa}, |
| + {0x00, 0x96, 0x00, 0xaa}, |
| + {0x00, 0x9a, 0x80, 0xaa}, |
| + {0x00, 0xb0, 0x84, 0xaa}, |
| + {0x00, 0xb1, 0x0c, 0xaa}, |
| + {0x00, 0xb2, 0x0e, 0xaa}, |
| + {0x00, 0xb3, 0x82, 0xaa}, |
| + {0x00, 0xb8, 0x0a, 0xaa}, |
| + {0x00, 0x43, 0x14, 0xaa}, |
| + {0x00, 0x44, 0xf0, 0xaa}, |
| + {0x00, 0x45, 0x45, 0xaa}, |
| + {0x00, 0x46, 0x63, 0xaa}, |
| + {0x00, 0x47, 0x2d, 0xaa}, |
| + {0x00, 0x48, 0x46, 0xaa}, |
| + {0x00, 0x59, 0x88, 0xaa}, |
| + {0x00, 0x5a, 0xa0, 0xaa}, |
| + {0x00, 0x5b, 0xc6, 0xaa}, |
| + {0x00, 0x5c, 0x7d, 0xaa}, |
| + {0x00, 0x5d, 0x5f, 0xaa}, |
| + {0x00, 0x5e, 0x19, 0xaa}, |
| + {0x00, 0x6c, 0x0a, 0xaa}, |
| + {0x00, 0x6d, 0x55, 0xaa}, |
| + {0x00, 0x6e, 0x11, 0xaa}, |
| + {0x00, 0x6f, 0x9e, 0xaa}, |
| + {0x00, 0x69, 0x00, 0xaa}, |
| + {0x00, 0x6a, 0x40, 0xaa}, |
| + {0x00, 0x01, 0x40, 0xaa}, |
| + {0x00, 0x02, 0x40, 0xaa}, |
| + {0x00, 0x13, 0xe7, 0xaa}, |
| + {0x00, 0x5f, 0xf0, 0xaa}, |
| + {0x00, 0x60, 0xf0, 0xaa}, |
| + {0x00, 0x61, 0xf0, 0xaa}, |
| + {0x00, 0x27, 0xa0, 0xaa}, |
| + {0x00, 0x28, 0x80, 0xaa}, |
| + {0x00, 0x2c, 0x90, 0xaa}, |
| + {0x00, 0x4f, 0x66, 0xaa}, |
| + {0x00, 0x50, 0x66, 0xaa}, |
| + {0x00, 0x51, 0x00, 0xaa}, |
| + {0x00, 0x52, 0x22, 0xaa}, |
| + {0x00, 0x53, 0x5e, 0xaa}, |
| + {0x00, 0x54, 0x80, 0xaa}, |
| + {0x00, 0x58, 0x9e, 0xaa}, |
| + {0x00, 0x41, 0x08, 0xaa}, |
| + {0x00, 0x3f, 0x00, 0xaa}, |
| + {0x00, 0x75, 0x85, 0xaa}, |
| + {0x00, 0x76, 0xe1, 0xaa}, |
| + {0x00, 0x4c, 0x00, 0xaa}, |
| + {0x00, 0x77, 0x0a, 0xaa}, |
| + {0x00, 0x3d, 0x88, 0xaa}, |
| + {0x00, 0x4b, 0x09, 0xaa}, |
| + {0x00, 0xc9, 0x60, 0xaa}, |
| + {0x00, 0x41, 0x38, 0xaa}, |
| + {0x00, 0x62, 0x30, 0xaa}, |
| + {0x00, 0x63, 0x30, 0xaa}, |
| + {0x00, 0x64, 0x08, 0xaa}, |
| + {0x00, 0x94, 0x07, 0xaa}, |
| + {0x00, 0x95, 0x0b, 0xaa}, |
| + {0x00, 0x65, 0x00, 0xaa}, |
| + {0x00, 0x66, 0x05, 0xaa}, |
| + {0x00, 0x56, 0x50, 0xaa}, |
| + {0x00, 0x34, 0x11, 0xaa}, |
| + {0x00, 0xa4, 0x88, 0xaa}, |
| + {0x00, 0x96, 0x00, 0xaa}, |
| + {0x00, 0x97, 0x30, 0xaa}, |
| + {0x00, 0x98, 0x20, 0xaa}, |
| + {0x00, 0x99, 0x30, 0xaa}, |
| + {0x00, 0x9a, 0x84, 0xaa}, |
| + {0x00, 0x9b, 0x29, 0xaa}, |
| + {0x00, 0x9c, 0x03, 0xaa}, |
| + {0x00, 0x78, 0x04, 0xaa}, |
| + {0x00, 0x79, 0x01, 0xaa}, |
| + {0x00, 0xc8, 0xf0, 0xaa}, |
| + {0x00, 0x79, 0x0f, 0xaa}, |
| + {0x00, 0xc8, 0x00, 0xaa}, |
| + {0x00, 0x79, 0x10, 0xaa}, |
| + {0x00, 0xc8, 0x7e, 0xaa}, |
| + {0x00, 0x79, 0x0a, 0xaa}, |
| + {0x00, 0xc8, 0x80, 0xaa}, |
| + {0x00, 0x79, 0x0b, 0xaa}, |
| + {0x00, 0xc8, 0x01, 0xaa}, |
| + {0x00, 0x79, 0x0c, 0xaa}, |
| + {0x00, 0xc8, 0x0f, 0xaa}, |
| + {0x00, 0x79, 0x0d, 0xaa}, |
| + {0x00, 0xc8, 0x20, 0xaa}, |
| + {0x00, 0x79, 0x09, 0xaa}, |
| + {0x00, 0xc8, 0x80, 0xaa}, |
| + {0x00, 0x79, 0x02, 0xaa}, |
| + {0x00, 0xc8, 0xc0, 0xaa}, |
| + {0x00, 0x79, 0x03, 0xaa}, |
| + {0x00, 0xc8, 0x40, 0xaa}, |
| + {0x00, 0x79, 0x05, 0xaa}, |
| + {0x00, 0xc8, 0x30, 0xaa}, |
| + {0x00, 0x79, 0x26, 0xaa}, |
| + {0x00, 0x11, 0x40, 0xaa}, |
| + {0x00, 0x3a, 0x04, 0xaa}, |
| + {0x00, 0x12, 0x00, 0xaa}, |
| + {0x00, 0x40, 0xc0, 0xaa}, |
| + {0x00, 0x8c, 0x00, 0xaa}, |
| + {0x00, 0x17, 0x14, 0xaa}, |
| + {0x00, 0x18, 0x02, 0xaa}, |
| + {0x00, 0x32, 0x92, 0xaa}, |
| + {0x00, 0x19, 0x02, 0xaa}, |
| + {0x00, 0x1a, 0x7a, 0xaa}, |
| + {0x00, 0x03, 0x0a, 0xaa}, |
| + {0x00, 0x0c, 0x00, 0xaa}, |
| + {0x00, 0x3e, 0x00, 0xaa}, |
| + {0x00, 0x70, 0x3a, 0xaa}, |
| + {0x00, 0x71, 0x35, 0xaa}, |
| + {0x00, 0x72, 0x11, 0xaa}, |
| + {0x00, 0x73, 0xf0, 0xaa}, |
| + {0x00, 0xa2, 0x02, 0xaa}, |
| + {0x00, 0xb1, 0x00, 0xaa}, |
| + {0x00, 0xb1, 0x0c, 0xaa}, |
| {0x00, 0x1e, 0x37, 0xaa}, /* MVFP */ |
| {0x00, 0xaa, 0x14, 0xaa}, |
| - {0x00, 0x24, 0x80, 0xaa}, {0x00, 0x25, 0x74, 0xaa}, |
| - {0x00, 0x26, 0xd3, 0xaa}, {0x00, 0x0d, 0x00, 0xaa}, |
| - {0x00, 0x14, 0x18, 0xaa}, {0x00, 0x9d, 0x99, 0xaa}, |
| - {0x00, 0x9e, 0x7f, 0xaa}, {0x00, 0x64, 0x08, 0xaa}, |
| - {0x00, 0x94, 0x07, 0xaa}, {0x00, 0x95, 0x06, 0xaa}, |
| - {0x00, 0x66, 0x05, 0xaa}, {0x00, 0x41, 0x08, 0xaa}, |
| - {0x00, 0x3f, 0x00, 0xaa}, {0x00, 0x75, 0x07, 0xaa}, |
| - {0x00, 0x76, 0xe1, 0xaa}, {0x00, 0x4c, 0x00, 0xaa}, |
| - {0x00, 0x77, 0x00, 0xaa}, {0x00, 0x3d, 0xc2, 0xaa}, |
| - {0x00, 0x4b, 0x09, 0xaa}, {0x00, 0xc9, 0x60, 0xaa}, |
| - {0x00, 0x41, 0x38, 0xaa}, {0xb6, 0x00, 0x00, 0xcc}, |
| - {0xb6, 0x03, 0x01, 0xcc}, {0xb6, 0x02, 0x40, 0xcc}, |
| - {0xb6, 0x05, 0x00, 0xcc}, {0xb6, 0x04, 0xf0, 0xcc}, |
| - {0xb6, 0x12, 0xf8, 0xcc}, {0xb6, 0x13, 0x21, 0xcc}, |
| - {0xb6, 0x18, 0x00, 0xcc}, {0xb6, 0x17, 0x96, 0xcc}, |
| - {0xb6, 0x16, 0x00, 0xcc}, {0xb6, 0x22, 0x12, 0xcc}, |
| - {0xb6, 0x23, 0x0b, 0xcc}, {0xbf, 0xc0, 0x39, 0xcc}, |
| - {0xbf, 0xc1, 0x04, 0xcc}, {0xbf, 0xcc, 0x00, 0xcc}, |
| - {0xbc, 0x02, 0x18, 0xcc}, {0xbc, 0x03, 0x50, 0xcc}, |
| - {0xbc, 0x04, 0x18, 0xcc}, {0xbc, 0x05, 0x00, 0xcc}, |
| - {0xbc, 0x06, 0x00, 0xcc}, {0xbc, 0x08, 0x30, 0xcc}, |
| - {0xbc, 0x09, 0x40, 0xcc}, {0xbc, 0x0a, 0x10, 0xcc}, |
| - {0xbc, 0x0b, 0x00, 0xcc}, {0xbc, 0x0c, 0x00, 0xcc}, |
| - {0xb3, 0x5c, 0x01, 0xcc}, {0xb3, 0x01, 0x45, 0xcc}, |
| - {0x00, 0x77, 0x05, 0xaa }, |
| + {0x00, 0x24, 0x80, 0xaa}, |
| + {0x00, 0x25, 0x74, 0xaa}, |
| + {0x00, 0x26, 0xd3, 0xaa}, |
| + {0x00, 0x0d, 0x00, 0xaa}, |
| + {0x00, 0x14, 0x18, 0xaa}, |
| + {0x00, 0x9d, 0x99, 0xaa}, |
| + {0x00, 0x9e, 0x7f, 0xaa}, |
| + {0x00, 0x64, 0x08, 0xaa}, |
| + {0x00, 0x94, 0x07, 0xaa}, |
| + {0x00, 0x95, 0x06, 0xaa}, |
| + {0x00, 0x66, 0x05, 0xaa}, |
| + {0x00, 0x41, 0x08, 0xaa}, |
| + {0x00, 0x3f, 0x00, 0xaa}, |
| + {0x00, 0x75, 0x07, 0xaa}, |
| + {0x00, 0x76, 0xe1, 0xaa}, |
| + {0x00, 0x4c, 0x00, 0xaa}, |
| + {0x00, 0x77, 0x00, 0xaa}, |
| + {0x00, 0x3d, 0xc2, 0xaa}, |
| + {0x00, 0x4b, 0x09, 0xaa}, |
| + {0x00, 0xc9, 0x60, 0xaa}, |
| + {0x00, 0x41, 0x38, 0xaa}, |
| + {0xbc, 0x02, 0x18, 0xcc}, |
| + {0xbc, 0x03, 0x50, 0xcc}, |
| + {0xbc, 0x04, 0x18, 0xcc}, |
| + {0xbc, 0x05, 0x00, 0xcc}, |
| + {0xbc, 0x06, 0x00, 0xcc}, |
| + {0xbc, 0x08, 0x30, 0xcc}, |
| + {0xbc, 0x09, 0x40, 0xcc}, |
| + {0xbc, 0x0a, 0x10, 0xcc}, |
| + {0xbc, 0x0b, 0x00, 0xcc}, |
| + {0xbc, 0x0c, 0x00, 0xcc}, |
| + {0xbf, 0xc0, 0x26, 0xcc}, |
| + {0xbf, 0xc1, 0x02, 0xcc}, |
| + {0xbf, 0xcc, 0x04, 0xcc}, |
| + {0xb3, 0x5c, 0x01, 0xcc}, |
| + {0xb3, 0x01, 0x45, 0xcc}, |
| + {0x00, 0x77, 0x05, 0xaa}, |
| {}, |
| }; |
| |
| @@ -3117,6 +3338,10 @@ static int sd_config(struct gspca_dev *gspca_dev, |
| cam->cam_mode = bi_mode; |
| cam->nmodes = ARRAY_SIZE(bi_mode); |
| break; |
| + case SENSOR_OV7670: |
| + cam->cam_mode = bi_mode; |
| + cam->nmodes = ARRAY_SIZE(bi_mode) - 1; |
| + break; |
| default: |
| cam->cam_mode = vc0323_mode; |
| cam->nmodes = ARRAY_SIZE(vc0323_mode) - 1; |
| @@ -3329,14 +3554,6 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| else |
| init = ov7660_initVGA_data; /* 640x480 */ |
| break; |
| - case SENSOR_OV7670: |
| - /*GammaT = ov7660_gamma; */ |
| - /*MatrixT = ov7660_matrix; */ |
| - if (mode) |
| - init = ov7670_initQVGA_JPG; /* 320x240 */ |
| - else |
| - init = ov7670_initVGA_JPG; /* 640x480 */ |
| - break; |
| case SENSOR_MI0360: |
| GammaT = mi1320_gamma; |
| MatrixT = mi0360_matrix; |
| @@ -3373,6 +3590,9 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| MatrixT = mi1320_matrix; |
| init = mi1320_soc_init[mode]; |
| break; |
| + case SENSOR_OV7670: |
| + init = mode == 1 ? ov7670_InitVGA : ov7670_InitQVGA; |
| + break; |
| case SENSOR_PO3130NC: |
| GammaT = po3130_gamma; |
| MatrixT = po3130_matrix; |
| @@ -3426,7 +3646,13 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| sethvflip(gspca_dev); |
| setlightfreq(gspca_dev); |
| } |
| - if (sd->sensor == SENSOR_POxxxx) { |
| + switch (sd->sensor) { |
| + case SENSOR_OV7670: |
| + reg_w(gspca_dev->dev, 0x87, 0xffff, 0xffff); |
| + reg_w(gspca_dev->dev, 0x88, 0xff00, 0xf0f1); |
| + reg_w(gspca_dev->dev, 0xa0, 0x0000, 0xbfff); |
| + break; |
| + case SENSOR_POxxxx: |
| setcolors(gspca_dev); |
| setbrightness(gspca_dev); |
| setcontrast(gspca_dev); |
| @@ -3435,6 +3661,7 @@ static int sd_start(struct gspca_dev *gspca_dev) |
| msleep(80); |
| reg_w(gspca_dev->dev, 0x89, 0xffff, 0xfdff); |
| usb_exchange(gspca_dev, poxxxx_init_end_2); |
| + break; |
| } |
| return 0; |
| } |