Path: blob/master/drivers/media/video/gspca/vc032x.c
17602 views
/*1* Z-star vc0321 library2*3* Copyright (C) 2009-2010 Jean-François Moine <http://moinejf.free.fr>4* Copyright (C) 2006 Koninski Artur [email protected]5* Copyright (C) 2006 Michel Xhaard6*7* This program is free software; you can redistribute it and/or modify8* it under the terms of the GNU General Public License as published by9* the Free Software Foundation; either version 2 of the License, or10* any later version.11*12* This program is distributed in the hope that it will be useful,13* but WITHOUT ANY WARRANTY; without even the implied warranty of14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the15* GNU General Public License for more details.16*17* You should have received a copy of the GNU General Public License18* along with this program; if not, write to the Free Software19* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA20*/2122#define MODULE_NAME "vc032x"2324#include "gspca.h"2526MODULE_AUTHOR("Jean-François Moine <http://moinejf.free.fr>");27MODULE_DESCRIPTION("GSPCA/VC032X USB Camera Driver");28MODULE_LICENSE("GPL");2930/* specific webcam descriptor */31struct sd {32struct gspca_dev gspca_dev; /* !! must be the first item */3334u8 brightness;35u8 contrast;36u8 colors;37u8 hflip;38u8 vflip;39u8 lightfreq;40s8 sharpness;41u16 exposure;42u8 gain;43u8 autogain;44u8 backlight;4546u8 image_offset;4748u8 bridge;49u8 sensor;50u8 flags;51#define FL_SAMSUNG 0x01 /* SamsungQ1 (2 sensors) */52#define FL_HFLIP 0x02 /* mirrored by default */53#define FL_VFLIP 0x04 /* vertical flipped by default */54};55enum bridges {56BRIDGE_VC0321,57BRIDGE_VC0323,58};59enum sensors {60SENSOR_HV7131R,61SENSOR_MI0360,62SENSOR_MI1310_SOC,63SENSOR_MI1320,64SENSOR_MI1320_SOC,65SENSOR_OV7660,66SENSOR_OV7670,67SENSOR_PO1200,68SENSOR_PO3130NC,69SENSOR_POxxxx,70NSENSORS71};7273/* V4L2 controls supported by the driver */74static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);75static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);76static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);77static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);78static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val);79static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val);80static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val);81static int sd_gethflip(struct gspca_dev *gspca_dev, __s32 *val);82static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val);83static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val);84static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val);85static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val);86static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val);87static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val);88static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val);89static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val);90static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val);91static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val);92static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val);93static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val);94static int sd_setbacklight(struct gspca_dev *gspca_dev, __s32 val);95static int sd_getbacklight(struct gspca_dev *gspca_dev, __s32 *val);9697static const struct ctrl sd_ctrls[] = {98#define BRIGHTNESS_IDX 099{100{101.id = V4L2_CID_BRIGHTNESS,102.type = V4L2_CTRL_TYPE_INTEGER,103.name = "Brightness",104.minimum = 0,105.maximum = 255,106.step = 1,107#define BRIGHTNESS_DEF 128108.default_value = BRIGHTNESS_DEF,109},110.set = sd_setbrightness,111.get = sd_getbrightness,112},113#define CONTRAST_IDX 1114{115{116.id = V4L2_CID_CONTRAST,117.type = V4L2_CTRL_TYPE_INTEGER,118.name = "Contrast",119.minimum = 0,120.maximum = 255,121.step = 1,122#define CONTRAST_DEF 127123.default_value = CONTRAST_DEF,124},125.set = sd_setcontrast,126.get = sd_getcontrast,127},128#define COLORS_IDX 2129{130{131.id = V4L2_CID_SATURATION,132.type = V4L2_CTRL_TYPE_INTEGER,133.name = "Saturation",134.minimum = 1,135.maximum = 127,136.step = 1,137#define COLOR_DEF 63138.default_value = COLOR_DEF,139},140.set = sd_setcolors,141.get = sd_getcolors,142},143/* next 2 controls work with some sensors only */144#define HFLIP_IDX 3145{146{147.id = V4L2_CID_HFLIP,148.type = V4L2_CTRL_TYPE_BOOLEAN,149.name = "Mirror",150.minimum = 0,151.maximum = 1,152.step = 1,153#define HFLIP_DEF 0154.default_value = HFLIP_DEF,155},156.set = sd_sethflip,157.get = sd_gethflip,158},159#define VFLIP_IDX 4160{161{162.id = V4L2_CID_VFLIP,163.type = V4L2_CTRL_TYPE_BOOLEAN,164.name = "Vflip",165.minimum = 0,166.maximum = 1,167.step = 1,168#define VFLIP_DEF 0169.default_value = VFLIP_DEF,170},171.set = sd_setvflip,172.get = sd_getvflip,173},174#define LIGHTFREQ_IDX 5175{176{177.id = V4L2_CID_POWER_LINE_FREQUENCY,178.type = V4L2_CTRL_TYPE_MENU,179.name = "Light frequency filter",180.minimum = 0,181.maximum = 2, /* 0: No, 1: 50Hz, 2:60Hz */182.step = 1,183#define FREQ_DEF 1184.default_value = FREQ_DEF,185},186.set = sd_setfreq,187.get = sd_getfreq,188},189#define SHARPNESS_IDX 6190{191{192.id = V4L2_CID_SHARPNESS,193.type = V4L2_CTRL_TYPE_INTEGER,194.name = "Sharpness",195.minimum = -1,196.maximum = 2,197.step = 1,198#define SHARPNESS_DEF -1199.default_value = SHARPNESS_DEF,200},201.set = sd_setsharpness,202.get = sd_getsharpness,203},204#define GAIN_IDX 7205{206{207.id = V4L2_CID_GAIN,208.type = V4L2_CTRL_TYPE_INTEGER,209.name = "Gain",210.minimum = 0,211.maximum = 78,212.step = 1,213#define GAIN_DEF 0214.default_value = GAIN_DEF,215},216.set = sd_setgain,217.get = sd_getgain,218},219#define EXPOSURE_IDX 8220{221{222.id = V4L2_CID_EXPOSURE,223.type = V4L2_CTRL_TYPE_INTEGER,224.name = "Exposure",225#define EXPOSURE_DEF 450226.minimum = 0,227.maximum = 4095,228.step = 1,229.default_value = EXPOSURE_DEF,230},231.set = sd_setexposure,232.get = sd_getexposure,233},234#define AUTOGAIN_IDX 9235{236{237.id = V4L2_CID_AUTOGAIN,238.type = V4L2_CTRL_TYPE_BOOLEAN,239.name = "Automatic Gain and Exposure",240.minimum = 0,241.maximum = 1,242.step = 1,243#define AUTOGAIN_DEF 1244.default_value = AUTOGAIN_DEF,245},246.set = sd_setautogain,247.get = sd_getautogain,248},249#define BACKLIGHT_IDX 10250{251{252.id = V4L2_CID_BACKLIGHT_COMPENSATION,253.type = V4L2_CTRL_TYPE_BOOLEAN,254.name = "Backlight Compensation",255.minimum = 0,256.maximum = 15,257.step = 1,258#define BACKLIGHT_DEF 15259.default_value = BACKLIGHT_DEF,260},261.set = sd_setbacklight,262.get = sd_getbacklight,263},264};265266/* table of the disabled controls */267static u32 ctrl_dis[NSENSORS] = {268[SENSOR_HV7131R] =269(1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX)270| (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX)271| (1 << SHARPNESS_IDX)272| (1 << GAIN_IDX) | (1 << EXPOSURE_IDX)273| (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX),274[SENSOR_MI0360] =275(1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX)276| (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX)277| (1 << SHARPNESS_IDX)278| (1 << GAIN_IDX) | (1 << EXPOSURE_IDX)279| (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX),280[SENSOR_MI1310_SOC] =281(1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX)282| (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX)283| (1 << GAIN_IDX) | (1 << EXPOSURE_IDX)284| (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX),285[SENSOR_MI1320] =286(1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX)287| (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX)288| (1 << GAIN_IDX) | (1 << EXPOSURE_IDX)289| (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX),290[SENSOR_MI1320_SOC] =291(1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX)292| (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX)293| (1 << GAIN_IDX) | (1 << EXPOSURE_IDX)294| (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX),295[SENSOR_OV7660] =296(1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX)297| (1 << LIGHTFREQ_IDX) | (1 << SHARPNESS_IDX)298| (1 << GAIN_IDX) | (1 << EXPOSURE_IDX)299| (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX),300[SENSOR_OV7670] =301(1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX)302| (1 << SHARPNESS_IDX)303| (1 << GAIN_IDX) | (1 << EXPOSURE_IDX)304| (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX),305[SENSOR_PO1200] =306(1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX)307| (1 << LIGHTFREQ_IDX)308| (1 << GAIN_IDX) | (1 << EXPOSURE_IDX)309| (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX),310[SENSOR_PO3130NC] =311(1 << BRIGHTNESS_IDX) | (1 << CONTRAST_IDX) | (1 << COLORS_IDX)312| (1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX)313| (1 << SHARPNESS_IDX)314| (1 << GAIN_IDX) | (1 << EXPOSURE_IDX)315| (1 << AUTOGAIN_IDX) | (1 << BACKLIGHT_IDX),316[SENSOR_POxxxx] =317(1 << HFLIP_IDX) | (1 << VFLIP_IDX) | (1 << LIGHTFREQ_IDX),318};319320static const struct v4l2_pix_format vc0321_mode[] = {321{320, 240, V4L2_PIX_FMT_YVYU, V4L2_FIELD_NONE,322.bytesperline = 320,323.sizeimage = 320 * 240 * 2,324.colorspace = V4L2_COLORSPACE_SRGB,325.priv = 1},326{640, 480, V4L2_PIX_FMT_YVYU, V4L2_FIELD_NONE,327.bytesperline = 640,328.sizeimage = 640 * 480 * 2,329.colorspace = V4L2_COLORSPACE_SRGB,330.priv = 0},331};332static const struct v4l2_pix_format vc0323_mode[] = {333{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,334.bytesperline = 320,335.sizeimage = 320 * 240 * 3 / 8 + 590,336.colorspace = V4L2_COLORSPACE_JPEG,337.priv = 1},338{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,339.bytesperline = 640,340.sizeimage = 640 * 480 * 3 / 8 + 590,341.colorspace = V4L2_COLORSPACE_JPEG,342.priv = 0},343{1280, 960, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, /* mi1310_soc only */344.bytesperline = 1280,345.sizeimage = 1280 * 960 * 3 / 8 + 590,346.colorspace = V4L2_COLORSPACE_JPEG,347.priv = 2},348};349static const struct v4l2_pix_format bi_mode[] = {350{320, 240, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,351.bytesperline = 320,352.sizeimage = 320 * 240 * 2,353.colorspace = V4L2_COLORSPACE_SRGB,354.priv = 2},355{640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,356.bytesperline = 640,357.sizeimage = 640 * 480 * 2,358.colorspace = V4L2_COLORSPACE_SRGB,359.priv = 1},360{1280, 1024, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,361.bytesperline = 1280,362.sizeimage = 1280 * 1024 * 2,363.colorspace = V4L2_COLORSPACE_SRGB,364.priv = 0},365};366static const struct v4l2_pix_format svga_mode[] = {367{800, 600, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,368.bytesperline = 800,369.sizeimage = 800 * 600 * 1 / 4 + 590,370.colorspace = V4L2_COLORSPACE_JPEG,371.priv = 0},372};373374/* OV7660/7670 registers */375#define OV7660_REG_MVFP 0x1e376#define OV7660_MVFP_MIRROR 0x20377#define OV7660_MVFP_VFLIP 0x10378379static const u8 mi0360_matrix[9] = {3800x50, 0xf8, 0xf8, 0xf5, 0x50, 0xfb, 0xff, 0xf1, 0x50381};382383static const u8 mi0360_initVGA_JPG[][4] = {384{0xb0, 0x03, 0x19, 0xcc},385{0xb0, 0x04, 0x02, 0xcc},386{0xb3, 0x00, 0x24, 0xcc},387{0xb3, 0x00, 0x25, 0xcc},388{0xb3, 0x08, 0x01, 0xcc},389{0xb3, 0x09, 0x0c, 0xcc},390{0xb3, 0x05, 0x01, 0xcc},391{0xb3, 0x06, 0x03, 0xcc},392{0xb3, 0x03, 0x0a, 0xcc},393{0xb3, 0x20, 0x00, 0xcc},394{0xb3, 0x21, 0x00, 0xcc},395{0xb3, 0x22, 0x01, 0xcc},396{0xb3, 0x23, 0xe0, 0xcc},397{0xb3, 0x04, 0x05, 0xcc},398{0xb3, 0x14, 0x00, 0xcc},399{0xb3, 0x15, 0x00, 0xcc},400{0xb3, 0x16, 0x02, 0xcc},401{0xb3, 0x17, 0x7f, 0xcc},402{0xb3, 0x35, 0xdd, 0xcc}, /* i2c add: 5d */403{0xb3, 0x34, 0x02, 0xcc},404{0xb3, 0x00, 0x25, 0xcc},405{0xbc, 0x00, 0x71, 0xcc},406{0xb8, 0x00, 0x13, 0xcc},407{0xb8, 0x27, 0x20, 0xcc},408{0xb8, 0x2c, 0x50, 0xcc},409{0xb8, 0x2d, 0xf8, 0xcc},410{0xb8, 0x2e, 0xf8, 0xcc},411{0xb8, 0x2f, 0xf8, 0xcc},412{0xb8, 0x30, 0x50, 0xcc},413{0xb8, 0x31, 0xf8, 0xcc},414{0xb8, 0x32, 0xf8, 0xcc},415{0xb8, 0x33, 0xf8, 0xcc},416{0xb8, 0x34, 0x50, 0xcc},417{0xb8, 0x35, 0x00, 0xcc},418{0xb8, 0x36, 0x00, 0xcc},419{0xb8, 0x37, 0x00, 0xcc},420{0xb8, 0x01, 0x79, 0xcc},421{0xb8, 0x08, 0xe0, 0xcc},422{0xb3, 0x01, 0x41, 0xcc},423{0xb8, 0x01, 0x79, 0xcc},424{0xb8, 0x14, 0x18, 0xcc},425{0xb8, 0xb2, 0x0a, 0xcc},426{0xb8, 0xb4, 0x0a, 0xcc},427{0xb8, 0xb5, 0x0a, 0xcc},428{0xb8, 0xfe, 0x00, 0xcc},429{0xb8, 0xff, 0x28, 0xcc},430{0xb9, 0x00, 0x28, 0xcc},431{0xb9, 0x01, 0x28, 0xcc},432{0xb9, 0x02, 0x28, 0xcc},433{0xb9, 0x03, 0x00, 0xcc},434{0xb9, 0x04, 0x00, 0xcc},435{0xb9, 0x05, 0x3c, 0xcc},436{0xb9, 0x06, 0x3c, 0xcc},437{0xb9, 0x07, 0x3c, 0xcc},438{0xb9, 0x08, 0x3c, 0xcc},439{0xb8, 0x8e, 0x00, 0xcc},440{0xb8, 0x8f, 0xff, 0xcc},441{0xb8, 0x81, 0x09, 0xcc},442{0x31, 0x00, 0x00, 0xbb},443{0x09, 0x01, 0xc7, 0xbb},444{0x34, 0x01, 0x00, 0xbb},445{0x2b, 0x00, 0x28, 0xbb},446{0x2c, 0x00, 0x30, 0xbb},447{0x2d, 0x00, 0x30, 0xbb},448{0x2e, 0x00, 0x28, 0xbb},449{0x62, 0x04, 0x11, 0xbb},450{0x03, 0x01, 0xe0, 0xbb},451{0x2c, 0x00, 0x2c, 0xbb},452{0x20, 0xd0, 0x00, 0xbb},453{0x01, 0x00, 0x08, 0xbb},454{0x06, 0x00, 0x10, 0xbb},455{0x05, 0x00, 0x20, 0xbb},456{0x20, 0x00, 0x00, 0xbb},457{0xb6, 0x00, 0x00, 0xcc},458{0xb6, 0x03, 0x02, 0xcc},459{0xb6, 0x02, 0x80, 0xcc},460{0xb6, 0x05, 0x01, 0xcc},461{0xb6, 0x04, 0xe0, 0xcc},462{0xb6, 0x12, 0x78, 0xcc},463{0xb6, 0x18, 0x02, 0xcc},464{0xb6, 0x17, 0x58, 0xcc},465{0xb6, 0x16, 0x00, 0xcc},466{0xb6, 0x22, 0x12, 0xcc},467{0xb6, 0x23, 0x0b, 0xcc},468{0xb3, 0x02, 0x02, 0xcc},469{0xbf, 0xc0, 0x39, 0xcc},470{0xbf, 0xc1, 0x04, 0xcc},471{0xbf, 0xcc, 0x10, 0xcc},472{0xb9, 0x12, 0x00, 0xcc},473{0xb9, 0x13, 0x0a, 0xcc},474{0xb9, 0x14, 0x0a, 0xcc},475{0xb9, 0x15, 0x0a, 0xcc},476{0xb9, 0x16, 0x0a, 0xcc},477{0xb9, 0x18, 0x00, 0xcc},478{0xb9, 0x19, 0x0f, 0xcc},479{0xb9, 0x1a, 0x0f, 0xcc},480{0xb9, 0x1b, 0x0f, 0xcc},481{0xb9, 0x1c, 0x0f, 0xcc},482{0xb8, 0x8e, 0x00, 0xcc},483{0xb8, 0x8f, 0xff, 0xcc},484{0xb6, 0x12, 0xf8, 0xcc},485{0xb8, 0x0c, 0x20, 0xcc},486{0xb8, 0x0d, 0x70, 0xcc},487{0xb6, 0x13, 0x13, 0xcc},488{0x35, 0x00, 0x60, 0xbb},489{0xb3, 0x5c, 0x01, 0xcc},490{}491};492static const u8 mi0360_initQVGA_JPG[][4] = {493{0xb0, 0x03, 0x19, 0xcc},494{0xb0, 0x04, 0x02, 0xcc},495{0xb3, 0x00, 0x24, 0xcc},496{0xb3, 0x00, 0x25, 0xcc},497{0xb3, 0x08, 0x01, 0xcc},498{0xb3, 0x09, 0x0c, 0xcc},499{0xb3, 0x05, 0x01, 0xcc},500{0xb3, 0x06, 0x03, 0xcc},501{0xb3, 0x03, 0x0a, 0xcc},502{0xb3, 0x20, 0x00, 0xcc},503{0xb3, 0x21, 0x00, 0xcc},504{0xb3, 0x22, 0x01, 0xcc},505{0xb3, 0x23, 0xe0, 0xcc},506{0xb3, 0x04, 0x05, 0xcc},507{0xb3, 0x14, 0x00, 0xcc},508{0xb3, 0x15, 0x00, 0xcc},509{0xb3, 0x16, 0x02, 0xcc},510{0xb3, 0x17, 0x7f, 0xcc},511{0xb3, 0x35, 0xdd, 0xcc},512{0xb3, 0x34, 0x02, 0xcc},513{0xb3, 0x00, 0x25, 0xcc},514{0xbc, 0x00, 0xd1, 0xcc},515{0xb8, 0x00, 0x13, 0xcc},516{0xb8, 0x27, 0x20, 0xcc},517{0xb8, 0x2c, 0x50, 0xcc},518{0xb8, 0x2d, 0xf8, 0xcc},519{0xb8, 0x2e, 0xf8, 0xcc},520{0xb8, 0x2f, 0xf8, 0xcc},521{0xb8, 0x30, 0x50, 0xcc},522{0xb8, 0x31, 0xf8, 0xcc},523{0xb8, 0x32, 0xf8, 0xcc},524{0xb8, 0x33, 0xf8, 0xcc},525{0xb8, 0x34, 0x50, 0xcc},526{0xb8, 0x35, 0x00, 0xcc},527{0xb8, 0x36, 0x00, 0xcc},528{0xb8, 0x37, 0x00, 0xcc},529{0xb8, 0x01, 0x79, 0xcc},530{0xb8, 0x08, 0xe0, 0xcc},531{0xb3, 0x01, 0x41, 0xcc},532{0xb8, 0x01, 0x79, 0xcc},533{0xb8, 0x14, 0x18, 0xcc},534{0xb8, 0xb2, 0x0a, 0xcc},535{0xb8, 0xb4, 0x0a, 0xcc},536{0xb8, 0xb5, 0x0a, 0xcc},537{0xb8, 0xfe, 0x00, 0xcc},538{0xb8, 0xff, 0x28, 0xcc},539{0xb9, 0x00, 0x28, 0xcc},540{0xb9, 0x01, 0x28, 0xcc},541{0xb9, 0x02, 0x28, 0xcc},542{0xb9, 0x03, 0x00, 0xcc},543{0xb9, 0x04, 0x00, 0xcc},544{0xb9, 0x05, 0x3c, 0xcc},545{0xb9, 0x06, 0x3c, 0xcc},546{0xb9, 0x07, 0x3c, 0xcc},547{0xb9, 0x08, 0x3c, 0xcc},548{0xb8, 0x8e, 0x00, 0xcc},549{0xb8, 0x8f, 0xff, 0xcc},550{0xb8, 0x81, 0x09, 0xcc},551{0x31, 0x00, 0x00, 0xbb},552{0x09, 0x01, 0xc7, 0xbb},553{0x34, 0x01, 0x00, 0xbb},554{0x2b, 0x00, 0x28, 0xbb},555{0x2c, 0x00, 0x30, 0xbb},556{0x2d, 0x00, 0x30, 0xbb},557{0x2e, 0x00, 0x28, 0xbb},558{0x62, 0x04, 0x11, 0xbb},559{0x03, 0x01, 0xe0, 0xbb},560{0x2c, 0x00, 0x2c, 0xbb},561{0x20, 0xd0, 0x00, 0xbb},562{0x01, 0x00, 0x08, 0xbb},563{0x06, 0x00, 0x10, 0xbb},564{0x05, 0x00, 0x20, 0xbb},565{0x20, 0x00, 0x00, 0xbb},566{0xb6, 0x00, 0x00, 0xcc},567{0xb6, 0x03, 0x01, 0xcc},568{0xb6, 0x02, 0x40, 0xcc},569{0xb6, 0x05, 0x00, 0xcc},570{0xb6, 0x04, 0xf0, 0xcc},571{0xb6, 0x12, 0x78, 0xcc},572{0xb6, 0x18, 0x00, 0xcc},573{0xb6, 0x17, 0x96, 0xcc},574{0xb6, 0x16, 0x00, 0xcc},575{0xb6, 0x22, 0x12, 0xcc},576{0xb6, 0x23, 0x0b, 0xcc},577{0xb3, 0x02, 0x02, 0xcc},578{0xbf, 0xc0, 0x39, 0xcc},579{0xbf, 0xc1, 0x04, 0xcc},580{0xbf, 0xcc, 0x10, 0xcc},581{0xb9, 0x12, 0x00, 0xcc},582{0xb9, 0x13, 0x0a, 0xcc},583{0xb9, 0x14, 0x0a, 0xcc},584{0xb9, 0x15, 0x0a, 0xcc},585{0xb9, 0x16, 0x0a, 0xcc},586{0xb9, 0x18, 0x00, 0xcc},587{0xb9, 0x19, 0x0f, 0xcc},588{0xb9, 0x1a, 0x0f, 0xcc},589{0xb9, 0x1b, 0x0f, 0xcc},590{0xb9, 0x1c, 0x0f, 0xcc},591{0xb8, 0x8e, 0x00, 0xcc},592{0xb8, 0x8f, 0xff, 0xcc},593{0xb6, 0x12, 0xf8, 0xcc},594{0xb6, 0x13, 0x13, 0xcc},595{0xbc, 0x02, 0x18, 0xcc},596{0xbc, 0x03, 0x50, 0xcc},597{0xbc, 0x04, 0x18, 0xcc},598{0xbc, 0x05, 0x00, 0xcc},599{0xbc, 0x06, 0x00, 0xcc},600{0xbc, 0x08, 0x30, 0xcc},601{0xbc, 0x09, 0x40, 0xcc},602{0xbc, 0x0a, 0x10, 0xcc},603{0xb8, 0x0c, 0x20, 0xcc},604{0xb8, 0x0d, 0x70, 0xcc},605{0xbc, 0x0b, 0x00, 0xcc},606{0xbc, 0x0c, 0x00, 0xcc},607{0x35, 0x00, 0xef, 0xbb},608{0xb3, 0x5c, 0x01, 0xcc},609{}610};611612static const u8 mi1310_socinitVGA_JPG[][4] = {613{0xb0, 0x03, 0x19, 0xcc},614{0xb0, 0x04, 0x02, 0xcc},615{0xb3, 0x00, 0x64, 0xcc},616{0xb3, 0x00, 0x65, 0xcc},617{0xb3, 0x05, 0x00, 0xcc},618{0xb3, 0x06, 0x00, 0xcc},619{0xb3, 0x08, 0x01, 0xcc},620{0xb3, 0x09, 0x0c, 0xcc},621{0xb3, 0x34, 0x02, 0xcc},622{0xb3, 0x35, 0xdd, 0xcc}, /* i2c add: 5d */623{0xb3, 0x02, 0x00, 0xcc},624{0xb3, 0x03, 0x0a, 0xcc},625{0xb3, 0x04, 0x05, 0xcc},626{0xb3, 0x20, 0x00, 0xcc},627{0xb3, 0x21, 0x00, 0xcc},628{0xb3, 0x22, 0x03, 0xcc},629{0xb3, 0x23, 0xc0, 0xcc},630{0xb3, 0x14, 0x00, 0xcc},631{0xb3, 0x15, 0x00, 0xcc},632{0xb3, 0x16, 0x04, 0xcc},633{0xb3, 0x17, 0xff, 0xcc},634{0xb3, 0x00, 0x65, 0xcc},635{0xb8, 0x00, 0x00, 0xcc},636{0xbc, 0x00, 0xd0, 0xcc},637{0xbc, 0x01, 0x01, 0xcc},638{0xf0, 0x00, 0x02, 0xbb},639{0xc8, 0x9f, 0x0b, 0xbb},640{0x5b, 0x00, 0x01, 0xbb},641{0x2f, 0xde, 0x20, 0xbb},642{0xf0, 0x00, 0x00, 0xbb},643{0x20, 0x03, 0x02, 0xbb}, /* h/v flip */644{0xf0, 0x00, 0x01, 0xbb},645{0x05, 0x00, 0x07, 0xbb},646{0x34, 0x00, 0x00, 0xbb},647{0x35, 0xff, 0x00, 0xbb},648{0xdc, 0x07, 0x02, 0xbb},649{0xdd, 0x3c, 0x18, 0xbb},650{0xde, 0x92, 0x6d, 0xbb},651{0xdf, 0xcd, 0xb1, 0xbb},652{0xe0, 0xff, 0xe7, 0xbb},653{0x06, 0xf0, 0x0d, 0xbb},654{0x06, 0x70, 0x0e, 0xbb},655{0x4c, 0x00, 0x01, 0xbb},656{0x4d, 0x00, 0x01, 0xbb},657{0xf0, 0x00, 0x02, 0xbb},658{0x2e, 0x0c, 0x55, 0xbb},659{0x21, 0xb6, 0x6e, 0xbb},660{0x36, 0x30, 0x10, 0xbb},661{0x37, 0x00, 0xc1, 0xbb},662{0xf0, 0x00, 0x00, 0xbb},663{0x07, 0x00, 0x84, 0xbb},664{0x08, 0x02, 0x4a, 0xbb},665{0x05, 0x01, 0x10, 0xbb},666{0x06, 0x00, 0x39, 0xbb},667{0xf0, 0x00, 0x02, 0xbb},668{0x58, 0x02, 0x67, 0xbb},669{0x57, 0x02, 0x00, 0xbb},670{0x5a, 0x02, 0x67, 0xbb},671{0x59, 0x02, 0x00, 0xbb},672{0x5c, 0x12, 0x0d, 0xbb},673{0x5d, 0x16, 0x11, 0xbb},674{0x39, 0x06, 0x18, 0xbb},675{0x3a, 0x06, 0x18, 0xbb},676{0x3b, 0x06, 0x18, 0xbb},677{0x3c, 0x06, 0x18, 0xbb},678{0x64, 0x7b, 0x5b, 0xbb},679{0xf0, 0x00, 0x02, 0xbb},680{0x36, 0x30, 0x10, 0xbb},681{0x37, 0x00, 0xc0, 0xbb},682{0xbc, 0x0e, 0x00, 0xcc},683{0xbc, 0x0f, 0x05, 0xcc},684{0xbc, 0x10, 0xc0, 0xcc},685{0xbc, 0x11, 0x03, 0xcc},686{0xb6, 0x00, 0x00, 0xcc},687{0xb6, 0x03, 0x02, 0xcc},688{0xb6, 0x02, 0x80, 0xcc},689{0xb6, 0x05, 0x01, 0xcc},690{0xb6, 0x04, 0xe0, 0xcc},691{0xb6, 0x12, 0xf8, 0xcc},692{0xb6, 0x13, 0x25, 0xcc},693{0xb6, 0x18, 0x02, 0xcc},694{0xb6, 0x17, 0x58, 0xcc},695{0xb6, 0x16, 0x00, 0xcc},696{0xb6, 0x22, 0x12, 0xcc},697{0xb6, 0x23, 0x0b, 0xcc},698{0xbf, 0xc0, 0x39, 0xcc},699{0xbf, 0xc1, 0x04, 0xcc},700{0xbf, 0xcc, 0x00, 0xcc},701{0xbc, 0x02, 0x18, 0xcc},702{0xbc, 0x03, 0x50, 0xcc},703{0xbc, 0x04, 0x18, 0xcc},704{0xbc, 0x05, 0x00, 0xcc},705{0xbc, 0x06, 0x00, 0xcc},706{0xbc, 0x08, 0x30, 0xcc},707{0xbc, 0x09, 0x40, 0xcc},708{0xbc, 0x0a, 0x10, 0xcc},709{0xbc, 0x0b, 0x00, 0xcc},710{0xbc, 0x0c, 0x00, 0xcc},711{0xb3, 0x5c, 0x01, 0xcc},712{0xf0, 0x00, 0x01, 0xbb},713{0x80, 0x00, 0x03, 0xbb},714{0x81, 0xc7, 0x14, 0xbb},715{0x82, 0xeb, 0xe8, 0xbb},716{0x83, 0xfe, 0xf4, 0xbb},717{0x84, 0xcd, 0x10, 0xbb},718{0x85, 0xf3, 0xee, 0xbb},719{0x86, 0xff, 0xf1, 0xbb},720{0x87, 0xcd, 0x10, 0xbb},721{0x88, 0xf3, 0xee, 0xbb},722{0x89, 0x01, 0xf1, 0xbb},723{0x8a, 0xe5, 0x17, 0xbb},724{0x8b, 0xe8, 0xe2, 0xbb},725{0x8c, 0xf7, 0xed, 0xbb},726{0x8d, 0x00, 0xff, 0xbb},727{0x8e, 0xec, 0x10, 0xbb},728{0x8f, 0xf0, 0xed, 0xbb},729{0x90, 0xf9, 0xf2, 0xbb},730{0x91, 0x00, 0x00, 0xbb},731{0x92, 0xe9, 0x0d, 0xbb},732{0x93, 0xf4, 0xf2, 0xbb},733{0x94, 0xfb, 0xf5, 0xbb},734{0x95, 0x00, 0xff, 0xbb},735{0xb6, 0x0f, 0x08, 0xbb},736{0xb7, 0x3d, 0x16, 0xbb},737{0xb8, 0x0c, 0x04, 0xbb},738{0xb9, 0x1c, 0x07, 0xbb},739{0xba, 0x0a, 0x03, 0xbb},740{0xbb, 0x1b, 0x09, 0xbb},741{0xbc, 0x17, 0x0d, 0xbb},742{0xbd, 0x23, 0x1d, 0xbb},743{0xbe, 0x00, 0x28, 0xbb},744{0xbf, 0x11, 0x09, 0xbb},745{0xc0, 0x16, 0x15, 0xbb},746{0xc1, 0x00, 0x1b, 0xbb},747{0xc2, 0x0e, 0x07, 0xbb},748{0xc3, 0x14, 0x10, 0xbb},749{0xc4, 0x00, 0x17, 0xbb},750{0x06, 0x74, 0x8e, 0xbb},751{0xf0, 0x00, 0x01, 0xbb},752{0x06, 0xf4, 0x8e, 0xbb},753{0x00, 0x00, 0x50, 0xdd},754{0x06, 0x74, 0x8e, 0xbb},755{0xf0, 0x00, 0x02, 0xbb},756{0x24, 0x50, 0x20, 0xbb},757{0xf0, 0x00, 0x02, 0xbb},758{0x34, 0x0c, 0x50, 0xbb},759{0xb3, 0x01, 0x41, 0xcc},760{0xf0, 0x00, 0x00, 0xbb},761{0x03, 0x03, 0xc0, 0xbb},762{},763};764static const u8 mi1310_socinitQVGA_JPG[][4] = {765{0xb0, 0x03, 0x19, 0xcc}, {0xb0, 0x04, 0x02, 0xcc},766{0xb3, 0x00, 0x64, 0xcc}, {0xb3, 0x00, 0x65, 0xcc},767{0xb3, 0x05, 0x00, 0xcc}, {0xb3, 0x06, 0x00, 0xcc},768{0xb3, 0x08, 0x01, 0xcc}, {0xb3, 0x09, 0x0c, 0xcc},769{0xb3, 0x34, 0x02, 0xcc}, {0xb3, 0x35, 0xdd, 0xcc},770{0xb3, 0x02, 0x00, 0xcc}, {0xb3, 0x03, 0x0a, 0xcc},771{0xb3, 0x04, 0x05, 0xcc}, {0xb3, 0x20, 0x00, 0xcc},772{0xb3, 0x21, 0x00, 0xcc}, {0xb3, 0x22, 0x03, 0xcc},773{0xb3, 0x23, 0xc0, 0xcc}, {0xb3, 0x14, 0x00, 0xcc},774{0xb3, 0x15, 0x00, 0xcc}, {0xb3, 0x16, 0x04, 0xcc},775{0xb3, 0x17, 0xff, 0xcc}, {0xb3, 0x00, 0x65, 0xcc},776{0xb8, 0x00, 0x00, 0xcc}, {0xbc, 0x00, 0xf0, 0xcc},777{0xbc, 0x01, 0x01, 0xcc}, {0xf0, 0x00, 0x02, 0xbb},778{0xc8, 0x9f, 0x0b, 0xbb}, {0x5b, 0x00, 0x01, 0xbb},779{0x2f, 0xde, 0x20, 0xbb}, {0xf0, 0x00, 0x00, 0xbb},780{0x20, 0x03, 0x02, 0xbb}, /* h/v flip */781{0xf0, 0x00, 0x01, 0xbb},782{0x05, 0x00, 0x07, 0xbb}, {0x34, 0x00, 0x00, 0xbb},783{0x35, 0xff, 0x00, 0xbb}, {0xdc, 0x07, 0x02, 0xbb},784{0xdd, 0x3c, 0x18, 0xbb}, {0xde, 0x92, 0x6d, 0xbb},785{0xdf, 0xcd, 0xb1, 0xbb}, {0xe0, 0xff, 0xe7, 0xbb},786{0x06, 0xf0, 0x0d, 0xbb}, {0x06, 0x70, 0x0e, 0xbb},787{0x4c, 0x00, 0x01, 0xbb}, {0x4d, 0x00, 0x01, 0xbb},788{0xf0, 0x00, 0x02, 0xbb}, {0x2e, 0x0c, 0x55, 0xbb},789{0x21, 0xb6, 0x6e, 0xbb}, {0x36, 0x30, 0x10, 0xbb},790{0x37, 0x00, 0xc1, 0xbb}, {0xf0, 0x00, 0x00, 0xbb},791{0x07, 0x00, 0x84, 0xbb}, {0x08, 0x02, 0x4a, 0xbb},792{0x05, 0x01, 0x10, 0xbb}, {0x06, 0x00, 0x39, 0xbb},793{0xf0, 0x00, 0x02, 0xbb}, {0x58, 0x02, 0x67, 0xbb},794{0x57, 0x02, 0x00, 0xbb}, {0x5a, 0x02, 0x67, 0xbb},795{0x59, 0x02, 0x00, 0xbb}, {0x5c, 0x12, 0x0d, 0xbb},796{0x5d, 0x16, 0x11, 0xbb}, {0x39, 0x06, 0x18, 0xbb},797{0x3a, 0x06, 0x18, 0xbb}, {0x3b, 0x06, 0x18, 0xbb},798{0x3c, 0x06, 0x18, 0xbb}, {0x64, 0x7b, 0x5b, 0xbb},799{0xf0, 0x00, 0x02, 0xbb}, {0x36, 0x30, 0x10, 0xbb},800{0x37, 0x00, 0xc0, 0xbb}, {0xbc, 0x0e, 0x00, 0xcc},801{0xbc, 0x0f, 0x05, 0xcc}, {0xbc, 0x10, 0xc0, 0xcc},802{0xbc, 0x11, 0x03, 0xcc}, {0xb6, 0x00, 0x00, 0xcc},803{0xb6, 0x03, 0x01, 0xcc}, {0xb6, 0x02, 0x40, 0xcc},804{0xb6, 0x05, 0x00, 0xcc}, {0xb6, 0x04, 0xf0, 0xcc},805{0xb6, 0x12, 0xf8, 0xcc}, {0xb6, 0x13, 0x25, 0xcc},806{0xb6, 0x18, 0x00, 0xcc}, {0xb6, 0x17, 0x96, 0xcc},807{0xb6, 0x16, 0x00, 0xcc}, {0xb6, 0x22, 0x12, 0xcc},808{0xb6, 0x23, 0x0b, 0xcc}, {0xbf, 0xc0, 0x39, 0xcc},809{0xbf, 0xc1, 0x04, 0xcc}, {0xbf, 0xcc, 0x00, 0xcc},810{0xb3, 0x5c, 0x01, 0xcc}, {0xf0, 0x00, 0x01, 0xbb},811{0x80, 0x00, 0x03, 0xbb}, {0x81, 0xc7, 0x14, 0xbb},812{0x82, 0xeb, 0xe8, 0xbb}, {0x83, 0xfe, 0xf4, 0xbb},813{0x84, 0xcd, 0x10, 0xbb}, {0x85, 0xf3, 0xee, 0xbb},814{0x86, 0xff, 0xf1, 0xbb}, {0x87, 0xcd, 0x10, 0xbb},815{0x88, 0xf3, 0xee, 0xbb}, {0x89, 0x01, 0xf1, 0xbb},816{0x8a, 0xe5, 0x17, 0xbb}, {0x8b, 0xe8, 0xe2, 0xbb},817{0x8c, 0xf7, 0xed, 0xbb}, {0x8d, 0x00, 0xff, 0xbb},818{0x8e, 0xec, 0x10, 0xbb}, {0x8f, 0xf0, 0xed, 0xbb},819{0x90, 0xf9, 0xf2, 0xbb}, {0x91, 0x00, 0x00, 0xbb},820{0x92, 0xe9, 0x0d, 0xbb}, {0x93, 0xf4, 0xf2, 0xbb},821{0x94, 0xfb, 0xf5, 0xbb}, {0x95, 0x00, 0xff, 0xbb},822{0xb6, 0x0f, 0x08, 0xbb}, {0xb7, 0x3d, 0x16, 0xbb},823{0xb8, 0x0c, 0x04, 0xbb}, {0xb9, 0x1c, 0x07, 0xbb},824{0xba, 0x0a, 0x03, 0xbb}, {0xbb, 0x1b, 0x09, 0xbb},825{0xbc, 0x17, 0x0d, 0xbb}, {0xbd, 0x23, 0x1d, 0xbb},826{0xbe, 0x00, 0x28, 0xbb}, {0xbf, 0x11, 0x09, 0xbb},827{0xc0, 0x16, 0x15, 0xbb}, {0xc1, 0x00, 0x1b, 0xbb},828{0xc2, 0x0e, 0x07, 0xbb}, {0xc3, 0x14, 0x10, 0xbb},829{0xc4, 0x00, 0x17, 0xbb}, {0x06, 0x74, 0x8e, 0xbb},830{0xf0, 0x00, 0x01, 0xbb}, {0x06, 0xf4, 0x8e, 0xbb},831{0x00, 0x00, 0x50, 0xdd}, {0x06, 0x74, 0x8e, 0xbb},832{0xf0, 0x00, 0x02, 0xbb}, {0x24, 0x50, 0x20, 0xbb},833{0xf0, 0x00, 0x02, 0xbb}, {0x34, 0x0c, 0x50, 0xbb},834{0xb3, 0x01, 0x41, 0xcc}, {0xf0, 0x00, 0x00, 0xbb},835{0x03, 0x03, 0xc0, 0xbb},836{},837};838static const u8 mi1310_soc_InitSXGA_JPG[][4] = {839{0xb0, 0x03, 0x19, 0xcc},840{0xb0, 0x04, 0x02, 0xcc},841{0xb3, 0x00, 0x64, 0xcc},842{0xb3, 0x00, 0x65, 0xcc},843{0xb3, 0x05, 0x00, 0xcc},844{0xb3, 0x06, 0x00, 0xcc},845{0xb3, 0x08, 0x01, 0xcc},846{0xb3, 0x09, 0x0c, 0xcc},847{0xb3, 0x34, 0x02, 0xcc},848{0xb3, 0x35, 0xdd, 0xcc},849{0xb3, 0x02, 0x00, 0xcc},850{0xb3, 0x03, 0x0a, 0xcc},851{0xb3, 0x04, 0x0d, 0xcc},852{0xb3, 0x20, 0x00, 0xcc},853{0xb3, 0x21, 0x00, 0xcc},854{0xb3, 0x22, 0x03, 0xcc},855{0xb3, 0x23, 0xc0, 0xcc},856{0xb3, 0x14, 0x00, 0xcc},857{0xb3, 0x15, 0x00, 0xcc},858{0xb3, 0x16, 0x04, 0xcc},859{0xb3, 0x17, 0xff, 0xcc},860{0xb3, 0x00, 0x65, 0xcc},861{0xb8, 0x00, 0x00, 0xcc},862{0xbc, 0x00, 0x70, 0xcc},863{0xbc, 0x01, 0x01, 0xcc},864{0xf0, 0x00, 0x02, 0xbb},865{0xc8, 0x9f, 0x0b, 0xbb},866{0x5b, 0x00, 0x01, 0xbb},867{0xf0, 0x00, 0x00, 0xbb},868{0x20, 0x03, 0x02, 0xbb}, /* h/v flip */869{0xf0, 0x00, 0x01, 0xbb},870{0x05, 0x00, 0x07, 0xbb},871{0x34, 0x00, 0x00, 0xbb},872{0x35, 0xff, 0x00, 0xbb},873{0xdc, 0x07, 0x02, 0xbb},874{0xdd, 0x3c, 0x18, 0xbb},875{0xde, 0x92, 0x6d, 0xbb},876{0xdf, 0xcd, 0xb1, 0xbb},877{0xe0, 0xff, 0xe7, 0xbb},878{0x06, 0xf0, 0x0d, 0xbb},879{0x06, 0x70, 0x0e, 0xbb},880{0x4c, 0x00, 0x01, 0xbb},881{0x4d, 0x00, 0x01, 0xbb},882{0xf0, 0x00, 0x02, 0xbb},883{0x2e, 0x0c, 0x60, 0xbb},884{0x21, 0xb6, 0x6e, 0xbb},885{0x37, 0x01, 0x40, 0xbb},886{0xf0, 0x00, 0x00, 0xbb},887{0x07, 0x00, 0x84, 0xbb},888{0x08, 0x02, 0x4a, 0xbb},889{0x05, 0x01, 0x10, 0xbb},890{0x06, 0x00, 0x39, 0xbb},891{0xf0, 0x00, 0x02, 0xbb},892{0x58, 0x02, 0x67, 0xbb},893{0x57, 0x02, 0x00, 0xbb},894{0x5a, 0x02, 0x67, 0xbb},895{0x59, 0x02, 0x00, 0xbb},896{0x5c, 0x12, 0x0d, 0xbb},897{0x5d, 0x16, 0x11, 0xbb},898{0x39, 0x06, 0x18, 0xbb},899{0x3a, 0x06, 0x18, 0xbb},900{0x3b, 0x06, 0x18, 0xbb},901{0x3c, 0x06, 0x18, 0xbb},902{0x64, 0x7b, 0x5b, 0xbb},903{0xb6, 0x00, 0x00, 0xcc},904{0xb6, 0x03, 0x05, 0xcc},905{0xb6, 0x02, 0x00, 0xcc},906{0xb6, 0x05, 0x03, 0xcc},907{0xb6, 0x04, 0xc0, 0xcc},908{0xb6, 0x12, 0xf8, 0xcc},909{0xb6, 0x13, 0x29, 0xcc},910{0xb6, 0x18, 0x09, 0xcc},911{0xb6, 0x17, 0x60, 0xcc},912{0xb6, 0x16, 0x00, 0xcc},913{0xb6, 0x22, 0x12, 0xcc},914{0xb6, 0x23, 0x0b, 0xcc},915{0xbf, 0xc0, 0x39, 0xcc},916{0xbf, 0xc1, 0x04, 0xcc},917{0xbf, 0xcc, 0x00, 0xcc},918{0xb3, 0x01, 0x41, 0xcc},919{0x00, 0x00, 0x80, 0xdd},920{0xf0, 0x00, 0x02, 0xbb},921{0x00, 0x00, 0x10, 0xdd},922{0x22, 0xa0, 0x78, 0xbb},923{0x23, 0xa0, 0x78, 0xbb},924{0x24, 0x7f, 0x00, 0xbb},925{0x28, 0xea, 0x02, 0xbb},926{0x29, 0x86, 0x7a, 0xbb},927{0x5e, 0x52, 0x4c, 0xbb},928{0x5f, 0x20, 0x24, 0xbb},929{0x60, 0x00, 0x02, 0xbb},930{0x02, 0x00, 0xee, 0xbb},931{0x03, 0x39, 0x23, 0xbb},932{0x04, 0x07, 0x24, 0xbb},933{0x09, 0x00, 0xc0, 0xbb},934{0x0a, 0x00, 0x79, 0xbb},935{0x0b, 0x00, 0x04, 0xbb},936{0x0c, 0x00, 0x5c, 0xbb},937{0x0d, 0x00, 0xd9, 0xbb},938{0x0e, 0x00, 0x53, 0xbb},939{0x0f, 0x00, 0x21, 0xbb},940{0x10, 0x00, 0xa4, 0xbb},941{0x11, 0x00, 0xe5, 0xbb},942{0x15, 0x00, 0x00, 0xbb},943{0x16, 0x00, 0x00, 0xbb},944{0x17, 0x00, 0x00, 0xbb},945{0x18, 0x00, 0x00, 0xbb},946{0x19, 0x00, 0x00, 0xbb},947{0x1a, 0x00, 0x00, 0xbb},948{0x1b, 0x00, 0x00, 0xbb},949{0x1c, 0x00, 0x00, 0xbb},950{0x1d, 0x00, 0x00, 0xbb},951{0x1e, 0x00, 0x00, 0xbb},952{0xf0, 0x00, 0x01, 0xbb},953{0x00, 0x00, 0x20, 0xdd},954{0x06, 0xf0, 0x8e, 0xbb},955{0x00, 0x00, 0x80, 0xdd},956{0x06, 0x70, 0x8e, 0xbb},957{0xf0, 0x00, 0x02, 0xbb},958{0x00, 0x00, 0x20, 0xdd},959{0x5e, 0x6a, 0x53, 0xbb},960{0x5f, 0x40, 0x2c, 0xbb},961{0xf0, 0x00, 0x01, 0xbb},962{0x00, 0x00, 0x20, 0xdd},963{0x58, 0x00, 0x00, 0xbb},964{0x53, 0x09, 0x03, 0xbb},965{0x54, 0x31, 0x18, 0xbb},966{0x55, 0x8b, 0x5f, 0xbb},967{0x56, 0xc0, 0xa9, 0xbb},968{0x57, 0xe0, 0xd2, 0xbb},969{0xe1, 0x00, 0x00, 0xbb},970{0xdc, 0x09, 0x03, 0xbb},971{0xdd, 0x31, 0x18, 0xbb},972{0xde, 0x8b, 0x5f, 0xbb},973{0xdf, 0xc0, 0xa9, 0xbb},974{0xe0, 0xe0, 0xd2, 0xbb},975{0xb3, 0x5c, 0x01, 0xcc},976{0xf0, 0x00, 0x01, 0xbb},977{0x06, 0xf0, 0x8e, 0xbb},978{0xf0, 0x00, 0x02, 0xbb},979{0x2f, 0xde, 0x20, 0xbb},980{0xf0, 0x00, 0x02, 0xbb},981{0x24, 0x50, 0x20, 0xbb},982{0xbc, 0x0e, 0x00, 0xcc},983{0xbc, 0x0f, 0x05, 0xcc},984{0xbc, 0x10, 0xc0, 0xcc},985{0xf0, 0x00, 0x02, 0xbb},986{0x34, 0x0c, 0x50, 0xbb},987{0xbc, 0x11, 0x03, 0xcc},988{0xf0, 0x00, 0x01, 0xbb},989{0x80, 0x00, 0x03, 0xbb},990{0x81, 0xc7, 0x14, 0xbb},991{0x82, 0xeb, 0xe8, 0xbb},992{0x83, 0xfe, 0xf4, 0xbb},993{0x84, 0xcd, 0x10, 0xbb},994{0x85, 0xf3, 0xee, 0xbb},995{0x86, 0xff, 0xf1, 0xbb},996{0x87, 0xcd, 0x10, 0xbb},997{0x88, 0xf3, 0xee, 0xbb},998{0x89, 0x01, 0xf1, 0xbb},999{0x8a, 0xe5, 0x17, 0xbb},1000{0x8b, 0xe8, 0xe2, 0xbb},1001{0x8c, 0xf7, 0xed, 0xbb},1002{0x8d, 0x00, 0xff, 0xbb},1003{0x8e, 0xec, 0x10, 0xbb},1004{0x8f, 0xf0, 0xed, 0xbb},1005{0x90, 0xf9, 0xf2, 0xbb},1006{0x91, 0x00, 0x00, 0xbb},1007{0x92, 0xe9, 0x0d, 0xbb},1008{0x93, 0xf4, 0xf2, 0xbb},1009{0x94, 0xfb, 0xf5, 0xbb},1010{0x95, 0x00, 0xff, 0xbb},1011{0xb6, 0x0f, 0x08, 0xbb},1012{0xb7, 0x3d, 0x16, 0xbb},1013{0xb8, 0x0c, 0x04, 0xbb},1014{0xb9, 0x1c, 0x07, 0xbb},1015{0xba, 0x0a, 0x03, 0xbb},1016{0xbb, 0x1b, 0x09, 0xbb},1017{0xbc, 0x17, 0x0d, 0xbb},1018{0xbd, 0x23, 0x1d, 0xbb},1019{0xbe, 0x00, 0x28, 0xbb},1020{0xbf, 0x11, 0x09, 0xbb},1021{0xc0, 0x16, 0x15, 0xbb},1022{0xc1, 0x00, 0x1b, 0xbb},1023{0xc2, 0x0e, 0x07, 0xbb},1024{0xc3, 0x14, 0x10, 0xbb},1025{0xc4, 0x00, 0x17, 0xbb},1026{0x06, 0x74, 0x8e, 0xbb},1027{0xf0, 0x00, 0x00, 0xbb},1028{0x03, 0x03, 0xc0, 0xbb},1029{}1030};10311032static const u8 mi1320_gamma[17] = {10330x00, 0x13, 0x38, 0x59, 0x79, 0x92, 0xa7, 0xb9, 0xc8,10340xd4, 0xdf, 0xe7, 0xee, 0xf4, 0xf9, 0xfc, 0xff1035};1036static const u8 mi1320_matrix[9] = {10370x54, 0xda, 0x06, 0xf1, 0x50, 0xf4, 0xf7, 0xea, 0x521038};1039static const u8 mi1320_initVGA_data[][4] = {1040{0xb3, 0x01, 0x01, 0xcc}, {0x00, 0x00, 0x33, 0xdd},1041{0xb0, 0x03, 0x19, 0xcc}, {0x00, 0x00, 0x33, 0xdd},1042{0xb0, 0x04, 0x02, 0xcc}, {0x00, 0x00, 0x33, 0xdd},1043{0xb3, 0x00, 0x64, 0xcc}, {0xb3, 0x00, 0x65, 0xcc},1044{0xb0, 0x16, 0x03, 0xcc}, {0xb3, 0x05, 0x00, 0xcc},1045{0xb3, 0x06, 0x00, 0xcc}, {0xb3, 0x08, 0x01, 0xcc},1046{0xb3, 0x09, 0x0c, 0xcc}, {0xb3, 0x34, 0x02, 0xcc},1047{0xb3, 0x35, 0xc8, 0xcc}, /* i2c add: 48 */1048{0xb3, 0x02, 0x00, 0xcc},1049{0xb3, 0x03, 0x0a, 0xcc}, {0xb3, 0x04, 0x05, 0xcc},1050{0xb3, 0x20, 0x00, 0xcc}, {0xb3, 0x21, 0x00, 0xcc},1051{0xb3, 0x22, 0x03, 0xcc}, {0xb3, 0x23, 0xc0, 0xcc},1052{0xb3, 0x14, 0x00, 0xcc}, {0xb3, 0x15, 0x00, 0xcc},1053{0xb3, 0x16, 0x04, 0xcc}, {0xb3, 0x17, 0xff, 0xcc},1054{0xb3, 0x00, 0x67, 0xcc}, {0xbc, 0x00, 0xd0, 0xcc},1055{0xbc, 0x01, 0x01, 0xcc}, {0xf0, 0x00, 0x00, 0xbb},1056{0x0d, 0x00, 0x09, 0xbb}, {0x00, 0x01, 0x00, 0xdd},1057{0x0d, 0x00, 0x08, 0xbb}, {0xf0, 0x00, 0x01, 0xbb},1058{0xa1, 0x05, 0x00, 0xbb}, {0xa4, 0x03, 0xc0, 0xbb},1059{0xf0, 0x00, 0x02, 0xbb}, {0x00, 0x00, 0x10, 0xdd},1060{0xc8, 0x9f, 0x0b, 0xbb}, {0x00, 0x00, 0x10, 0xdd},1061{0xf0, 0x00, 0x00, 0xbb}, {0x00, 0x00, 0x10, 0xdd},1062{0x20, 0x01, 0x00, 0xbb}, {0x00, 0x00, 0x10, 0xdd},1063{0xf0, 0x00, 0x01, 0xbb}, {0x9d, 0x3c, 0xa0, 0xbb},1064{0x47, 0x30, 0x30, 0xbb}, {0xf0, 0x00, 0x00, 0xbb},1065{0x0a, 0x80, 0x11, 0xbb}, {0x35, 0x00, 0x22, 0xbb},1066{0xf0, 0x00, 0x02, 0xbb}, {0x9d, 0xc5, 0x05, 0xbb},1067{0xdc, 0x0f, 0xfc, 0xbb}, {0xf0, 0x00, 0x01, 0xbb},1068{0x06, 0x74, 0x0e, 0xbb}, {0x80, 0x00, 0x06, 0xbb},1069{0x81, 0x04, 0x00, 0xbb}, {0x82, 0x01, 0x02, 0xbb},1070{0x83, 0x03, 0x02, 0xbb}, {0x84, 0x05, 0x00, 0xbb},1071{0x85, 0x01, 0x00, 0xbb}, {0x86, 0x03, 0x02, 0xbb},1072{0x87, 0x05, 0x00, 0xbb}, {0x88, 0x01, 0x00, 0xbb},1073{0x89, 0x02, 0x02, 0xbb}, {0x8a, 0xfd, 0x04, 0xbb},1074{0x8b, 0xfc, 0xfd, 0xbb}, {0x8c, 0xff, 0xfd, 0xbb},1075{0x8d, 0x00, 0x00, 0xbb}, {0x8e, 0xfe, 0x05, 0xbb},1076{0x8f, 0xfc, 0xfd, 0xbb}, {0x90, 0xfe, 0xfd, 0xbb},1077{0x91, 0x00, 0x00, 0xbb}, {0x92, 0xfe, 0x03, 0xbb},1078{0x93, 0xfd, 0xfe, 0xbb}, {0x94, 0xff, 0xfd, 0xbb},1079{0x95, 0x00, 0x00, 0xbb}, {0xb6, 0x07, 0x05, 0xbb},1080{0xb7, 0x13, 0x06, 0xbb}, {0xb8, 0x08, 0x06, 0xbb},1081{0xb9, 0x14, 0x08, 0xbb}, {0xba, 0x06, 0x05, 0xbb},1082{0xbb, 0x13, 0x06, 0xbb}, {0xbc, 0x03, 0x01, 0xbb},1083{0xbd, 0x03, 0x04, 0xbb}, {0xbe, 0x00, 0x02, 0xbb},1084{0xbf, 0x03, 0x01, 0xbb}, {0xc0, 0x02, 0x04, 0xbb},1085{0xc1, 0x00, 0x04, 0xbb}, {0xc2, 0x02, 0x01, 0xbb},1086{0xc3, 0x01, 0x03, 0xbb}, {0xc4, 0x00, 0x04, 0xbb},1087{0xf0, 0x00, 0x00, 0xbb}, {0x05, 0x01, 0x13, 0xbb},1088{0x06, 0x00, 0x11, 0xbb}, {0x07, 0x00, 0x85, 0xbb},1089{0x08, 0x00, 0x27, 0xbb},1090{0x20, 0x01, 0x00, 0xbb}, /* h/v flips - was 03 */1091{0x21, 0x80, 0x00, 0xbb}, {0x22, 0x0d, 0x0f, 0xbb},1092{0x24, 0x80, 0x00, 0xbb}, {0x59, 0x00, 0xff, 0xbb},1093{0xf0, 0x00, 0x02, 0xbb}, {0x39, 0x03, 0x0d, 0xbb},1094{0x3a, 0x06, 0x1b, 0xbb}, {0x3b, 0x00, 0x95, 0xbb},1095{0x3c, 0x04, 0xdb, 0xbb}, {0x57, 0x02, 0x00, 0xbb},1096{0x58, 0x02, 0x66, 0xbb}, {0x59, 0x00, 0xff, 0xbb},1097{0x5a, 0x01, 0x33, 0xbb}, {0x5c, 0x12, 0x0d, 0xbb},1098{0x5d, 0x16, 0x11, 0xbb}, {0x64, 0x5e, 0x1c, 0xbb},1099{0xf0, 0x00, 0x02, 0xbb}, {0x2f, 0xd1, 0x00, 0xbb},1100{0x5b, 0x00, 0x01, 0xbb}, {0xf0, 0x00, 0x02, 0xbb},1101{0x36, 0x68, 0x10, 0xbb}, {0x00, 0x00, 0x30, 0xdd},1102{0x37, 0x82, 0x00, 0xbb}, {0xbc, 0x0e, 0x00, 0xcc},1103{0xbc, 0x0f, 0x05, 0xcc}, {0xbc, 0x10, 0xc0, 0xcc},1104{0xbc, 0x11, 0x03, 0xcc}, {0xb6, 0x00, 0x00, 0xcc},1105{0xb6, 0x03, 0x05, 0xcc}, {0xb6, 0x02, 0x00, 0xcc},1106{0xb6, 0x05, 0x04, 0xcc}, {0xb6, 0x04, 0x00, 0xcc},1107{0xb6, 0x12, 0xf8, 0xcc}, {0xb6, 0x13, 0x29, 0xcc},1108{0xb6, 0x18, 0x0a, 0xcc}, {0xb6, 0x17, 0x00, 0xcc},1109{0xb6, 0x16, 0x00, 0xcc}, {0xb6, 0x22, 0x12, 0xcc},1110{0xb6, 0x23, 0x0b, 0xcc}, {0xbf, 0xc0, 0x26, 0xcc},1111{0xbf, 0xc1, 0x02, 0xcc}, {0xbf, 0xcc, 0x04, 0xcc},1112{0xbc, 0x02, 0x18, 0xcc}, {0xbc, 0x03, 0x50, 0xcc},1113{0xbc, 0x04, 0x18, 0xcc}, {0xbc, 0x05, 0x00, 0xcc},1114{0xbc, 0x06, 0x00, 0xcc}, {0xbc, 0x08, 0x30, 0xcc},1115{0xbc, 0x09, 0x40, 0xcc}, {0xbc, 0x0a, 0x10, 0xcc},1116{0xbc, 0x0b, 0x00, 0xcc}, {0xbc, 0x0c, 0x00, 0xcc},1117{0xb3, 0x5c, 0x01, 0xcc}, {0xb3, 0x01, 0x41, 0xcc},1118{}1119};1120static const u8 mi1320_initQVGA_data[][4] = {1121{0xb3, 0x01, 0x01, 0xcc}, {0x00, 0x00, 0x33, 0xdd},1122{0xb0, 0x03, 0x19, 0xcc}, {0x00, 0x00, 0x33, 0xdd},1123{0xb0, 0x04, 0x02, 0xcc}, {0x00, 0x00, 0x33, 0xdd},1124{0xb3, 0x00, 0x64, 0xcc}, {0xb3, 0x00, 0x65, 0xcc},1125{0xb0, 0x16, 0x03, 0xcc}, {0xb3, 0x05, 0x01, 0xcc},1126{0xb3, 0x06, 0x01, 0xcc}, {0xb3, 0x08, 0x01, 0xcc},1127{0xb3, 0x09, 0x0c, 0xcc}, {0xb3, 0x34, 0x02, 0xcc},1128{0xb3, 0x35, 0xc8, 0xcc}, {0xb3, 0x02, 0x00, 0xcc},1129{0xb3, 0x03, 0x0a, 0xcc}, {0xb3, 0x04, 0x05, 0xcc},1130{0xb3, 0x20, 0x00, 0xcc}, {0xb3, 0x21, 0x00, 0xcc},1131{0xb3, 0x22, 0x01, 0xcc}, {0xb3, 0x23, 0xe0, 0xcc},1132{0xb3, 0x14, 0x00, 0xcc}, {0xb3, 0x15, 0x00, 0xcc},1133{0xb3, 0x16, 0x02, 0xcc}, {0xb3, 0x17, 0x7f, 0xcc},1134{0xb3, 0x00, 0x65, 0xcc}, {0xb8, 0x00, 0x00, 0xcc},1135{0xbc, 0x00, 0xd0, 0xcc}, {0xbc, 0x01, 0x01, 0xcc},1136{0xf0, 0x00, 0x00, 0xbb}, {0x0d, 0x00, 0x09, 0xbb},1137{0x00, 0x01, 0x00, 0xdd}, {0x0d, 0x00, 0x08, 0xbb},1138{0xf0, 0x00, 0x00, 0xbb}, {0x02, 0x00, 0x64, 0xbb},1139{0x05, 0x01, 0x78, 0xbb}, {0x06, 0x00, 0x11, 0xbb},1140{0x07, 0x01, 0x42, 0xbb}, {0x08, 0x00, 0x11, 0xbb},1141{0x20, 0x01, 0x00, 0xbb}, {0x21, 0x80, 0x00, 0xbb},1142{0x22, 0x0d, 0x0f, 0xbb}, {0x24, 0x80, 0x00, 0xbb},1143{0x59, 0x00, 0xff, 0xbb}, {0xf0, 0x00, 0x01, 0xbb},1144{0x9d, 0x3c, 0xa0, 0xbb}, {0x47, 0x30, 0x30, 0xbb},1145{0xf0, 0x00, 0x00, 0xbb}, {0x0a, 0x80, 0x11, 0xbb},1146{0x35, 0x00, 0x22, 0xbb}, {0xf0, 0x00, 0x02, 0xbb},1147{0x9d, 0xc5, 0x05, 0xbb}, {0xdc, 0x0f, 0xfc, 0xbb},1148{0xf0, 0x00, 0x01, 0xbb}, {0x06, 0x74, 0x0e, 0xbb},1149{0x80, 0x00, 0x06, 0xbb}, {0x81, 0x04, 0x00, 0xbb},1150{0x82, 0x01, 0x02, 0xbb}, {0x83, 0x03, 0x02, 0xbb},1151{0x84, 0x05, 0x00, 0xbb}, {0x85, 0x01, 0x00, 0xbb},1152{0x86, 0x03, 0x02, 0xbb}, {0x87, 0x05, 0x00, 0xbb},1153{0x88, 0x01, 0x00, 0xbb}, {0x89, 0x02, 0x02, 0xbb},1154{0x8a, 0xfd, 0x04, 0xbb}, {0x8b, 0xfc, 0xfd, 0xbb},1155{0x8c, 0xff, 0xfd, 0xbb}, {0x8d, 0x00, 0x00, 0xbb},1156{0x8e, 0xfe, 0x05, 0xbb}, {0x8f, 0xfc, 0xfd, 0xbb},1157{0x90, 0xfe, 0xfd, 0xbb}, {0x91, 0x00, 0x00, 0xbb},1158{0x92, 0xfe, 0x03, 0xbb}, {0x93, 0xfd, 0xfe, 0xbb},1159{0x94, 0xff, 0xfd, 0xbb}, {0x95, 0x00, 0x00, 0xbb},1160{0xb6, 0x07, 0x05, 0xbb}, {0xb7, 0x13, 0x06, 0xbb},1161{0xb8, 0x08, 0x06, 0xbb}, {0xb9, 0x14, 0x08, 0xbb},1162{0xba, 0x06, 0x05, 0xbb}, {0xbb, 0x13, 0x06, 0xbb},1163{0xbc, 0x03, 0x01, 0xbb}, {0xbd, 0x03, 0x04, 0xbb},1164{0xbe, 0x00, 0x02, 0xbb}, {0xbf, 0x03, 0x01, 0xbb},1165{0xc0, 0x02, 0x04, 0xbb}, {0xc1, 0x00, 0x04, 0xbb},1166{0xc2, 0x02, 0x01, 0xbb}, {0xc3, 0x01, 0x03, 0xbb},1167{0xc4, 0x00, 0x04, 0xbb}, {0xf0, 0x00, 0x02, 0xbb},1168{0xc8, 0x00, 0x00, 0xbb}, {0x2e, 0x00, 0x00, 0xbb},1169{0x2e, 0x0c, 0x5b, 0xbb}, {0x2f, 0xd1, 0x00, 0xbb},1170{0x39, 0x03, 0xca, 0xbb}, {0x3a, 0x06, 0x80, 0xbb},1171{0x3b, 0x01, 0x52, 0xbb}, {0x3c, 0x05, 0x40, 0xbb},1172{0x57, 0x01, 0x9c, 0xbb}, {0x58, 0x01, 0xee, 0xbb},1173{0x59, 0x00, 0xf0, 0xbb}, {0x5a, 0x01, 0x20, 0xbb},1174{0x5c, 0x1d, 0x17, 0xbb}, {0x5d, 0x22, 0x1c, 0xbb},1175{0x64, 0x1e, 0x1c, 0xbb}, {0x5b, 0x00, 0x01, 0xbb},1176{0xf0, 0x00, 0x02, 0xbb}, {0x36, 0x68, 0x10, 0xbb},1177{0x00, 0x00, 0x30, 0xdd}, {0x37, 0x81, 0x00, 0xbb},1178{0xbc, 0x02, 0x18, 0xcc}, {0xbc, 0x03, 0x50, 0xcc},1179{0xbc, 0x04, 0x18, 0xcc}, {0xbc, 0x05, 0x00, 0xcc},1180{0xbc, 0x06, 0x00, 0xcc}, {0xbc, 0x08, 0x30, 0xcc},1181{0xbc, 0x09, 0x40, 0xcc}, {0xbc, 0x0a, 0x10, 0xcc},1182{0xbc, 0x0b, 0x00, 0xcc}, {0xbc, 0x0c, 0x00, 0xcc},1183{0xbf, 0xc0, 0x26, 0xcc}, {0xbf, 0xc1, 0x02, 0xcc},1184{0xbf, 0xcc, 0x04, 0xcc}, {0xb3, 0x5c, 0x01, 0xcc},1185{0xb3, 0x01, 0x41, 0xcc},1186{}1187};11881189static const u8 mi1320_soc_InitVGA[][4] = {1190{0xb3, 0x01, 0x01, 0xcc},1191{0xb0, 0x03, 0x19, 0xcc},1192{0xb0, 0x04, 0x02, 0xcc},1193{0x00, 0x00, 0x30, 0xdd},1194{0xb3, 0x00, 0x64, 0xcc},1195{0xb3, 0x00, 0x67, 0xcc},1196{0xb3, 0x05, 0x01, 0xcc},1197{0xb3, 0x06, 0x01, 0xcc},1198{0xb3, 0x08, 0x01, 0xcc},1199{0xb3, 0x09, 0x0c, 0xcc},1200{0xb3, 0x34, 0x02, 0xcc},1201{0xb3, 0x35, 0xc8, 0xcc}, /* i2c add: 48 */1202{0xb3, 0x02, 0x00, 0xcc},1203{0xb3, 0x03, 0x0a, 0xcc},1204{0xb3, 0x04, 0x05, 0xcc},1205{0xb3, 0x20, 0x00, 0xcc},1206{0xb3, 0x21, 0x00, 0xcc},1207{0xb3, 0x22, 0x01, 0xcc},1208{0xb3, 0x23, 0xe0, 0xcc},1209{0xb3, 0x14, 0x00, 0xcc},1210{0xb3, 0x15, 0x00, 0xcc},1211{0xb3, 0x16, 0x02, 0xcc},1212{0xb3, 0x17, 0x7f, 0xcc},1213{0xb3, 0x00, 0x67, 0xcc},1214{0xb8, 0x00, 0x00, 0xcc},1215{0xbc, 0x00, 0x71, 0xcc},1216{0xbc, 0x01, 0x01, 0xcc},1217{0xb3, 0x5c, 0x01, 0xcc},1218{0xf0, 0x00, 0x02, 0xbb},1219{0x00, 0x00, 0x10, 0xdd},1220{0xc8, 0x00, 0x00, 0xbb},1221{0x00, 0x00, 0x30, 0xdd},1222{0xf0, 0x00, 0x00, 0xbb},1223{0x00, 0x00, 0x10, 0xdd},1224{0x07, 0x00, 0xe0, 0xbb},1225{0x08, 0x00, 0x0b, 0xbb},1226{0x21, 0x00, 0x0c, 0xbb},1227{0x20, 0x01, 0x03, 0xbb}, /* h/v flip */1228{0xbf, 0xc0, 0x26, 0xcc},1229{0xbf, 0xc1, 0x02, 0xcc},1230{0xbf, 0xcc, 0x04, 0xcc},1231{0xb3, 0x01, 0x41, 0xcc},1232{0xf0, 0x00, 0x00, 0xbb},1233{0x05, 0x01, 0x78, 0xbb},1234{0x06, 0x00, 0x11, 0xbb},1235{0x07, 0x01, 0x42, 0xbb},1236{0x08, 0x00, 0x11, 0xbb},1237{0x20, 0x01, 0x03, 0xbb}, /* h/v flip */1238{0x21, 0x80, 0x00, 0xbb},1239{0x22, 0x0d, 0x0f, 0xbb},1240{0x24, 0x80, 0x00, 0xbb},1241{0x59, 0x00, 0xff, 0xbb},1242{0xf0, 0x00, 0x02, 0xbb},1243{0x39, 0x03, 0xca, 0xbb},1244{0x3a, 0x06, 0x80, 0xbb},1245{0x3b, 0x01, 0x52, 0xbb},1246{0x3c, 0x05, 0x40, 0xbb},1247{0x57, 0x01, 0x9c, 0xbb},1248{0x58, 0x01, 0xee, 0xbb},1249{0x59, 0x00, 0xf0, 0xbb},1250{0x5a, 0x01, 0x20, 0xbb},1251{0x5c, 0x1d, 0x17, 0xbb},1252{0x5d, 0x22, 0x1c, 0xbb},1253{0x64, 0x1e, 0x1c, 0xbb},1254{0x5b, 0x00, 0x00, 0xbb},1255{0xf0, 0x00, 0x02, 0xbb},1256{0x22, 0xa0, 0x78, 0xbb},1257{0x23, 0xa0, 0x78, 0xbb},1258{0x24, 0x7f, 0x00, 0xbb},1259{0x28, 0xea, 0x02, 0xbb},1260{0x29, 0x86, 0x7a, 0xbb},1261{0x5e, 0x52, 0x4c, 0xbb},1262{0x5f, 0x20, 0x24, 0xbb},1263{0x60, 0x00, 0x02, 0xbb},1264{0x02, 0x00, 0xee, 0xbb},1265{0x03, 0x39, 0x23, 0xbb},1266{0x04, 0x07, 0x24, 0xbb},1267{0x09, 0x00, 0xc0, 0xbb},1268{0x0a, 0x00, 0x79, 0xbb},1269{0x0b, 0x00, 0x04, 0xbb},1270{0x0c, 0x00, 0x5c, 0xbb},1271{0x0d, 0x00, 0xd9, 0xbb},1272{0x0e, 0x00, 0x53, 0xbb},1273{0x0f, 0x00, 0x21, 0xbb},1274{0x10, 0x00, 0xa4, 0xbb},1275{0x11, 0x00, 0xe5, 0xbb},1276{0x15, 0x00, 0x00, 0xbb},1277{0x16, 0x00, 0x00, 0xbb},1278{0x17, 0x00, 0x00, 0xbb},1279{0x18, 0x00, 0x00, 0xbb},1280{0x19, 0x00, 0x00, 0xbb},1281{0x1a, 0x00, 0x00, 0xbb},1282{0x1b, 0x00, 0x00, 0xbb},1283{0x1c, 0x00, 0x00, 0xbb},1284{0x1d, 0x00, 0x00, 0xbb},1285{0x1e, 0x00, 0x00, 0xbb},1286{0xf0, 0x00, 0x01, 0xbb},1287{0x06, 0xe0, 0x0e, 0xbb},1288{0x06, 0x60, 0x0e, 0xbb},1289{0xb3, 0x5c, 0x01, 0xcc},1290{}1291};1292static const u8 mi1320_soc_InitQVGA[][4] = {1293{0xb3, 0x01, 0x01, 0xcc},1294{0xb0, 0x03, 0x19, 0xcc},1295{0xb0, 0x04, 0x02, 0xcc},1296{0x00, 0x00, 0x30, 0xdd},1297{0xb3, 0x00, 0x64, 0xcc},1298{0xb3, 0x00, 0x67, 0xcc},1299{0xb3, 0x05, 0x01, 0xcc},1300{0xb3, 0x06, 0x01, 0xcc},1301{0xb3, 0x08, 0x01, 0xcc},1302{0xb3, 0x09, 0x0c, 0xcc},1303{0xb3, 0x34, 0x02, 0xcc},1304{0xb3, 0x35, 0xc8, 0xcc},1305{0xb3, 0x02, 0x00, 0xcc},1306{0xb3, 0x03, 0x0a, 0xcc},1307{0xb3, 0x04, 0x05, 0xcc},1308{0xb3, 0x20, 0x00, 0xcc},1309{0xb3, 0x21, 0x00, 0xcc},1310{0xb3, 0x22, 0x01, 0xcc},1311{0xb3, 0x23, 0xe0, 0xcc},1312{0xb3, 0x14, 0x00, 0xcc},1313{0xb3, 0x15, 0x00, 0xcc},1314{0xb3, 0x16, 0x02, 0xcc},1315{0xb3, 0x17, 0x7f, 0xcc},1316{0xb3, 0x00, 0x67, 0xcc},1317{0xb8, 0x00, 0x00, 0xcc},1318{0xbc, 0x00, 0xd1, 0xcc},1319{0xbc, 0x01, 0x01, 0xcc},1320{0xb3, 0x5c, 0x01, 0xcc},1321{0xf0, 0x00, 0x02, 0xbb},1322{0x00, 0x00, 0x10, 0xdd},1323{0xc8, 0x00, 0x00, 0xbb},1324{0x00, 0x00, 0x30, 0xdd},1325{0xf0, 0x00, 0x00, 0xbb},1326{0x00, 0x00, 0x10, 0xdd},1327{0x07, 0x00, 0xe0, 0xbb},1328{0x08, 0x00, 0x0b, 0xbb},1329{0x21, 0x00, 0x0c, 0xbb},1330{0x20, 0x01, 0x03, 0xbb}, /* h/v flip */1331{0xbf, 0xc0, 0x26, 0xcc},1332{0xbf, 0xc1, 0x02, 0xcc},1333{0xbf, 0xcc, 0x04, 0xcc},1334{0xbc, 0x02, 0x18, 0xcc},1335{0xbc, 0x03, 0x50, 0xcc},1336{0xbc, 0x04, 0x18, 0xcc},1337{0xbc, 0x05, 0x00, 0xcc},1338{0xbc, 0x06, 0x00, 0xcc},1339{0xbc, 0x08, 0x30, 0xcc},1340{0xbc, 0x09, 0x40, 0xcc},1341{0xbc, 0x0a, 0x10, 0xcc},1342{0xbc, 0x0b, 0x00, 0xcc},1343{0xbc, 0x0c, 0x00, 0xcc},1344{0xb3, 0x01, 0x41, 0xcc},1345{0xf0, 0x00, 0x00, 0xbb},1346{0x05, 0x01, 0x78, 0xbb},1347{0x06, 0x00, 0x11, 0xbb},1348{0x07, 0x01, 0x42, 0xbb},1349{0x08, 0x00, 0x11, 0xbb},1350{0x20, 0x01, 0x03, 0xbb}, /* h/v flip */1351{0x21, 0x80, 0x00, 0xbb},1352{0x22, 0x0d, 0x0f, 0xbb},1353{0x24, 0x80, 0x00, 0xbb},1354{0x59, 0x00, 0xff, 0xbb},1355{0xf0, 0x00, 0x02, 0xbb},1356{0x39, 0x03, 0xca, 0xbb},1357{0x3a, 0x06, 0x80, 0xbb},1358{0x3b, 0x01, 0x52, 0xbb},1359{0x3c, 0x05, 0x40, 0xbb},1360{0x57, 0x01, 0x9c, 0xbb},1361{0x58, 0x01, 0xee, 0xbb},1362{0x59, 0x00, 0xf0, 0xbb},1363{0x5a, 0x01, 0x20, 0xbb},1364{0x5c, 0x1d, 0x17, 0xbb},1365{0x5d, 0x22, 0x1c, 0xbb},1366{0x64, 0x1e, 0x1c, 0xbb},1367{0x5b, 0x00, 0x00, 0xbb},1368{0xf0, 0x00, 0x02, 0xbb},1369{0x22, 0xa0, 0x78, 0xbb},1370{0x23, 0xa0, 0x78, 0xbb},1371{0x24, 0x7f, 0x00, 0xbb},1372{0x28, 0xea, 0x02, 0xbb},1373{0x29, 0x86, 0x7a, 0xbb},1374{0x5e, 0x52, 0x4c, 0xbb},1375{0x5f, 0x20, 0x24, 0xbb},1376{0x60, 0x00, 0x02, 0xbb},1377{0x02, 0x00, 0xee, 0xbb},1378{0x03, 0x39, 0x23, 0xbb},1379{0x04, 0x07, 0x24, 0xbb},1380{0x09, 0x00, 0xc0, 0xbb},1381{0x0a, 0x00, 0x79, 0xbb},1382{0x0b, 0x00, 0x04, 0xbb},1383{0x0c, 0x00, 0x5c, 0xbb},1384{0x0d, 0x00, 0xd9, 0xbb},1385{0x0e, 0x00, 0x53, 0xbb},1386{0x0f, 0x00, 0x21, 0xbb},1387{0x10, 0x00, 0xa4, 0xbb},1388{0x11, 0x00, 0xe5, 0xbb},1389{0x15, 0x00, 0x00, 0xbb},1390{0x16, 0x00, 0x00, 0xbb},1391{0x17, 0x00, 0x00, 0xbb},1392{0x18, 0x00, 0x00, 0xbb},1393{0x19, 0x00, 0x00, 0xbb},1394{0x1a, 0x00, 0x00, 0xbb},1395{0x1b, 0x00, 0x00, 0xbb},1396{0x1c, 0x00, 0x00, 0xbb},1397{0x1d, 0x00, 0x00, 0xbb},1398{0x1e, 0x00, 0x00, 0xbb},1399{0xf0, 0x00, 0x01, 0xbb},1400{0x06, 0xe0, 0x0e, 0xbb},1401{0x06, 0x60, 0x0e, 0xbb},1402{0xb3, 0x5c, 0x01, 0xcc},1403{}1404};1405static const u8 mi1320_soc_InitSXGA[][4] = {1406{0xb3, 0x01, 0x01, 0xcc},1407{0xb0, 0x03, 0x19, 0xcc},1408{0x00, 0x00, 0x30, 0xdd},1409{0xb3, 0x00, 0x64, 0xcc},1410{0xb3, 0x00, 0x67, 0xcc},1411{0xb3, 0x05, 0x01, 0xcc},1412{0xb3, 0x06, 0x01, 0xcc},1413{0xb3, 0x08, 0x01, 0xcc},1414{0xb3, 0x09, 0x0c, 0xcc},1415{0xb3, 0x34, 0x02, 0xcc},1416{0xb3, 0x35, 0xc8, 0xcc},1417{0xb3, 0x02, 0x00, 0xcc},1418{0xb3, 0x03, 0x0a, 0xcc},1419{0xb3, 0x04, 0x05, 0xcc},1420{0xb3, 0x20, 0x00, 0xcc},1421{0xb3, 0x21, 0x00, 0xcc},1422{0xb3, 0x22, 0x04, 0xcc},1423{0xb3, 0x23, 0x00, 0xcc},1424{0xb3, 0x14, 0x00, 0xcc},1425{0xb3, 0x15, 0x00, 0xcc},1426{0xb3, 0x16, 0x04, 0xcc},1427{0xb3, 0x17, 0xff, 0xcc},1428{0xb3, 0x00, 0x67, 0xcc},1429{0xbc, 0x00, 0x71, 0xcc},1430{0xbc, 0x01, 0x01, 0xcc},1431{0xb3, 0x5c, 0x01, 0xcc},1432{0xf0, 0x00, 0x02, 0xbb},1433{0x00, 0x00, 0x30, 0xdd},1434{0xc8, 0x9f, 0x0b, 0xbb},1435{0x00, 0x00, 0x20, 0xdd},1436{0x5b, 0x00, 0x01, 0xbb},1437{0x00, 0x00, 0x20, 0xdd},1438{0xf0, 0x00, 0x00, 0xbb},1439{0x00, 0x00, 0x30, 0xdd},1440{0x20, 0x01, 0x03, 0xbb}, /* h/v flip */1441{0x00, 0x00, 0x20, 0xdd},1442{0xbf, 0xc0, 0x26, 0xcc},1443{0xbf, 0xc1, 0x02, 0xcc},1444{0xbf, 0xcc, 0x04, 0xcc},1445{0xb3, 0x01, 0x41, 0xcc},1446{0xf0, 0x00, 0x00, 0xbb},1447{0x05, 0x01, 0x78, 0xbb},1448{0x06, 0x00, 0x11, 0xbb},1449{0x07, 0x01, 0x42, 0xbb},1450{0x08, 0x00, 0x11, 0xbb},1451{0x20, 0x01, 0x03, 0xbb}, /* h/v flip */1452{0x21, 0x80, 0x00, 0xbb},1453{0x22, 0x0d, 0x0f, 0xbb},1454{0x24, 0x80, 0x00, 0xbb},1455{0x59, 0x00, 0xff, 0xbb},1456{0xf0, 0x00, 0x02, 0xbb},1457{0x39, 0x03, 0xca, 0xbb},1458{0x3a, 0x06, 0x80, 0xbb},1459{0x3b, 0x01, 0x52, 0xbb},1460{0x3c, 0x05, 0x40, 0xbb},1461{0x57, 0x01, 0x9c, 0xbb},1462{0x58, 0x01, 0xee, 0xbb},1463{0x59, 0x00, 0xf0, 0xbb},1464{0x5a, 0x01, 0x20, 0xbb},1465{0x5c, 0x1d, 0x17, 0xbb},1466{0x5d, 0x22, 0x1c, 0xbb},1467{0x64, 0x1e, 0x1c, 0xbb},1468{0x5b, 0x00, 0x00, 0xbb},1469{0xf0, 0x00, 0x02, 0xbb},1470{0x22, 0xa0, 0x78, 0xbb},1471{0x23, 0xa0, 0x78, 0xbb},1472{0x24, 0x7f, 0x00, 0xbb},1473{0x28, 0xea, 0x02, 0xbb},1474{0x29, 0x86, 0x7a, 0xbb},1475{0x5e, 0x52, 0x4c, 0xbb},1476{0x5f, 0x20, 0x24, 0xbb},1477{0x60, 0x00, 0x02, 0xbb},1478{0x02, 0x00, 0xee, 0xbb},1479{0x03, 0x39, 0x23, 0xbb},1480{0x04, 0x07, 0x24, 0xbb},1481{0x09, 0x00, 0xc0, 0xbb},1482{0x0a, 0x00, 0x79, 0xbb},1483{0x0b, 0x00, 0x04, 0xbb},1484{0x0c, 0x00, 0x5c, 0xbb},1485{0x0d, 0x00, 0xd9, 0xbb},1486{0x0e, 0x00, 0x53, 0xbb},1487{0x0f, 0x00, 0x21, 0xbb},1488{0x10, 0x00, 0xa4, 0xbb},1489{0x11, 0x00, 0xe5, 0xbb},1490{0x15, 0x00, 0x00, 0xbb},1491{0x16, 0x00, 0x00, 0xbb},1492{0x17, 0x00, 0x00, 0xbb},1493{0x18, 0x00, 0x00, 0xbb},1494{0x19, 0x00, 0x00, 0xbb},1495{0x1a, 0x00, 0x00, 0xbb},1496{0x1b, 0x00, 0x00, 0xbb},1497{0x1c, 0x00, 0x00, 0xbb},1498{0x1d, 0x00, 0x00, 0xbb},1499{0x1e, 0x00, 0x00, 0xbb},1500{0xf0, 0x00, 0x01, 0xbb},1501{0x06, 0xe0, 0x0e, 0xbb},1502{0x06, 0x60, 0x0e, 0xbb},1503{0xb3, 0x5c, 0x01, 0xcc},1504{0xf0, 0x00, 0x00, 0xbb},1505{0x05, 0x01, 0x13, 0xbb},1506{0x06, 0x00, 0x11, 0xbb},1507{0x07, 0x00, 0x85, 0xbb},1508{0x08, 0x00, 0x27, 0xbb},1509{0x20, 0x01, 0x03, 0xbb}, /* h/v flip */1510{0x21, 0x80, 0x00, 0xbb},1511{0x22, 0x0d, 0x0f, 0xbb},1512{0x24, 0x80, 0x00, 0xbb},1513{0x59, 0x00, 0xff, 0xbb},1514{0xf0, 0x00, 0x02, 0xbb},1515{0x39, 0x03, 0x0d, 0xbb},1516{0x3a, 0x06, 0x1b, 0xbb},1517{0x3b, 0x00, 0x95, 0xbb},1518{0x3c, 0x04, 0xdb, 0xbb},1519{0x57, 0x02, 0x00, 0xbb},1520{0x58, 0x02, 0x66, 0xbb},1521{0x59, 0x00, 0xff, 0xbb},1522{0x5a, 0x01, 0x33, 0xbb},1523{0x5c, 0x12, 0x0d, 0xbb},1524{0x5d, 0x16, 0x11, 0xbb},1525{0x64, 0x5e, 0x1c, 0xbb},1526{}1527};1528static const u8 po3130_gamma[17] = {15290x00, 0x13, 0x38, 0x59, 0x79, 0x92, 0xa7, 0xb9, 0xc8,15300xd4, 0xdf, 0xe7, 0xee, 0xf4, 0xf9, 0xfc, 0xff1531};1532static const u8 po3130_matrix[9] = {15330x5f, 0xec, 0xf5, 0xf1, 0x5a, 0xf5, 0xf1, 0xec, 0x631534};15351536static const u8 po3130_initVGA_data[][4] = {1537{0xb0, 0x4d, 0x00, 0xcc}, {0xb3, 0x01, 0x01, 0xcc},1538{0x00, 0x00, 0x50, 0xdd}, {0xb0, 0x03, 0x01, 0xcc},1539{0xb3, 0x00, 0x04, 0xcc}, {0xb3, 0x00, 0x24, 0xcc},1540{0xb3, 0x00, 0x25, 0xcc}, {0xb3, 0x08, 0x01, 0xcc},1541{0xb3, 0x09, 0x0c, 0xcc}, {0xb3, 0x05, 0x00, 0xcc},1542{0xb3, 0x06, 0x01, 0xcc}, {0xb3, 0x03, 0x1a, 0xcc},1543{0xb3, 0x04, 0x15, 0xcc}, {0xb3, 0x20, 0x00, 0xcc},1544{0xb3, 0x21, 0x00, 0xcc}, {0xb3, 0x22, 0x01, 0xcc},1545{0xb3, 0x23, 0xe8, 0xcc}, {0xb8, 0x08, 0xe8, 0xcc},1546{0xb3, 0x14, 0x00, 0xcc}, {0xb3, 0x15, 0x00, 0xcc},1547{0xb3, 0x16, 0x02, 0xcc}, {0xb3, 0x17, 0x7f, 0xcc},1548{0xb3, 0x34, 0x01, 0xcc},1549{0xb3, 0x35, 0xf6, 0xcc}, /* i2c add: 76 */1550{0xb3, 0x00, 0x27, 0xcc}, {0xbc, 0x00, 0x71, 0xcc},1551{0xb8, 0x00, 0x21, 0xcc}, {0xb8, 0x27, 0x20, 0xcc},1552{0xb8, 0x01, 0x79, 0xcc}, {0xb8, 0x81, 0x09, 0xcc},1553{0xb8, 0x2c, 0x50, 0xcc}, {0xb8, 0x2d, 0xf8, 0xcc},1554{0xb8, 0x2e, 0xf8, 0xcc}, {0xb8, 0x2f, 0xf8, 0xcc},1555{0xb8, 0x30, 0x50, 0xcc}, {0xb8, 0x31, 0xf8, 0xcc},1556{0xb8, 0x32, 0xf8, 0xcc}, {0xb8, 0x33, 0xf8, 0xcc},1557{0xb8, 0x34, 0x50, 0xcc}, {0xb8, 0x35, 0x00, 0xcc},1558{0xb8, 0x36, 0x00, 0xcc}, {0xb8, 0x37, 0x00, 0xcc},1559{0x00, 0x1e, 0xc6, 0xaa}, {0x00, 0x20, 0x44, 0xaa},1560{0x00, 0xad, 0x02, 0xaa}, {0x00, 0xae, 0x2c, 0xaa},1561{0x00, 0x12, 0x08, 0xaa}, {0x00, 0x17, 0x41, 0xaa},1562{0x00, 0x19, 0x41, 0xaa}, {0x00, 0x1e, 0x06, 0xaa},1563{0x00, 0x21, 0x00, 0xaa}, {0x00, 0x36, 0xc0, 0xaa},1564{0x00, 0x37, 0xc8, 0xaa}, {0x00, 0x3b, 0x36, 0xaa},1565{0x00, 0x4b, 0xfe, 0xaa}, {0x00, 0x51, 0x1c, 0xaa},1566{0x00, 0x52, 0x01, 0xaa}, {0x00, 0x55, 0x0a, 0xaa},1567{0x00, 0x59, 0x02, 0xaa}, {0x00, 0x5a, 0x04, 0xaa},1568{0x00, 0x5c, 0x10, 0xaa}, {0x00, 0x5d, 0x10, 0xaa},1569{0x00, 0x5e, 0x10, 0xaa}, {0x00, 0x5f, 0x10, 0xaa},1570{0x00, 0x61, 0x00, 0xaa}, {0x00, 0x62, 0x18, 0xaa},1571{0x00, 0x63, 0x30, 0xaa}, {0x00, 0x70, 0x68, 0xaa},1572{0x00, 0x80, 0x71, 0xaa}, {0x00, 0x81, 0x08, 0xaa},1573{0x00, 0x82, 0x00, 0xaa}, {0x00, 0x83, 0x55, 0xaa},1574{0x00, 0x84, 0x06, 0xaa}, {0x00, 0x85, 0x06, 0xaa},1575{0x00, 0x86, 0x13, 0xaa}, {0x00, 0x87, 0x18, 0xaa},1576{0x00, 0xaa, 0x3f, 0xaa}, {0x00, 0xab, 0x44, 0xaa},1577{0x00, 0xb0, 0x68, 0xaa}, {0x00, 0xb5, 0x10, 0xaa},1578{0x00, 0xb8, 0x20, 0xaa}, {0x00, 0xb9, 0xa0, 0xaa},1579{0x00, 0xbc, 0x04, 0xaa}, {0x00, 0x8b, 0x40, 0xaa},1580{0x00, 0x8c, 0x91, 0xaa}, {0x00, 0x8d, 0x8f, 0xaa},1581{0x00, 0x8e, 0x91, 0xaa}, {0x00, 0x8f, 0x43, 0xaa},1582{0x00, 0x90, 0x92, 0xaa}, {0x00, 0x91, 0x89, 0xaa},1583{0x00, 0x92, 0x9d, 0xaa}, {0x00, 0x93, 0x46, 0xaa},1584{0x00, 0xd6, 0x22, 0xaa}, {0x00, 0x73, 0x00, 0xaa},1585{0x00, 0x74, 0x10, 0xaa}, {0x00, 0x75, 0x20, 0xaa},1586{0x00, 0x76, 0x2b, 0xaa}, {0x00, 0x77, 0x36, 0xaa},1587{0x00, 0x78, 0x49, 0xaa}, {0x00, 0x79, 0x5a, 0xaa},1588{0x00, 0x7a, 0x7f, 0xaa}, {0x00, 0x7b, 0x9b, 0xaa},1589{0x00, 0x7c, 0xba, 0xaa}, {0x00, 0x7d, 0xd4, 0xaa},1590{0x00, 0x7e, 0xea, 0xaa}, {0x00, 0xd6, 0x62, 0xaa},1591{0x00, 0x73, 0x00, 0xaa}, {0x00, 0x74, 0x10, 0xaa},1592{0x00, 0x75, 0x20, 0xaa}, {0x00, 0x76, 0x2b, 0xaa},1593{0x00, 0x77, 0x36, 0xaa}, {0x00, 0x78, 0x49, 0xaa},1594{0x00, 0x79, 0x5a, 0xaa}, {0x00, 0x7a, 0x7f, 0xaa},1595{0x00, 0x7b, 0x9b, 0xaa}, {0x00, 0x7c, 0xba, 0xaa},1596{0x00, 0x7d, 0xd4, 0xaa}, {0x00, 0x7e, 0xea, 0xaa},1597{0x00, 0xd6, 0xa2, 0xaa}, {0x00, 0x73, 0x00, 0xaa},1598{0x00, 0x74, 0x10, 0xaa}, {0x00, 0x75, 0x20, 0xaa},1599{0x00, 0x76, 0x2b, 0xaa}, {0x00, 0x77, 0x36, 0xaa},1600{0x00, 0x78, 0x49, 0xaa}, {0x00, 0x79, 0x5a, 0xaa},1601{0x00, 0x7a, 0x7f, 0xaa}, {0x00, 0x7b, 0x9b, 0xaa},1602{0x00, 0x7c, 0xba, 0xaa}, {0x00, 0x7d, 0xd4, 0xaa},1603{0x00, 0x7e, 0xea, 0xaa},1604{0x00, 0x4c, 0x07, 0xaa},1605{0x00, 0x4b, 0xe0, 0xaa}, {0x00, 0x4e, 0x77, 0xaa},1606{0x00, 0x59, 0x02, 0xaa}, {0x00, 0x4d, 0x0a, 0xaa},1607/* {0x00, 0xd1, 0x00, 0xaa}, {0x00, 0x20, 0xc4, 0xaa},1608{0xb8, 0x8e, 0x00, 0xcc}, {0xb8, 0x8f, 0xff, 0xcc}, */1609{0x00, 0xd1, 0x3c, 0xaa}, {0x00, 0x20, 0xc4, 0xaa},1610{0xb8, 0x8e, 0x00, 0xcc}, {0xb8, 0x8f, 0xff, 0xcc},1611{0xb8, 0xfe, 0x00, 0xcc}, {0xb8, 0xff, 0x28, 0xcc},1612{0xb9, 0x00, 0x28, 0xcc}, {0xb9, 0x01, 0x28, 0xcc},1613{0xb9, 0x02, 0x28, 0xcc}, {0xb9, 0x03, 0x00, 0xcc},1614{0xb9, 0x04, 0x00, 0xcc}, {0xb9, 0x05, 0x3c, 0xcc},1615{0xb9, 0x06, 0x3c, 0xcc}, {0xb9, 0x07, 0x3c, 0xcc},1616{0xb9, 0x08, 0x3c, 0xcc}, {0x00, 0x05, 0x00, 0xaa},1617{0xb3, 0x5c, 0x00, 0xcc}, {0xb3, 0x01, 0x41, 0xcc},1618{}1619};1620static const u8 po3130_rundata[][4] = {1621{0x00, 0x47, 0x45, 0xaa}, {0x00, 0x48, 0x9b, 0xaa},1622{0x00, 0x49, 0x3a, 0xaa}, {0x00, 0x4a, 0x01, 0xaa},1623{0x00, 0x44, 0x40, 0xaa},1624/* {0x00, 0xd5, 0x7c, 0xaa}, */1625{0x00, 0xad, 0x04, 0xaa}, {0x00, 0xae, 0x00, 0xaa},1626{0x00, 0xb0, 0x78, 0xaa}, {0x00, 0x98, 0x02, 0xaa},1627{0x00, 0x94, 0x25, 0xaa}, {0x00, 0x95, 0x25, 0xaa},1628{0x00, 0x59, 0x68, 0xaa}, {0x00, 0x44, 0x20, 0xaa},1629{0x00, 0x17, 0x50, 0xaa}, {0x00, 0x19, 0x50, 0xaa},1630{0x00, 0xd1, 0x3c, 0xaa}, {0x00, 0xd1, 0x3c, 0xaa},1631{0x00, 0x1e, 0x06, 0xaa}, {0x00, 0x1e, 0x06, 0xaa},1632{}1633};16341635static const u8 po3130_initQVGA_data[][4] = {1636{0xb0, 0x4d, 0x00, 0xcc}, {0xb3, 0x01, 0x01, 0xcc},1637{0x00, 0x00, 0x50, 0xdd}, {0xb0, 0x03, 0x09, 0xcc},1638{0xb3, 0x00, 0x04, 0xcc}, {0xb3, 0x00, 0x24, 0xcc},1639{0xb3, 0x00, 0x25, 0xcc}, {0xb3, 0x08, 0x01, 0xcc},1640{0xb3, 0x09, 0x0c, 0xcc}, {0xb3, 0x05, 0x00, 0xcc},1641{0xb3, 0x06, 0x01, 0xcc}, {0xb3, 0x03, 0x1a, 0xcc},1642{0xb3, 0x04, 0x15, 0xcc}, {0xb3, 0x20, 0x00, 0xcc},1643{0xb3, 0x21, 0x00, 0xcc}, {0xb3, 0x22, 0x01, 0xcc},1644{0xb3, 0x23, 0xe0, 0xcc}, {0xb8, 0x08, 0xe0, 0xcc},1645{0xb3, 0x14, 0x00, 0xcc}, {0xb3, 0x15, 0x00, 0xcc},1646{0xb3, 0x16, 0x02, 0xcc}, {0xb3, 0x17, 0x7f, 0xcc},1647{0xb3, 0x34, 0x01, 0xcc}, {0xb3, 0x35, 0xf6, 0xcc},1648{0xb3, 0x00, 0x27, 0xcc}, {0xbc, 0x00, 0xd1, 0xcc},1649{0xb8, 0x00, 0x21, 0xcc}, {0xb8, 0x27, 0x20, 0xcc},1650{0xb8, 0x01, 0x79, 0xcc}, {0xb8, 0x81, 0x09, 0xcc},1651{0xb8, 0x2c, 0x50, 0xcc}, {0xb8, 0x2d, 0xf8, 0xcc},1652{0xb8, 0x2e, 0xf8, 0xcc}, {0xb8, 0x2f, 0xf8, 0xcc},1653{0xb8, 0x30, 0x50, 0xcc}, {0xb8, 0x31, 0xf8, 0xcc},1654{0xb8, 0x32, 0xf8, 0xcc}, {0xb8, 0x33, 0xf8, 0xcc},1655{0xb8, 0x34, 0x50, 0xcc}, {0xb8, 0x35, 0x00, 0xcc},1656{0xb8, 0x36, 0x00, 0xcc}, {0xb8, 0x37, 0x00, 0xcc},1657{0x00, 0x1e, 0xc6, 0xaa}, {0x00, 0x20, 0x44, 0xaa},1658{0x00, 0xad, 0x02, 0xaa}, {0x00, 0xae, 0x2c, 0xaa},1659{0x00, 0x12, 0x08, 0xaa}, {0x00, 0x17, 0x41, 0xaa},1660{0x00, 0x19, 0x41, 0xaa}, {0x00, 0x1e, 0x06, 0xaa},1661{0x00, 0x21, 0x00, 0xaa}, {0x00, 0x36, 0xc0, 0xaa},1662{0x00, 0x37, 0xc8, 0xaa}, {0x00, 0x3b, 0x36, 0xaa},1663{0x00, 0x4b, 0xfe, 0xaa}, {0x00, 0x51, 0x1c, 0xaa},1664{0x00, 0x52, 0x01, 0xaa}, {0x00, 0x55, 0x0a, 0xaa},1665{0x00, 0x59, 0x6f, 0xaa}, {0x00, 0x5a, 0x04, 0xaa},1666{0x00, 0x5c, 0x10, 0xaa}, {0x00, 0x5d, 0x10, 0xaa},1667{0x00, 0x5e, 0x10, 0xaa}, {0x00, 0x5f, 0x10, 0xaa},1668{0x00, 0x61, 0x00, 0xaa}, {0x00, 0x62, 0x18, 0xaa},1669{0x00, 0x63, 0x30, 0xaa}, {0x00, 0x70, 0x68, 0xaa},1670{0x00, 0x80, 0x71, 0xaa}, {0x00, 0x81, 0x08, 0xaa},1671{0x00, 0x82, 0x00, 0xaa}, {0x00, 0x83, 0x55, 0xaa},1672{0x00, 0x84, 0x06, 0xaa}, {0x00, 0x85, 0x06, 0xaa},1673{0x00, 0x86, 0x13, 0xaa}, {0x00, 0x87, 0x18, 0xaa},1674{0x00, 0xaa, 0x3f, 0xaa}, {0x00, 0xab, 0x44, 0xaa},1675{0x00, 0xb0, 0x68, 0xaa}, {0x00, 0xb5, 0x10, 0xaa},1676{0x00, 0xb8, 0x20, 0xaa}, {0x00, 0xb9, 0xa0, 0xaa},1677{0x00, 0xbc, 0x04, 0xaa}, {0x00, 0x8b, 0x40, 0xaa},1678{0x00, 0x8c, 0x91, 0xaa}, {0x00, 0x8d, 0x8f, 0xaa},1679{0x00, 0x8e, 0x91, 0xaa}, {0x00, 0x8f, 0x43, 0xaa},1680{0x00, 0x90, 0x92, 0xaa}, {0x00, 0x91, 0x89, 0xaa},1681{0x00, 0x92, 0x9d, 0xaa}, {0x00, 0x93, 0x46, 0xaa},1682{0x00, 0xd6, 0x22, 0xaa}, {0x00, 0x73, 0x00, 0xaa},1683{0x00, 0x74, 0x10, 0xaa}, {0x00, 0x75, 0x20, 0xaa},1684{0x00, 0x76, 0x2b, 0xaa}, {0x00, 0x77, 0x36, 0xaa},1685{0x00, 0x78, 0x49, 0xaa}, {0x00, 0x79, 0x5a, 0xaa},1686{0x00, 0x7a, 0x7f, 0xaa}, {0x00, 0x7b, 0x9b, 0xaa},1687{0x00, 0x7c, 0xba, 0xaa}, {0x00, 0x7d, 0xd4, 0xaa},1688{0x00, 0x7e, 0xea, 0xaa}, {0x00, 0xd6, 0x62, 0xaa},1689{0x00, 0x73, 0x00, 0xaa}, {0x00, 0x74, 0x10, 0xaa},1690{0x00, 0x75, 0x20, 0xaa}, {0x00, 0x76, 0x2b, 0xaa},1691{0x00, 0x77, 0x36, 0xaa}, {0x00, 0x78, 0x49, 0xaa},1692{0x00, 0x79, 0x5a, 0xaa}, {0x00, 0x7a, 0x7f, 0xaa},1693{0x00, 0x7b, 0x9b, 0xaa}, {0x00, 0x7c, 0xba, 0xaa},1694{0x00, 0x7d, 0xd4, 0xaa}, {0x00, 0x7e, 0xea, 0xaa},1695{0x00, 0xd6, 0xa2, 0xaa}, {0x00, 0x73, 0x00, 0xaa},1696{0x00, 0x74, 0x10, 0xaa}, {0x00, 0x75, 0x20, 0xaa},1697{0x00, 0x76, 0x2b, 0xaa}, {0x00, 0x77, 0x36, 0xaa},1698{0x00, 0x78, 0x49, 0xaa}, {0x00, 0x79, 0x5a, 0xaa},1699{0x00, 0x7a, 0x7f, 0xaa}, {0x00, 0x7b, 0x9b, 0xaa},1700{0x00, 0x7c, 0xba, 0xaa}, {0x00, 0x7d, 0xd4, 0xaa},1701{0x00, 0x7e, 0xea, 0xaa}, {0x00, 0x4c, 0x07, 0xaa},1702{0x00, 0x4b, 0xe0, 0xaa}, {0x00, 0x4e, 0x77, 0xaa},1703{0x00, 0x59, 0x66, 0xaa}, {0x00, 0x4d, 0x0a, 0xaa},1704{0x00, 0xd1, 0x00, 0xaa}, {0x00, 0x20, 0xc4, 0xaa},1705{0xb8, 0x8e, 0x00, 0xcc}, {0xb8, 0x8f, 0xff, 0xcc},1706{0xb8, 0xfe, 0x00, 0xcc}, {0xb8, 0xff, 0x28, 0xcc},1707{0xb9, 0x00, 0x28, 0xcc}, {0xb9, 0x01, 0x28, 0xcc},1708{0xb9, 0x02, 0x28, 0xcc}, {0xb9, 0x03, 0x00, 0xcc},1709{0xb9, 0x04, 0x00, 0xcc}, {0xb9, 0x05, 0x3c, 0xcc},1710{0xb9, 0x06, 0x3c, 0xcc}, {0xb9, 0x07, 0x3c, 0xcc},1711{0xb9, 0x08, 0x3c, 0xcc}, {0xbc, 0x02, 0x18, 0xcc},1712{0xbc, 0x03, 0x50, 0xcc}, {0xbc, 0x04, 0x18, 0xcc},1713{0xbc, 0x05, 0x00, 0xcc}, {0xbc, 0x06, 0x00, 0xcc},1714{0xbc, 0x08, 0x30, 0xcc}, {0xbc, 0x09, 0x40, 0xcc},1715{0xbc, 0x0a, 0x10, 0xcc}, {0xbc, 0x0b, 0x00, 0xcc},1716{0xbc, 0x0c, 0x00, 0xcc}, {0x00, 0x05, 0x00, 0xaa},1717{0xb3, 0x5c, 0x00, 0xcc}, {0xb3, 0x01, 0x41, 0xcc},1718{}1719};17201721static const u8 hv7131r_gamma[17] = {17220x00, 0x13, 0x38, 0x59, 0x79, 0x92, 0xa7, 0xb9, 0xc8,17230xd4, 0xdf, 0xe7, 0xee, 0xf4, 0xf9, 0xfc, 0xff1724};1725static const u8 hv7131r_matrix[9] = {17260x5f, 0xec, 0xf5, 0xf1, 0x5a, 0xf5, 0xf1, 0xec, 0x631727};1728static const u8 hv7131r_initVGA_data[][4] = {1729{0xb3, 0x01, 0x01, 0xcc},1730{0xb0, 0x03, 0x19, 0xcc},1731{0xb0, 0x04, 0x02, 0xcc},1732{0x00, 0x00, 0x20, 0xdd},1733{0xb3, 0x00, 0x24, 0xcc},1734{0xb3, 0x00, 0x25, 0xcc},1735{0xb3, 0x08, 0x01, 0xcc},1736{0xb3, 0x09, 0x0c, 0xcc},1737{0xb3, 0x05, 0x01, 0xcc},1738{0xb3, 0x06, 0x03, 0xcc},1739{0xb3, 0x01, 0x45, 0xcc},1740{0xb3, 0x03, 0x0b, 0xcc},1741{0xb3, 0x04, 0x05, 0xcc},1742{0xb3, 0x20, 0x00, 0xcc},1743{0xb3, 0x21, 0x00, 0xcc},1744{0xb3, 0x22, 0x01, 0xcc},1745{0xb3, 0x23, 0xe0, 0xcc},1746{0xb3, 0x14, 0x00, 0xcc},1747{0xb3, 0x15, 0x02, 0xcc},1748{0xb3, 0x16, 0x02, 0xcc},1749{0xb3, 0x17, 0x7f, 0xcc},1750{0xb3, 0x34, 0x01, 0xcc},1751{0xb3, 0x35, 0x91, 0xcc}, /* i2c add: 11 */1752{0xb3, 0x00, 0x27, 0xcc},1753{0xbc, 0x00, 0x73, 0xcc},1754{0xb8, 0x00, 0x23, 0xcc},1755{0xb8, 0x2c, 0x50, 0xcc},1756{0xb8, 0x2d, 0xf8, 0xcc},1757{0xb8, 0x2e, 0xf8, 0xcc},1758{0xb8, 0x2f, 0xf8, 0xcc},1759{0xb8, 0x30, 0x50, 0xcc},1760{0xb8, 0x31, 0xf8, 0xcc},1761{0xb8, 0x32, 0xf8, 0xcc},1762{0xb8, 0x33, 0xf8, 0xcc},1763{0xb8, 0x34, 0x58, 0xcc},1764{0xb8, 0x35, 0x00, 0xcc},1765{0xb8, 0x36, 0x00, 0xcc},1766{0xb8, 0x37, 0x00, 0xcc},1767{0xb8, 0x27, 0x20, 0xcc},1768{0xb8, 0x01, 0x7d, 0xcc},1769{0xb8, 0x81, 0x09, 0xcc},1770{0xb3, 0x01, 0x41, 0xcc},1771{0xb8, 0x8e, 0x00, 0xcc},1772{0xb8, 0x8f, 0xff, 0xcc},1773{0x00, 0x01, 0x0c, 0xaa},1774{0x00, 0x14, 0x01, 0xaa},1775{0x00, 0x15, 0xe6, 0xaa},1776{0x00, 0x16, 0x02, 0xaa},1777{0x00, 0x17, 0x86, 0xaa},1778{0x00, 0x23, 0x00, 0xaa},1779{0x00, 0x25, 0x03, 0xaa},1780{0x00, 0x26, 0xa9, 0xaa},1781{0x00, 0x27, 0x80, 0xaa},1782{0x00, 0x30, 0x18, 0xaa},1783{0xb6, 0x00, 0x00, 0xcc},1784{0xb6, 0x03, 0x02, 0xcc},1785{0xb6, 0x02, 0x80, 0xcc},1786{0xb6, 0x05, 0x01, 0xcc},1787{0xb6, 0x04, 0xe0, 0xcc},1788{0xb6, 0x12, 0x78, 0xcc},1789{0xb6, 0x18, 0x02, 0xcc},1790{0xb6, 0x17, 0x58, 0xcc},1791{0xb6, 0x16, 0x00, 0xcc},1792{0xb6, 0x22, 0x12, 0xcc},1793{0xb6, 0x23, 0x0b, 0xcc},1794{0xb3, 0x02, 0x02, 0xcc},1795{0xbf, 0xc0, 0x39, 0xcc},1796{0xbf, 0xc1, 0x04, 0xcc},1797{0xbf, 0xcc, 0x10, 0xcc},1798{0xb6, 0x12, 0xf8, 0xcc},1799{0xb6, 0x13, 0x13, 0xcc},1800{0xb9, 0x12, 0x00, 0xcc},1801{0xb9, 0x13, 0x0a, 0xcc},1802{0xb9, 0x14, 0x0a, 0xcc},1803{0xb9, 0x15, 0x0a, 0xcc},1804{0xb9, 0x16, 0x0a, 0xcc},1805{0xb8, 0x0c, 0x20, 0xcc},1806{0xb8, 0x0d, 0x70, 0xcc},1807{0xb9, 0x18, 0x00, 0xcc},1808{0xb9, 0x19, 0x0f, 0xcc},1809{0xb9, 0x1a, 0x0f, 0xcc},1810{0xb9, 0x1b, 0x0f, 0xcc},1811{0xb9, 0x1c, 0x0f, 0xcc},1812{0xb3, 0x5c, 0x01, 0xcc},1813{}1814};18151816static const u8 hv7131r_initQVGA_data[][4] = {1817{0xb3, 0x01, 0x01, 0xcc},1818{0xb0, 0x03, 0x19, 0xcc},1819{0xb0, 0x04, 0x02, 0xcc},1820{0x00, 0x00, 0x20, 0xdd},1821{0xb3, 0x00, 0x24, 0xcc},1822{0xb3, 0x00, 0x25, 0xcc},1823{0xb3, 0x08, 0x01, 0xcc},1824{0xb3, 0x09, 0x0c, 0xcc},1825{0xb3, 0x05, 0x01, 0xcc},1826{0xb3, 0x06, 0x03, 0xcc},1827{0xb3, 0x01, 0x45, 0xcc},1828{0xb3, 0x03, 0x0b, 0xcc},1829{0xb3, 0x04, 0x05, 0xcc},1830{0xb3, 0x20, 0x00, 0xcc},1831{0xb3, 0x21, 0x00, 0xcc},1832{0xb3, 0x22, 0x01, 0xcc},1833{0xb3, 0x23, 0xe0, 0xcc},1834{0xb3, 0x14, 0x00, 0xcc},1835{0xb3, 0x15, 0x02, 0xcc},1836{0xb3, 0x16, 0x02, 0xcc},1837{0xb3, 0x17, 0x7f, 0xcc},1838{0xb3, 0x34, 0x01, 0xcc},1839{0xb3, 0x35, 0x91, 0xcc},1840{0xb3, 0x00, 0x27, 0xcc},1841{0xbc, 0x00, 0xd3, 0xcc},1842{0xb8, 0x00, 0x23, 0xcc},1843{0xb8, 0x2c, 0x50, 0xcc},1844{0xb8, 0x2d, 0xf8, 0xcc},1845{0xb8, 0x2e, 0xf8, 0xcc},1846{0xb8, 0x2f, 0xf8, 0xcc},1847{0xb8, 0x30, 0x50, 0xcc},1848{0xb8, 0x31, 0xf8, 0xcc},1849{0xb8, 0x32, 0xf8, 0xcc},1850{0xb8, 0x33, 0xf8, 0xcc},1851{0xb8, 0x34, 0x58, 0xcc},1852{0xb8, 0x35, 0x00, 0xcc},1853{0xb8, 0x36, 0x00, 0xcc},1854{0xb8, 0x37, 0x00, 0xcc},1855{0xb8, 0x27, 0x20, 0xcc},1856{0xb8, 0x01, 0x7d, 0xcc},1857{0xb8, 0x81, 0x09, 0xcc},1858{0xb3, 0x01, 0x41, 0xcc},1859{0xb8, 0x8e, 0x00, 0xcc},1860{0xb8, 0x8f, 0xff, 0xcc},1861{0x00, 0x01, 0x0c, 0xaa},1862{0x00, 0x14, 0x01, 0xaa},1863{0x00, 0x15, 0xe6, 0xaa},1864{0x00, 0x16, 0x02, 0xaa},1865{0x00, 0x17, 0x86, 0xaa},1866{0x00, 0x23, 0x00, 0xaa},1867{0x00, 0x25, 0x03, 0xaa},1868{0x00, 0x26, 0xa9, 0xaa},1869{0x00, 0x27, 0x80, 0xaa},1870{0x00, 0x30, 0x18, 0xaa},1871{0xb6, 0x00, 0x00, 0xcc},1872{0xb6, 0x03, 0x01, 0xcc},1873{0xb6, 0x02, 0x40, 0xcc},1874{0xb6, 0x05, 0x00, 0xcc},1875{0xb6, 0x04, 0xf0, 0xcc},1876{0xb6, 0x12, 0x78, 0xcc},1877{0xb6, 0x18, 0x00, 0xcc},1878{0xb6, 0x17, 0x96, 0xcc},1879{0xb6, 0x16, 0x00, 0xcc},1880{0xb6, 0x22, 0x12, 0xcc},1881{0xb6, 0x23, 0x0b, 0xcc},1882{0xb3, 0x02, 0x02, 0xcc},1883{0xbf, 0xc0, 0x39, 0xcc},1884{0xbf, 0xc1, 0x04, 0xcc},1885{0xbf, 0xcc, 0x10, 0xcc},1886{0xbc, 0x02, 0x18, 0xcc},1887{0xbc, 0x03, 0x50, 0xcc},1888{0xbc, 0x04, 0x18, 0xcc},1889{0xbc, 0x05, 0x00, 0xcc},1890{0xbc, 0x06, 0x00, 0xcc},1891{0xbc, 0x08, 0x30, 0xcc},1892{0xbc, 0x09, 0x40, 0xcc},1893{0xbc, 0x0a, 0x10, 0xcc},1894{0xbc, 0x0b, 0x00, 0xcc},1895{0xbc, 0x0c, 0x00, 0xcc},1896{0xb9, 0x12, 0x00, 0xcc},1897{0xb9, 0x13, 0x0a, 0xcc},1898{0xb9, 0x14, 0x0a, 0xcc},1899{0xb9, 0x15, 0x0a, 0xcc},1900{0xb9, 0x16, 0x0a, 0xcc},1901{0xb9, 0x18, 0x00, 0xcc},1902{0xb9, 0x19, 0x0f, 0xcc},1903{0xb8, 0x0c, 0x20, 0xcc},1904{0xb8, 0x0d, 0x70, 0xcc},1905{0xb9, 0x1a, 0x0f, 0xcc},1906{0xb9, 0x1b, 0x0f, 0xcc},1907{0xb9, 0x1c, 0x0f, 0xcc},1908{0xb6, 0x12, 0xf8, 0xcc},1909{0xb6, 0x13, 0x13, 0xcc},1910{0xb3, 0x5c, 0x01, 0xcc},1911{}1912};19131914static const u8 ov7660_gamma[17] = {19150x00, 0x13, 0x38, 0x59, 0x79, 0x92, 0xa7, 0xb9, 0xc8,19160xd4, 0xdf, 0xe7, 0xee, 0xf4, 0xf9, 0xfc, 0xff1917};1918static const u8 ov7660_matrix[9] = {19190x5a, 0xf0, 0xf6, 0xf3, 0x57, 0xf6, 0xf3, 0xef, 0x621920};1921static const u8 ov7660_initVGA_data[][4] = {1922{0xb0, 0x4d, 0x00, 0xcc}, {0xb3, 0x01, 0x01, 0xcc},1923{0x00, 0x00, 0x50, 0xdd},1924{0xb0, 0x03, 0x01, 0xcc},1925{0xb3, 0x00, 0x21, 0xcc}, {0xb3, 0x00, 0x26, 0xcc},1926{0xb3, 0x05, 0x01, 0xcc},1927{0xb3, 0x06, 0x03, 0xcc},1928{0xb3, 0x03, 0x1f, 0xcc}, {0xb3, 0x04, 0x05, 0xcc},1929{0xb3, 0x05, 0x00, 0xcc},1930{0xb3, 0x06, 0x01, 0xcc},1931{0xb3, 0x15, 0x00, 0xcc},/* 0xb315 <-0 href startl */1932{0xb3, 0x16, 0x02, 0xcc}, {0xb3, 0x17, 0x7f, 0xcc},1933{0xb3, 0x21, 0x00, 0xcc},1934{0xb3, 0x23, 0xe0, 0xcc}, {0xb3, 0x1d, 0x01, 0xcc},1935{0xb3, 0x1f, 0x02, 0xcc},1936{0xb3, 0x34, 0x01, 0xcc},1937{0xb3, 0x35, 0xa1, 0xcc}, /* i2c add: 21 */1938{0xb3, 0x00, 0x26, 0xcc},1939{0xb8, 0x00, 0x33, 0xcc}, /* 13 */1940{0xb8, 0x01, 0x7d, 0xcc},1941{0xbc, 0x00, 0x73, 0xcc}, {0xb8, 0x81, 0x09, 0xcc},1942{0xb8, 0x27, 0x20, 0xcc},1943{0xb8, 0x8f, 0x50, 0xcc},1944{0x00, 0x01, 0x80, 0xaa}, {0x00, 0x02, 0x80, 0xaa},1945{0x00, 0x12, 0x80, 0xaa},1946{0x00, 0x12, 0x05, 0xaa},1947{0x00, 0x1e, 0x01, 0xaa}, /* MVFP */1948{0x00, 0x3d, 0x40, 0xaa}, /* 0x3d <-40 gamma 01 */1949{0x00, 0x41, 0x00, 0xaa}, /* edge 00 */1950{0x00, 0x0d, 0x48, 0xaa}, {0x00, 0x0e, 0x04, 0xaa},1951{0x00, 0x13, 0xa7, 0xaa},1952{0x00, 0x40, 0xc1, 0xaa}, {0x00, 0x35, 0x00, 0xaa},1953{0x00, 0x36, 0x00, 0xaa},1954{0x00, 0x3c, 0x68, 0xaa}, {0x00, 0x1b, 0x05, 0xaa},1955{0x00, 0x39, 0x43, 0xaa},1956{0x00, 0x8d, 0xcf, 0xaa},1957{0x00, 0x8b, 0xcc, 0xaa}, {0x00, 0x8c, 0xcc, 0xaa},1958{0x00, 0x0f, 0x62, 0xaa},1959{0x00, 0x35, 0x84, 0xaa},1960{0x00, 0x3b, 0x08, 0xaa}, /* 0 * Nightframe 1/4 + 50Hz -> 0xC8 */1961{0x00, 0x3a, 0x00, 0xaa}, /* mx change yuyv format 00, 04, 01; 08, 0c*/1962{0x00, 0x14, 0x2a, 0xaa}, /* agc ampli */1963{0x00, 0x9e, 0x40, 0xaa}, {0xb8, 0x8f, 0x50, 0xcc},1964{0x00, 0x01, 0x80, 0xaa},1965{0x00, 0x02, 0x80, 0xaa},1966{0xb8, 0xfe, 0x00, 0xcc}, {0xb8, 0xff, 0x28, 0xcc},1967{0xb9, 0x00, 0x28, 0xcc},1968{0xb9, 0x01, 0x28, 0xcc}, {0xb9, 0x02, 0x28, 0xcc},1969{0xb9, 0x03, 0x00, 0xcc},1970{0xb9, 0x04, 0x00, 0xcc},1971{0xb9, 0x05, 0x3c, 0xcc}, {0xb9, 0x06, 0x3c, 0xcc},1972{0xb9, 0x07, 0x3c, 0xcc},1973{0xb9, 0x08, 0x3c, 0xcc},19741975{0xb8, 0x8e, 0x00, 0xcc}, {0xb8, 0x8f, 0xff, 0xcc},19761977{0x00, 0x29, 0x3c, 0xaa}, {0xb3, 0x01, 0x45, 0xcc},1978{}1979};1980static const u8 ov7660_initQVGA_data[][4] = {1981{0xb0, 0x4d, 0x00, 0xcc}, {0xb3, 0x01, 0x01, 0xcc},1982{0x00, 0x00, 0x50, 0xdd}, {0xb0, 0x03, 0x01, 0xcc},1983{0xb3, 0x00, 0x21, 0xcc}, {0xb3, 0x00, 0x26, 0xcc},1984{0xb3, 0x05, 0x01, 0xcc}, {0xb3, 0x06, 0x03, 0xcc},1985{0xb3, 0x03, 0x1f, 0xcc}, {0xb3, 0x04, 0x05, 0xcc},1986{0xb3, 0x05, 0x00, 0xcc}, {0xb3, 0x06, 0x01, 0xcc},1987{0xb3, 0x15, 0x00, 0xcc},/* 0xb315 <-0 href startl */1988{0xb3, 0x16, 0x02, 0xcc}, {0xb3, 0x17, 0x7f, 0xcc},1989{0xb3, 0x21, 0x00, 0xcc},1990{0xb3, 0x23, 0xe0, 0xcc}, {0xb3, 0x1d, 0x01, 0xcc},1991{0xb3, 0x1f, 0x02, 0xcc}, {0xb3, 0x34, 0x01, 0xcc},1992{0xb3, 0x35, 0xa1, 0xcc}, {0xb3, 0x00, 0x26, 0xcc},1993{0xb8, 0x00, 0x33, 0xcc}, /* 13 */1994{0xb8, 0x01, 0x7d, 0xcc},1995/* sizer */1996{0xbc, 0x00, 0xd3, 0xcc},1997{0xb8, 0x81, 0x09, 0xcc}, {0xb8, 0x81, 0x09, 0xcc},1998{0xb8, 0x27, 0x20, 0xcc}, {0xb8, 0x8f, 0x50, 0xcc},1999{0x00, 0x01, 0x80, 0xaa}, {0x00, 0x02, 0x80, 0xaa},2000{0x00, 0x12, 0x80, 0xaa}, {0x00, 0x12, 0x05, 0xaa},2001{0x00, 0x1e, 0x01, 0xaa}, /* MVFP */2002{0x00, 0x3d, 0x40, 0xaa}, /* 0x3d <-40 gamma 01 */2003{0x00, 0x41, 0x00, 0xaa}, /* edge 00 */2004{0x00, 0x0d, 0x48, 0xaa}, {0x00, 0x0e, 0x04, 0xaa},2005{0x00, 0x13, 0xa7, 0xaa},2006{0x00, 0x40, 0xc1, 0xaa}, {0x00, 0x35, 0x00, 0xaa},2007{0x00, 0x36, 0x00, 0xaa},2008{0x00, 0x3c, 0x68, 0xaa}, {0x00, 0x1b, 0x05, 0xaa},2009{0x00, 0x39, 0x43, 0xaa}, {0x00, 0x8d, 0xcf, 0xaa},2010{0x00, 0x8b, 0xcc, 0xaa}, {0x00, 0x8c, 0xcc, 0xaa},2011{0x00, 0x0f, 0x62, 0xaa}, {0x00, 0x35, 0x84, 0xaa},2012{0x00, 0x3b, 0x08, 0xaa}, /* 0 * Nightframe 1/4 + 50Hz -> 0xC8 */2013{0x00, 0x3a, 0x00, 0xaa}, /* mx change yuyv format 00, 04, 01; 08, 0c*/2014{0x00, 0x14, 0x2a, 0xaa}, /* agc ampli */2015{0x00, 0x9e, 0x40, 0xaa}, {0xb8, 0x8f, 0x50, 0xcc},2016{0x00, 0x01, 0x80, 0xaa},2017{0x00, 0x02, 0x80, 0xaa},2018/* sizer filters */2019{0xbc, 0x02, 0x08, 0xcc},2020{0xbc, 0x03, 0x70, 0xcc},2021{0xb8, 0x35, 0x00, 0xcc},2022{0xb8, 0x36, 0x00, 0xcc},2023{0xb8, 0x37, 0x00, 0xcc},2024{0xbc, 0x04, 0x08, 0xcc},2025{0xbc, 0x05, 0x00, 0xcc},2026{0xbc, 0x06, 0x00, 0xcc},2027{0xbc, 0x08, 0x3c, 0xcc},2028{0xbc, 0x09, 0x40, 0xcc},2029{0xbc, 0x0a, 0x04, 0xcc},2030{0xbc, 0x0b, 0x00, 0xcc},2031{0xbc, 0x0c, 0x00, 0xcc},2032/* */2033{0xb8, 0xfe, 0x00, 0xcc},2034{0xb8, 0xff, 0x28, 0xcc},2035/* */2036{0xb9, 0x00, 0x28, 0xcc}, {0xb9, 0x01, 0x28, 0xcc},2037{0xb9, 0x02, 0x28, 0xcc}, {0xb9, 0x03, 0x00, 0xcc},2038{0xb9, 0x04, 0x00, 0xcc}, {0xb9, 0x05, 0x3c, 0xcc},2039{0xb9, 0x06, 0x3c, 0xcc}, {0xb9, 0x07, 0x3c, 0xcc},2040{0xb9, 0x08, 0x3c, 0xcc},2041/* */2042{0xb8, 0x8e, 0x00, 0xcc},2043{0xb8, 0x8f, 0xff, 0xcc}, /* ff */2044{0x00, 0x29, 0x3c, 0xaa},2045{0xb3, 0x01, 0x45, 0xcc}, /* 45 */2046{}2047};20482049static const u8 ov7660_50HZ[][4] = {2050{0x00, 0x3b, 0x08, 0xaa},2051{0x00, 0x9d, 0x40, 0xaa},2052{0x00, 0x13, 0xa7, 0xaa},2053{}2054};20552056static const u8 ov7660_60HZ[][4] = {2057{0x00, 0x3b, 0x00, 0xaa},2058{0x00, 0x9e, 0x40, 0xaa},2059{0x00, 0x13, 0xa7, 0xaa},2060{}2061};20622063static const u8 ov7660_NoFliker[][4] = {2064{0x00, 0x13, 0x87, 0xaa},2065{}2066};20672068static const u8 ov7670_InitVGA[][4] = {2069{0xb3, 0x01, 0x05, 0xcc},2070{0x00, 0x00, 0x30, 0xdd},2071{0xb0, 0x03, 0x19, 0xcc},2072{0x00, 0x00, 0x10, 0xdd},2073{0xb0, 0x04, 0x02, 0xcc},2074{0x00, 0x00, 0x10, 0xdd},2075{0xb3, 0x00, 0x66, 0xcc},2076{0xb3, 0x00, 0x67, 0xcc},2077{0xb0, 0x16, 0x01, 0xcc},2078{0xb3, 0x35, 0xa1, 0xcc}, /* i2c add: 21 */2079{0xb3, 0x34, 0x01, 0xcc},2080{0xb3, 0x05, 0x01, 0xcc},2081{0xb3, 0x06, 0x01, 0xcc},2082{0xb3, 0x08, 0x01, 0xcc},2083{0xb3, 0x09, 0x0c, 0xcc},2084{0xb3, 0x02, 0x02, 0xcc},2085{0xb3, 0x03, 0x1f, 0xcc},2086{0xb3, 0x14, 0x00, 0xcc},2087{0xb3, 0x15, 0x00, 0xcc},2088{0xb3, 0x16, 0x02, 0xcc},2089{0xb3, 0x17, 0x7f, 0xcc},2090{0xb3, 0x04, 0x05, 0xcc},2091{0xb3, 0x20, 0x00, 0xcc},2092{0xb3, 0x21, 0x00, 0xcc},2093{0xb3, 0x22, 0x01, 0xcc},2094{0xb3, 0x23, 0xe0, 0xcc},2095{0xbc, 0x00, 0x41, 0xcc},2096{0xbc, 0x01, 0x01, 0xcc},2097{0x00, 0x12, 0x80, 0xaa},2098{0x00, 0x00, 0x20, 0xdd},2099{0x00, 0x12, 0x00, 0xaa},2100{0x00, 0x11, 0x40, 0xaa},2101{0x00, 0x6b, 0x0a, 0xaa},2102{0x00, 0x3a, 0x04, 0xaa},2103{0x00, 0x40, 0xc0, 0xaa},2104{0x00, 0x8c, 0x00, 0xaa},2105{0x00, 0x7a, 0x29, 0xaa},2106{0x00, 0x7b, 0x0e, 0xaa},2107{0x00, 0x7c, 0x1a, 0xaa},2108{0x00, 0x7d, 0x31, 0xaa},2109{0x00, 0x7e, 0x53, 0xaa},2110{0x00, 0x7f, 0x60, 0xaa},2111{0x00, 0x80, 0x6b, 0xaa},2112{0x00, 0x81, 0x73, 0xaa},2113{0x00, 0x82, 0x7b, 0xaa},2114{0x00, 0x83, 0x82, 0xaa},2115{0x00, 0x84, 0x89, 0xaa},2116{0x00, 0x85, 0x96, 0xaa},2117{0x00, 0x86, 0xa1, 0xaa},2118{0x00, 0x87, 0xb7, 0xaa},2119{0x00, 0x88, 0xcc, 0xaa},2120{0x00, 0x89, 0xe1, 0xaa},2121{0x00, 0x13, 0xe0, 0xaa},2122{0x00, 0x00, 0x00, 0xaa},2123{0x00, 0x10, 0x00, 0xaa},2124{0x00, 0x0d, 0x40, 0xaa},2125{0x00, 0x14, 0x28, 0xaa},2126{0x00, 0xa5, 0x05, 0xaa},2127{0x00, 0xab, 0x07, 0xaa},2128{0x00, 0x24, 0x95, 0xaa},2129{0x00, 0x25, 0x33, 0xaa},2130{0x00, 0x26, 0xe3, 0xaa},2131{0x00, 0x9f, 0x88, 0xaa},2132{0x00, 0xa0, 0x78, 0xaa},2133{0x00, 0x55, 0x90, 0xaa},2134{0x00, 0xa1, 0x03, 0xaa},2135{0x00, 0xa6, 0xe0, 0xaa},2136{0x00, 0xa7, 0xd8, 0xaa},2137{0x00, 0xa8, 0xf0, 0xaa},2138{0x00, 0xa9, 0x90, 0xaa},2139{0x00, 0xaa, 0x14, 0xaa},2140{0x00, 0x13, 0xe5, 0xaa},2141{0x00, 0x0e, 0x61, 0xaa},2142{0x00, 0x0f, 0x4b, 0xaa},2143{0x00, 0x16, 0x02, 0xaa},2144{0x00, 0x1e, 0x07, 0xaa}, /* MVFP */2145{0x00, 0x21, 0x02, 0xaa},2146{0x00, 0x22, 0x91, 0xaa},2147{0x00, 0x29, 0x07, 0xaa},2148{0x00, 0x33, 0x0b, 0xaa},2149{0x00, 0x35, 0x0b, 0xaa},2150{0x00, 0x37, 0x1d, 0xaa},2151{0x00, 0x38, 0x71, 0xaa},2152{0x00, 0x39, 0x2a, 0xaa},2153{0x00, 0x3c, 0x78, 0xaa},2154{0x00, 0x4d, 0x40, 0xaa},2155{0x00, 0x4e, 0x20, 0xaa},2156{0x00, 0x74, 0x19, 0xaa},2157{0x00, 0x8d, 0x4f, 0xaa},2158{0x00, 0x8e, 0x00, 0xaa},2159{0x00, 0x8f, 0x00, 0xaa},2160{0x00, 0x90, 0x00, 0xaa},2161{0x00, 0x91, 0x00, 0xaa},2162{0x00, 0x96, 0x00, 0xaa},2163{0x00, 0x9a, 0x80, 0xaa},2164{0x00, 0xb0, 0x84, 0xaa},2165{0x00, 0xb1, 0x0c, 0xaa},2166{0x00, 0xb2, 0x0e, 0xaa},2167{0x00, 0xb3, 0x82, 0xaa},2168{0x00, 0xb8, 0x0a, 0xaa},2169{0x00, 0x43, 0x14, 0xaa},2170{0x00, 0x44, 0xf0, 0xaa},2171{0x00, 0x45, 0x45, 0xaa},2172{0x00, 0x46, 0x63, 0xaa},2173{0x00, 0x47, 0x2d, 0xaa},2174{0x00, 0x48, 0x46, 0xaa},2175{0x00, 0x59, 0x88, 0xaa},2176{0x00, 0x5a, 0xa0, 0xaa},2177{0x00, 0x5b, 0xc6, 0xaa},2178{0x00, 0x5c, 0x7d, 0xaa},2179{0x00, 0x5d, 0x5f, 0xaa},2180{0x00, 0x5e, 0x19, 0xaa},2181{0x00, 0x6c, 0x0a, 0xaa},2182{0x00, 0x6d, 0x55, 0xaa},2183{0x00, 0x6e, 0x11, 0xaa},2184{0x00, 0x6f, 0x9e, 0xaa},2185{0x00, 0x69, 0x00, 0xaa},2186{0x00, 0x6a, 0x40, 0xaa},2187{0x00, 0x01, 0x40, 0xaa},2188{0x00, 0x02, 0x40, 0xaa},2189{0x00, 0x13, 0xe7, 0xaa},2190{0x00, 0x5f, 0xf0, 0xaa},2191{0x00, 0x60, 0xf0, 0xaa},2192{0x00, 0x61, 0xf0, 0xaa},2193{0x00, 0x27, 0xa0, 0xaa},2194{0x00, 0x28, 0x80, 0xaa},2195{0x00, 0x2c, 0x90, 0xaa},2196{0x00, 0x4f, 0x66, 0xaa},2197{0x00, 0x50, 0x66, 0xaa},2198{0x00, 0x51, 0x00, 0xaa},2199{0x00, 0x52, 0x22, 0xaa},2200{0x00, 0x53, 0x5e, 0xaa},2201{0x00, 0x54, 0x80, 0xaa},2202{0x00, 0x58, 0x9e, 0xaa},2203{0x00, 0x41, 0x08, 0xaa},2204{0x00, 0x3f, 0x00, 0xaa},2205{0x00, 0x75, 0x85, 0xaa},2206{0x00, 0x76, 0xe1, 0xaa},2207{0x00, 0x4c, 0x00, 0xaa},2208{0x00, 0x77, 0x0a, 0xaa},2209{0x00, 0x3d, 0x88, 0xaa},2210{0x00, 0x4b, 0x09, 0xaa},2211{0x00, 0xc9, 0x60, 0xaa},2212{0x00, 0x41, 0x38, 0xaa},2213{0x00, 0x62, 0x30, 0xaa},2214{0x00, 0x63, 0x30, 0xaa},2215{0x00, 0x64, 0x08, 0xaa},2216{0x00, 0x94, 0x07, 0xaa},2217{0x00, 0x95, 0x0b, 0xaa},2218{0x00, 0x65, 0x00, 0xaa},2219{0x00, 0x66, 0x05, 0xaa},2220{0x00, 0x56, 0x50, 0xaa},2221{0x00, 0x34, 0x11, 0xaa},2222{0x00, 0xa4, 0x88, 0xaa},2223{0x00, 0x96, 0x00, 0xaa},2224{0x00, 0x97, 0x30, 0xaa},2225{0x00, 0x98, 0x20, 0xaa},2226{0x00, 0x99, 0x30, 0xaa},2227{0x00, 0x9a, 0x84, 0xaa},2228{0x00, 0x9b, 0x29, 0xaa},2229{0x00, 0x9c, 0x03, 0xaa},2230{0x00, 0x78, 0x04, 0xaa},2231{0x00, 0x79, 0x01, 0xaa},2232{0x00, 0xc8, 0xf0, 0xaa},2233{0x00, 0x79, 0x0f, 0xaa},2234{0x00, 0xc8, 0x00, 0xaa},2235{0x00, 0x79, 0x10, 0xaa},2236{0x00, 0xc8, 0x7e, 0xaa},2237{0x00, 0x79, 0x0a, 0xaa},2238{0x00, 0xc8, 0x80, 0xaa},2239{0x00, 0x79, 0x0b, 0xaa},2240{0x00, 0xc8, 0x01, 0xaa},2241{0x00, 0x79, 0x0c, 0xaa},2242{0x00, 0xc8, 0x0f, 0xaa},2243{0x00, 0x79, 0x0d, 0xaa},2244{0x00, 0xc8, 0x20, 0xaa},2245{0x00, 0x79, 0x09, 0xaa},2246{0x00, 0xc8, 0x80, 0xaa},2247{0x00, 0x79, 0x02, 0xaa},2248{0x00, 0xc8, 0xc0, 0xaa},2249{0x00, 0x79, 0x03, 0xaa},2250{0x00, 0xc8, 0x40, 0xaa},2251{0x00, 0x79, 0x05, 0xaa},2252{0x00, 0xc8, 0x30, 0xaa},2253{0x00, 0x79, 0x26, 0xaa},2254{0x00, 0x11, 0x40, 0xaa},2255{0x00, 0x3a, 0x04, 0xaa},2256{0x00, 0x12, 0x00, 0xaa},2257{0x00, 0x40, 0xc0, 0xaa},2258{0x00, 0x8c, 0x00, 0xaa},2259{0x00, 0x17, 0x14, 0xaa},2260{0x00, 0x18, 0x02, 0xaa},2261{0x00, 0x32, 0x92, 0xaa},2262{0x00, 0x19, 0x02, 0xaa},2263{0x00, 0x1a, 0x7a, 0xaa},2264{0x00, 0x03, 0x0a, 0xaa},2265{0x00, 0x0c, 0x00, 0xaa},2266{0x00, 0x3e, 0x00, 0xaa},2267{0x00, 0x70, 0x3a, 0xaa},2268{0x00, 0x71, 0x35, 0xaa},2269{0x00, 0x72, 0x11, 0xaa},2270{0x00, 0x73, 0xf0, 0xaa},2271{0x00, 0xa2, 0x02, 0xaa},2272{0x00, 0xb1, 0x00, 0xaa},2273{0x00, 0xb1, 0x0c, 0xaa},2274{0x00, 0x1e, 0x37, 0xaa}, /* MVFP */2275{0x00, 0xaa, 0x14, 0xaa},2276{0x00, 0x24, 0x80, 0xaa},2277{0x00, 0x25, 0x74, 0xaa},2278{0x00, 0x26, 0xd3, 0xaa},2279{0x00, 0x0d, 0x00, 0xaa},2280{0x00, 0x14, 0x18, 0xaa},2281{0x00, 0x9d, 0x99, 0xaa},2282{0x00, 0x9e, 0x7f, 0xaa},2283{0x00, 0x64, 0x08, 0xaa},2284{0x00, 0x94, 0x07, 0xaa},2285{0x00, 0x95, 0x06, 0xaa},2286{0x00, 0x66, 0x05, 0xaa},2287{0x00, 0x41, 0x08, 0xaa},2288{0x00, 0x3f, 0x00, 0xaa},2289{0x00, 0x75, 0x07, 0xaa},2290{0x00, 0x76, 0xe1, 0xaa},2291{0x00, 0x4c, 0x00, 0xaa},2292{0x00, 0x77, 0x00, 0xaa},2293{0x00, 0x3d, 0xc2, 0xaa},2294{0x00, 0x4b, 0x09, 0xaa},2295{0x00, 0xc9, 0x60, 0xaa},2296{0x00, 0x41, 0x38, 0xaa},2297{0xbf, 0xc0, 0x26, 0xcc},2298{0xbf, 0xc1, 0x02, 0xcc},2299{0xbf, 0xcc, 0x04, 0xcc},2300{0xb3, 0x5c, 0x01, 0xcc},2301{0xb3, 0x01, 0x45, 0xcc},2302{0x00, 0x77, 0x05, 0xaa},2303{},2304};23052306static const u8 ov7670_InitQVGA[][4] = {2307{0xb3, 0x01, 0x05, 0xcc},2308{0x00, 0x00, 0x30, 0xdd},2309{0xb0, 0x03, 0x19, 0xcc},2310{0x00, 0x00, 0x10, 0xdd},2311{0xb0, 0x04, 0x02, 0xcc},2312{0x00, 0x00, 0x10, 0xdd},2313{0xb3, 0x00, 0x66, 0xcc},2314{0xb3, 0x00, 0x67, 0xcc},2315{0xb0, 0x16, 0x01, 0xcc},2316{0xb3, 0x35, 0xa1, 0xcc}, /* i2c add: 21 */2317{0xb3, 0x34, 0x01, 0xcc},2318{0xb3, 0x05, 0x01, 0xcc},2319{0xb3, 0x06, 0x01, 0xcc},2320{0xb3, 0x08, 0x01, 0xcc},2321{0xb3, 0x09, 0x0c, 0xcc},2322{0xb3, 0x02, 0x02, 0xcc},2323{0xb3, 0x03, 0x1f, 0xcc},2324{0xb3, 0x14, 0x00, 0xcc},2325{0xb3, 0x15, 0x00, 0xcc},2326{0xb3, 0x16, 0x02, 0xcc},2327{0xb3, 0x17, 0x7f, 0xcc},2328{0xb3, 0x04, 0x05, 0xcc},2329{0xb3, 0x20, 0x00, 0xcc},2330{0xb3, 0x21, 0x00, 0xcc},2331{0xb3, 0x22, 0x01, 0xcc},2332{0xb3, 0x23, 0xe0, 0xcc},2333{0xbc, 0x00, 0xd1, 0xcc},2334{0xbc, 0x01, 0x01, 0xcc},2335{0x00, 0x12, 0x80, 0xaa},2336{0x00, 0x00, 0x20, 0xdd},2337{0x00, 0x12, 0x00, 0xaa},2338{0x00, 0x11, 0x40, 0xaa},2339{0x00, 0x6b, 0x0a, 0xaa},2340{0x00, 0x3a, 0x04, 0xaa},2341{0x00, 0x40, 0xc0, 0xaa},2342{0x00, 0x8c, 0x00, 0xaa},2343{0x00, 0x7a, 0x29, 0xaa},2344{0x00, 0x7b, 0x0e, 0xaa},2345{0x00, 0x7c, 0x1a, 0xaa},2346{0x00, 0x7d, 0x31, 0xaa},2347{0x00, 0x7e, 0x53, 0xaa},2348{0x00, 0x7f, 0x60, 0xaa},2349{0x00, 0x80, 0x6b, 0xaa},2350{0x00, 0x81, 0x73, 0xaa},2351{0x00, 0x82, 0x7b, 0xaa},2352{0x00, 0x83, 0x82, 0xaa},2353{0x00, 0x84, 0x89, 0xaa},2354{0x00, 0x85, 0x96, 0xaa},2355{0x00, 0x86, 0xa1, 0xaa},2356{0x00, 0x87, 0xb7, 0xaa},2357{0x00, 0x88, 0xcc, 0xaa},2358{0x00, 0x89, 0xe1, 0xaa},2359{0x00, 0x13, 0xe0, 0xaa},2360{0x00, 0x00, 0x00, 0xaa},2361{0x00, 0x10, 0x00, 0xaa},2362{0x00, 0x0d, 0x40, 0xaa},2363{0x00, 0x14, 0x28, 0xaa},2364{0x00, 0xa5, 0x05, 0xaa},2365{0x00, 0xab, 0x07, 0xaa},2366{0x00, 0x24, 0x95, 0xaa},2367{0x00, 0x25, 0x33, 0xaa},2368{0x00, 0x26, 0xe3, 0xaa},2369{0x00, 0x9f, 0x88, 0xaa},2370{0x00, 0xa0, 0x78, 0xaa},2371{0x00, 0x55, 0x90, 0xaa},2372{0x00, 0xa1, 0x03, 0xaa},2373{0x00, 0xa6, 0xe0, 0xaa},2374{0x00, 0xa7, 0xd8, 0xaa},2375{0x00, 0xa8, 0xf0, 0xaa},2376{0x00, 0xa9, 0x90, 0xaa},2377{0x00, 0xaa, 0x14, 0xaa},2378{0x00, 0x13, 0xe5, 0xaa},2379{0x00, 0x0e, 0x61, 0xaa},2380{0x00, 0x0f, 0x4b, 0xaa},2381{0x00, 0x16, 0x02, 0xaa},2382{0x00, 0x1e, 0x07, 0xaa}, /* MVFP */2383{0x00, 0x21, 0x02, 0xaa},2384{0x00, 0x22, 0x91, 0xaa},2385{0x00, 0x29, 0x07, 0xaa},2386{0x00, 0x33, 0x0b, 0xaa},2387{0x00, 0x35, 0x0b, 0xaa},2388{0x00, 0x37, 0x1d, 0xaa},2389{0x00, 0x38, 0x71, 0xaa},2390{0x00, 0x39, 0x2a, 0xaa},2391{0x00, 0x3c, 0x78, 0xaa},2392{0x00, 0x4d, 0x40, 0xaa},2393{0x00, 0x4e, 0x20, 0xaa},2394{0x00, 0x74, 0x19, 0xaa},2395{0x00, 0x8d, 0x4f, 0xaa},2396{0x00, 0x8e, 0x00, 0xaa},2397{0x00, 0x8f, 0x00, 0xaa},2398{0x00, 0x90, 0x00, 0xaa},2399{0x00, 0x91, 0x00, 0xaa},2400{0x00, 0x96, 0x00, 0xaa},2401{0x00, 0x9a, 0x80, 0xaa},2402{0x00, 0xb0, 0x84, 0xaa},2403{0x00, 0xb1, 0x0c, 0xaa},2404{0x00, 0xb2, 0x0e, 0xaa},2405{0x00, 0xb3, 0x82, 0xaa},2406{0x00, 0xb8, 0x0a, 0xaa},2407{0x00, 0x43, 0x14, 0xaa},2408{0x00, 0x44, 0xf0, 0xaa},2409{0x00, 0x45, 0x45, 0xaa},2410{0x00, 0x46, 0x63, 0xaa},2411{0x00, 0x47, 0x2d, 0xaa},2412{0x00, 0x48, 0x46, 0xaa},2413{0x00, 0x59, 0x88, 0xaa},2414{0x00, 0x5a, 0xa0, 0xaa},2415{0x00, 0x5b, 0xc6, 0xaa},2416{0x00, 0x5c, 0x7d, 0xaa},2417{0x00, 0x5d, 0x5f, 0xaa},2418{0x00, 0x5e, 0x19, 0xaa},2419{0x00, 0x6c, 0x0a, 0xaa},2420{0x00, 0x6d, 0x55, 0xaa},2421{0x00, 0x6e, 0x11, 0xaa},2422{0x00, 0x6f, 0x9e, 0xaa},2423{0x00, 0x69, 0x00, 0xaa},2424{0x00, 0x6a, 0x40, 0xaa},2425{0x00, 0x01, 0x40, 0xaa},2426{0x00, 0x02, 0x40, 0xaa},2427{0x00, 0x13, 0xe7, 0xaa},2428{0x00, 0x5f, 0xf0, 0xaa},2429{0x00, 0x60, 0xf0, 0xaa},2430{0x00, 0x61, 0xf0, 0xaa},2431{0x00, 0x27, 0xa0, 0xaa},2432{0x00, 0x28, 0x80, 0xaa},2433{0x00, 0x2c, 0x90, 0xaa},2434{0x00, 0x4f, 0x66, 0xaa},2435{0x00, 0x50, 0x66, 0xaa},2436{0x00, 0x51, 0x00, 0xaa},2437{0x00, 0x52, 0x22, 0xaa},2438{0x00, 0x53, 0x5e, 0xaa},2439{0x00, 0x54, 0x80, 0xaa},2440{0x00, 0x58, 0x9e, 0xaa},2441{0x00, 0x41, 0x08, 0xaa},2442{0x00, 0x3f, 0x00, 0xaa},2443{0x00, 0x75, 0x85, 0xaa},2444{0x00, 0x76, 0xe1, 0xaa},2445{0x00, 0x4c, 0x00, 0xaa},2446{0x00, 0x77, 0x0a, 0xaa},2447{0x00, 0x3d, 0x88, 0xaa},2448{0x00, 0x4b, 0x09, 0xaa},2449{0x00, 0xc9, 0x60, 0xaa},2450{0x00, 0x41, 0x38, 0xaa},2451{0x00, 0x62, 0x30, 0xaa},2452{0x00, 0x63, 0x30, 0xaa},2453{0x00, 0x64, 0x08, 0xaa},2454{0x00, 0x94, 0x07, 0xaa},2455{0x00, 0x95, 0x0b, 0xaa},2456{0x00, 0x65, 0x00, 0xaa},2457{0x00, 0x66, 0x05, 0xaa},2458{0x00, 0x56, 0x50, 0xaa},2459{0x00, 0x34, 0x11, 0xaa},2460{0x00, 0xa4, 0x88, 0xaa},2461{0x00, 0x96, 0x00, 0xaa},2462{0x00, 0x97, 0x30, 0xaa},2463{0x00, 0x98, 0x20, 0xaa},2464{0x00, 0x99, 0x30, 0xaa},2465{0x00, 0x9a, 0x84, 0xaa},2466{0x00, 0x9b, 0x29, 0xaa},2467{0x00, 0x9c, 0x03, 0xaa},2468{0x00, 0x78, 0x04, 0xaa},2469{0x00, 0x79, 0x01, 0xaa},2470{0x00, 0xc8, 0xf0, 0xaa},2471{0x00, 0x79, 0x0f, 0xaa},2472{0x00, 0xc8, 0x00, 0xaa},2473{0x00, 0x79, 0x10, 0xaa},2474{0x00, 0xc8, 0x7e, 0xaa},2475{0x00, 0x79, 0x0a, 0xaa},2476{0x00, 0xc8, 0x80, 0xaa},2477{0x00, 0x79, 0x0b, 0xaa},2478{0x00, 0xc8, 0x01, 0xaa},2479{0x00, 0x79, 0x0c, 0xaa},2480{0x00, 0xc8, 0x0f, 0xaa},2481{0x00, 0x79, 0x0d, 0xaa},2482{0x00, 0xc8, 0x20, 0xaa},2483{0x00, 0x79, 0x09, 0xaa},2484{0x00, 0xc8, 0x80, 0xaa},2485{0x00, 0x79, 0x02, 0xaa},2486{0x00, 0xc8, 0xc0, 0xaa},2487{0x00, 0x79, 0x03, 0xaa},2488{0x00, 0xc8, 0x40, 0xaa},2489{0x00, 0x79, 0x05, 0xaa},2490{0x00, 0xc8, 0x30, 0xaa},2491{0x00, 0x79, 0x26, 0xaa},2492{0x00, 0x11, 0x40, 0xaa},2493{0x00, 0x3a, 0x04, 0xaa},2494{0x00, 0x12, 0x00, 0xaa},2495{0x00, 0x40, 0xc0, 0xaa},2496{0x00, 0x8c, 0x00, 0xaa},2497{0x00, 0x17, 0x14, 0xaa},2498{0x00, 0x18, 0x02, 0xaa},2499{0x00, 0x32, 0x92, 0xaa},2500{0x00, 0x19, 0x02, 0xaa},2501{0x00, 0x1a, 0x7a, 0xaa},2502{0x00, 0x03, 0x0a, 0xaa},2503{0x00, 0x0c, 0x00, 0xaa},2504{0x00, 0x3e, 0x00, 0xaa},2505{0x00, 0x70, 0x3a, 0xaa},2506{0x00, 0x71, 0x35, 0xaa},2507{0x00, 0x72, 0x11, 0xaa},2508{0x00, 0x73, 0xf0, 0xaa},2509{0x00, 0xa2, 0x02, 0xaa},2510{0x00, 0xb1, 0x00, 0xaa},2511{0x00, 0xb1, 0x0c, 0xaa},2512{0x00, 0x1e, 0x37, 0xaa}, /* MVFP */2513{0x00, 0xaa, 0x14, 0xaa},2514{0x00, 0x24, 0x80, 0xaa},2515{0x00, 0x25, 0x74, 0xaa},2516{0x00, 0x26, 0xd3, 0xaa},2517{0x00, 0x0d, 0x00, 0xaa},2518{0x00, 0x14, 0x18, 0xaa},2519{0x00, 0x9d, 0x99, 0xaa},2520{0x00, 0x9e, 0x7f, 0xaa},2521{0x00, 0x64, 0x08, 0xaa},2522{0x00, 0x94, 0x07, 0xaa},2523{0x00, 0x95, 0x06, 0xaa},2524{0x00, 0x66, 0x05, 0xaa},2525{0x00, 0x41, 0x08, 0xaa},2526{0x00, 0x3f, 0x00, 0xaa},2527{0x00, 0x75, 0x07, 0xaa},2528{0x00, 0x76, 0xe1, 0xaa},2529{0x00, 0x4c, 0x00, 0xaa},2530{0x00, 0x77, 0x00, 0xaa},2531{0x00, 0x3d, 0xc2, 0xaa},2532{0x00, 0x4b, 0x09, 0xaa},2533{0x00, 0xc9, 0x60, 0xaa},2534{0x00, 0x41, 0x38, 0xaa},2535{0xbc, 0x02, 0x18, 0xcc},2536{0xbc, 0x03, 0x50, 0xcc},2537{0xbc, 0x04, 0x18, 0xcc},2538{0xbc, 0x05, 0x00, 0xcc},2539{0xbc, 0x06, 0x00, 0xcc},2540{0xbc, 0x08, 0x30, 0xcc},2541{0xbc, 0x09, 0x40, 0xcc},2542{0xbc, 0x0a, 0x10, 0xcc},2543{0xbc, 0x0b, 0x00, 0xcc},2544{0xbc, 0x0c, 0x00, 0xcc},2545{0xbf, 0xc0, 0x26, 0xcc},2546{0xbf, 0xc1, 0x02, 0xcc},2547{0xbf, 0xcc, 0x04, 0xcc},2548{0xb3, 0x5c, 0x01, 0xcc},2549{0xb3, 0x01, 0x45, 0xcc},2550{0x00, 0x77, 0x05, 0xaa},2551{},2552};25532554/* PO1200 - values from usbvm326.inf and ms-win trace */2555static const u8 po1200_gamma[17] = {25560x00, 0x13, 0x38, 0x59, 0x79, 0x92, 0xa7, 0xb9, 0xc8,25570xd4, 0xdf, 0xe7, 0xee, 0xf4, 0xf9, 0xfc, 0xff2558};2559static const u8 po1200_matrix[9] = {25600x60, 0xf9, 0xe5, 0xe7, 0x50, 0x05, 0xf3, 0xe6, 0x5e2561};2562static const u8 po1200_initVGA_data[][4] = {2563{0xb0, 0x03, 0x19, 0xcc}, /* reset? */2564{0xb0, 0x03, 0x19, 0xcc},2565/* {0x00, 0x00, 0x33, 0xdd}, */2566{0xb0, 0x04, 0x02, 0xcc},2567{0xb0, 0x02, 0x02, 0xcc},2568{0xb3, 0x5d, 0x00, 0xcc},2569{0xb3, 0x01, 0x01, 0xcc},2570{0xb3, 0x00, 0x64, 0xcc},2571{0xb3, 0x00, 0x65, 0xcc},2572{0xb3, 0x05, 0x01, 0xcc},2573{0xb3, 0x06, 0x01, 0xcc},2574{0xb3, 0x5c, 0x01, 0xcc},2575{0xb3, 0x08, 0x01, 0xcc},2576{0xb3, 0x09, 0x0c, 0xcc},2577{0xb3, 0x00, 0x67, 0xcc},2578{0xb3, 0x02, 0xb2, 0xcc},2579{0xb3, 0x03, 0x18, 0xcc},2580{0xb3, 0x04, 0x15, 0xcc},2581{0xb3, 0x20, 0x00, 0xcc},2582{0xb3, 0x21, 0x00, 0xcc},2583{0xb3, 0x22, 0x02, 0xcc},2584{0xb3, 0x23, 0x58, 0xcc},2585{0xb3, 0x14, 0x00, 0xcc},2586{0xb3, 0x15, 0x00, 0xcc},2587{0xb3, 0x16, 0x03, 0xcc},2588{0xb3, 0x17, 0x1f, 0xcc},2589{0xbc, 0x00, 0x71, 0xcc},2590{0xbc, 0x01, 0x01, 0xcc},2591{0xb0, 0x54, 0x13, 0xcc},2592{0xb3, 0x00, 0x67, 0xcc},2593{0xb3, 0x34, 0x01, 0xcc},2594{0xb3, 0x35, 0xdc, 0xcc}, /* i2c add: 5c */2595{0x00, 0x03, 0x00, 0xaa},2596{0x00, 0x12, 0x05, 0xaa},2597{0x00, 0x13, 0x02, 0xaa},2598{0x00, 0x1e, 0xc6, 0xaa}, /* h/v flip */2599{0x00, 0x21, 0x00, 0xaa},2600{0x00, 0x25, 0x02, 0xaa},2601{0x00, 0x3c, 0x4f, 0xaa},2602{0x00, 0x3f, 0xe0, 0xaa},2603{0x00, 0x42, 0xff, 0xaa},2604{0x00, 0x45, 0x34, 0xaa},2605{0x00, 0x55, 0xfe, 0xaa},2606{0x00, 0x59, 0xd3, 0xaa},2607{0x00, 0x5e, 0x04, 0xaa},2608{0x00, 0x61, 0xb8, 0xaa}, /* sharpness */2609{0x00, 0x62, 0x02, 0xaa},2610{0x00, 0xa7, 0x31, 0xaa},2611{0x00, 0xa9, 0x66, 0xaa},2612{0x00, 0xb0, 0x00, 0xaa},2613{0x00, 0xb1, 0x00, 0xaa},2614{0x00, 0xb3, 0x11, 0xaa},2615{0x00, 0xb6, 0x26, 0xaa},2616{0x00, 0xb7, 0x20, 0xaa},2617{0x00, 0xba, 0x04, 0xaa},2618{0x00, 0x88, 0x42, 0xaa},2619{0x00, 0x89, 0x9a, 0xaa},2620{0x00, 0x8a, 0x88, 0xaa},2621{0x00, 0x8b, 0x8e, 0xaa},2622{0x00, 0x8c, 0x3e, 0xaa},2623{0x00, 0x8d, 0x90, 0xaa},2624{0x00, 0x8e, 0x87, 0xaa},2625{0x00, 0x8f, 0x96, 0xaa},2626{0x00, 0x90, 0x3d, 0xaa},2627{0x00, 0x64, 0x00, 0xaa},2628{0x00, 0x65, 0x10, 0xaa},2629{0x00, 0x66, 0x20, 0xaa},2630{0x00, 0x67, 0x2b, 0xaa},2631{0x00, 0x68, 0x36, 0xaa},2632{0x00, 0x69, 0x49, 0xaa},2633{0x00, 0x6a, 0x5a, 0xaa},2634{0x00, 0x6b, 0x7f, 0xaa},2635{0x00, 0x6c, 0x9b, 0xaa},2636{0x00, 0x6d, 0xba, 0xaa},2637{0x00, 0x6e, 0xd4, 0xaa},2638{0x00, 0x6f, 0xea, 0xaa},2639{0x00, 0x70, 0x00, 0xaa},2640{0x00, 0x71, 0x10, 0xaa},2641{0x00, 0x72, 0x20, 0xaa},2642{0x00, 0x73, 0x2b, 0xaa},2643{0x00, 0x74, 0x36, 0xaa},2644{0x00, 0x75, 0x49, 0xaa},2645{0x00, 0x76, 0x5a, 0xaa},2646{0x00, 0x77, 0x7f, 0xaa},2647{0x00, 0x78, 0x9b, 0xaa},2648{0x00, 0x79, 0xba, 0xaa},2649{0x00, 0x7a, 0xd4, 0xaa},2650{0x00, 0x7b, 0xea, 0xaa},2651{0x00, 0x7c, 0x00, 0xaa},2652{0x00, 0x7d, 0x10, 0xaa},2653{0x00, 0x7e, 0x20, 0xaa},2654{0x00, 0x7f, 0x2b, 0xaa},2655{0x00, 0x80, 0x36, 0xaa},2656{0x00, 0x81, 0x49, 0xaa},2657{0x00, 0x82, 0x5a, 0xaa},2658{0x00, 0x83, 0x7f, 0xaa},2659{0x00, 0x84, 0x9b, 0xaa},2660{0x00, 0x85, 0xba, 0xaa},2661{0x00, 0x86, 0xd4, 0xaa},2662{0x00, 0x87, 0xea, 0xaa},2663{0x00, 0x57, 0x2a, 0xaa},2664{0x00, 0x03, 0x01, 0xaa},2665{0x00, 0x04, 0x10, 0xaa},2666{0x00, 0x05, 0x10, 0xaa},2667{0x00, 0x06, 0x10, 0xaa},2668{0x00, 0x07, 0x10, 0xaa},2669{0x00, 0x08, 0x13, 0xaa},2670{0x00, 0x0a, 0x00, 0xaa},2671{0x00, 0x0b, 0x10, 0xaa},2672{0x00, 0x0c, 0x20, 0xaa},2673{0x00, 0x0d, 0x18, 0xaa},2674{0x00, 0x22, 0x01, 0xaa},2675{0x00, 0x23, 0x60, 0xaa},2676{0x00, 0x25, 0x08, 0xaa},2677{0x00, 0x26, 0x82, 0xaa},2678{0x00, 0x2e, 0x0f, 0xaa},2679{0x00, 0x2f, 0x1e, 0xaa},2680{0x00, 0x30, 0x2d, 0xaa},2681{0x00, 0x31, 0x3c, 0xaa},2682{0x00, 0x32, 0x4b, 0xaa},2683{0x00, 0x33, 0x5a, 0xaa},2684{0x00, 0x34, 0x69, 0xaa},2685{0x00, 0x35, 0x78, 0xaa},2686{0x00, 0x36, 0x87, 0xaa},2687{0x00, 0x37, 0x96, 0xaa},2688{0x00, 0x38, 0xa5, 0xaa},2689{0x00, 0x39, 0xb4, 0xaa},2690{0x00, 0x3a, 0xc3, 0xaa},2691{0x00, 0x3b, 0xd2, 0xaa},2692{0x00, 0x3c, 0xe1, 0xaa},2693{0x00, 0x3e, 0xff, 0xaa},2694{0x00, 0x3f, 0xff, 0xaa},2695{0x00, 0x40, 0xff, 0xaa},2696{0x00, 0x41, 0xff, 0xaa},2697{0x00, 0x42, 0xff, 0xaa},2698{0x00, 0x43, 0xff, 0xaa},2699{0x00, 0x03, 0x00, 0xaa},2700{0x00, 0x03, 0x00, 0xaa},2701{0x00, 0x20, 0xc4, 0xaa},2702{0x00, 0x13, 0x03, 0xaa},2703{0x00, 0x3c, 0x50, 0xaa},2704{0x00, 0x61, 0x6a, 0xaa}, /* sharpness? */2705{0x00, 0x51, 0x5b, 0xaa},2706{0x00, 0x52, 0x91, 0xaa},2707{0x00, 0x53, 0x4c, 0xaa},2708{0x00, 0x54, 0x50, 0xaa},2709{0x00, 0x56, 0x02, 0xaa},2710{0xb6, 0x00, 0x00, 0xcc},2711{0xb6, 0x03, 0x03, 0xcc},2712{0xb6, 0x02, 0x20, 0xcc},2713{0xb6, 0x05, 0x02, 0xcc},2714{0xb6, 0x04, 0x58, 0xcc},2715{0xb6, 0x12, 0xf8, 0xcc},2716{0xb6, 0x13, 0x21, 0xcc},2717{0xb6, 0x18, 0x03, 0xcc},2718{0xb6, 0x17, 0xa9, 0xcc},2719{0xb6, 0x16, 0x80, 0xcc},2720{0xb6, 0x22, 0x12, 0xcc},2721{0xb6, 0x23, 0x0b, 0xcc},2722{0xbf, 0xc0, 0x39, 0xcc},2723{0xbf, 0xc1, 0x04, 0xcc},2724{0xbf, 0xcc, 0x00, 0xcc},2725{0xb8, 0x06, 0x20, 0xcc},2726{0xb8, 0x07, 0x03, 0xcc},2727{0xb8, 0x08, 0x58, 0xcc},2728{0xb8, 0x09, 0x02, 0xcc},2729{0xb3, 0x01, 0x41, 0xcc},2730{0x00, 0x03, 0x00, 0xaa},2731{0x00, 0xd9, 0x0f, 0xaa},2732{0x00, 0xda, 0xaa, 0xaa},2733{0x00, 0xd9, 0x10, 0xaa},2734{0x00, 0xda, 0xaa, 0xaa},2735{0x00, 0xd9, 0x11, 0xaa},2736{0x00, 0xda, 0x00, 0xaa},2737{0x00, 0xd9, 0x12, 0xaa},2738{0x00, 0xda, 0xff, 0xaa},2739{0x00, 0xd9, 0x13, 0xaa},2740{0x00, 0xda, 0xff, 0xaa},2741{0x00, 0xe8, 0x11, 0xaa},2742{0x00, 0xe9, 0x12, 0xaa},2743{0x00, 0xea, 0x5c, 0xaa},2744{0x00, 0xeb, 0xff, 0xaa},2745{0x00, 0xd8, 0x80, 0xaa},2746{0x00, 0xe6, 0x02, 0xaa},2747{0x00, 0xd6, 0x40, 0xaa},2748{0x00, 0xe3, 0x05, 0xaa},2749{0x00, 0xe0, 0x40, 0xaa},2750{0x00, 0xde, 0x03, 0xaa},2751{0x00, 0xdf, 0x03, 0xaa},2752{0x00, 0xdb, 0x02, 0xaa},2753{0x00, 0xdc, 0x00, 0xaa},2754{0x00, 0xdd, 0x03, 0xaa},2755{0x00, 0xe1, 0x08, 0xaa},2756{0x00, 0xe2, 0x01, 0xaa},2757{0x00, 0xd6, 0x40, 0xaa},2758{0x00, 0xe4, 0x40, 0xaa},2759{0x00, 0xa8, 0x8f, 0xaa},2760{0x00, 0xb4, 0x16, 0xaa},2761{0xb0, 0x02, 0x06, 0xcc},2762{0xb0, 0x18, 0x06, 0xcc},2763{0xb0, 0x19, 0x06, 0xcc},2764{0xb3, 0x5d, 0x18, 0xcc},2765{0xb3, 0x05, 0x00, 0xcc},2766{0xb3, 0x06, 0x00, 0xcc},2767{0x00, 0xb4, 0x0e, 0xaa},2768{0x00, 0xb5, 0x49, 0xaa},2769{0x00, 0xb6, 0x1c, 0xaa},2770{0x00, 0xb7, 0x96, 0xaa},2771/* end of usbvm326.inf - start of ms-win trace */2772{0xb6, 0x12, 0xf8, 0xcc},2773{0xb6, 0x13, 0x3d, 0xcc},2774/*read b306*/2775{0x00, 0x03, 0x00, 0xaa},2776{0x00, 0x1a, 0x09, 0xaa},2777{0x00, 0x1b, 0x8a, 0xaa},2778/*read b827*/2779{0xb8, 0x27, 0x00, 0xcc},2780{0xb8, 0x26, 0x60, 0xcc},2781{0xb8, 0x26, 0x60, 0xcc},2782/*gamma - to do?*/2783{0x00, 0x03, 0x00, 0xaa},2784{0x00, 0xae, 0x84, 0xaa},2785/*gamma again*/2786{0x00, 0x03, 0x00, 0xaa},2787{0x00, 0x96, 0xa0, 0xaa},2788/*matrix*/2789{0x00, 0x03, 0x00, 0xaa},2790{0x00, 0x91, 0x35, 0xaa},2791{0x00, 0x92, 0x22, 0xaa},2792/*gamma*/2793{0x00, 0x03, 0x00, 0xaa},2794{0x00, 0x95, 0x85, 0xaa},2795/*matrix*/2796{0x00, 0x03, 0x00, 0xaa},2797{0x00, 0x4d, 0x20, 0xaa},2798{0xb8, 0x22, 0x40, 0xcc},2799{0xb8, 0x23, 0x40, 0xcc},2800{0xb8, 0x24, 0x40, 0xcc},2801{0xb8, 0x81, 0x09, 0xcc},2802{0x00, 0x00, 0x64, 0xdd},2803{0x00, 0x03, 0x01, 0xaa},2804/*read 46*/2805{0x00, 0x46, 0x3c, 0xaa},2806{0x00, 0x03, 0x00, 0xaa},2807{0x00, 0x16, 0x40, 0xaa},2808{0x00, 0x17, 0x40, 0xaa},2809{0x00, 0x18, 0x40, 0xaa},2810{0x00, 0x19, 0x41, 0xaa},2811{0x00, 0x03, 0x01, 0xaa},2812{0x00, 0x46, 0x3c, 0xaa},2813{0x00, 0x00, 0x18, 0xdd},2814/*read bfff*/2815{0x00, 0x03, 0x00, 0xaa},2816{0x00, 0xb4, 0x1c, 0xaa},2817{0x00, 0xb5, 0x92, 0xaa},2818{0x00, 0xb6, 0x39, 0xaa},2819{0x00, 0xb7, 0x24, 0xaa},2820/*write 89 0400 1415*/2821{}2822};28232824static const u8 poxxxx_init_common[][4] = {2825{0xb3, 0x00, 0x04, 0xcc},2826{0x00, 0x00, 0x10, 0xdd},2827{0xb3, 0x00, 0x64, 0xcc},2828{0x00, 0x00, 0x10, 0xdd},2829{0xb3, 0x00, 0x65, 0xcc},2830{0x00, 0x00, 0x10, 0xdd},2831{0xb3, 0x00, 0x67, 0xcc},2832{0xb0, 0x03, 0x09, 0xcc},2833{0xb3, 0x05, 0x00, 0xcc},2834{0xb3, 0x06, 0x00, 0xcc},2835{0xb3, 0x5c, 0x01, 0xcc},2836{0xb3, 0x08, 0x01, 0xcc},2837{0xb3, 0x09, 0x0c, 0xcc},2838{0xb3, 0x34, 0x01, 0xcc},2839{0xb3, 0x35, 0xf6, 0xcc}, /* i2c add: 76 */2840{0xb3, 0x02, 0xb0, 0xcc},2841{0xb3, 0x03, 0x18, 0xcc},2842{0xb3, 0x04, 0x15, 0xcc},2843{0xb3, 0x20, 0x00, 0xcc},2844{0xb3, 0x21, 0x00, 0xcc},2845{0xb3, 0x22, 0x04, 0xcc}, /* sensor height = 1024 */2846{0xb3, 0x23, 0x00, 0xcc},2847{0xb3, 0x14, 0x00, 0xcc},2848{0xb3, 0x15, 0x00, 0xcc},2849{0xb3, 0x16, 0x04, 0xcc}, /* sensor width = 1280 */2850{0xb3, 0x17, 0xff, 0xcc},2851{0xb3, 0x2c, 0x03, 0xcc},2852{0xb3, 0x2d, 0x56, 0xcc},2853{0xb3, 0x2e, 0x02, 0xcc},2854{0xb3, 0x2f, 0x0a, 0xcc},2855{0xb3, 0x40, 0x00, 0xcc},2856{0xb3, 0x41, 0x34, 0xcc},2857{0xb3, 0x42, 0x01, 0xcc},2858{0xb3, 0x43, 0xe0, 0xcc},2859{0xbc, 0x00, 0x71, 0xcc},2860{0xbc, 0x01, 0x01, 0xcc},2861{0xb3, 0x01, 0x41, 0xcc},2862{0xb3, 0x4d, 0x00, 0xcc},2863{0x00, 0x0b, 0x2a, 0xaa},2864{0x00, 0x0e, 0x03, 0xaa},2865{0x00, 0x0f, 0xea, 0xaa},2866{0x00, 0x12, 0x08, 0xaa},2867{0x00, 0x1e, 0x06, 0xaa},2868{0x00, 0x21, 0x00, 0xaa},2869{0x00, 0x31, 0x1f, 0xaa},2870{0x00, 0x33, 0x38, 0xaa},2871{0x00, 0x36, 0xc0, 0xaa},2872{0x00, 0x37, 0xc8, 0xaa},2873{0x00, 0x3b, 0x36, 0xaa},2874{0x00, 0x4b, 0xfe, 0xaa},2875{0x00, 0x4d, 0x2e, 0xaa},2876{0x00, 0x51, 0x1c, 0xaa},2877{0x00, 0x52, 0x01, 0xaa},2878{0x00, 0x55, 0x0a, 0xaa},2879{0x00, 0x56, 0x0a, 0xaa},2880{0x00, 0x57, 0x07, 0xaa},2881{0x00, 0x58, 0x07, 0xaa},2882{0x00, 0x59, 0x04, 0xaa},2883{0x00, 0x70, 0x68, 0xaa},2884{0x00, 0x71, 0x04, 0xaa},2885{0x00, 0x72, 0x10, 0xaa},2886{0x00, 0x80, 0x71, 0xaa},2887{0x00, 0x81, 0x08, 0xaa},2888{0x00, 0x82, 0x00, 0xaa},2889{0x00, 0x83, 0x55, 0xaa},2890{0x00, 0x84, 0x06, 0xaa},2891{0x00, 0x85, 0x06, 0xaa},2892{0x00, 0x8b, 0x25, 0xaa},2893{0x00, 0x8c, 0x00, 0xaa},2894{0x00, 0x8d, 0x86, 0xaa},2895{0x00, 0x8e, 0x82, 0xaa},2896{0x00, 0x8f, 0x2d, 0xaa},2897{0x00, 0x90, 0x8b, 0xaa},2898{0x00, 0x91, 0x81, 0xaa},2899{0x00, 0x92, 0x81, 0xaa},2900{0x00, 0x93, 0x23, 0xaa},2901{0x00, 0xa3, 0x2a, 0xaa},2902{0x00, 0xa4, 0x03, 0xaa},2903{0x00, 0xa5, 0xea, 0xaa},2904{0x00, 0xb0, 0x68, 0xaa},2905{0x00, 0xbc, 0x04, 0xaa},2906{0x00, 0xbe, 0x3b, 0xaa},2907{0x00, 0x4e, 0x40, 0xaa},2908{0x00, 0x06, 0x04, 0xaa},2909{0x00, 0x07, 0x03, 0xaa},2910{0x00, 0xcd, 0x18, 0xaa},2911{0x00, 0x28, 0x03, 0xaa},2912{0x00, 0x29, 0xef, 0xaa},2913/* reinit on alt 2 (qvga) or alt7 (vga) */2914{0xb3, 0x05, 0x00, 0xcc},2915{0xb3, 0x06, 0x00, 0xcc},2916{0xb8, 0x00, 0x01, 0xcc},29172918{0x00, 0x1d, 0x85, 0xaa},2919{0x00, 0x1e, 0xc6, 0xaa},2920{0x00, 0x00, 0x40, 0xdd},2921{0x00, 0x1d, 0x05, 0xaa},2922{}2923};2924static const u8 poxxxx_gamma[][4] = {2925{0x00, 0xd6, 0x22, 0xaa}, /* gamma 0 */2926{0x00, 0x73, 0x00, 0xaa},2927{0x00, 0x74, 0x0a, 0xaa},2928{0x00, 0x75, 0x16, 0xaa},2929{0x00, 0x76, 0x25, 0xaa},2930{0x00, 0x77, 0x34, 0xaa},2931{0x00, 0x78, 0x49, 0xaa},2932{0x00, 0x79, 0x5a, 0xaa},2933{0x00, 0x7a, 0x7f, 0xaa},2934{0x00, 0x7b, 0x9b, 0xaa},2935{0x00, 0x7c, 0xba, 0xaa},2936{0x00, 0x7d, 0xd4, 0xaa},2937{0x00, 0x7e, 0xea, 0xaa},29382939{0x00, 0xd6, 0x62, 0xaa}, /* gamma 1 */2940{0x00, 0x73, 0x00, 0xaa},2941{0x00, 0x74, 0x0a, 0xaa},2942{0x00, 0x75, 0x16, 0xaa},2943{0x00, 0x76, 0x25, 0xaa},2944{0x00, 0x77, 0x34, 0xaa},2945{0x00, 0x78, 0x49, 0xaa},2946{0x00, 0x79, 0x5a, 0xaa},2947{0x00, 0x7a, 0x7f, 0xaa},2948{0x00, 0x7b, 0x9b, 0xaa},2949{0x00, 0x7c, 0xba, 0xaa},2950{0x00, 0x7d, 0xd4, 0xaa},2951{0x00, 0x7e, 0xea, 0xaa},29522953{0x00, 0xd6, 0xa2, 0xaa}, /* gamma 2 */2954{0x00, 0x73, 0x00, 0xaa},2955{0x00, 0x74, 0x0a, 0xaa},2956{0x00, 0x75, 0x16, 0xaa},2957{0x00, 0x76, 0x25, 0xaa},2958{0x00, 0x77, 0x34, 0xaa},2959{0x00, 0x78, 0x49, 0xaa},2960{0x00, 0x79, 0x5a, 0xaa},2961{0x00, 0x7a, 0x7f, 0xaa},2962{0x00, 0x7b, 0x9b, 0xaa},2963{0x00, 0x7c, 0xba, 0xaa},2964{0x00, 0x7d, 0xd4, 0xaa},2965{0x00, 0x7e, 0xea, 0xaa},2966{}2967};2968static const u8 poxxxx_init_start_3[][4] = {2969{0x00, 0xb8, 0x28, 0xaa},2970{0x00, 0xb9, 0x1e, 0xaa},2971{0x00, 0xb6, 0x14, 0xaa},2972{0x00, 0xb7, 0x0f, 0xaa},2973{0x00, 0x5c, 0x10, 0xaa},2974{0x00, 0x5d, 0x18, 0xaa},2975{0x00, 0x5e, 0x24, 0xaa},2976{0x00, 0x5f, 0x24, 0xaa},2977{0x00, 0x86, 0x1a, 0xaa},2978{0x00, 0x60, 0x00, 0xaa},2979{0x00, 0x61, 0x1b, 0xaa},2980{0x00, 0x62, 0x30, 0xaa},2981{0x00, 0x63, 0x40, 0xaa},2982{0x00, 0x87, 0x1a, 0xaa},2983{0x00, 0x64, 0x00, 0xaa},2984{0x00, 0x65, 0x08, 0xaa},2985{0x00, 0x66, 0x10, 0xaa},2986{0x00, 0x67, 0x20, 0xaa},2987{0x00, 0x88, 0x10, 0xaa},2988{0x00, 0x68, 0x00, 0xaa},2989{0x00, 0x69, 0x08, 0xaa},2990{0x00, 0x6a, 0x0f, 0xaa},2991{0x00, 0x6b, 0x0f, 0xaa},2992{0x00, 0x89, 0x07, 0xaa},2993{0x00, 0xd5, 0x4c, 0xaa},2994{0x00, 0x0a, 0x00, 0xaa},2995{0x00, 0x0b, 0x2a, 0xaa},2996{0x00, 0x0e, 0x03, 0xaa},2997{0x00, 0x0f, 0xea, 0xaa},2998{0x00, 0xa2, 0x00, 0xaa},2999{0x00, 0xa3, 0x2a, 0xaa},3000{0x00, 0xa4, 0x03, 0xaa},3001{0x00, 0xa5, 0xea, 0xaa},3002{}3003};3004static const u8 poxxxx_initVGA[][4] = {3005{0x00, 0x20, 0x11, 0xaa},3006{0x00, 0x33, 0x38, 0xaa},3007{0x00, 0xbb, 0x0d, 0xaa},3008{0xb3, 0x22, 0x01, 0xcc}, /* change to 640x480 */3009{0xb3, 0x23, 0xe0, 0xcc},3010{0xb3, 0x16, 0x02, 0xcc},3011{0xb3, 0x17, 0x7f, 0xcc},3012{0xb3, 0x02, 0xb0, 0xcc},3013{0xb3, 0x06, 0x00, 0xcc},3014{0xb3, 0x5c, 0x01, 0xcc},3015{0x00, 0x04, 0x06, 0xaa},3016{0x00, 0x05, 0x3f, 0xaa},3017{0x00, 0x04, 0x00, 0xdd}, /* delay 1s */3018{}3019};3020static const u8 poxxxx_initQVGA[][4] = {3021{0x00, 0x20, 0x33, 0xaa},3022{0x00, 0x33, 0x38, 0xaa},3023{0x00, 0xbb, 0x0d, 0xaa},3024{0xb3, 0x22, 0x00, 0xcc}, /* change to 320x240 */3025{0xb3, 0x23, 0xf0, 0xcc},3026{0xb3, 0x16, 0x01, 0xcc},3027{0xb3, 0x17, 0x3f, 0xcc},3028{0xb3, 0x02, 0xb0, 0xcc},3029{0xb3, 0x06, 0x01, 0xcc},3030{0xb3, 0x5c, 0x00, 0xcc},3031{0x00, 0x04, 0x06, 0xaa},3032{0x00, 0x05, 0x3f, 0xaa},3033{0x00, 0x04, 0x00, 0xdd}, /* delay 1s */3034{}3035};3036static const u8 poxxxx_init_end_1[][4] = {3037{0x00, 0x47, 0x25, 0xaa},3038{0x00, 0x48, 0x80, 0xaa},3039{0x00, 0x49, 0x1f, 0xaa},3040{0x00, 0x4a, 0x40, 0xaa},3041{0x00, 0x44, 0x40, 0xaa},3042{0x00, 0xab, 0x4a, 0xaa},3043{0x00, 0xb1, 0x00, 0xaa},3044{0x00, 0xb2, 0x04, 0xaa},3045{0x00, 0xb3, 0x08, 0xaa},3046{0x00, 0xb4, 0x0b, 0xaa},3047{0x00, 0xb5, 0x0d, 0xaa},3048{}3049};3050static const u8 poxxxx_init_end_2[][4] = {3051{0x00, 0x1d, 0x85, 0xaa},3052{0x00, 0x1e, 0x06, 0xaa},3053{0x00, 0x1d, 0x05, 0xaa},3054{}3055};30563057struct sensor_info {3058s8 sensorId;3059u8 I2cAdd;3060u8 IdAdd;3061u16 VpId;3062u8 m1;3063u8 m2;3064u8 op;3065};30663067/* probe values */3068static const struct sensor_info vc0321_probe_data[] = {3069/* sensorId, I2cAdd, IdAdd, VpId, m1, m2, op */3070/* 0 OV9640 */3071{-1, 0x80 | 0x30, 0x0a, 0x0000, 0x25, 0x24, 0x05},3072/* 1 ICM108T (may respond on IdAdd == 0x83 - tested in vc032x_probe_sensor) */3073{-1, 0x80 | 0x20, 0x82, 0x0000, 0x24, 0x25, 0x01},3074/* 2 PO2130 (may detect PO3130NC - tested in vc032x_probe_sensor)*/3075{-1, 0x80 | 0x76, 0x00, 0x0000, 0x24, 0x25, 0x01},3076/* 3 MI1310 */3077{-1, 0x80 | 0x5d, 0x00, 0x0000, 0x24, 0x25, 0x01},3078/* 4 MI360 - tested in vc032x_probe_sensor */3079/* {SENSOR_MI0360, 0x80 | 0x5d, 0x00, 0x8243, 0x24, 0x25, 0x01}, */3080/* 5 7131R */3081{SENSOR_HV7131R, 0x80 | 0x11, 0x00, 0x0209, 0x24, 0x25, 0x01},3082/* 6 OV7649 */3083{-1, 0x80 | 0x21, 0x0a, 0x0000, 0x21, 0x20, 0x05},3084/* 7 PAS302BCW */3085{-1, 0x80 | 0x40, 0x00, 0x0000, 0x20, 0x22, 0x05},3086/* 8 OV7660 */3087{SENSOR_OV7660, 0x80 | 0x21, 0x0a, 0x7660, 0x26, 0x26, 0x05},3088/* 9 PO3130NC - (tested in vc032x_probe_sensor) */3089/* {SENSOR_PO3130NC, 0x80 | 0x76, 0x00, 0x3130, 0x24, 0x25, 0x01}, */3090/* 10 PO1030KC */3091{-1, 0x80 | 0x6e, 0x00, 0x0000, 0x24, 0x25, 0x01},3092/* 11 MI1310_SOC */3093{SENSOR_MI1310_SOC, 0x80 | 0x5d, 0x00, 0x143a, 0x24, 0x25, 0x01},3094/* 12 OV9650 */3095{-1, 0x80 | 0x30, 0x0a, 0x0000, 0x25, 0x24, 0x05},3096/* 13 S5K532 */3097{-1, 0x80 | 0x11, 0x39, 0x0000, 0x24, 0x25, 0x01},3098/* 14 MI360_SOC - ??? */3099/* 15 PO1200N */3100{SENSOR_PO1200, 0x80 | 0x5c, 0x00, 0x1200, 0x67, 0x67, 0x01},3101/* 16 PO3030K */3102{-1, 0x80 | 0x18, 0x00, 0x0000, 0x24, 0x25, 0x01},3103/* 17 PO2030 */3104{-1, 0x80 | 0x6e, 0x00, 0x0000, 0x24, 0x25, 0x01},3105/* ?? */3106{-1, 0x80 | 0x56, 0x01, 0x0000, 0x64, 0x67, 0x01},3107{SENSOR_MI1320, 0x80 | 0x48, 0x00, 0x148c, 0x64, 0x65, 0x01},3108};3109static const struct sensor_info vc0323_probe_data[] = {3110/* sensorId, I2cAdd, IdAdd, VpId, m1, m2, op */3111/* 0 OV9640 */3112{-1, 0x80 | 0x30, 0x0a, 0x0000, 0x25, 0x24, 0x05},3113/* 1 ICM108T (may respond on IdAdd == 0x83 - tested in vc032x_probe_sensor) */3114{-1, 0x80 | 0x20, 0x82, 0x0000, 0x24, 0x25, 0x01},3115/* 2 PO2130 (may detect PO3130NC - tested in vc032x_probe_sensor)*/3116{-1, 0x80 | 0x76, 0x00, 0x0000, 0x24, 0x25, 0x01},3117/* 3 MI1310 */3118{-1, 0x80 | 0x5d, 0x00, 0x0000, 0x24, 0x25, 0x01},3119/* 4 MI360 - tested in vc032x_probe_sensor */3120/* {SENSOR_MI0360, 0x80 | 0x5d, 0x00, 0x8243, 0x24, 0x25, 0x01}, */3121/* 5 7131R */3122{SENSOR_HV7131R, 0x80 | 0x11, 0x00, 0x0209, 0x24, 0x25, 0x01},3123/* 6 OV7649 */3124{-1, 0x80 | 0x21, 0x0a, 0x0000, 0x21, 0x20, 0x05},3125/* 7 PAS302BCW */3126{-1, 0x80 | 0x40, 0x00, 0x0000, 0x20, 0x22, 0x05},3127/* 8 OV7660 */3128{SENSOR_OV7660, 0x80 | 0x21, 0x0a, 0x7660, 0x26, 0x26, 0x05},3129/* 9 PO3130NC - (tested in vc032x_probe_sensor) */3130/* {SENSOR_PO3130NC, 0x80 | 0x76, 0x00, 0x3130, 0x24, 0x25, 0x01}, */3131/* 10 PO1030KC */3132{-1, 0x80 | 0x6e, 0x00, 0x0000, 0x24, 0x25, 0x01},3133/* 11 MI1310_SOC */3134{SENSOR_MI1310_SOC, 0x80 | 0x5d, 0x00, 0x143a, 0x24, 0x25, 0x01},3135/* 12 OV9650 */3136{-1, 0x80 | 0x30, 0x0a, 0x0000, 0x25, 0x24, 0x05},3137/* 13 S5K532 */3138{-1, 0x80 | 0x11, 0x39, 0x0000, 0x24, 0x25, 0x01},3139/* 14 MI360_SOC - ??? */3140/* 15 PO1200N */3141{SENSOR_PO1200, 0x80 | 0x5c, 0x00, 0x1200, 0x67, 0x67, 0x01},3142/* 16 ?? */3143{-1, 0x80 | 0x2d, 0x00, 0x0000, 0x65, 0x67, 0x01},3144/* 17 PO2030 */3145{-1, 0x80 | 0x6e, 0x00, 0x0000, 0x24, 0x25, 0x01},3146/* ?? */3147{-1, 0x80 | 0x56, 0x01, 0x0000, 0x64, 0x67, 0x01},3148{SENSOR_MI1320_SOC, 0x80 | 0x48, 0x00, 0x148c, 0x64, 0x67, 0x01},3149/*fixme: not in the ms-win probe - may be found before? */3150{SENSOR_OV7670, 0x80 | 0x21, 0x0a, 0x7673, 0x66, 0x67, 0x05},3151};31523153/* read 'len' bytes in gspca_dev->usb_buf */3154static void reg_r_i(struct gspca_dev *gspca_dev,3155u16 req,3156u16 index,3157u16 len)3158{3159int ret;31603161if (gspca_dev->usb_err < 0)3162return;3163ret = usb_control_msg(gspca_dev->dev,3164usb_rcvctrlpipe(gspca_dev->dev, 0),3165req,3166USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,31671, /* value */3168index, gspca_dev->usb_buf, len,3169500);3170if (ret < 0) {3171err("reg_r err %d", ret);3172gspca_dev->usb_err = ret;3173}3174}3175static void reg_r(struct gspca_dev *gspca_dev,3176u16 req,3177u16 index,3178u16 len)3179{3180reg_r_i(gspca_dev, req, index, len);3181#ifdef GSPCA_DEBUG3182if (gspca_dev->usb_err < 0)3183return;3184if (len == 1)3185PDEBUG(D_USBI, "GET %02x 0001 %04x %02x", req, index,3186gspca_dev->usb_buf[0]);3187else3188PDEBUG(D_USBI, "GET %02x 0001 %04x %02x %02x %02x",3189req, index,3190gspca_dev->usb_buf[0],3191gspca_dev->usb_buf[1],3192gspca_dev->usb_buf[2]);3193#endif3194}31953196static void reg_w_i(struct gspca_dev *gspca_dev,3197u16 req,3198u16 value,3199u16 index)3200{3201int ret;32023203if (gspca_dev->usb_err < 0)3204return;3205ret = usb_control_msg(gspca_dev->dev,3206usb_sndctrlpipe(gspca_dev->dev, 0),3207req,3208USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,3209value, index, NULL, 0,3210500);3211if (ret < 0) {3212err("reg_w err %d", ret);3213gspca_dev->usb_err = ret;3214}3215}3216static void reg_w(struct gspca_dev *gspca_dev,3217u16 req,3218u16 value,3219u16 index)3220{3221#ifdef GSPCA_DEBUG3222if (gspca_dev->usb_err < 0)3223return;3224PDEBUG(D_USBO, "SET %02x %04x %04x", req, value, index);3225#endif3226reg_w_i(gspca_dev, req, value, index);3227}32283229static u16 read_sensor_register(struct gspca_dev *gspca_dev,3230u16 address)3231{3232u8 ldata, mdata, hdata;3233int retry = 50;32343235reg_r(gspca_dev, 0xa1, 0xb33f, 1);3236if (!(gspca_dev->usb_buf[0] & 0x02)) {3237err("I2c Bus Busy Wait %02x",3238gspca_dev->usb_buf[0]);3239return 0;3240}3241reg_w(gspca_dev, 0xa0, address, 0xb33a);3242reg_w(gspca_dev, 0xa0, 0x02, 0xb339);32433244do {3245reg_r(gspca_dev, 0xa1, 0xb33b, 1);3246if (gspca_dev->usb_buf[0] == 0x00)3247break;3248msleep(40);3249} while (--retry >= 0);32503251reg_r(gspca_dev, 0xa1, 0xb33e, 1);3252ldata = gspca_dev->usb_buf[0];3253reg_r(gspca_dev, 0xa1, 0xb33d, 1);3254mdata = gspca_dev->usb_buf[0];3255reg_r(gspca_dev, 0xa1, 0xb33c, 1);3256hdata = gspca_dev->usb_buf[0];3257if (hdata != 0 && mdata != 0 && ldata != 0)3258PDEBUG(D_PROBE, "Read Sensor %02x%02x %02x",3259hdata, mdata, ldata);3260reg_r(gspca_dev, 0xa1, 0xb334, 1);3261if (gspca_dev->usb_buf[0] == 0x02)3262return (hdata << 8) + mdata;3263return hdata;3264}32653266static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)3267{3268struct sd *sd = (struct sd *) gspca_dev;3269int i, n;3270u16 value;3271const struct sensor_info *ptsensor_info;32723273/*fixme: should also check the other sensor (back mi1320_soc, front mc501cb)*/3274if (sd->flags & FL_SAMSUNG) {3275reg_w(gspca_dev, 0xa0, 0x01, 0xb301);3276reg_w(gspca_dev, 0x89, 0xf0ff, 0xffff);3277/* select the back sensor */3278}32793280reg_r(gspca_dev, 0xa1, 0xbfcf, 1);3281PDEBUG(D_PROBE, "vc032%d check sensor header %02x",3282sd->bridge == BRIDGE_VC0321 ? 1 : 3, gspca_dev->usb_buf[0]);3283if (sd->bridge == BRIDGE_VC0321) {3284ptsensor_info = vc0321_probe_data;3285n = ARRAY_SIZE(vc0321_probe_data);3286} else {3287ptsensor_info = vc0323_probe_data;3288n = ARRAY_SIZE(vc0323_probe_data);3289}3290for (i = 0; i < n; i++) {3291reg_w(gspca_dev, 0xa0, 0x02, 0xb334);3292reg_w(gspca_dev, 0xa0, ptsensor_info->m1, 0xb300);3293reg_w(gspca_dev, 0xa0, ptsensor_info->m2, 0xb300);3294reg_w(gspca_dev, 0xa0, 0x01, 0xb308);3295reg_w(gspca_dev, 0xa0, 0x0c, 0xb309);3296reg_w(gspca_dev, 0xa0, ptsensor_info->I2cAdd, 0xb335);3297reg_w(gspca_dev, 0xa0, ptsensor_info->op, 0xb301);3298value = read_sensor_register(gspca_dev, ptsensor_info->IdAdd);3299if (value == 0 && ptsensor_info->IdAdd == 0x82)3300value = read_sensor_register(gspca_dev, 0x83);3301if (value != 0) {3302PDEBUG(D_ERR|D_PROBE, "Sensor ID %04x (%d)",3303value, i);3304if (value == ptsensor_info->VpId)3305return ptsensor_info->sensorId;33063307switch (value) {3308case 0x3130:3309return SENSOR_PO3130NC;3310case 0x7673:3311return SENSOR_OV7670;3312case 0x8243:3313return SENSOR_MI0360;3314}3315}3316ptsensor_info++;3317}3318return -1;3319}33203321static void i2c_write(struct gspca_dev *gspca_dev,3322u8 reg, const u8 *val,3323u8 size) /* 1 or 2 */3324{3325int retry;33263327#ifdef GSPCA_DEBUG3328if (gspca_dev->usb_err < 0)3329return;3330if (size == 1)3331PDEBUG(D_USBO, "i2c_w %02x %02x", reg, *val);3332else3333PDEBUG(D_USBO, "i2c_w %02x %02x%02x", reg, *val, val[1]);3334#endif3335reg_r_i(gspca_dev, 0xa1, 0xb33f, 1);3336/*fixme:should check if (!(gspca_dev->usb_buf[0] & 0x02)) error*/3337reg_w_i(gspca_dev, 0xa0, size, 0xb334);3338reg_w_i(gspca_dev, 0xa0, reg, 0xb33a);3339reg_w_i(gspca_dev, 0xa0, val[0], 0xb336);3340if (size > 1)3341reg_w_i(gspca_dev, 0xa0, val[1], 0xb337);3342reg_w_i(gspca_dev, 0xa0, 0x01, 0xb339);3343retry = 4;3344do {3345reg_r_i(gspca_dev, 0xa1, 0xb33b, 1);3346if (gspca_dev->usb_buf[0] == 0)3347break;3348msleep(20);3349} while (--retry > 0);3350if (retry <= 0)3351err("i2c_write timeout");3352}33533354static void put_tab_to_reg(struct gspca_dev *gspca_dev,3355const u8 *tab, u8 tabsize, u16 addr)3356{3357int j;3358u16 ad = addr;33593360for (j = 0; j < tabsize; j++)3361reg_w(gspca_dev, 0xa0, tab[j], ad++);3362}33633364static void usb_exchange(struct gspca_dev *gspca_dev,3365const u8 data[][4])3366{3367int i = 0;33683369for (;;) {3370switch (data[i][3]) {3371default:3372return;3373case 0xcc: /* normal write */3374reg_w(gspca_dev, 0xa0, data[i][2],3375(data[i][0]) << 8 | data[i][1]);3376break;3377case 0xaa: /* i2c op */3378i2c_write(gspca_dev, data[i][1], &data[i][2], 1);3379break;3380case 0xbb: /* i2c op */3381i2c_write(gspca_dev, data[i][0], &data[i][1], 2);3382break;3383case 0xdd:3384msleep(data[i][1] * 256 + data[i][2] + 10);3385break;3386}3387i++;3388}3389/*not reached*/3390}339133923393/* this function is called at probe time */3394static int sd_config(struct gspca_dev *gspca_dev,3395const struct usb_device_id *id)3396{3397struct sd *sd = (struct sd *) gspca_dev;33983399sd->bridge = id->driver_info >> 8;3400sd->flags = id->driver_info & 0xff;34013402if (id->idVendor == 0x046d &&3403(id->idProduct == 0x0892 || id->idProduct == 0x0896))3404sd->sensor = SENSOR_POxxxx; /* no probe */34053406sd->brightness = BRIGHTNESS_DEF;3407sd->contrast = CONTRAST_DEF;3408sd->colors = COLOR_DEF;3409sd->hflip = HFLIP_DEF;3410sd->vflip = VFLIP_DEF;3411sd->lightfreq = FREQ_DEF;3412sd->sharpness = SHARPNESS_DEF;3413sd->gain = GAIN_DEF;3414sd->exposure = EXPOSURE_DEF;3415sd->autogain = AUTOGAIN_DEF;3416sd->backlight = BACKLIGHT_DEF;34173418return 0;3419}34203421/* this function is called at probe and resume time */3422static int sd_init(struct gspca_dev *gspca_dev)3423{3424struct sd *sd = (struct sd *) gspca_dev;3425struct cam *cam;3426int sensor;3427/* number of packets per ISOC message */3428static u8 npkt[NSENSORS] = {3429[SENSOR_HV7131R] = 64,3430[SENSOR_MI0360] = 32,3431[SENSOR_MI1310_SOC] = 32,3432[SENSOR_MI1320] = 64,3433[SENSOR_MI1320_SOC] = 128,3434[SENSOR_OV7660] = 32,3435[SENSOR_OV7670] = 64,3436[SENSOR_PO1200] = 128,3437[SENSOR_PO3130NC] = 128,3438[SENSOR_POxxxx] = 128,3439};34403441if (sd->sensor != SENSOR_POxxxx)3442sensor = vc032x_probe_sensor(gspca_dev);3443else3444sensor = sd->sensor;34453446switch (sensor) {3447case -1:3448err("Unknown sensor...");3449return -EINVAL;3450case SENSOR_HV7131R:3451PDEBUG(D_PROBE, "Find Sensor HV7131R");3452break;3453case SENSOR_MI0360:3454PDEBUG(D_PROBE, "Find Sensor MI0360");3455sd->bridge = BRIDGE_VC0323;3456break;3457case SENSOR_MI1310_SOC:3458PDEBUG(D_PROBE, "Find Sensor MI1310_SOC");3459break;3460case SENSOR_MI1320:3461PDEBUG(D_PROBE, "Find Sensor MI1320");3462break;3463case SENSOR_MI1320_SOC:3464PDEBUG(D_PROBE, "Find Sensor MI1320_SOC");3465break;3466case SENSOR_OV7660:3467PDEBUG(D_PROBE, "Find Sensor OV7660");3468break;3469case SENSOR_OV7670:3470PDEBUG(D_PROBE, "Find Sensor OV7670");3471break;3472case SENSOR_PO1200:3473PDEBUG(D_PROBE, "Find Sensor PO1200");3474break;3475case SENSOR_PO3130NC:3476PDEBUG(D_PROBE, "Find Sensor PO3130NC");3477break;3478case SENSOR_POxxxx:3479PDEBUG(D_PROBE, "Sensor POxxxx");3480break;3481}3482sd->sensor = sensor;34833484cam = &gspca_dev->cam;3485if (sd->bridge == BRIDGE_VC0321) {3486cam->cam_mode = vc0321_mode;3487cam->nmodes = ARRAY_SIZE(vc0321_mode);3488} else {3489switch (sensor) {3490case SENSOR_PO1200:3491cam->cam_mode = svga_mode;3492cam->nmodes = ARRAY_SIZE(svga_mode);3493break;3494case SENSOR_MI1310_SOC:3495cam->cam_mode = vc0323_mode;3496cam->nmodes = ARRAY_SIZE(vc0323_mode);3497break;3498case SENSOR_MI1320_SOC:3499cam->cam_mode = bi_mode;3500cam->nmodes = ARRAY_SIZE(bi_mode);3501break;3502case SENSOR_OV7670:3503cam->cam_mode = bi_mode;3504cam->nmodes = ARRAY_SIZE(bi_mode) - 1;3505break;3506default:3507cam->cam_mode = vc0323_mode;3508cam->nmodes = ARRAY_SIZE(vc0323_mode) - 1;3509break;3510}3511}3512cam->npkt = npkt[sd->sensor];3513gspca_dev->ctrl_dis = ctrl_dis[sd->sensor];35143515if (sd->sensor == SENSOR_OV7670)3516sd->flags |= FL_HFLIP | FL_VFLIP;35173518if (sd->bridge == BRIDGE_VC0321) {3519reg_r(gspca_dev, 0x8a, 0, 3);3520reg_w(gspca_dev, 0x87, 0x00, 0x0f0f);3521reg_r(gspca_dev, 0x8b, 0, 3);3522reg_w(gspca_dev, 0x88, 0x00, 0x0202);3523if (sd->sensor == SENSOR_POxxxx) {3524reg_r(gspca_dev, 0xa1, 0xb300, 1);3525if (gspca_dev->usb_buf[0] != 0) {3526reg_w(gspca_dev, 0xa0, 0x26, 0xb300);3527reg_w(gspca_dev, 0xa0, 0x04, 0xb300);3528}3529reg_w(gspca_dev, 0xa0, 0x00, 0xb300);3530}3531}3532return gspca_dev->usb_err;3533}35343535static void setbrightness(struct gspca_dev *gspca_dev)3536{3537struct sd *sd = (struct sd *) gspca_dev;3538u8 data;35393540if (gspca_dev->ctrl_dis & (1 << BRIGHTNESS_IDX))3541return;3542data = sd->brightness;3543if (data >= 0x80)3544data &= 0x7f;3545else3546data = 0xff ^ data;3547i2c_write(gspca_dev, 0x98, &data, 1);3548}35493550static void setcontrast(struct gspca_dev *gspca_dev)3551{3552struct sd *sd = (struct sd *) gspca_dev;35533554if (gspca_dev->ctrl_dis & (1 << CONTRAST_IDX))3555return;3556i2c_write(gspca_dev, 0x99, &sd->contrast, 1);3557}35583559static void setcolors(struct gspca_dev *gspca_dev)3560{3561struct sd *sd = (struct sd *) gspca_dev;3562u8 data;35633564if (gspca_dev->ctrl_dis & (1 << COLORS_IDX))3565return;3566data = sd->colors - (sd->colors >> 3) - 1;3567i2c_write(gspca_dev, 0x94, &data, 1);3568i2c_write(gspca_dev, 0x95, &sd->colors, 1);3569}35703571static void sethvflip(struct gspca_dev *gspca_dev)3572{3573struct sd *sd = (struct sd *) gspca_dev;3574u8 data[2], hflip, vflip;35753576hflip = sd->hflip;3577if (sd->flags & FL_HFLIP)3578hflip = !hflip;3579vflip = sd->vflip;3580if (sd->flags & FL_VFLIP)3581vflip = !vflip;3582switch (sd->sensor) {3583case SENSOR_MI1310_SOC:3584case SENSOR_MI1320:3585case SENSOR_MI1320_SOC:3586data[0] = data[1] = 0; /* select page 0 */3587i2c_write(gspca_dev, 0xf0, data, 2);3588data[0] = sd->sensor == SENSOR_MI1310_SOC ? 0x03 : 0x01;3589data[1] = 0x02 * hflip3590| 0x01 * vflip;3591i2c_write(gspca_dev, 0x20, data, 2);3592break;3593case SENSOR_OV7660:3594case SENSOR_OV7670:3595data[0] = sd->sensor == SENSOR_OV7660 ? 0x01 : 0x07;3596data[0] |= OV7660_MVFP_MIRROR * hflip3597| OV7660_MVFP_VFLIP * vflip;3598i2c_write(gspca_dev, OV7660_REG_MVFP, data, 1);3599break;3600case SENSOR_PO1200:3601data[0] = 0;3602i2c_write(gspca_dev, 0x03, data, 1);3603data[0] = 0x80 * hflip3604| 0x40 * vflip3605| 0x06;3606i2c_write(gspca_dev, 0x1e, data, 1);3607break;3608}3609}36103611static void setlightfreq(struct gspca_dev *gspca_dev)3612{3613struct sd *sd = (struct sd *) gspca_dev;3614static const u8 (*ov7660_freq_tb[3])[4] =3615{ov7660_NoFliker, ov7660_50HZ, ov7660_60HZ};36163617if (sd->sensor != SENSOR_OV7660)3618return;3619usb_exchange(gspca_dev, ov7660_freq_tb[sd->lightfreq]);3620}36213622static void setsharpness(struct gspca_dev *gspca_dev)3623{3624struct sd *sd = (struct sd *) gspca_dev;3625u8 data;36263627switch (sd->sensor) {3628case SENSOR_PO1200:3629data = 0;3630i2c_write(gspca_dev, 0x03, &data, 1);3631if (sd->sharpness < 0)3632data = 0x6a;3633else3634data = 0xb5 + sd->sharpness * 3;3635i2c_write(gspca_dev, 0x61, &data, 1);3636break;3637case SENSOR_POxxxx:3638if (sd->sharpness < 0)3639data = 0x7e; /* def = max */3640else3641data = 0x60 + sd->sharpness * 0x0f;3642i2c_write(gspca_dev, 0x59, &data, 1);3643break;3644}3645}3646static void setgain(struct gspca_dev *gspca_dev)3647{3648struct sd *sd = (struct sd *) gspca_dev;36493650if (gspca_dev->ctrl_dis & (1 << GAIN_IDX))3651return;3652i2c_write(gspca_dev, 0x15, &sd->gain, 1);3653}36543655static void setexposure(struct gspca_dev *gspca_dev)3656{3657struct sd *sd = (struct sd *) gspca_dev;3658u8 data;36593660if (gspca_dev->ctrl_dis & (1 << EXPOSURE_IDX))3661return;3662data = sd->exposure >> 8;3663i2c_write(gspca_dev, 0x1a, &data, 1);3664data = sd->exposure;3665i2c_write(gspca_dev, 0x1b, &data, 1);3666}36673668static void setautogain(struct gspca_dev *gspca_dev)3669{3670struct sd *sd = (struct sd *) gspca_dev;3671static const u8 data[2] = {0x28, 0x3c};36723673if (gspca_dev->ctrl_dis & (1 << AUTOGAIN_IDX))3674return;3675i2c_write(gspca_dev, 0xd1, &data[sd->autogain], 1);3676}36773678static void setgamma(struct gspca_dev *gspca_dev)3679{3680/*fixme:to do */3681usb_exchange(gspca_dev, poxxxx_gamma);3682}36833684static void setbacklight(struct gspca_dev *gspca_dev)3685{3686struct sd *sd = (struct sd *) gspca_dev;3687u16 v;3688u8 data;36893690data = (sd->backlight << 4) | 0x0f;3691i2c_write(gspca_dev, 0xaa, &data, 1);3692v = 613 + 12 * sd->backlight;3693data = v >> 8;3694i2c_write(gspca_dev, 0xc4, &data, 1);3695data = v;3696i2c_write(gspca_dev, 0xc5, &data, 1);3697v = 1093 - 12 * sd->backlight;3698data = v >> 8;3699i2c_write(gspca_dev, 0xc6, &data, 1);3700data = v;3701i2c_write(gspca_dev, 0xc7, &data, 1);3702v = 342 + 9 * sd->backlight;3703data = v >> 8;3704i2c_write(gspca_dev, 0xc8, &data, 1);3705data = v;3706i2c_write(gspca_dev, 0xc9, &data, 1);3707v = 702 - 9 * sd->backlight;3708data = v >> 8;3709i2c_write(gspca_dev, 0xca, &data, 1);3710data = v;3711i2c_write(gspca_dev, 0xcb, &data, 1);3712}37133714static void setwb(struct gspca_dev *gspca_dev)3715{3716/*fixme:to do - valid when reg d1 = 0x1c - (reg16 + reg15 = 0xa3)*/3717static const u8 data[2] = {0x00, 0x00};37183719i2c_write(gspca_dev, 0x16, &data[0], 1);3720i2c_write(gspca_dev, 0x18, &data[1], 1);3721}37223723static int sd_start(struct gspca_dev *gspca_dev)3724{3725struct sd *sd = (struct sd *) gspca_dev;3726const u8 (*init)[4];3727const u8 *GammaT = NULL;3728const u8 *MatrixT = NULL;3729int mode;3730static const u8 (*mi1320_soc_init[])[4] = {3731mi1320_soc_InitSXGA,3732mi1320_soc_InitVGA,3733mi1320_soc_InitQVGA,3734};37353736/*fixme: back sensor only*/3737if (sd->flags & FL_SAMSUNG) {3738reg_w(gspca_dev, 0x89, 0xf0ff, 0xffff);3739reg_w(gspca_dev, 0xa9, 0x8348, 0x000e);3740reg_w(gspca_dev, 0xa9, 0x0000, 0x001a);3741}37423743/* Assume start use the good resolution from gspca_dev->mode */3744if (sd->bridge == BRIDGE_VC0321) {3745reg_w(gspca_dev, 0xa0, 0xff, 0xbfec);3746reg_w(gspca_dev, 0xa0, 0xff, 0xbfed);3747reg_w(gspca_dev, 0xa0, 0xff, 0xbfee);3748reg_w(gspca_dev, 0xa0, 0xff, 0xbfef);3749sd->image_offset = 46;3750} else {3751if (gspca_dev->cam.cam_mode[gspca_dev->curr_mode].pixelformat3752== V4L2_PIX_FMT_JPEG)3753sd->image_offset = 0;3754else3755sd->image_offset = 32;3756}37573758mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;3759switch (sd->sensor) {3760case SENSOR_HV7131R:3761GammaT = hv7131r_gamma;3762MatrixT = hv7131r_matrix;3763if (mode)3764init = hv7131r_initQVGA_data; /* 320x240 */3765else3766init = hv7131r_initVGA_data; /* 640x480 */3767break;3768case SENSOR_OV7660:3769GammaT = ov7660_gamma;3770MatrixT = ov7660_matrix;3771if (mode)3772init = ov7660_initQVGA_data; /* 320x240 */3773else3774init = ov7660_initVGA_data; /* 640x480 */3775break;3776case SENSOR_MI0360:3777GammaT = mi1320_gamma;3778MatrixT = mi0360_matrix;3779if (mode)3780init = mi0360_initQVGA_JPG; /* 320x240 */3781else3782init = mi0360_initVGA_JPG; /* 640x480 */3783break;3784case SENSOR_MI1310_SOC:3785GammaT = mi1320_gamma;3786MatrixT = mi1320_matrix;3787switch (mode) {3788case 1:3789init = mi1310_socinitQVGA_JPG; /* 320x240 */3790break;3791case 0:3792init = mi1310_socinitVGA_JPG; /* 640x480 */3793break;3794default:3795init = mi1310_soc_InitSXGA_JPG; /* 1280x1024 */3796break;3797}3798break;3799case SENSOR_MI1320:3800GammaT = mi1320_gamma;3801MatrixT = mi1320_matrix;3802if (mode)3803init = mi1320_initQVGA_data; /* 320x240 */3804else3805init = mi1320_initVGA_data; /* 640x480 */3806break;3807case SENSOR_MI1320_SOC:3808GammaT = mi1320_gamma;3809MatrixT = mi1320_matrix;3810init = mi1320_soc_init[mode];3811break;3812case SENSOR_OV7670:3813init = mode == 1 ? ov7670_InitVGA : ov7670_InitQVGA;3814break;3815case SENSOR_PO3130NC:3816GammaT = po3130_gamma;3817MatrixT = po3130_matrix;3818if (mode)3819init = po3130_initQVGA_data; /* 320x240 */3820else3821init = po3130_initVGA_data; /* 640x480 */3822usb_exchange(gspca_dev, init);3823init = po3130_rundata;3824break;3825case SENSOR_PO1200:3826GammaT = po1200_gamma;3827MatrixT = po1200_matrix;3828init = po1200_initVGA_data;3829break;3830default:3831/* case SENSOR_POxxxx: */3832usb_exchange(gspca_dev, poxxxx_init_common);3833setgamma(gspca_dev);3834setbacklight(gspca_dev);3835setbrightness(gspca_dev);3836setcontrast(gspca_dev);3837setcolors(gspca_dev);3838setsharpness(gspca_dev);3839setautogain(gspca_dev);3840setexposure(gspca_dev);3841setgain(gspca_dev);3842usb_exchange(gspca_dev, poxxxx_init_start_3);3843if (mode)3844init = poxxxx_initQVGA;3845else3846init = poxxxx_initVGA;3847usb_exchange(gspca_dev, init);3848reg_r(gspca_dev, 0x8c, 0x0000, 3);3849reg_w(gspca_dev, 0xa0,3850gspca_dev->usb_buf[2] & 1 ? 0 : 1,38510xb35c);3852msleep(300);3853/*fixme: i2c read 04 and 05*/3854init = poxxxx_init_end_1;3855break;3856}3857usb_exchange(gspca_dev, init);3858if (GammaT && MatrixT) {3859put_tab_to_reg(gspca_dev, GammaT, 17, 0xb84a);3860put_tab_to_reg(gspca_dev, GammaT, 17, 0xb85b);3861put_tab_to_reg(gspca_dev, GammaT, 17, 0xb86c);3862put_tab_to_reg(gspca_dev, MatrixT, 9, 0xb82c);38633864switch (sd->sensor) {3865case SENSOR_PO1200:3866case SENSOR_HV7131R:3867reg_w(gspca_dev, 0x89, 0x0400, 0x1415);3868break;3869case SENSOR_MI1310_SOC:3870reg_w(gspca_dev, 0x89, 0x058c, 0x0000);3871break;3872}3873msleep(100);3874sethvflip(gspca_dev);3875setlightfreq(gspca_dev);3876}3877switch (sd->sensor) {3878case SENSOR_OV7670:3879reg_w(gspca_dev, 0x87, 0xffff, 0xffff);3880reg_w(gspca_dev, 0x88, 0xff00, 0xf0f1);3881reg_w(gspca_dev, 0xa0, 0x0000, 0xbfff);3882break;3883case SENSOR_POxxxx:3884usb_exchange(gspca_dev, poxxxx_init_end_2);3885setwb(gspca_dev);3886msleep(80); /* led on */3887reg_w(gspca_dev, 0x89, 0xffff, 0xfdff);3888break;3889}3890return gspca_dev->usb_err;3891}38923893static void sd_stopN(struct gspca_dev *gspca_dev)3894{3895struct sd *sd = (struct sd *) gspca_dev;38963897switch (sd->sensor) {3898case SENSOR_MI1310_SOC:3899reg_w(gspca_dev, 0x89, 0x058c, 0x00ff);3900break;3901case SENSOR_POxxxx:3902return;3903default:3904if (!(sd->flags & FL_SAMSUNG))3905reg_w(gspca_dev, 0x89, 0xffff, 0xffff);3906break;3907}3908reg_w(gspca_dev, 0xa0, 0x01, 0xb301);3909reg_w(gspca_dev, 0xa0, 0x09, 0xb003);3910}39113912/* called on streamoff with alt 0 and on disconnect */3913static void sd_stop0(struct gspca_dev *gspca_dev)3914{3915struct sd *sd = (struct sd *) gspca_dev;39163917if (!gspca_dev->present)3918return;3919/*fixme: is this useful?*/3920if (sd->sensor == SENSOR_MI1310_SOC)3921reg_w(gspca_dev, 0x89, 0x058c, 0x00ff);3922else if (!(sd->flags & FL_SAMSUNG))3923reg_w(gspca_dev, 0x89, 0xffff, 0xffff);39243925if (sd->sensor == SENSOR_POxxxx) {3926reg_w(gspca_dev, 0xa0, 0x26, 0xb300);3927reg_w(gspca_dev, 0xa0, 0x04, 0xb300);3928reg_w(gspca_dev, 0xa0, 0x00, 0xb300);3929}3930}39313932static void sd_pkt_scan(struct gspca_dev *gspca_dev,3933u8 *data, /* isoc packet */3934int len) /* iso pkt length */3935{3936struct sd *sd = (struct sd *) gspca_dev;39373938if (data[0] == 0xff && data[1] == 0xd8) {3939PDEBUG(D_PACK,3940"vc032x header packet found len %d", len);3941gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);3942data += sd->image_offset;3943len -= sd->image_offset;3944gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);3945return;3946}39473948/* The vc0321 sends some additional data after sending the complete3949* frame, we ignore this. */3950if (sd->bridge == BRIDGE_VC0321) {3951int size, l;39523953l = gspca_dev->image_len;3954size = gspca_dev->frsz;3955if (len > size - l)3956len = size - l;3957}3958gspca_frame_add(gspca_dev, INTER_PACKET, data, len);3959}39603961static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)3962{3963struct sd *sd = (struct sd *) gspca_dev;39643965sd->brightness = val;3966if (gspca_dev->streaming)3967setbrightness(gspca_dev);3968return gspca_dev->usb_err;3969}39703971static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)3972{3973struct sd *sd = (struct sd *) gspca_dev;39743975*val = sd->brightness;3976return 0;3977}39783979static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)3980{3981struct sd *sd = (struct sd *) gspca_dev;39823983sd->contrast = val;3984if (gspca_dev->streaming)3985setcontrast(gspca_dev);3986return gspca_dev->usb_err;3987}39883989static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)3990{3991struct sd *sd = (struct sd *) gspca_dev;39923993*val = sd->contrast;3994return 0;3995}39963997static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val)3998{3999struct sd *sd = (struct sd *) gspca_dev;40004001sd->colors = val;4002if (gspca_dev->streaming)4003setcolors(gspca_dev);4004return gspca_dev->usb_err;4005}40064007static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val)4008{4009struct sd *sd = (struct sd *) gspca_dev;40104011*val = sd->colors;4012return 0;4013}40144015static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val)4016{4017struct sd *sd = (struct sd *) gspca_dev;40184019sd->hflip = val;4020if (gspca_dev->streaming)4021sethvflip(gspca_dev);4022return gspca_dev->usb_err;4023}40244025static int sd_gethflip(struct gspca_dev *gspca_dev, __s32 *val)4026{4027struct sd *sd = (struct sd *) gspca_dev;40284029*val = sd->hflip;4030return 0;4031}40324033static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)4034{4035struct sd *sd = (struct sd *) gspca_dev;40364037sd->vflip = val;4038if (gspca_dev->streaming)4039sethvflip(gspca_dev);4040return gspca_dev->usb_err;4041}40424043static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val)4044{4045struct sd *sd = (struct sd *) gspca_dev;40464047*val = sd->vflip;4048return 0;4049}40504051static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val)4052{4053struct sd *sd = (struct sd *) gspca_dev;40544055sd->lightfreq = val;4056if (gspca_dev->streaming)4057setlightfreq(gspca_dev);4058return gspca_dev->usb_err;4059}40604061static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val)4062{4063struct sd *sd = (struct sd *) gspca_dev;40644065*val = sd->lightfreq;4066return 0;4067}40684069static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val)4070{4071struct sd *sd = (struct sd *) gspca_dev;40724073sd->sharpness = val;4074if (gspca_dev->streaming)4075setsharpness(gspca_dev);4076return gspca_dev->usb_err;4077}40784079static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val)4080{4081struct sd *sd = (struct sd *) gspca_dev;40824083*val = sd->sharpness;4084return 0;4085}40864087static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val)4088{4089struct sd *sd = (struct sd *) gspca_dev;40904091sd->gain = val;4092if (gspca_dev->streaming)4093setgain(gspca_dev);4094return gspca_dev->usb_err;4095}40964097static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val)4098{4099struct sd *sd = (struct sd *) gspca_dev;41004101*val = sd->gain;4102return 0;4103}41044105static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val)4106{4107struct sd *sd = (struct sd *) gspca_dev;41084109sd->exposure = val;4110if (gspca_dev->streaming)4111setexposure(gspca_dev);4112return gspca_dev->usb_err;4113}41144115static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val)4116{4117struct sd *sd = (struct sd *) gspca_dev;41184119*val = sd->exposure;4120return 0;4121}41224123static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)4124{4125struct sd *sd = (struct sd *) gspca_dev;41264127sd->autogain = val;4128if (gspca_dev->streaming)4129setautogain(gspca_dev);41304131return gspca_dev->usb_err;4132}41334134static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val)4135{4136struct sd *sd = (struct sd *) gspca_dev;41374138*val = sd->autogain;4139return 0;4140}41414142static int sd_setbacklight(struct gspca_dev *gspca_dev, __s32 val)4143{4144struct sd *sd = (struct sd *) gspca_dev;41454146sd->backlight = val;4147if (gspca_dev->streaming)4148setbacklight(gspca_dev);41494150return gspca_dev->usb_err;4151}41524153static int sd_getbacklight(struct gspca_dev *gspca_dev, __s32 *val)4154{4155struct sd *sd = (struct sd *) gspca_dev;41564157*val = sd->backlight;4158return 0;4159}41604161static int sd_querymenu(struct gspca_dev *gspca_dev,4162struct v4l2_querymenu *menu)4163{4164static const char *freq_nm[3] = {"NoFliker", "50 Hz", "60 Hz"};41654166switch (menu->id) {4167case V4L2_CID_POWER_LINE_FREQUENCY:4168if (menu->index >= ARRAY_SIZE(freq_nm))4169break;4170strcpy((char *) menu->name, freq_nm[menu->index]);4171return 0;4172}4173return -EINVAL;4174}41754176/* sub-driver description */4177static const struct sd_desc sd_desc = {4178.name = MODULE_NAME,4179.ctrls = sd_ctrls,4180.nctrls = ARRAY_SIZE(sd_ctrls),4181.config = sd_config,4182.init = sd_init,4183.start = sd_start,4184.stopN = sd_stopN,4185.stop0 = sd_stop0,4186.pkt_scan = sd_pkt_scan,4187.querymenu = sd_querymenu,4188};41894190/* -- module initialisation -- */4191#define BF(bridge, flags) \4192.driver_info = (BRIDGE_ ## bridge << 8) \4193| (flags)4194static const struct usb_device_id device_table[] = {4195{USB_DEVICE(0x041e, 0x405b), BF(VC0323, FL_VFLIP)},4196{USB_DEVICE(0x046d, 0x0892), BF(VC0321, 0)},4197{USB_DEVICE(0x046d, 0x0896), BF(VC0321, 0)},4198{USB_DEVICE(0x046d, 0x0897), BF(VC0321, 0)},4199{USB_DEVICE(0x0ac8, 0x0321), BF(VC0321, 0)},4200{USB_DEVICE(0x0ac8, 0x0323), BF(VC0323, 0)},4201{USB_DEVICE(0x0ac8, 0x0328), BF(VC0321, 0)},4202{USB_DEVICE(0x0ac8, 0xc001), BF(VC0321, 0)},4203{USB_DEVICE(0x0ac8, 0xc002), BF(VC0321, 0)},4204{USB_DEVICE(0x0ac8, 0xc301), BF(VC0323, FL_SAMSUNG)},4205{USB_DEVICE(0x15b8, 0x6001), BF(VC0323, 0)},4206{USB_DEVICE(0x15b8, 0x6002), BF(VC0323, 0)},4207{USB_DEVICE(0x17ef, 0x4802), BF(VC0323, 0)},4208{}4209};4210MODULE_DEVICE_TABLE(usb, device_table);42114212/* -- device connect -- */4213static int sd_probe(struct usb_interface *intf,4214const struct usb_device_id *id)4215{4216return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),4217THIS_MODULE);4218}42194220static struct usb_driver sd_driver = {4221.name = MODULE_NAME,4222.id_table = device_table,4223.probe = sd_probe,4224.disconnect = gspca_disconnect,4225#ifdef CONFIG_PM4226.suspend = gspca_suspend,4227.resume = gspca_resume,4228#endif4229};42304231/* -- module insert / remove -- */4232static int __init sd_mod_init(void)4233{4234return usb_register(&sd_driver);4235}4236static void __exit sd_mod_exit(void)4237{4238usb_deregister(&sd_driver);4239}42404241module_init(sd_mod_init);4242module_exit(sd_mod_exit);424342444245