2410 lines
70 KiB
C
2410 lines
70 KiB
C
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
/*
|
||
|
* Sonix sn9c201 sn9c202 library
|
||
|
*
|
||
|
* Copyright (C) 2012 Jean-Francois Moine <http://moinejf.free.fr>
|
||
|
* Copyright (C) 2008-2009 microdia project <microdia@googlegroups.com>
|
||
|
* Copyright (C) 2009 Brian Johnson <brijohn@gmail.com>
|
||
|
*/
|
||
|
|
||
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||
|
|
||
|
#include <linux/input.h>
|
||
|
|
||
|
#include "gspca.h"
|
||
|
#include "jpeg.h"
|
||
|
|
||
|
#include <linux/dmi.h>
|
||
|
|
||
|
MODULE_AUTHOR("Brian Johnson <brijohn@gmail.com>, microdia project <microdia@googlegroups.com>");
|
||
|
MODULE_DESCRIPTION("GSPCA/SN9C20X USB Camera Driver");
|
||
|
MODULE_LICENSE("GPL");
|
||
|
|
||
|
/*
|
||
|
* Pixel format private data
|
||
|
*/
|
||
|
#define SCALE_MASK 0x0f
|
||
|
#define SCALE_160x120 0
|
||
|
#define SCALE_320x240 1
|
||
|
#define SCALE_640x480 2
|
||
|
#define SCALE_1280x1024 3
|
||
|
#define MODE_RAW 0x10
|
||
|
#define MODE_JPEG 0x20
|
||
|
#define MODE_SXGA 0x80
|
||
|
|
||
|
#define SENSOR_OV9650 0
|
||
|
#define SENSOR_OV9655 1
|
||
|
#define SENSOR_SOI968 2
|
||
|
#define SENSOR_OV7660 3
|
||
|
#define SENSOR_OV7670 4
|
||
|
#define SENSOR_MT9V011 5
|
||
|
#define SENSOR_MT9V111 6
|
||
|
#define SENSOR_MT9V112 7
|
||
|
#define SENSOR_MT9M001 8
|
||
|
#define SENSOR_MT9M111 9
|
||
|
#define SENSOR_MT9M112 10
|
||
|
#define SENSOR_HV7131R 11
|
||
|
#define SENSOR_MT9VPRB 12
|
||
|
|
||
|
/* camera flags */
|
||
|
#define HAS_NO_BUTTON 0x1
|
||
|
#define LED_REVERSE 0x2 /* some cameras unset gpio to turn on leds */
|
||
|
#define FLIP_DETECT 0x4
|
||
|
#define HAS_LED_TORCH 0x8
|
||
|
|
||
|
/* specific webcam descriptor */
|
||
|
struct sd {
|
||
|
struct gspca_dev gspca_dev;
|
||
|
|
||
|
struct { /* color control cluster */
|
||
|
struct v4l2_ctrl *brightness;
|
||
|
struct v4l2_ctrl *contrast;
|
||
|
struct v4l2_ctrl *saturation;
|
||
|
struct v4l2_ctrl *hue;
|
||
|
};
|
||
|
struct { /* blue/red balance control cluster */
|
||
|
struct v4l2_ctrl *blue;
|
||
|
struct v4l2_ctrl *red;
|
||
|
};
|
||
|
struct { /* h/vflip control cluster */
|
||
|
struct v4l2_ctrl *hflip;
|
||
|
struct v4l2_ctrl *vflip;
|
||
|
};
|
||
|
struct v4l2_ctrl *gamma;
|
||
|
struct { /* autogain and exposure or gain control cluster */
|
||
|
struct v4l2_ctrl *autogain;
|
||
|
struct v4l2_ctrl *exposure;
|
||
|
struct v4l2_ctrl *gain;
|
||
|
};
|
||
|
struct v4l2_ctrl *jpegqual;
|
||
|
|
||
|
struct v4l2_ctrl *led_mode;
|
||
|
|
||
|
struct work_struct work;
|
||
|
|
||
|
u32 pktsz; /* (used by pkt_scan) */
|
||
|
u16 npkt;
|
||
|
s8 nchg;
|
||
|
u8 fmt; /* (used for JPEG QTAB update */
|
||
|
|
||
|
#define MIN_AVG_LUM 80
|
||
|
#define MAX_AVG_LUM 130
|
||
|
atomic_t avg_lum;
|
||
|
u8 old_step;
|
||
|
u8 older_step;
|
||
|
u8 exposure_step;
|
||
|
|
||
|
u8 i2c_addr;
|
||
|
u8 i2c_intf;
|
||
|
u8 sensor;
|
||
|
u8 hstart;
|
||
|
u8 vstart;
|
||
|
|
||
|
u8 jpeg_hdr[JPEG_HDR_SZ];
|
||
|
|
||
|
u8 flags;
|
||
|
};
|
||
|
|
||
|
static void qual_upd(struct work_struct *work);
|
||
|
|
||
|
struct i2c_reg_u8 {
|
||
|
u8 reg;
|
||
|
u8 val;
|
||
|
};
|
||
|
|
||
|
struct i2c_reg_u16 {
|
||
|
u8 reg;
|
||
|
u16 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-1039",
|
||
|
.matches = {
|
||
|
DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."),
|
||
|
DMI_MATCH(DMI_PRODUCT_NAME, "MS-1039"),
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
.ident = "MSI MS-1632",
|
||
|
.matches = {
|
||
|
DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
|
||
|
DMI_MATCH(DMI_BOARD_NAME, "MS-1632")
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
.ident = "MSI MS-1633X",
|
||
|
.matches = {
|
||
|
DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
|
||
|
DMI_MATCH(DMI_BOARD_NAME, "MS-1633X")
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
.ident = "MSI MS-1635X",
|
||
|
.matches = {
|
||
|
DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
|
||
|
DMI_MATCH(DMI_BOARD_NAME, "MS-1635X")
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
.ident = "ASUSTeK W7J",
|
||
|
.matches = {
|
||
|
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
|
||
|
DMI_MATCH(DMI_BOARD_NAME, "W7J ")
|
||
|
}
|
||
|
},
|
||
|
{}
|
||
|
};
|
||
|
|
||
|
static const struct v4l2_pix_format vga_mode[] = {
|
||
|
{160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 160,
|
||
|
.sizeimage = 160 * 120 * 4 / 8 + 590,
|
||
|
.colorspace = V4L2_COLORSPACE_JPEG,
|
||
|
.priv = SCALE_160x120 | MODE_JPEG},
|
||
|
{160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 160,
|
||
|
.sizeimage = 160 * 120,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_160x120 | MODE_RAW},
|
||
|
{160, 120, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 160,
|
||
|
.sizeimage = 240 * 120,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_160x120},
|
||
|
{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 320,
|
||
|
.sizeimage = 320 * 240 * 4 / 8 + 590,
|
||
|
.colorspace = V4L2_COLORSPACE_JPEG,
|
||
|
.priv = SCALE_320x240 | MODE_JPEG},
|
||
|
{320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 320,
|
||
|
.sizeimage = 320 * 240 ,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_320x240 | MODE_RAW},
|
||
|
{320, 240, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 320,
|
||
|
.sizeimage = 480 * 240 ,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_320x240},
|
||
|
{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 640,
|
||
|
.sizeimage = 640 * 480 * 4 / 8 + 590,
|
||
|
.colorspace = V4L2_COLORSPACE_JPEG,
|
||
|
.priv = SCALE_640x480 | MODE_JPEG},
|
||
|
{640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 640,
|
||
|
.sizeimage = 640 * 480,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_640x480 | MODE_RAW},
|
||
|
{640, 480, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 640,
|
||
|
.sizeimage = 960 * 480,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_640x480},
|
||
|
};
|
||
|
|
||
|
static const struct v4l2_pix_format sxga_mode[] = {
|
||
|
{160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 160,
|
||
|
.sizeimage = 160 * 120 * 4 / 8 + 590,
|
||
|
.colorspace = V4L2_COLORSPACE_JPEG,
|
||
|
.priv = SCALE_160x120 | MODE_JPEG},
|
||
|
{160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 160,
|
||
|
.sizeimage = 160 * 120,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_160x120 | MODE_RAW},
|
||
|
{160, 120, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 160,
|
||
|
.sizeimage = 240 * 120,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_160x120},
|
||
|
{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 320,
|
||
|
.sizeimage = 320 * 240 * 4 / 8 + 590,
|
||
|
.colorspace = V4L2_COLORSPACE_JPEG,
|
||
|
.priv = SCALE_320x240 | MODE_JPEG},
|
||
|
{320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 320,
|
||
|
.sizeimage = 320 * 240 ,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_320x240 | MODE_RAW},
|
||
|
{320, 240, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 320,
|
||
|
.sizeimage = 480 * 240 ,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_320x240},
|
||
|
{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 640,
|
||
|
.sizeimage = 640 * 480 * 4 / 8 + 590,
|
||
|
.colorspace = V4L2_COLORSPACE_JPEG,
|
||
|
.priv = SCALE_640x480 | MODE_JPEG},
|
||
|
{640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 640,
|
||
|
.sizeimage = 640 * 480,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_640x480 | MODE_RAW},
|
||
|
{640, 480, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 640,
|
||
|
.sizeimage = 960 * 480,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_640x480},
|
||
|
{1280, 1024, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 1280,
|
||
|
.sizeimage = 1280 * 1024,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_1280x1024 | MODE_RAW | MODE_SXGA},
|
||
|
};
|
||
|
|
||
|
static const struct v4l2_pix_format mono_mode[] = {
|
||
|
{160, 120, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 160,
|
||
|
.sizeimage = 160 * 120,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_160x120 | MODE_RAW},
|
||
|
{320, 240, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 320,
|
||
|
.sizeimage = 320 * 240 ,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_320x240 | MODE_RAW},
|
||
|
{640, 480, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 640,
|
||
|
.sizeimage = 640 * 480,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_640x480 | MODE_RAW},
|
||
|
{1280, 1024, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
|
||
|
.bytesperline = 1280,
|
||
|
.sizeimage = 1280 * 1024,
|
||
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||
|
.priv = SCALE_1280x1024 | MODE_RAW | MODE_SXGA},
|
||
|
};
|
||
|
|
||
|
static const s16 hsv_red_x[] = {
|
||
|
41, 44, 46, 48, 50, 52, 54, 56,
|
||
|
58, 60, 62, 64, 66, 68, 70, 72,
|
||
|
74, 76, 78, 80, 81, 83, 85, 87,
|
||
|
88, 90, 92, 93, 95, 97, 98, 100,
|
||
|
101, 102, 104, 105, 107, 108, 109, 110,
|
||
|
112, 113, 114, 115, 116, 117, 118, 119,
|
||
|
120, 121, 122, 123, 123, 124, 125, 125,
|
||
|
126, 127, 127, 128, 128, 129, 129, 129,
|
||
|
130, 130, 130, 130, 131, 131, 131, 131,
|
||
|
131, 131, 131, 131, 130, 130, 130, 130,
|
||
|
129, 129, 129, 128, 128, 127, 127, 126,
|
||
|
125, 125, 124, 123, 122, 122, 121, 120,
|
||
|
119, 118, 117, 116, 115, 114, 112, 111,
|
||
|
110, 109, 107, 106, 105, 103, 102, 101,
|
||
|
99, 98, 96, 94, 93, 91, 90, 88,
|
||
|
86, 84, 83, 81, 79, 77, 75, 74,
|
||
|
72, 70, 68, 66, 64, 62, 60, 58,
|
||
|
56, 54, 52, 49, 47, 45, 43, 41,
|
||
|
39, 36, 34, 32, 30, 28, 25, 23,
|
||
|
21, 19, 16, 14, 12, 9, 7, 5,
|
||
|
3, 0, -1, -3, -6, -8, -10, -12,
|
||
|
-15, -17, -19, -22, -24, -26, -28, -30,
|
||
|
-33, -35, -37, -39, -41, -44, -46, -48,
|
||
|
-50, -52, -54, -56, -58, -60, -62, -64,
|
||
|
-66, -68, -70, -72, -74, -76, -78, -80,
|
||
|
-81, -83, -85, -87, -88, -90, -92, -93,
|
||
|
-95, -97, -98, -100, -101, -102, -104, -105,
|
||
|
-107, -108, -109, -110, -112, -113, -114, -115,
|
||
|
-116, -117, -118, -119, -120, -121, -122, -123,
|
||
|
-123, -124, -125, -125, -126, -127, -127, -128,
|
||
|
-128, -128, -128, -128, -128, -128, -128, -128,
|
||
|
-128, -128, -128, -128, -128, -128, -128, -128,
|
||
|
-128, -128, -128, -128, -128, -128, -128, -128,
|
||
|
-128, -127, -127, -126, -125, -125, -124, -123,
|
||
|
-122, -122, -121, -120, -119, -118, -117, -116,
|
||
|
-115, -114, -112, -111, -110, -109, -107, -106,
|
||
|
-105, -103, -102, -101, -99, -98, -96, -94,
|
||
|
-93, -91, -90, -88, -86, -84, -83, -81,
|
||
|
-79, -77, -75, -74, -72, -70, -68, -66,
|
||
|
-64, -62, -60, -58, -56, -54, -52, -49,
|
||
|
-47, -45, -43, -41, -39, -36, -34, -32,
|
||
|
-30, -28, -25, -23, -21, -19, -16, -14,
|
||
|
-12, -9, -7, -5, -3, 0, 1, 3,
|
||
|
6, 8, 10, 12, 15, 17, 19, 22,
|
||
|
24, 26, 28, 30, 33, 35, 37, 39, 41
|
||
|
};
|
||
|
|
||
|
static const s16 hsv_red_y[] = {
|
||
|
82, 80, 78, 76, 74, 73, 71, 69,
|
||
|
67, 65, 63, 61, 58, 56, 54, 52,
|
||
|
50, 48, 46, 44, 41, 39, 37, 35,
|
||
|
32, 30, 28, 26, 23, 21, 19, 16,
|
||
|
14, 12, 10, 7, 5, 3, 0, -1,
|
||
|
-3, -6, -8, -10, -13, -15, -17, -19,
|
||
|
-22, -24, -26, -29, -31, -33, -35, -38,
|
||
|
-40, -42, -44, -46, -48, -51, -53, -55,
|
||
|
-57, -59, -61, -63, -65, -67, -69, -71,
|
||
|
-73, -75, -77, -79, -81, -82, -84, -86,
|
||
|
-88, -89, -91, -93, -94, -96, -98, -99,
|
||
|
-101, -102, -104, -105, -106, -108, -109, -110,
|
||
|
-112, -113, -114, -115, -116, -117, -119, -120,
|
||
|
-120, -121, -122, -123, -124, -125, -126, -126,
|
||
|
-127, -128, -128, -128, -128, -128, -128, -128,
|
||
|
-128, -128, -128, -128, -128, -128, -128, -128,
|
||
|
-128, -128, -128, -128, -128, -128, -128, -128,
|
||
|
-128, -128, -128, -128, -128, -128, -128, -128,
|
||
|
-127, -127, -126, -125, -125, -124, -123, -122,
|
||
|
-121, -120, -119, -118, -117, -116, -115, -114,
|
||
|
-113, -111, -110, -109, -107, -106, -105, -103,
|
||
|
-102, -100, -99, -97, -96, -94, -92, -91,
|
||
|
-89, -87, -85, -84, -82, -80, -78, -76,
|
||
|
-74, -73, -71, -69, -67, -65, -63, -61,
|
||
|
-58, -56, -54, -52, -50, -48, -46, -44,
|
||
|
-41, -39, -37, -35, -32, -30, -28, -26,
|
||
|
-23, -21, -19, -16, -14, -12, -10, -7,
|
||
|
-5, -3, 0, 1, 3, 6, 8, 10,
|
||
|
13, 15, 17, 19, 22, 24, 26, 29,
|
||
|
31, 33, 35, 38, 40, 42, 44, 46,
|
||
|
48, 51, 53, 55, 57, 59, 61, 63,
|
||
|
65, 67, 69, 71, 73, 75, 77, 79,
|
||
|
81, 82, 84, 86, 88, 89, 91, 93,
|
||
|
94, 96, 98, 99, 101, 102, 104, 105,
|
||
|
106, 108, 109, 110, 112, 113, 114, 115,
|
||
|
116, 117, 119, 120, 120, 121, 122, 123,
|
||
|
124, 125, 126, 126, 127, 128, 128, 129,
|
||
|
129, 130, 130, 131, 131, 131, 131, 132,
|
||
|
132, 132, 132, 132, 132, 132, 132, 132,
|
||
|
132, 132, 132, 131, 131, 131, 130, 130,
|
||
|
130, 129, 129, 128, 127, 127, 126, 125,
|
||
|
125, 124, 123, 122, 121, 120, 119, 118,
|
||
|
117, 116, 115, 114, 113, 111, 110, 109,
|
||
|
107, 106, 105, 103, 102, 100, 99, 97,
|
||
|
96, 94, 92, 91, 89, 87, 85, 84, 82
|
||
|
};
|
||
|
|
||
|
static const s16 hsv_green_x[] = {
|
||
|
-124, -124, -125, -125, -125, -125, -125, -125,
|
||
|
-125, -126, -126, -125, -125, -125, -125, -125,
|
||
|
-125, -124, -124, -124, -123, -123, -122, -122,
|
||
|
-121, -121, -120, -120, -119, -118, -117, -117,
|
||
|
-116, -115, -114, -113, -112, -111, -110, -109,
|
||
|
-108, -107, -105, -104, -103, -102, -100, -99,
|
||
|
-98, -96, -95, -93, -92, -91, -89, -87,
|
||
|
-86, -84, -83, -81, -79, -77, -76, -74,
|
||
|
-72, -70, -69, -67, -65, -63, -61, -59,
|
||
|
-57, -55, -53, -51, -49, -47, -45, -43,
|
||
|
-41, -39, -37, -35, -33, -30, -28, -26,
|
||
|
-24, -22, -20, -18, -15, -13, -11, -9,
|
||
|
-7, -4, -2, 0, 1, 3, 6, 8,
|
||
|
10, 12, 14, 17, 19, 21, 23, 25,
|
||
|
27, 29, 32, 34, 36, 38, 40, 42,
|
||
|
44, 46, 48, 50, 52, 54, 56, 58,
|
||
|
60, 62, 64, 66, 68, 70, 71, 73,
|
||
|
75, 77, 78, 80, 82, 83, 85, 87,
|
||
|
88, 90, 91, 93, 94, 96, 97, 98,
|
||
|
100, 101, 102, 104, 105, 106, 107, 108,
|
||
|
109, 111, 112, 113, 113, 114, 115, 116,
|
||
|
117, 118, 118, 119, 120, 120, 121, 122,
|
||
|
122, 123, 123, 124, 124, 124, 125, 125,
|
||
|
125, 125, 125, 125, 125, 126, 126, 125,
|
||
|
125, 125, 125, 125, 125, 124, 124, 124,
|
||
|
123, 123, 122, 122, 121, 121, 120, 120,
|
||
|
119, 118, 117, 117, 116, 115, 114, 113,
|
||
|
112, 111, 110, 109, 108, 107, 105, 104,
|
||
|
103, 102, 100, 99, 98, 96, 95, 93,
|
||
|
92, 91, 89, 87, 86, 84, 83, 81,
|
||
|
79, 77, 76, 74, 72, 70, 69, 67,
|
||
|
65, 63, 61, 59, 57, 55, 53, 51,
|
||
|
49, 47, 45, 43, 41, 39, 37, 35,
|
||
|
33, 30, 28, 26, 24, 22, 20, 18,
|
||
|
15, 13, 11, 9, 7, 4, 2, 0,
|
||
|
-1, -3, -6, -8, -10, -12, -14, -17,
|
||
|
-19, -21, -23, -25, -27, -29, -32, -34,
|
||
|
-36, -38, -40, -42, -44, -46, -48, -50,
|
||
|
-52, -54, -56, -58, -60, -62, -64, -66,
|
||
|
-68, -70, -71, -73, -75, -77, -78, -80,
|
||
|
-82, -83, -85, -87, -88, -90, -91, -93,
|
||
|
-94, -96, -97, -98, -100, -101, -102, -104,
|
||
|
-105, -106, -107, -108, -109, -111, -112, -113,
|
||
|
-113, -114, -115, -116, -117, -118, -118, -119,
|
||
|
-120, -120, -121, -122, -122, -123, -123, -124, -124
|
||
|
};
|
||
|
|
||
|
static const s16 hsv_green_y[] = {
|
||
|
-100, -99, -98, -97, -95, -94, -93, -91,
|
||
|
-90, -89, -87, -86, -84, -83, -81, -80,
|
||
|
-78, -76, -75, -73, -71, -70, -68, -66,
|
||
|
-64, -63, -61, -59, -57, -55, -53, -51,
|
||
|
-49, -48, -46, -44, -42, -40, -38, -36,
|
||
|
-34, -32, -30, -27, -25, -23, -21, -19,
|
||
|
-17, -15, -13, -11, -9, -7, -4, -2,
|
||
|
0, 1, 3, 5, 7, 9, 11, 14,
|
||
|
16, 18, 20, 22, 24, 26, 28, 30,
|
||
|
32, 34, 36, 38, 40, 42, 44, 46,
|
||
|
48, 50, 52, 54, 56, 58, 59, 61,
|
||
|
63, 65, 67, 68, 70, 72, 74, 75,
|
||
|
77, 78, 80, 82, 83, 85, 86, 88,
|
||
|
89, 90, 92, 93, 95, 96, 97, 98,
|
||
|
100, 101, 102, 103, 104, 105, 106, 107,
|
||
|
108, 109, 110, 111, 112, 112, 113, 114,
|
||
|
115, 115, 116, 116, 117, 117, 118, 118,
|
||
|
119, 119, 119, 120, 120, 120, 120, 120,
|
||
|
121, 121, 121, 121, 121, 121, 120, 120,
|
||
|
120, 120, 120, 119, 119, 119, 118, 118,
|
||
|
117, 117, 116, 116, 115, 114, 114, 113,
|
||
|
112, 111, 111, 110, 109, 108, 107, 106,
|
||
|
105, 104, 103, 102, 100, 99, 98, 97,
|
||
|
95, 94, 93, 91, 90, 89, 87, 86,
|
||
|
84, 83, 81, 80, 78, 76, 75, 73,
|
||
|
71, 70, 68, 66, 64, 63, 61, 59,
|
||
|
57, 55, 53, 51, 49, 48, 46, 44,
|
||
|
42, 40, 38, 36, 34, 32, 30, 27,
|
||
|
25, 23, 21, 19, 17, 15, 13, 11,
|
||
|
9, 7, 4, 2, 0, -1, -3, -5,
|
||
|
-7, -9, -11, -14, -16, -18, -20, -22,
|
||
|
-24, -26, -28, -30, -32, -34, -36, -38,
|
||
|
-40, -42, -44, -46, -48, -50, -52, -54,
|
||
|
-56, -58, -59, -61, -63, -65, -67, -68,
|
||
|
-70, -72, -74, -75, -77, -78, -80, -82,
|
||
|
-83, -85, -86, -88, -89, -90, -92, -93,
|
||
|
-95, -96, -97, -98, -100, -101, -102, -103,
|
||
|
-104, -105, -106, -107, -108, -109, -110, -111,
|
||
|
-112, -112, -113, -114, -115, -115, -116, -116,
|
||
|
-117, -117, -118, -118, -119, -119, -119, -120,
|
||
|
-120, -120, -120, -120, -121, -121, -121, -121,
|
||
|
-121, -121, -120, -120, -120, -120, -120, -119,
|
||
|
-119, -119, -118, -118, -117, -117, -116, -116,
|
||
|
-115, -114, -114, -113, -112, -111, -111, -110,
|
||
|
-109, -108, -107, -106, -105, -104, -103, -102, -100
|
||
|
};
|
||
|
|
||
|
static const s16 hsv_blue_x[] = {
|
||
|
112, 113, 114, 114, 115, 116, 117, 117,
|
||
|
118, 118, 119, 119, 120, 120, 120, 121,
|
||
|
121, 121, 122, 122, 122, 122, 122, 122,
|
||
|
122, 122, 122, 122, 122, 122, 121, 121,
|
||
|
121, 120, 120, 120, 119, 119, 118, 118,
|
||
|
117, 116, 116, 115, 114, 113, 113, 112,
|
||
|
111, 110, 109, 108, 107, 106, 105, 104,
|
||
|
103, 102, 100, 99, 98, 97, 95, 94,
|
||
|
93, 91, 90, 88, 87, 85, 84, 82,
|
||
|
80, 79, 77, 76, 74, 72, 70, 69,
|
||
|
67, 65, 63, 61, 60, 58, 56, 54,
|
||
|
52, 50, 48, 46, 44, 42, 40, 38,
|
||
|
36, 34, 32, 30, 28, 26, 24, 22,
|
||
|
19, 17, 15, 13, 11, 9, 7, 5,
|
||
|
2, 0, -1, -3, -5, -7, -9, -12,
|
||
|
-14, -16, -18, -20, -22, -24, -26, -28,
|
||
|
-31, -33, -35, -37, -39, -41, -43, -45,
|
||
|
-47, -49, -51, -53, -54, -56, -58, -60,
|
||
|
-62, -64, -66, -67, -69, -71, -73, -74,
|
||
|
-76, -78, -79, -81, -83, -84, -86, -87,
|
||
|
-89, -90, -92, -93, -94, -96, -97, -98,
|
||
|
-99, -101, -102, -103, -104, -105, -106, -107,
|
||
|
-108, -109, -110, -111, -112, -113, -114, -114,
|
||
|
-115, -116, -117, -117, -118, -118, -119, -119,
|
||
|
-120, -120, -120, -121, -121, -121, -122, -122,
|
||
|
-122, -122, -122, -122, -122, -122, -122, -122,
|
||
|
-122, -122, -121, -121, -121, -120, -120, -120,
|
||
|
-119, -119, -118, -118, -117, -116, -116, -115,
|
||
|
-114, -113, -113, -112, -111, -110, -109, -108,
|
||
|
-107, -106, -105, -104, -103, -102, -100, -99,
|
||
|
-98, -97, -95, -94, -93, -91, -90, -88,
|
||
|
-87, -85, -84, -82, -80, -79, -77, -76,
|
||
|
-74, -72, -70, -69, -67, -65, -63, -61,
|
||
|
-60, -58, -56, -54, -52, -50, -48, -46,
|
||
|
-44, -42, -40, -38, -36, -34, -32, -30,
|
||
|
-28, -26, -24, -22, -19, -17, -15, -13,
|
||
|
-11, -9, -7, -5, -2, 0, 1, 3,
|
||
|
5, 7, 9, 12, 14, 16, 18, 20,
|
||
|
22, 24, 26, 28, 31, 33, 35, 37,
|
||
|
39, 41, 43, 45, 47, 49, 51, 53,
|
||
|
54, 56, 58, 60, 62, 64, 66, 67,
|
||
|
69, 71, 73, 74, 76, 78, 79, 81,
|
||
|
83, 84, 86, 87, 89, 90, 92, 93,
|
||
|
94, 96, 97, 98, 99, 101, 102, 103,
|
||
|
104, 105, 106, 107, 108, 109, 110, 111, 112
|
||
|
};
|
||
|
|
||
|
static const s16 hsv_blue_y[] = {
|
||
|
-11, -13, -15, -17, -19, -21, -23, -25,
|
||
|
-27, -29, -31, -33, -35, -37, -39, -41,
|
||
|
-43, -45, -46, -48, -50, -52, -54, -55,
|
||
|
-57, -59, -61, -62, -64, -66, -67, -69,
|
||
|
-71, -72, -74, -75, -77, -78, -80, -81,
|
||
|
-83, -84, -86, -87, -88, -90, -91, -92,
|
||
|
-93, -95, -96, -97, -98, -99, -100, -101,
|
||
|
-102, -103, -104, -105, -106, -106, -107, -108,
|
||
|
-109, -109, -110, -111, -111, -112, -112, -113,
|
||
|
-113, -114, -114, -114, -115, -115, -115, -115,
|
||
|
-116, -116, -116, -116, -116, -116, -116, -116,
|
||
|
-116, -115, -115, -115, -115, -114, -114, -114,
|
||
|
-113, -113, -112, -112, -111, -111, -110, -110,
|
||
|
-109, -108, -108, -107, -106, -105, -104, -103,
|
||
|
-102, -101, -100, -99, -98, -97, -96, -95,
|
||
|
-94, -93, -91, -90, -89, -88, -86, -85,
|
||
|
-84, -82, -81, -79, -78, -76, -75, -73,
|
||
|
-71, -70, -68, -67, -65, -63, -62, -60,
|
||
|
-58, -56, -55, -53, -51, -49, -47, -45,
|
||
|
-44, -42, -40, -38, -36, -34, -32, -30,
|
||
|
-28, -26, -24, -22, -20, -18, -16, -14,
|
||
|
-12, -10, -8, -6, -4, -2, 0, 1,
|
||
|
3, 5, 7, 9, 11, 13, 15, 17,
|
||
|
19, 21, 23, 25, 27, 29, 31, 33,
|
||
|
35, 37, 39, 41, 43, 45, 46, 48,
|
||
|
50, 52, 54, 55, 57, 59, 61, 62,
|
||
|
64, 66, 67, 69, 71, 72, 74, 75,
|
||
|
77, 78, 80, 81, 83, 84, 86, 87,
|
||
|
88, 90, 91, 92, 93, 95, 96, 97,
|
||
|
98, 99, 100, 101, 102, 103, 104, 105,
|
||
|
106, 106, 107, 108, 109, 109, 110, 111,
|
||
|
111, 112, 112, 113, 113, 114, 114, 114,
|
||
|
115, 115, 115, 115, 116, 116, 116, 116,
|
||
|
116, 116, 116, 116, 116, 115, 115, 115,
|
||
|
115, 114, 114, 114, 113, 113, 112, 112,
|
||
|
111, 111, 110, 110, 109, 108, 108, 107,
|
||
|
106, 105, 104, 103, 102, 101, 100, 99,
|
||
|
98, 97, 96, 95, 94, 93, 91, 90,
|
||
|
89, 88, 86, 85, 84, 82, 81, 79,
|
||
|
78, 76, 75, 73, 71, 70, 68, 67,
|
||
|
65, 63, 62, 60, 58, 56, 55, 53,
|
||
|
51, 49, 47, 45, 44, 42, 40, 38,
|
||
|
36, 34, 32, 30, 28, 26, 24, 22,
|
||
|
20, 18, 16, 14, 12, 10, 8, 6,
|
||
|
4, 2, 0, -1, -3, -5, -7, -9, -11
|
||
|
};
|
||
|
|
||
|
static const u16 bridge_init[][2] = {
|
||
|
{0x1000, 0x78}, {0x1001, 0x40}, {0x1002, 0x1c},
|
||
|
{0x1020, 0x80}, {0x1061, 0x01}, {0x1067, 0x40},
|
||
|
{0x1068, 0x30}, {0x1069, 0x20}, {0x106a, 0x10},
|
||
|
{0x106b, 0x08}, {0x1188, 0x87}, {0x11a1, 0x00},
|
||
|
{0x11a2, 0x00}, {0x11a3, 0x6a}, {0x11a4, 0x50},
|
||
|
{0x11ab, 0x00}, {0x11ac, 0x00}, {0x11ad, 0x50},
|
||
|
{0x11ae, 0x3c}, {0x118a, 0x04}, {0x0395, 0x04},
|
||
|
{0x11b8, 0x3a}, {0x118b, 0x0e}, {0x10f7, 0x05},
|
||
|
{0x10f8, 0x14}, {0x10fa, 0xff}, {0x10f9, 0x00},
|
||
|
{0x11ba, 0x0a}, {0x11a5, 0x2d}, {0x11a6, 0x2d},
|
||
|
{0x11a7, 0x3a}, {0x11a8, 0x05}, {0x11a9, 0x04},
|
||
|
{0x11aa, 0x3f}, {0x11af, 0x28}, {0x11b0, 0xd8},
|
||
|
{0x11b1, 0x14}, {0x11b2, 0xec}, {0x11b3, 0x32},
|
||
|
{0x11b4, 0xdd}, {0x11b5, 0x32}, {0x11b6, 0xdd},
|
||
|
{0x10e0, 0x2c}, {0x11bc, 0x40}, {0x11bd, 0x01},
|
||
|
{0x11be, 0xf0}, {0x11bf, 0x00}, {0x118c, 0x1f},
|
||
|
{0x118d, 0x1f}, {0x118e, 0x1f}, {0x118f, 0x1f},
|
||
|
{0x1180, 0x01}, {0x1181, 0x00}, {0x1182, 0x01},
|
||
|
{0x1183, 0x00}, {0x1184, 0x50}, {0x1185, 0x80},
|
||
|
{0x1007, 0x00}
|
||
|
};
|
||
|
|
||
|
/* Gain = (bit[3:0] / 16 + 1) * (bit[4] + 1) * (bit[5] + 1) * (bit[6] + 1) */
|
||
|
static const u8 ov_gain[] = {
|
||
|
0x00 /* 1x */, 0x04 /* 1.25x */, 0x08 /* 1.5x */, 0x0c /* 1.75x */,
|
||
|
0x10 /* 2x */, 0x12 /* 2.25x */, 0x14 /* 2.5x */, 0x16 /* 2.75x */,
|
||
|
0x18 /* 3x */, 0x1a /* 3.25x */, 0x1c /* 3.5x */, 0x1e /* 3.75x */,
|
||
|
0x30 /* 4x */, 0x31 /* 4.25x */, 0x32 /* 4.5x */, 0x33 /* 4.75x */,
|
||
|
0x34 /* 5x */, 0x35 /* 5.25x */, 0x36 /* 5.5x */, 0x37 /* 5.75x */,
|
||
|
0x38 /* 6x */, 0x39 /* 6.25x */, 0x3a /* 6.5x */, 0x3b /* 6.75x */,
|
||
|
0x3c /* 7x */, 0x3d /* 7.25x */, 0x3e /* 7.5x */, 0x3f /* 7.75x */,
|
||
|
0x70 /* 8x */
|
||
|
};
|
||
|
|
||
|
/* Gain = (bit[8] + 1) * (bit[7] + 1) * (bit[6:0] * 0.03125) */
|
||
|
static const u16 micron1_gain[] = {
|
||
|
/* 1x 1.25x 1.5x 1.75x */
|
||
|
0x0020, 0x0028, 0x0030, 0x0038,
|
||
|
/* 2x 2.25x 2.5x 2.75x */
|
||
|
0x00a0, 0x00a4, 0x00a8, 0x00ac,
|
||
|
/* 3x 3.25x 3.5x 3.75x */
|
||
|
0x00b0, 0x00b4, 0x00b8, 0x00bc,
|
||
|
/* 4x 4.25x 4.5x 4.75x */
|
||
|
0x00c0, 0x00c4, 0x00c8, 0x00cc,
|
||
|
/* 5x 5.25x 5.5x 5.75x */
|
||
|
0x00d0, 0x00d4, 0x00d8, 0x00dc,
|
||
|
/* 6x 6.25x 6.5x 6.75x */
|
||
|
0x00e0, 0x00e4, 0x00e8, 0x00ec,
|
||
|
/* 7x 7.25x 7.5x 7.75x */
|
||
|
0x00f0, 0x00f4, 0x00f8, 0x00fc,
|
||
|
/* 8x */
|
||
|
0x01c0
|
||
|
};
|
||
|
|
||
|
/* mt9m001 sensor uses a different gain formula then other micron sensors */
|
||
|
/* Gain = (bit[6] + 1) * (bit[5-0] * 0.125) */
|
||
|
static const u16 micron2_gain[] = {
|
||
|
/* 1x 1.25x 1.5x 1.75x */
|
||
|
0x0008, 0x000a, 0x000c, 0x000e,
|
||
|
/* 2x 2.25x 2.5x 2.75x */
|
||
|
0x0010, 0x0012, 0x0014, 0x0016,
|
||
|
/* 3x 3.25x 3.5x 3.75x */
|
||
|
0x0018, 0x001a, 0x001c, 0x001e,
|
||
|
/* 4x 4.25x 4.5x 4.75x */
|
||
|
0x0020, 0x0051, 0x0052, 0x0053,
|
||
|
/* 5x 5.25x 5.5x 5.75x */
|
||
|
0x0054, 0x0055, 0x0056, 0x0057,
|
||
|
/* 6x 6.25x 6.5x 6.75x */
|
||
|
0x0058, 0x0059, 0x005a, 0x005b,
|
||
|
/* 7x 7.25x 7.5x 7.75x */
|
||
|
0x005c, 0x005d, 0x005e, 0x005f,
|
||
|
/* 8x */
|
||
|
0x0060
|
||
|
};
|
||
|
|
||
|
/* Gain = .5 + bit[7:0] / 16 */
|
||
|
static const u8 hv7131r_gain[] = {
|
||
|
0x08 /* 1x */, 0x0c /* 1.25x */, 0x10 /* 1.5x */, 0x14 /* 1.75x */,
|
||
|
0x18 /* 2x */, 0x1c /* 2.25x */, 0x20 /* 2.5x */, 0x24 /* 2.75x */,
|
||
|
0x28 /* 3x */, 0x2c /* 3.25x */, 0x30 /* 3.5x */, 0x34 /* 3.75x */,
|
||
|
0x38 /* 4x */, 0x3c /* 4.25x */, 0x40 /* 4.5x */, 0x44 /* 4.75x */,
|
||
|
0x48 /* 5x */, 0x4c /* 5.25x */, 0x50 /* 5.5x */, 0x54 /* 5.75x */,
|
||
|
0x58 /* 6x */, 0x5c /* 6.25x */, 0x60 /* 6.5x */, 0x64 /* 6.75x */,
|
||
|
0x68 /* 7x */, 0x6c /* 7.25x */, 0x70 /* 7.5x */, 0x74 /* 7.75x */,
|
||
|
0x78 /* 8x */
|
||
|
};
|
||
|
|
||
|
static const struct i2c_reg_u8 soi968_init[] = {
|
||
|
{0x0c, 0x00}, {0x0f, 0x1f},
|
||
|
{0x11, 0x80}, {0x38, 0x52}, {0x1e, 0x00},
|
||
|
{0x33, 0x08}, {0x35, 0x8c}, {0x36, 0x0c},
|
||
|
{0x37, 0x04}, {0x45, 0x04}, {0x47, 0xff},
|
||
|
{0x3e, 0x00}, {0x3f, 0x00}, {0x3b, 0x20},
|
||
|
{0x3a, 0x96}, {0x3d, 0x0a}, {0x14, 0x8e},
|
||
|
{0x13, 0x8b}, {0x12, 0x40}, {0x17, 0x13},
|
||
|
{0x18, 0x63}, {0x19, 0x01}, {0x1a, 0x79},
|
||
|
{0x32, 0x24}, {0x03, 0x00}, {0x11, 0x40},
|
||
|
{0x2a, 0x10}, {0x2b, 0xe0}, {0x10, 0x32},
|
||
|
{0x00, 0x00}, {0x01, 0x80}, {0x02, 0x80},
|
||
|
};
|
||
|
|
||
|
static const struct i2c_reg_u8 ov7660_init[] = {
|
||
|
{0x0e, 0x80}, {0x0d, 0x08}, {0x0f, 0xc3},
|
||
|
{0x04, 0xc3}, {0x10, 0x40}, {0x11, 0x40},
|
||
|
{0x12, 0x05}, {0x13, 0xba}, {0x14, 0x2a},
|
||
|
/* HDG Set hstart and hstop, datasheet default 0x11, 0x61, using
|
||
|
0x10, 0x61 and sd->hstart, vstart = 3, fixes ugly colored borders */
|
||
|
{0x17, 0x10}, {0x18, 0x61},
|
||
|
{0x37, 0x0f}, {0x38, 0x02}, {0x39, 0x43},
|
||
|
{0x3a, 0x00}, {0x69, 0x90}, {0x2d, 0x00},
|
||
|
{0x2e, 0x00}, {0x01, 0x78}, {0x02, 0x50},
|
||
|
};
|
||
|
|
||
|
static const struct i2c_reg_u8 ov7670_init[] = {
|
||
|
{0x11, 0x80}, {0x3a, 0x04}, {0x12, 0x01},
|
||
|
{0x32, 0xb6}, {0x03, 0x0a}, {0x0c, 0x00}, {0x3e, 0x00},
|
||
|
{0x70, 0x3a}, {0x71, 0x35}, {0x72, 0x11}, {0x73, 0xf0},
|
||
|
{0xa2, 0x02}, {0x13, 0xe0}, {0x00, 0x00}, {0x10, 0x00},
|
||
|
{0x0d, 0x40}, {0x14, 0x28}, {0xa5, 0x05}, {0xab, 0x07},
|
||
|
{0x24, 0x95}, {0x25, 0x33}, {0x26, 0xe3}, {0x9f, 0x75},
|
||
|
{0xa0, 0x65}, {0xa1, 0x0b}, {0xa6, 0xd8}, {0xa7, 0xd8},
|
||
|
{0xa8, 0xf0}, {0xa9, 0x90}, {0xaa, 0x94}, {0x13, 0xe5},
|
||
|
{0x0e, 0x61}, {0x0f, 0x4b}, {0x16, 0x02}, {0x1e, 0x27},
|
||
|
{0x21, 0x02}, {0x22, 0x91}, {0x29, 0x07}, {0x33, 0x0b},
|
||
|
{0x35, 0x0b}, {0x37, 0x1d}, {0x38, 0x71}, {0x39, 0x2a},
|
||
|
{0x3c, 0x78}, {0x4d, 0x40}, {0x4e, 0x20}, {0x69, 0x00},
|
||
|
{0x74, 0x19}, {0x8d, 0x4f}, {0x8e, 0x00}, {0x8f, 0x00},
|
||
|
{0x90, 0x00}, {0x91, 0x00}, {0x96, 0x00}, {0x9a, 0x80},
|
||
|
{0xb0, 0x84}, {0xb1, 0x0c}, {0xb2, 0x0e}, {0xb3, 0x82},
|
||
|
{0xb8, 0x0a}, {0x43, 0x0a}, {0x44, 0xf0}, {0x45, 0x20},
|
||
|
{0x46, 0x7d}, {0x47, 0x29}, {0x48, 0x4a}, {0x59, 0x8c},
|
||
|
{0x5a, 0xa5}, {0x5b, 0xde}, {0x5c, 0x96}, {0x5d, 0x66},
|
||
|
{0x5e, 0x10}, {0x6c, 0x0a}, {0x6d, 0x55}, {0x6e, 0x11},
|
||
|
{0x6f, 0x9e}, {0x6a, 0x40}, {0x01, 0x40}, {0x02, 0x40},
|
||
|
{0x13, 0xe7}, {0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x02},
|
||
|
{0x52, 0x1d}, {0x53, 0x56}, {0x54, 0x73}, {0x55, 0x0a},
|
||
|
{0x56, 0x55}, {0x57, 0x80}, {0x58, 0x9e}, {0x41, 0x08},
|
||
|
{0x3f, 0x02}, {0x75, 0x03}, {0x76, 0x63}, {0x4c, 0x04},
|
||
|
{0x77, 0x06}, {0x3d, 0x02}, {0x4b, 0x09}, {0xc9, 0x30},
|
||
|
{0x41, 0x08}, {0x56, 0x48}, {0x34, 0x11}, {0xa4, 0x88},
|
||
|
{0x96, 0x00}, {0x97, 0x30}, {0x98, 0x20}, {0x99, 0x30},
|
||
|
{0x9a, 0x84}, {0x9b, 0x29}, {0x9c, 0x03}, {0x9d, 0x99},
|
||
|
{0x9e, 0x7f}, {0x78, 0x04}, {0x79, 0x01}, {0xc8, 0xf0},
|
||
|
{0x79, 0x0f}, {0xc8, 0x00}, {0x79, 0x10}, {0xc8, 0x7e},
|
||
|
{0x79, 0x0a}, {0xc8, 0x80}, {0x79, 0x0b}, {0xc8, 0x01},
|
||
|
{0x79, 0x0c}, {0xc8, 0x0f}, {0x79, 0x0d}, {0xc8, 0x20},
|
||
|
{0x79, 0x09}, {0xc8, 0x80}, {0x79, 0x02}, {0xc8, 0xc0},
|
||
|
{0x79, 0x03}, {0xc8, 0x40}, {0x79, 0x05}, {0xc8, 0x30},
|
||
|
{0x79, 0x26}, {0x62, 0x20}, {0x63, 0x00}, {0x64, 0x06},
|
||
|
{0x65, 0x00}, {0x66, 0x05}, {0x94, 0x05}, {0x95, 0x0a},
|
||
|
{0x17, 0x13}, {0x18, 0x01}, {0x19, 0x02}, {0x1a, 0x7a},
|
||
|
{0x46, 0x59}, {0x47, 0x30}, {0x58, 0x9a}, {0x59, 0x84},
|
||
|
{0x5a, 0x91}, {0x5b, 0x57}, {0x5c, 0x75}, {0x5d, 0x6d},
|
||
|
{0x5e, 0x13}, {0x64, 0x07}, {0x94, 0x07}, {0x95, 0x0d},
|
||
|
{0xa6, 0xdf}, {0xa7, 0xdf}, {0x48, 0x4d}, {0x51, 0x00},
|
||
|
{0x6b, 0x0a}, {0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00},
|
||
|
{0x92, 0x00}, {0x93, 0x00}, {0x55, 0x0a}, {0x56, 0x60},
|
||
|
{0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d},
|
||
|
{0x53, 0x56}, {0x54, 0x73}, {0x58, 0x9a}, {0x4f, 0x6e},
|
||
|
{0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d}, {0x53, 0x56},
|
||
|
{0x54, 0x73}, {0x58, 0x9a}, {0x3f, 0x01}, {0x7b, 0x03},
|
||
|
{0x7c, 0x09}, {0x7d, 0x16}, {0x7e, 0x38}, {0x7f, 0x47},
|
||
|
{0x80, 0x53}, {0x81, 0x5e}, {0x82, 0x6a}, {0x83, 0x74},
|
||
|
{0x84, 0x80}, {0x85, 0x8c}, {0x86, 0x9b}, {0x87, 0xb2},
|
||
|
{0x88, 0xcc}, {0x89, 0xe5}, {0x7a, 0x24}, {0x3b, 0x00},
|
||
|
{0x9f, 0x76}, {0xa0, 0x65}, {0x13, 0xe2}, {0x6b, 0x0a},
|
||
|
{0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00}, {0x92, 0x00},
|
||
|
{0x93, 0x00},
|
||
|
};
|
||
|
|
||
|
static const struct i2c_reg_u8 ov9650_init[] = {
|
||
|
{0x00, 0x00}, {0x01, 0x78},
|
||
|
{0x02, 0x78}, {0x03, 0x36}, {0x04, 0x03},
|
||
|
{0x05, 0x00}, {0x06, 0x00}, {0x08, 0x00},
|
||
|
{0x09, 0x01}, {0x0c, 0x00}, {0x0d, 0x00},
|
||
|
{0x0e, 0xa0}, {0x0f, 0x52}, {0x10, 0x7c},
|
||
|
{0x11, 0x80}, {0x12, 0x45}, {0x13, 0xc2},
|
||
|
{0x14, 0x2e}, {0x15, 0x00}, {0x16, 0x07},
|
||
|
{0x17, 0x24}, {0x18, 0xc5}, {0x19, 0x00},
|
||
|
{0x1a, 0x3c}, {0x1b, 0x00}, {0x1e, 0x04},
|
||
|
{0x1f, 0x00}, {0x24, 0x78}, {0x25, 0x68},
|
||
|
{0x26, 0xd4}, {0x27, 0x80}, {0x28, 0x80},
|
||
|
{0x29, 0x30}, {0x2a, 0x00}, {0x2b, 0x00},
|
||
|
{0x2c, 0x80}, {0x2d, 0x00}, {0x2e, 0x00},
|
||
|
{0x2f, 0x00}, {0x30, 0x08}, {0x31, 0x30},
|
||
|
{0x32, 0x84}, {0x33, 0xe2}, {0x34, 0xbf},
|
||
|
{0x35, 0x81}, {0x36, 0xf9}, {0x37, 0x00},
|
||
|
{0x38, 0x93}, {0x39, 0x50}, {0x3a, 0x01},
|
||
|
{0x3b, 0x01}, {0x3c, 0x73}, {0x3d, 0x19},
|
||
|
{0x3e, 0x0b}, {0x3f, 0x80}, {0x40, 0xc1},
|
||
|
{0x41, 0x00}, {0x42, 0x08}, {0x67, 0x80},
|
||
|
{0x68, 0x80}, {0x69, 0x40}, {0x6a, 0x00},
|
||
|
{0x6b, 0x0a}, {0x8b, 0x06}, {0x8c, 0x20},
|
||
|
{0x8d, 0x00}, {0x8e, 0x00}, {0x8f, 0xdf},
|
||
|
{0x92, 0x00}, {0x93, 0x00}, {0x94, 0x88},
|
||
|
{0x95, 0x88}, {0x96, 0x04}, {0xa1, 0x00},
|
||
|
{0xa5, 0x80}, {0xa8, 0x80}, {0xa9, 0xb8},
|
||
|
{0xaa, 0x92}, {0xab, 0x0a},
|
||
|
};
|
||
|
|
||
|
static const struct i2c_reg_u8 ov9655_init[] = {
|
||
|
{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}, {0x2d, 0x00},
|
||
|
{0x2e, 0x00}, {0x01, 0x80}, {0x02, 0x80}, {0x12, 0x61},
|
||
|
{0x36, 0xfa}, {0x8c, 0x8d}, {0xc0, 0xaa}, {0x69, 0x0a},
|
||
|
{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 const struct i2c_reg_u16 mt9v112_init[] = {
|
||
|
{0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0020},
|
||
|
{0x34, 0xc019}, {0x0a, 0x0011}, {0x0b, 0x000b},
|
||
|
{0x20, 0x0703}, {0x35, 0x2022}, {0xf0, 0x0001},
|
||
|
{0x05, 0x0000}, {0x06, 0x340c}, {0x3b, 0x042a},
|
||
|
{0x3c, 0x0400}, {0xf0, 0x0002}, {0x2e, 0x0c58},
|
||
|
{0x5b, 0x0001}, {0xc8, 0x9f0b}, {0xf0, 0x0001},
|
||
|
{0x9b, 0x5300}, {0xf0, 0x0000}, {0x2b, 0x0020},
|
||
|
{0x2c, 0x002a}, {0x2d, 0x0032}, {0x2e, 0x0020},
|
||
|
{0x09, 0x01dc}, {0x01, 0x000c}, {0x02, 0x0020},
|
||
|
{0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c},
|
||
|
{0x05, 0x0098}, {0x20, 0x0703}, {0x09, 0x01f2},
|
||
|
{0x2b, 0x00a0}, {0x2c, 0x00a0}, {0x2d, 0x00a0},
|
||
|
{0x2e, 0x00a0}, {0x01, 0x000c}, {0x02, 0x0020},
|
||
|
{0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c},
|
||
|
{0x05, 0x0098}, {0x09, 0x01c1}, {0x2b, 0x00ae},
|
||
|
{0x2c, 0x00ae}, {0x2d, 0x00ae}, {0x2e, 0x00ae},
|
||
|
};
|
||
|
|
||
|
static const struct i2c_reg_u16 mt9v111_init[] = {
|
||
|
{0x01, 0x0004}, {0x0d, 0x0001}, {0x0d, 0x0000},
|
||
|