mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-25 08:11:45 +00:00
6861 lines
147 KiB
Diff
6861 lines
147 KiB
Diff
From 03225f6dd86073fcef4ebbc764e4c57ecfcbed62 Mon Sep 17 00:00:00 2001
|
|
From: lhelontra <lhe.lontra@gmail.com>
|
|
Date: Sat, 1 Jul 2017 01:33:01 -0300
|
|
Subject: [PATCH] gc2035 camera improvements
|
|
|
|
resolution 1280x720 in hres0 mode, of 5fps to 8fps.
|
|
resolution 1600x1200 in hres0 mode, quality improvements.
|
|
resolution 1600x1200 in hres1, runs at 10fps and fixed darkness frames.
|
|
fixes cropped cif resolution in hres3.
|
|
change hres name, 3 to 2 and 2 to 3.
|
|
added auto choose of hres based on fps or/and resolution.
|
|
new hres modes:
|
|
- hres=0 (640x480|1280x720|1600x1200 - 8 FPS)
|
|
- hres=1 (800x600|1600x1200 - 10 FPS)
|
|
- hres=2 (320x240|352x288|640x480 - 15 FPS)
|
|
- hres=3 (320x240|640x480|800x600|1600x1200 - 20 FPS)
|
|
when trying set fmt, like V4L2_PIX_FMT_{BGR24,SGBRG8}, driver sets BGGR 8bits format and causes segmentation fault. The raw bayer format was disable.
|
|
---
|
|
drivers/media/video/sunxi-vfe/device/gc2035.c | 5780 ++++++++++++++++++-------
|
|
1 file changed, 4161 insertions(+), 1619 deletions(-)
|
|
|
|
diff --git a/drivers/media/video/sunxi-vfe/device/gc2035.c b/drivers/media/video/sunxi-vfe/device/gc2035.c
|
|
index 1d3eb0e77..b1c2b1f33 100755
|
|
--- a/drivers/media/video/sunxi-vfe/device/gc2035.c
|
|
+++ b/drivers/media/video/sunxi-vfe/device/gc2035.c
|
|
@@ -14,22 +14,30 @@
|
|
#include <media/v4l2-mediabus.h>
|
|
#include <linux/io.h>
|
|
|
|
-
|
|
#include "camera.h"
|
|
|
|
+static unsigned int mclk = 0;
|
|
+module_param(mclk, uint, 0);
|
|
+MODULE_PARM_DESC(mclk,
|
|
+"mclk override (default=0)");
|
|
+
|
|
+static unsigned int frate = 0;
|
|
+module_param(frate, uint, 0);
|
|
+MODULE_PARM_DESC(frate,
|
|
+"frate override (default=0)");
|
|
|
|
MODULE_AUTHOR("raymonxiu");
|
|
-MODULE_DESCRIPTION("A low-level driver for GalaxyCore gc2035 sensors");
|
|
+MODULE_AUTHOR("leonardo lontra");
|
|
+MODULE_AUTHOR("@lex");
|
|
+MODULE_DESCRIPTION("A low-level driver for GalaxyCore gc2035 sensors.");
|
|
MODULE_LICENSE("GPL");
|
|
|
|
-
|
|
-
|
|
//for internel driver debug
|
|
-#define DEV_DBG_EN 0
|
|
-#if(DEV_DBG_EN == 1)
|
|
+#define DEV_DBG_EN 0
|
|
+#if(DEV_DBG_EN == 1)
|
|
#define vfe_dev_dbg(x,arg...) printk("[CSI_DEBUG][GC2035]"x,##arg)
|
|
#else
|
|
-#define vfe_dev_dbg(x,arg...)
|
|
+#define vfe_dev_dbg(x,arg...)
|
|
#endif
|
|
|
|
#define vfe_dev_err(x,arg...) printk("[CSI_ERR][GC2035]"x,##arg)
|
|
@@ -45,10 +53,11 @@ MODULE_LICENSE("GPL");
|
|
}
|
|
|
|
//define module timing
|
|
-#define MCLK (24*1000*1000)
|
|
+int MCLK = 24;
|
|
#define VREF_POL V4L2_MBUS_VSYNC_ACTIVE_HIGH
|
|
#define HREF_POL V4L2_MBUS_HSYNC_ACTIVE_HIGH
|
|
#define CLK_POL V4L2_MBUS_PCLK_SAMPLE_RISING
|
|
+#define REG_CLKRC 0xfa
|
|
#define V4L2_IDENT_SENSOR 0x2035
|
|
|
|
//define the voltage level of control signal
|
|
@@ -67,15 +76,17 @@ MODULE_LICENSE("GPL");
|
|
/*
|
|
* Our nominal (default) frame rate.
|
|
*/
|
|
-#define SENSOR_FRAME_RATE 8
|
|
-
|
|
-
|
|
-
|
|
+int SENSOR_FRAME_RATE;
|
|
+int N_WIN_SIZES;
|
|
+static struct regval_list *sensor_default_regs;
|
|
+static struct sensor_win_size *sensor_win_sizes;
|
|
+int hres = 0;
|
|
+struct sensor_resolutions_struct;
|
|
/*
|
|
* The gc2035 sits on i2c with ID 0x78
|
|
*/
|
|
-#define I2C_ADDR 0x78
|
|
-#define SENSOR_NAME "gc2035"
|
|
+#define I2C_ADDR 0x78
|
|
+#define SENSOR_NAME "gc2035"
|
|
/*
|
|
* Information we maintain about a known sensor.
|
|
*/
|
|
@@ -91,900 +102,3325 @@ static inline struct sensor_info *to_state(struct v4l2_subdev *sd)
|
|
return container_of(sd, struct sensor_info, sd);
|
|
}
|
|
|
|
-
|
|
-
|
|
/*
|
|
- * The default register settings
|
|
+ * The registers settings
|
|
*
|
|
*/
|
|
+ static struct regval_list sensor_default_regs_hres0[] =
|
|
+ {
|
|
+ {0xfe,0x80},
|
|
+ {0xfe,0x80},
|
|
+ {0xfe,0x80},
|
|
+ {0xfc,0x06},
|
|
+ {0xf9,0xfe}, //[0] pll enable
|
|
+ {0xfa,0x00},
|
|
+ {0xf6,0x00},
|
|
+ {0xf7,0x17}, //pll enable
|
|
+ {0xf8,0x00},
|
|
+ {0xfe,0x00},
|
|
+ {0x82,0x00},
|
|
+ {0xb3,0x60},
|
|
+ {0xb4,0x40},
|
|
+ {0xb5,0x60},
|
|
+ {0x03,0x05},
|
|
+ {0x04,0x2e},
|
|
+
|
|
+ //measure window
|
|
+ {0xfe,0x00},
|
|
+ {0xec,0x04},
|
|
+ {0xed,0x04},
|
|
+ {0xee,0x60},
|
|
+ {0xef,0x90},
|
|
+
|
|
+ {0x0a,0x00}, //row start
|
|
+ {0x0c,0x02}, //col start
|
|
+
|
|
+ {0x0d,0x04},
|
|
+ {0x0e,0xc0},
|
|
+ {0x0f,0x06}, //Window setting
|
|
+ {0x10,0x58},//
|
|
+
|
|
+ {0x17,0x14}, //[0]mirror [1]flip
|
|
+ {0x18,0x0a}, //sdark 4 row in even frame??
|
|
+ {0x19,0x0a}, //AD pipe number
|
|
+
|
|
+ {0x1a,0x01}, //CISCTL mode4
|
|
+ {0x1b,0x48},
|
|
+ {0x1e,0x88}, //analog mode1 [7] tx-high en
|
|
+ {0x1f,0x0f}, //analog mode2
|
|
+
|
|
+ {0x20,0x05}, //[0]adclk mode [1]rowclk_MODE [2]rsthigh_en
|
|
+ {0x21,0x0f}, //[3]txlow_en
|
|
+ {0x22,0xf0}, //[3:0]vref
|
|
+ {0x23,0xc3}, //f3//ADC_r
|
|
+ {0x24,0x16}, //pad drive
|
|
+
|
|
+ //==============================aec
|
|
+ //AEC
|
|
+ {0xfe,0x01},
|
|
+ {0x09,0x00},
|
|
+
|
|
+ {0x11,0x10},
|
|
+ {0x47,0x30},
|
|
+ {0x0b,0x90},
|
|
+ {0x13,0x80}, //0x75
|
|
+ {0x1f,0xc0},//addd
|
|
+ {0x20,0x50},//add 0x60
|
|
+ {0xfe,0x00},
|
|
+ {0xf7,0x17}, //pll enable
|
|
+ {0xf8,0x00},
|
|
+ {0x05,0x01},
|
|
+ {0x06,0x18},
|
|
+ {0x07,0x00},
|
|
+ {0x08,0x48},
|
|
+ {0xfe,0x01},
|
|
+ {0x27,0x00},
|
|
+ {0x28,0x6a},
|
|
+ {0x29,0x03},
|
|
+ {0x2a,0x50},//8fps
|
|
+ {0x2b,0x04},
|
|
+ {0x2c,0xf8},
|
|
+ {0x2d,0x06},
|
|
+ {0x2e,0xa0},//6fps
|
|
+ {0x3e,0x40},//0x40
|
|
+ {0xfe,0x00},
|
|
+ {0xb6,0x03}, //AEC enable
|
|
+ {0xfe,0x00},
|
|
+
|
|
+ ///////BLK
|
|
+ {0x3f,0x00}, //prc close???
|
|
+ {0x40,0xa7}, // a7 77
|
|
+ {0x42,0x7f},
|
|
+ {0x43,0x30},//0x30
|
|
+
|
|
+ {0x5c,0x08},
|
|
+ //{0x6c 3a //manual_offset ,real B channel
|
|
+ //{0x6d 3a//manual_offset ,real B channel
|
|
+ //{0x6e 36//manual_offset ,real R channel
|
|
+ //{0x6f 36//manual_offset ,real R channel
|
|
+ {0x5e,0x20},
|
|
+ {0x5f,0x20},
|
|
+ {0x60,0x20},
|
|
+ {0x61,0x20},
|
|
+ {0x62,0x20},
|
|
+ {0x63,0x20},
|
|
+ {0x64,0x20},
|
|
+ {0x65,0x20},
|
|
+ {0x66,0x20},
|
|
+ {0x67,0x20},
|
|
+ {0x68,0x20},
|
|
+ {0x69,0x20},
|
|
+
|
|
+ /////crop//
|
|
+ {0x90,0x01}, //crop enable
|
|
+ {0x95,0x04}, //1600x1200
|
|
+ {0x96,0xb0},
|
|
+ {0x97,0x06},
|
|
+ {0x98,0x40},
|
|
+
|
|
+ {0xfe,0x03},
|
|
+ {0x42,0x80},
|
|
+ {0x43,0x06}, //output buf width //buf widthÕâÒ»¿éµÄÅäÖû¹ÐèÒªžãÇå³þ
|
|
+ {0x41,0x00}, // delay
|
|
+ {0x40,0x00}, //fifo half full trig
|
|
+ {0x17,0x01}, //wid mipi²¿·ÖµÄ·ÖƵÊÇΪʲÎv£¿
|
|
+ {0xfe,0x00},
|
|
+
|
|
+ {0x80,0xff},//block enable 0xff
|
|
+ {0x81,0x26},//38 //skin_Y 8c_debug
|
|
+
|
|
+ {0x03,0x05},
|
|
+ {0x04,0x2e},
|
|
+ {0x84,0x00}, //output put foramat
|
|
+ {0x86,0x03}, //sync plority
|
|
+ {0x87,0x80}, //middle gamma on
|
|
+ {0x8b,0xbc},//debug modeÐèÒªžãÇå³þÒ»ÏÂ
|
|
+ {0xa7,0x80},//B_channel_gain
|
|
+ {0xa8,0x80},//B_channel_gain
|
|
+ {0xb0,0x80}, //globle gain
|
|
+ {0xc0,0x40},
|
|
|
|
-static struct regval_list sensor_default_regs[] = {
|
|
-{0xfe , 0x80},
|
|
-{0xfe , 0x80},
|
|
-{0xfe , 0x80},
|
|
-{0xfc , 0x06},
|
|
-{0xf2 , 0x00},
|
|
-{0xf3 , 0x00},
|
|
-{0xf4 , 0x00},
|
|
-{0xf5 , 0x00},
|
|
-{0xf9 , 0xfe}, //[0] pll enable
|
|
-{0xfa , 0x00},
|
|
-{0xf6 , 0x00},
|
|
-{0xf7 , 0x15}, //pll enable
|
|
-
|
|
-{0xf8 , 0x85},
|
|
-{0xfe , 0x00},
|
|
-{0x82 , 0x00},
|
|
-{0xb3 , 0x60},
|
|
-{0xb4 , 0x40},
|
|
-{0xb5 , 0x60},
|
|
-
|
|
-{0x03 , 0x02},
|
|
-{0x04 , 0x80},
|
|
-
|
|
-//////////measure window ///////////
|
|
-{0xfe , 0x00},
|
|
-{0xec , 0x06},//04
|
|
-{0xed , 0x06},//04
|
|
-{0xee , 0x62},//60
|
|
-{0xef , 0x92},//90
|
|
-
|
|
-///////////analog/////////////
|
|
-{0x0a , 0x00}, //row start
|
|
-{0x0c , 0x00}, //col start
|
|
-{0x0d , 0x04},
|
|
-{0x0e , 0xc0},
|
|
-{0x0f , 0x06}, //Window setting
|
|
-{0x10 , 0x58},
|
|
-{0x17 , 0x14}, //[0]mirror [1]flip
|
|
-
|
|
-
|
|
-{0x18 , 0x0a}, //0a 2012.10.26
|
|
-{0x19 , 0x0a}, //AD pipe number
|
|
-
|
|
-{0x1a, 0x01}, //CISCTL mode4
|
|
-{0x1b , 0x8b},
|
|
-{0x1c , 0x05}, //added
|
|
-{0x1e , 0x88}, //analog mode1 [7] tx-high en [5:3]COL_bias
|
|
-{0x1f , 0x08}, //[3] tx-low en//
|
|
-{0x20 , 0x05}, //[0]adclk mode , 0x[1]rowclk_MODE [2]rsthigh_en
|
|
-{0x21 , 0x0f}, //[6:4]rsg
|
|
-{0x22 , 0xf0}, //[3:0]vref 0xf0
|
|
-{0x23 , 0xc3}, //f3//ADC_r
|
|
-{0x24 , 0x15}, //pad drive <=36MHz, use 0x00 is ok
|
|
-
|
|
-//AEC
|
|
-{0xfe , 0x01},
|
|
-{0x11 , 0x20},//AEC_out_slope , 0x
|
|
-{0x1f , 0xa0},//max_post_gain
|
|
-{0x20 , 0x40},//max_pre_gain
|
|
-{0x47 , 0x30},//AEC_outdoor_th
|
|
-{0x0b , 0x10},//
|
|
-{0x13 , 0x75},//y_target
|
|
-{0xfe , 0x00},
|
|
-
|
|
-
|
|
-{0x05 , 0x01},//hb
|
|
-{0x06 , 0x11},
|
|
-{0x07 , 0x00},//vb
|
|
-{0x08 , 0x50},
|
|
-{0xfe , 0x01},
|
|
-{0x27 , 0x00},//step
|
|
-{0x28 , 0xa0},
|
|
-{0x29 , 0x05},//level1
|
|
-{0x2a , 0x00},
|
|
-{0x2b , 0x05},//level2
|
|
-{0x2c , 0x00},
|
|
-{0x2d , 0x06},//6e8//level3
|
|
-{0x2e , 0xe0},
|
|
-{0x2f , 0x0a},//level4
|
|
-{0x30 , 0x00},
|
|
-{0x3e , 0x40},
|
|
-{0xfe , 0x00},
|
|
-{0xfe , 0x00}, //0x , 0x , 0x , 0x , 0x
|
|
-{0xb6 , 0x03}, //AEC enable
|
|
-{0xfe , 0x00},
|
|
-
|
|
-/////////BLK//////
|
|
-{0x3f , 0x00}, //prc close
|
|
-{0x40 , 0x77},//
|
|
-{0x42 , 0x7f},
|
|
-{0x43 , 0x30},
|
|
-{0x5c , 0x08},
|
|
-{0x5e , 0x20},
|
|
-{0x5f , 0x20},
|
|
-{0x60 , 0x20},
|
|
-{0x61 , 0x20},
|
|
-{0x62 , 0x20},
|
|
-{0x63 , 0x20},
|
|
-{0x64 , 0x20},
|
|
-{0x65 , 0x20},
|
|
-
|
|
-///block////////////
|
|
-{0x80 , 0xff},
|
|
-{0x81 , 0x26},//38 , 0x//skin_Y 8c_debug
|
|
-{0x87 , 0x90}, //[7]middle gamma
|
|
-{0x84 , 0x02}, //output put foramat
|
|
-{0x86 , 0x07}, //02 //sync plority
|
|
-{0x8b , 0xbc},
|
|
-{0xb0 , 0x80}, //globle gain
|
|
-{0xc0 , 0x40},//Yuv bypass
|
|
-
|
|
-//////lsc/////////////
|
|
-{0xfe , 0x01},
|
|
-{0xc2 , 0x38},
|
|
-{0xc3 , 0x25},
|
|
-{0xc4 , 0x21},
|
|
-{0xc8 , 0x19},
|
|
-{0xc9 , 0x12},
|
|
-{0xca , 0x0e},
|
|
-{0xbc , 0x43},
|
|
-{0xbd , 0x18},
|
|
-{0xbe , 0x1b},
|
|
-{0xb6 , 0x40},
|
|
-{0xb7 , 0x2e},
|
|
-{0xb8 , 0x26},
|
|
-{0xc5 , 0x05},
|
|
-{0xc6 , 0x03},
|
|
-{0xc7 , 0x04},
|
|
-{0xcb , 0x00},
|
|
-{0xcc , 0x00},
|
|
-{0xcd , 0x00},
|
|
-{0xbf , 0x14},
|
|
-{0xc0 , 0x22},
|
|
-{0xc1 , 0x1b},
|
|
-{0xb9 , 0x00},
|
|
-{0xba , 0x05},
|
|
-{0xbb , 0x05},
|
|
-{0xaa , 0x35},
|
|
-{0xab , 0x33},
|
|
-{0xac , 0x33},
|
|
-{0xad , 0x25},
|
|
-{0xae , 0x22},
|
|
-{0xaf , 0x27},
|
|
-{0xb0 , 0x1d},
|
|
-{0xb1 , 0x20},
|
|
-{0xb2 , 0x22},
|
|
-{0xb3 , 0x14},
|
|
-{0xb4 , 0x15},
|
|
-{0xb5 , 0x16},
|
|
-{0xd0 , 0x00},
|
|
-{0xd2 , 0x07},
|
|
-{0xd3 , 0x08},
|
|
-{0xd8 , 0x00},
|
|
-{0xda , 0x13},
|
|
-{0xdb , 0x17},
|
|
-{0xdc , 0x00},
|
|
-{0xde , 0x0a},
|
|
-{0xdf , 0x08},
|
|
-{0xd4 , 0x00},
|
|
-{0xd6 , 0x00},
|
|
-{0xd7 , 0x0c},
|
|
-{0xa4 , 0x00},
|
|
-{0xa5 , 0x00},
|
|
-{0xa6 , 0x00},
|
|
-{0xa7 , 0x00},
|
|
-{0xa8 , 0x00},
|
|
-{0xa9 , 0x00},
|
|
-{0xa1 , 0x80},
|
|
-{0xa2 , 0x80},
|
|
-
|
|
-//////////cc//////////////
|
|
-{0xfe , 0x02},
|
|
-{0xc0 , 0x01},
|
|
-{0xc1 , 0x40}, //Green_cc for d
|
|
-{0xc2 , 0xfc},
|
|
-{0xc3 , 0x05},
|
|
-{0xc4 , 0xec},
|
|
-{0xc5 , 0x42},
|
|
-{0xc6 , 0xf8},
|
|
-{0xc7 , 0x40},//for cwf
|
|
-{0xc8 , 0xf8},
|
|
-{0xc9 , 0x06},
|
|
-{0xca , 0xfd},
|
|
-{0xcb , 0x3e},
|
|
-{0xcc , 0xf3},
|
|
-{0xcd , 0x36},//for A
|
|
-{0xce , 0xf6},
|
|
-{0xcf , 0x04},
|
|
-{0xe3 , 0x0c},
|
|
-{0xe4 , 0x44},
|
|
-{0xe5 , 0xe5},
|
|
-{0xfe , 0x00},
|
|
-
|
|
-///////awb start ////////////////
|
|
-//AWB clear
|
|
-{0xfe , 0x01},
|
|
-{0x4f , 0x00},
|
|
-{0x4d , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0x10}, // 10
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0x20}, // 20
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0x30},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00}, // 30
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0x40}, // 40
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0x50}, // 50
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0x60}, // 60
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0x70}, // 70
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0x80}, // 80
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0x90}, // 90
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0xa0}, // a0
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0xb0}, // b0
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0xc0}, // c0
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4d , 0xd0}, // d0
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x00},
|
|
-{0x4f , 0x01},
|
|
-/////// awb value////////
|
|
-{0xfe , 0x01},
|
|
-{0x4f , 0x00},
|
|
-{0x4d , 0x30},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x80},
|
|
-{0x4e , 0x80},
|
|
-{0x4e , 0x02},
|
|
-{0x4e , 0x02},
|
|
-{0x4d , 0x40},
|
|
-{0x4e , 0x00},
|
|
-{0x4e , 0x80},
|
|
-{0x4e , 0x80},
|
|
-{0x4e , 0x02},
|
|
-{0x4e , 0x02},
|
|
-{0x4e , 0x02},
|
|
-{0x4d , 0x53},
|
|
-{0x4e , 0x08},
|
|
-{0x4e , 0x04},
|
|
-{0x4d , 0x62},
|
|
-{0x4e , 0x10},
|
|
-{0x4d , 0x72},
|
|
-{0x4e , 0x20},
|
|
-{0x4f , 0x01},
|
|
-
|
|
-/////awb////
|
|
-{0xfe , 0x01},
|
|
-{0x50 , 0x88},//c0//[6]green mode
|
|
-{0x52 , 0x40},
|
|
-{0x54 , 0x60},
|
|
-{0x56 , 0x06},
|
|
-{0x57 , 0x20}, //pre adjust
|
|
-{0x58 , 0x01},
|
|
-{0x5b , 0x02}, //AWB_gain_delta
|
|
-{0x61 , 0xaa},//R/G stand
|
|
-{0x62 , 0xaa},//R/G stand
|
|
-{0x71 , 0x00},
|
|
-{0x74 , 0x10}, //0x//AWB_C_max
|
|
-{0x77 , 0x08}, // 0x//AWB_p2_x
|
|
-{0x78 , 0xfd}, //AWB_p2_y
|
|
-{0x86 , 0x30},
|
|
-{0x87 , 0x00},
|
|
-{0x88 , 0x04},//06 , 0x//[1]dark mode
|
|
-{0x8a , 0xc0},//awb move mode
|
|
-{0x89 , 0x75},
|
|
-{0x84 , 0x08}, //0x//auto_window
|
|
-{0x8b , 0x00}, // 0x//awb compare luma
|
|
-{0x8d , 0x70}, //awb gain limit R
|
|
-{0x8e , 0x70},//G
|
|
-{0x8f , 0xf4},//B
|
|
-{0xfe , 0x00},
|
|
-{0x82 , 0x02},//awb_en
|
|
-/////////awb end /////////////
|
|
-
|
|
-///==========asde
|
|
-{0xfe , 0x01},
|
|
-{0x21 , 0xbf},
|
|
-{0xfe , 0x02},
|
|
-{0xa4 , 0x00},//
|
|
-{0xa5 , 0x40}, //lsc_th
|
|
-{0xa2 , 0xa0}, //lsc_dec_slope
|
|
-{0xa6 , 0x80}, //dd_th
|
|
-{0xa7 , 0x80}, //ot_th
|
|
-{0xab , 0x31}, //
|
|
-{0xa9 , 0x6f}, //
|
|
-{0xb0 , 0x99}, //0x//edge effect slope low
|
|
-{0xb1 , 0x34},//edge effect slope low
|
|
-{0xb3 , 0xf0}, //saturation dec slope
|
|
-{0xde , 0xb6}, //
|
|
-{0x38 , 0x0f}, //
|
|
-{0x39 , 0x60}, //
|
|
-{0xfe , 0x00},
|
|
-{0x81 , 0x26},
|
|
-{0xfe , 0x02},
|
|
-{0x83 , 0x00},//
|
|
-{0x84 , 0x45},//
|
|
-////////////YCP//////////
|
|
-{0xd1 , 0x34},//saturation_cb
|
|
-{0xd2 , 0x34},//saturation_Cr
|
|
-{0xd3 , 0x40},//contrast ? {0xd4 , 0x80},//contrast center
|
|
-{0xd4 , 0x80},//contrast center
|
|
-{0xd5 , 0x00},//luma_offset
|
|
-{0xdc , 0x30},
|
|
-{0xdd , 0xb8},//edge_sa_g,b
|
|
-{0xfe , 0x00},
|
|
-///////dndd///////////
|
|
-{0xfe , 0x02},
|
|
-{0x88 , 0x15},//dn_b_base
|
|
-{0x8c , 0xf6}, //[2]b_in_dark_inc
|
|
-{0x89 , 0x03}, //dn_c_weight
|
|
-////////EE ///////////
|
|
-{0xfe , 0x02},
|
|
-{0x90 , 0x6c},// EEINTP mode1
|
|
-{0x97 , 0x45},// edge effect
|
|
-////==============RGB Gamma
|
|
-{0xfe , 0x02},
|
|
-{0x15 , 0x0a},
|
|
-{0x16 , 0x12},
|
|
-{0x17 , 0x19},
|
|
-{0x18 , 0x1f},
|
|
-{0x19 , 0x2c},
|
|
-{0x1a , 0x38},
|
|
-{0x1b , 0x42},
|
|
-{0x1c , 0x4e},
|
|
-{0x1d , 0x63},
|
|
-{0x1e , 0x76},
|
|
-{0x1f , 0x87},
|
|
-{0x20 , 0x96},
|
|
-{0x21 , 0xa2},
|
|
-{0x22 , 0xb8},
|
|
-{0x23 , 0xca},
|
|
-{0x24 , 0xd8},
|
|
-{0x25 , 0xe3},
|
|
-{0x26 , 0xf0},
|
|
-{0x27 , 0xf8},
|
|
-{0x28 , 0xfd},
|
|
-{0x29 , 0xff},
|
|
-
|
|
-///=================y gamma
|
|
-{0xfe , 0x02},
|
|
-{0x2b , 0x00},
|
|
-{0x2c , 0x04},
|
|
-{0x2d , 0x09},
|
|
-{0x2e , 0x18},
|
|
-{0x2f , 0x27},
|
|
-{0x30 , 0x37},
|
|
-{0x31 , 0x49},
|
|
-{0x32 , 0x5c},
|
|
-{0x33 , 0x7e},
|
|
-{0x34 , 0xa0},
|
|
-{0x35 , 0xc0},
|
|
-{0x36 , 0xe0},
|
|
-{0x37 , 0xff},
|
|
-/////1600x1200size//
|
|
-{0xfe , 0x00},//
|
|
-{0x90 , 0x01}, //0x//crop enable
|
|
-{0x94 , 0x04},
|
|
-{0x95 , 0x04}, //0x//1600x1200
|
|
-{0x96 , 0xb0},
|
|
-{0x97 , 0x06},
|
|
-{0x98 , 0x40},
|
|
-
|
|
-{0xfe , 0x03},
|
|
-{0x42 , 0x40},
|
|
-{0x43 , 0x06}, //output buf width
|
|
-{0x41 , 0x02}, // Pclk_polarity
|
|
-{0x40 , 0x40}, //00
|
|
-{0x17 , 0x00}, //widv
|
|
-{0xfe , 0x00},
|
|
-////output DVP/////
|
|
-{0xfe , 0x00},
|
|
-{0x82 , 0xfe}, // fe
|
|
-{0xf2 , 0x70},
|
|
-{0xf3 , 0xff},
|
|
-{0xf4 , 0x00},
|
|
-{0xf5 , 0x30},
|
|
- ////////sabsumple 800X600//////
|
|
-{0xfe , 0x00},
|
|
-{0xb6 , 0x03},
|
|
-{0xfa , 0x00},
|
|
-
|
|
-{0xc8 , 0x00},//close scaler
|
|
-{0x99 , 0x22},// 1/2 subsample
|
|
-{0x9a , 0x07},
|
|
-{0x9b , 0x00},
|
|
-{0x9c , 0x00},
|
|
-{0x9d , 0x00},
|
|
-{0x9e , 0x00},
|
|
-{0x9f , 0x00},
|
|
-{0xa0 , 0x00},
|
|
-{0xa1 , 0x00},
|
|
-{0xa2 , 0x00},
|
|
-
|
|
-{0x90 , 0x01}, //crop enable
|
|
-{0x95 , 0x02},
|
|
-{0x96 , 0x58},
|
|
-{0x97 , 0x03},
|
|
-{0x98 , 0x20},
|
|
-
|
|
-#if 1
|
|
-///////// re zao///
|
|
-{0xfe , 0x00},
|
|
-{0x22 , 0xf0},
|
|
-{0xfe , 0x01},
|
|
-{0x21 , 0xff},
|
|
-{0xfe , 0x02},
|
|
-{0x8a , 0x33},
|
|
-{0x8c , 0x76},
|
|
-{0x8d , 0x85},
|
|
-{0xa6 , 0xf0},
|
|
-{0xae , 0x9f},
|
|
-{0xa2 , 0x90},
|
|
-{0xa5 , 0x40},
|
|
-{0xa7 , 0x30},
|
|
-{0xb0 , 0x88},
|
|
-{0x38 , 0x0b},
|
|
-{0x39 , 0x30},
|
|
-{0xfe , 0x00},
|
|
-{0x87 , 0xb0},
|
|
-
|
|
-//// small RGB gamma////
|
|
-/*
|
|
-{0xfe , 0x02},
|
|
-{0x15 , 0x0b},
|
|
-{0x16 , 0x0e},
|
|
-{0x17 , 0x10},
|
|
-{0x18 , 0x12},
|
|
-{0x19 , 0x19},
|
|
-{0x1a , 0x21},
|
|
-{0x1b , 0x29},
|
|
-{0x1c , 0x31},
|
|
-{0x1d , 0x41},
|
|
-{0x1e , 0x50},
|
|
-{0x1f , 0x5f},
|
|
-{0x20 , 0x6d},
|
|
-{0x21 , 0x79},
|
|
-{0x22 , 0x91},
|
|
-{0x23 , 0xa5},
|
|
-{0x24 , 0xb9},
|
|
-{0x25 , 0xc9},
|
|
-{0x26 , 0xe1},
|
|
-{0x27 , 0xee},
|
|
-{0x28 , 0xf7},
|
|
-{0x29 , 0xff},
|
|
-*/
|
|
-////dark sun/////
|
|
-{0xfe , 0x02},
|
|
-{0x40 , 0x06},
|
|
-{0x41 , 0x23},
|
|
-{0x42 , 0x3f},
|
|
-{0x43 , 0x06},
|
|
-{0x44 , 0x00},
|
|
-{0x45 , 0x00},
|
|
-{0x46 , 0x14},
|
|
-{0x47 , 0x09},
|
|
-{0xfe , 0x00},
|
|
+ #if 1
|
|
+ //lsc,
|
|
+ {0xfe,0x01},
|
|
+ {0xc2,0x10},//0x1f
|
|
+ {0xc3,0x02},//0x07
|
|
+ {0xc4,0x03},//0x03
|
|
+ {0xc8,0x10},//10
|
|
+ {0xc9,0x0a},//0x0a
|
|
+ {0xca,0x08},//0x08
|
|
+ {0xbc,0x16},// 3c
|
|
+ {0xbd,0x10},//0x1c
|
|
+ {0xbe,0x10},//0x1a
|
|
+ {0xb6,0x22},// 0x30
|
|
+ {0xb7,0x18},//0x1c
|
|
+ {0xb8,0x15},//0x15
|
|
+ {0xc5,0x00},
|
|
+ {0xc6,0x00},
|
|
+ {0xc7,0x00},
|
|
+ {0xcb,0x00},
|
|
+ {0xcc,0x00},
|
|
+ {0xcd,0x00},
|
|
+ {0xbf,0x0a},//0x0c
|
|
+ {0xc0,0x01},//0x04
|
|
+ {0xc1,0x00},
|
|
+ {0xb9,0x00},
|
|
+ {0xba,0x00},
|
|
+ {0xbb,0x00},
|
|
+ {0xaa,0x00},
|
|
+ {0xab,0x02},//00
|
|
+ {0xac,0x00},
|
|
+ {0xad,0x00},
|
|
+ {0xae,0x00},
|
|
+ {0xaf,0x00},
|
|
+ {0xb0,0x00},
|
|
+ {0xb1,0x00},
|
|
+ {0xb2,0x00},
|
|
+ {0xb3,0x00},
|
|
+ {0xb4,0x02},//00
|
|
+ {0xb5,0x00},
|
|
+ {0xd0,0x01},
|
|
+ {0xd2,0x02},//00
|
|
+ {0xd3,0x00},
|
|
+ {0xd8,0x18},
|
|
+ {0xda,0x00},
|
|
+ {0xdb,0x04},
|
|
+ {0xdc,0x00},
|
|
+ {0xde,0x07},//0x07
|
|
+ {0xdf,0x00},
|
|
+ {0xd4,0x00},
|
|
+ {0xd6,0x00},//00
|
|
+ {0xd7,0x00},
|
|
+ {0xa4,0x20},//00
|
|
+ {0xa5,0x02},//00
|
|
+ {0xa6,0x04},
|
|
+ {0xa7,0x00},
|
|
+ {0xa8,0x20},//00
|
|
+ {0xa9,0x02},//00
|
|
+ {0xa1,0x80},
|
|
+ {0xa2,0x80},
|
|
+
|
|
+ {0xfe,0x02},
|
|
+ {0xa4,0x00},
|
|
+ {0xfe,0x00},
|
|
+
|
|
+ {0xfe,0x02},
|
|
+ {0xc0,0x01},
|
|
+ {0xc1,0x40}, //Green_cc
|
|
+ {0xc2,0xfc},
|
|
+ {0xc3,0x05},
|
|
+ {0xc4,0xec},
|
|
+ {0xc5,0x42},
|
|
+ {0xc6,0xf8},
|
|
+ {0xc7,0x40},
|
|
+ {0xc8,0xf8},
|
|
+ {0xc9,0x06},
|
|
+ {0xca,0xfd},
|
|
+ {0xcb,0x3e},
|
|
+ {0xcc,0xf3},
|
|
+ {0xcd,0x36},
|
|
+ {0xce,0xf6},
|
|
+ {0xcf,0x04},
|
|
+ {0xe3,0x0c},
|
|
+ {0xe4,0x44},
|
|
+ {0xe5,0xe5},
|
|
+ {0xfe,0x00},
|
|
+ {0xfe,0x00},
|
|
+ //awb
|
|
+ {0xfe,0x01},
|
|
+ {0x4f,0x00},
|
|
+ {0x4d,0x10}, ////////////////10
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0x20}, ///////////////20
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0x30}, //////////////////30
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x02}, // d65
|
|
+ {0x4e,0x04},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0x40}, //////////////////////40
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00}, //cwf
|
|
+ {0x4e,0x08}, // cwf
|
|
+ {0x4e,0x04},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0x50}, //////////////////50
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x10}, // tl84
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0x60}, /////////////////60
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0x70}, ///////////////////70
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x20}, // a
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0x80}, /////////////////////80
|
|
+ {0x4e,0x00}, //H
|
|
+ {0x4e,0x40}, // h
|
|
+ {0x4e,0x00}, //A
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0x90}, //////////////////////90
|
|
+ {0x4e,0x00}, // h
|
|
+ {0x4e,0x40},
|
|
+ {0x4e,0x40},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0xa0}, /////////////////a0
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0xb0}, //////////////////////////////////b0
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0xc0}, //////////////////////////////////c0
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0xd0}, ////////////////////////////d0
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0xe0}, /////////////////////////////////e0
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4d,0xf0}, /////////////////////////////////f0
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4e,0x00},
|
|
+ {0x4f,0x01},
|
|
+ #endif
|
|
+ {0xfe,0x01},
|
|
+ {0x50,0x88},
|
|
+ {0x52,0x40},
|
|
+ {0x54,0x60},
|
|
+ {0x56,0x06},
|
|
+ {0x57,0x20}, //pre adjust
|
|
+ {0x58,0x01},
|
|
+ {0x5c,0xf0},
|
|
+ {0x5d,0x40},
|
|
+ {0x5b,0x02}, //AWB_gain_delta
|
|
+ {0x61,0xaa},//R/G stand
|
|
+ {0x62,0xaa},//R/G stand
|
|
+ {0x71,0x00},
|
|
+ {0x74,0x10}, //AWB_C_max
|
|
+ {0x77,0x08}, //AWB_p2_x
|
|
+ {0x78,0xfd}, //AWB_p2_y
|
|
+ {0x86,0x30},
|
|
+ {0x87,0x00},
|
|
+ {0x88,0x06},//04
|
|
+ {0x8a,0x8a},//awb move mode
|
|
+ {0x89,0x75},
|
|
+ {0x84,0x08}, //auto_window
|
|
+ {0x8b,0x00}, //awb compare luma
|
|
+ {0x8d,0x70}, //awb gain limit R
|
|
+ {0x8e,0x70},//G
|
|
+ {0x8f,0xf4},//B
|
|
+ {0x5e,0xa4},
|
|
+ {0x5f,0x60},
|
|
+ {0x92,0x58},
|
|
+ {0xfe,0x00},
|
|
+ {0x82,0x02},//awb_en
|
|
+
|
|
+ //{0xfe ,0xec}, luma_value
|
|
+ {0xfe,0x01},
|
|
+ {0x1e,0xf1},
|
|
+ {0x9c,0x00}, //add abs slope 0x02
|
|
+ {0x21,0xbf},
|
|
+ {0xfe,0x02},
|
|
+ {0xa5,0x60}, //lsc_th //40
|
|
+ {0xa2,0xc0}, //lsc_dec_slope 0xa0
|
|
+ {0xa3,0x30}, //when total gain is bigger than the value, enter dark light mode 0x20 added
|
|
+ {0xa4,0x00},//add
|
|
+ {0xa6,0x50}, //dd_th
|
|
+ {0xa7,0x80}, //ot_th 30
|
|
+ {0xab,0x31}, //[0]b_dn_effect_dark_inc_or_dec
|
|
+ {0x88,0x15}, //[5:0]b_base
|
|
+ {0xa9,0x6c}, //[7:4] ASDE_DN_b_slope_high 0x6c 0x6f
|
|
+
|
|
+ {0xb0,0x66}, //6edge effect slope 0x66 0x88 0x99
|
|
+
|
|
+ {0xb3,0x70}, //saturation dec slope //0x70 0x40
|
|
+ {0xb4,0x32},//0x32 0x42
|
|
+ {0x8c,0xf6}, //[2]b_in_dark_inc
|
|
+ {0x89,0x03}, //dn_c_weight 0x03
|
|
+
|
|
+ {0xde,0xb8}, //b6[7]asde_autogray [3:0]auto_gray_value 0xb9 0xb8 0xb9
|
|
+ {0x38,0x06}, //0aasde_autogray_slope 0x08 0x05 0x06 0x0a
|
|
+ {0x39,0x50}, //50asde_autogray_threshold 0x50 0x30
|
|
+
|
|
+ {0xfe,0x00},
|
|
+ {0x81,0x24}, //0x26
|
|
+ {0x87,0x90}, //[5:4]first_dn_en first_dd_en enable 0x80 0xb0
|
|
+
|
|
+ {0xfe,0x02},
|
|
+ {0x83,0x00},//[6]green_bks_auto [5]gobal_green_bks
|
|
+ {0x84,0x45},//RB offset
|
|
+ {0xd1,0x38}, //saturation_cb 0x3a
|
|
+ {0xd2,0x38}, //saturation_Cr 0x38
|
|
+ {0xd3,0x30},
|
|
+ {0xdc,0x30},
|
|
+ {0xdd,0xb8}, //edge_sa_g,b
|
|
+ {0xfe,0x00},
|
|
+ {0xad,0x80},//80
|
|
+ {0xae,0x7d},//80
|
|
+ {0xaf,0x80},
|
|
+
|
|
+ //gmma-curve4-low strech
|
|
+ {0xfe,0x02},
|
|
+ {0x15,0x05},
|
|
+ {0x16,0x0b},
|
|
+ {0x17,0x10},
|
|
+ {0x18,0x16},
|
|
+ {0x19,0x24},
|
|
+ {0x1a,0x32},
|
|
+ {0x1b,0x42},
|
|
+ {0x1c,0x4e},
|
|
+ {0x1d,0x64},
|
|
+ {0x1e,0x76},
|
|
+ {0x1f,0x86},
|
|
+ {0x20,0x94},
|
|
+ {0x21,0x9f},
|
|
+ {0x22,0xb4},
|
|
+ {0x23,0xc3},
|
|
+ {0x24,0xce},
|
|
+ {0x25,0xd7},
|
|
+ {0x26,0xe3},
|
|
+ {0x27,0xec},
|
|
+ {0x28,0xf7},
|
|
+ {0x29,0xff},
|
|
+
|
|
+ //y-gamma
|
|
+ {0x2b,0x00},
|
|
+ {0x2c,0x04},
|
|
+ {0x2d,0x09},
|
|
+ {0x2e,0x18},
|
|
+ {0x2f,0x27},
|
|
+ {0x30,0x37},
|
|
+ {0x31,0x49},
|
|
+ {0x32,0x5c},
|
|
+ {0x33,0x7e},
|
|
+ {0x34,0xa0},
|
|
+ {0x35,0xc0},
|
|
+ {0x36,0xe0},
|
|
+ {0x37,0xff},
|
|
+ {0xfe,0x00},
|
|
+
|
|
+ {0xfe,0x00},
|
|
+
|
|
+ {0x82,0xfe},
|
|
+ //sleep 400
|
|
+ {0xf2,0x70},
|
|
+ {0xf3,0xff},
|
|
+ {0xf4,0x00},
|
|
+ {0xf5,0x30},
|
|
+ {0xfe,0x01},
|
|
+ {0x0b,0x90},
|
|
+ {0x87,0x00},//0x10
|
|
+ {0xfe,0x00},
|
|
+
|
|
+ /////,0xup},date
|
|
+ //ÈÈ?0x },
|
|
+ {0xfe,0x02},
|
|
+ {0xa6,0x80}, //dd_th
|
|
+ {0xa7,0x60}, //ot_th //0x80
|
|
+ {0xa9,0x66}, //6f[7:4] ASDE_DN_b_slope_high 0x68
|
|
+ {0xb0,0x88}, //edge effect slope 0x99
|
|
+ {0x38,0x08}, //asde_autogray_slope 0x08 0x0f 0x0a 0b
|
|
+ {0x39,0x50}, //asde_autogray_threshold 0x60
|
|
+ {0xfe,0x00},
|
|
+ {0x87,0x90}, //[5:4]first_dn_en first_dd_en 0x90
|
|
+
|
|
+ {0xfe,0x00},
|
|
+ {0x90,0x01},
|
|
+ {0x95,0x01},
|
|
+ {0x96,0xe0},
|
|
+ {0x97,0x02},
|
|
+ {0x98,0x80},
|
|
+ {0xc8,0x14},
|
|
+ {0xf7,0x0D},
|
|
+ {0xf8,0x83},
|
|
+ {0xfa,0x00},//pll=4
|
|
+ {0x05,0x00},
|
|
+ {0x06,0xc4},
|
|
+ {0x07,0x00},
|
|
+ {0x08,0xae},
|
|
+ {0xad,0x80},
|
|
+ {0xae,0x7a},
|
|
+ {0xaf,0x7a},
|
|
+ {0xfe,0x01},
|
|
+ {0x27,0x00},
|
|
+ {0x28,0xe5},
|
|
+ {0x29,0x05},
|
|
+ {0x2a,0x5e},//18fps
|
|
+ {0x2b,0x07},
|
|
+ {0x2c,0x28},//12.5fps
|
|
+ {0x2d,0x0a},
|
|
+ {0x2e,0xbc},//8fps
|
|
+ {0x3e,0x40},// exposure level
|
|
+ {0xfe,0x03},
|
|
+ {0x42,0x04},
|
|
+ {0x43,0x05}, //output buf width
|
|
+ {0x41,0x02}, // delay
|
|
+ {0x40,0x40}, //fifo half full trig
|
|
+ {0x17,0x00}, //widv is 0
|
|
+ {0xfe,0x00},
|
|
+ {0xc8,0x55},
|
|
+ };
|
|
+
|
|
+ /* 1600X1200 UXGA capture */
|
|
+ static struct regval_list sensor_uxga_regs_hres0[] =
|
|
+ {
|
|
+ {0xfe , 0x00},
|
|
+ {0x0a , 0x00}, //row start
|
|
+ {0x0c , 0x00}, //col start
|
|
+
|
|
+ {0x0d , 0x04},
|
|
+ {0x0e , 0xc0},
|
|
+ {0x0f , 0x06}, //Window setting
|
|
+ {0x10 , 0x58},//
|
|
+
|
|
+ {0x90 , 0x01}, //crop enable
|
|
+ {0x94 , 0x04},//add
|
|
+ {0x95 , 0x04},
|
|
+ {0x96 , 0xb0},
|
|
+ {0x97 , 0x06},
|
|
+ {0x98 , 0x40},
|
|
+ {0x99 , 0x11},
|
|
+ {0xc8 , 0x00},
|
|
+
|
|
+ {0xfa , 0x11},
|
|
+
|
|
+ {0xfe , 0x03},
|
|
+ {0x42 , 0x80},
|
|
+ {0x43 , 0x06}, //output buf width
|
|
+ {0x41 , 0x00}, // delay
|
|
+ {0x40 , 0x00}, //fifo half full trig
|
|
+ {0x17 , 0x01}, //widv
|
|
+ {0xfe , 0x00},
|
|
+ {0xc8 , 0x00},
|
|
+ };
|
|
+
|
|
+ /* 1280X720 720HD */
|
|
+ static struct regval_list Gc2015_sensor_hd720_regs_hres0[] =
|
|
+ {
|
|
+ {0xfe , 0x00},
|
|
+ {0x05, 0x01},
|
|
+ {0x06, 0x9e},
|
|
+ {0x07, 0x01},
|
|
+ {0x08, 0x6d},
|
|
+ {0x0a , 0xf0}, //row start
|
|
+ {0x0c , 0xa0}, //col start
|
|
+ {0x0d , 0x02},
|
|
+ {0x0e , 0xd8},
|
|
+ {0x0f , 0x05}, //Window setting
|
|
+ {0x10 , 0x18},
|
|
|
|
-#endif
|
|
-};
|
|
+ {0xfe, 0x01},
|
|
+ {0x27, 0x00},
|
|
+ {0x28, 0xd9},
|
|
+ {0x29, 0x04},
|
|
+ {0x2a, 0x3d},//18fps
|
|
+ {0x2b, 0x06},
|
|
+ {0x2c, 0xc8},//12.5fps
|
|
+ {0x2d, 0x0a},
|
|
+ {0x2e, 0x2c},//8fps
|
|
+ {0x3e, 0x40},//0x40 0x00
|
|
+
|
|
+ //measure window
|
|
+ {0xfe, 0x00},
|
|
+ {0xec, 0x04},
|
|
+ {0xed, 0x04},
|
|
+ {0xee, 0x50},
|
|
+ {0xef, 0x58},
|
|
+
|
|
+ {0x90 , 0x01}, //crop enable
|
|
+ {0x95 , 0x02},
|
|
+ {0x96 , 0xd0},
|
|
+ {0x97 , 0x05},
|
|
+ {0x98 , 0x00},
|
|
+
|
|
+ {0xfe , 0x03},
|
|
+ {0x42 , 0x80},
|
|
+ {0x43 , 0x06}, //output buf width
|
|
+ {0x41 , 0x00}, // delay
|
|
+ {0x40 , 0x00}, //fifo half full trig
|
|
+ {0x17 , 0x01}, //widv
|
|
+ {0xfe , 0x00},
|
|
+ {0x99, 0x11},
|
|
+ {0xc8, 0x00},
|
|
+ {0xfa, 0x11},
|
|
+ {0xff, 0xff},
|
|
+ };
|
|
+
|
|
+ /* 640X480 VGA */
|
|
+ static struct regval_list sensor_vga_regs_hres0[] =
|
|
+ {
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ {0x0a , 0x00}, //row start
|
|
+ {0x0c , 0x00}, //col start
|
|
+
|
|
+ {0x0d , 0x04},
|
|
+ {0x0e , 0xc0},
|
|
+ {0x0f , 0x06}, //Window setting
|
|
+ {0x10 , 0x58},//
|
|
+
|
|
+ {0x90 , 0x01},
|
|
+ {0x94 , 0x00},
|
|
+ {0x95 , 0x01},
|
|
+ {0x96 , 0xe0},
|
|
+ {0x97 , 0x02},
|
|
+ {0x98 , 0x80},
|
|
+ {0xc8 , 0x15},
|
|
+
|
|
+ {0xfa , 0x00},
|
|
+
|
|
+ {0xfe , 0x03},
|
|
+ {0x42 , 0x00},
|
|
+ {0x43 , 0x05}, //output buf width 280*2=500
|
|
+ {0x41 , 0x02}, // delay
|
|
+ {0x40 , 0x40}, //fifo half full trig
|
|
+ {0x17 , 0x00}, //widv is 0
|
|
+
|
|
+ {0xfe , 0x00},
|
|
+ {0xc8 , 0x55},
|
|
+ {0xb6 , 0x03},//aec on
|
|
+ };
|
|
+
|
|
+ static struct regval_list sensor_default_regs_hres1[] = {
|
|
+ {0xfe , 0x80},
|
|
+ {0xfe , 0x80},
|
|
+ {0xfe , 0x80},
|
|
+ {0xfc , 0x06},
|
|
+ {0xf2 , 0x00},
|
|
+ {0xf3 , 0x00},
|
|
+ {0xf4 , 0x00},
|
|
+ {0xf5 , 0x00},
|
|
+ {0xf9 , 0xfe}, //[0] pll enable
|
|
+ {0xfa , 0x00},
|
|
+ {0xf6 , 0x00},
|
|
+ {0xf7 , 0x15}, //pll enable
|
|
+
|
|
+ {0xf8 , 0x85},
|
|
+ {0xfe , 0x00},
|
|
+ {0x82 , 0x00},
|
|
+ {0xb3 , 0x60},
|
|
+ {0xb4 , 0x40},
|
|
+ {0xb5 , 0x60},
|
|
+
|
|
+ {0x03 , 0x02},
|
|
+ {0x04 , 0x80},
|
|
+
|
|
+ //////////measure window ///////////
|
|
+ {0xfe , 0x00},
|
|
+ {0xec , 0x06},//04
|
|
+ {0xed , 0x06},//04
|
|
+ {0xee , 0x62},//60
|
|
+ {0xef , 0x92},//90
|
|
+
|
|
+ ///////////analog/////////////
|
|
+ {0x0a , 0x00}, //row start
|
|
+ {0x0c , 0x00}, //col start
|
|
+ {0x0d , 0x04},
|
|
+ {0x0e , 0xc0},
|
|
+ {0x0f , 0x06}, //Window setting
|
|
+ {0x10 , 0x58},
|
|
+ {0x17 , 0x14}, //[0]mirror [1]flip
|
|
+ {0x18 , 0x0a}, //0a 2012.10.26
|
|
+ {0x19 , 0x0a}, //AD pipe number
|
|
+
|
|
+ {0x1a, 0x01}, //CISCTL mode4
|
|
+ {0x1b , 0x8b},
|
|
+ {0x1c , 0x05}, //added
|
|
+ {0x1e , 0x88}, //analog mode1 [7] tx-high en [5:3]COL_bias
|
|
+ {0x1f , 0x08}, //[3] tx-low en//
|
|
+ {0x20 , 0x05}, //[0]adclk mode , 0x[1]rowclk_MODE [2]rsthigh_en
|
|
+ {0x21 , 0x0f}, //[6:4]rsg
|
|
+ {0x22 , 0xf0}, //[3:0]vref 0xf0
|
|
+ {0x23 , 0xc3}, //f3//ADC_r
|
|
+ {0x24 , 0x15}, //pad drive <=36MHz, use 0x00 is ok
|
|
+
|
|
+ //AEC
|
|
+ {0xfe , 0x01},
|
|
+ {0x11 , 0x20},//AEC_out_slope , 0x
|
|
+ {0x1f , 0xa0},//max_post_gain
|
|
+ {0x20 , 0x40},//max_pre_gain
|
|
+ {0x47 , 0x30},//AEC_outdoor_th
|
|
+ {0x0b , 0x10},//
|
|
+ {0x13 , 0x75},//y_target
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ {0x05 , 0x01},//hb
|
|
+ {0x06 , 0x11},
|
|
+ {0x07 , 0x00},//vb
|
|
+ {0x08 , 0x50},
|
|
+ {0xfe , 0x01},
|
|
+ {0x27 , 0x00},//step
|
|
+ {0x28 , 0xa0},
|
|
+ {0x29 , 0x05},//level1
|
|
+ {0x2a , 0x00},
|
|
+ {0x2b , 0x05},//level2
|
|
+ {0x2c , 0x00},
|
|
+ {0x2d , 0x06},//6e8//level3
|
|
+ {0x2e , 0xe0},
|
|
+ {0x2f , 0x0a},//level4
|
|
+ {0x30 , 0x00},
|
|
+ {0x3e , 0x40},
|
|
+ {0xfe , 0x00},
|
|
+ {0xfe , 0x00}, //0x , 0x , 0x , 0x , 0x
|
|
+ {0xb6 , 0x03}, //AEC enable
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ /////////BLK//////
|
|
+ {0x3f , 0x00}, //prc close
|
|
+ {0x40 , 0x77},//
|
|
+ {0x42 , 0x7f},
|
|
+ {0x43 , 0x30},
|
|
+ {0x5c , 0x08},
|
|
+ {0x5e , 0x20},
|
|
+ {0x5f , 0x20},
|
|
+ {0x60 , 0x20},
|
|
+ {0x61 , 0x20},
|
|
+ {0x62 , 0x20},
|
|
+ {0x63 , 0x20},
|
|
+ {0x64 , 0x20},
|
|
+ {0x65 , 0x20},
|
|
+
|
|
+ ///block////////////
|
|
+ {0x80 , 0xff},
|
|
+ {0x81 , 0x26},//38 , 0x//skin_Y 8c_debug
|
|
+ {0x87 , 0x90}, //[7]middle gamma
|
|
+ {0x84 , 0x02}, //output put foramat
|
|
+ {0x86 , 0x07}, //02 //sync plority
|
|
+ {0x8b , 0xbc},
|
|
+ {0xb0 , 0x80}, //globle gain
|
|
+ {0xc0 , 0x40},//Yuv bypass
|
|
+
|
|
+ //////lsc/////////////
|
|
+ {0xfe , 0x01},
|
|
+ {0xc2 , 0x38},
|
|
+ {0xc3 , 0x25},
|
|
+ {0xc4 , 0x21},
|
|
+ {0xc8 , 0x19},
|
|
+ {0xc9 , 0x12},
|
|
+ {0xca , 0x0e},
|
|
+ {0xbc , 0x43},
|
|
+ {0xbd , 0x18},
|
|
+ {0xbe , 0x1b},
|
|
+ {0xb6 , 0x40},
|
|
+ {0xb7 , 0x2e},
|
|
+ {0xb8 , 0x26},
|
|
+ {0xc5 , 0x05},
|
|
+ {0xc6 , 0x03},
|
|
+ {0xc7 , 0x04},
|
|
+ {0xcb , 0x00},
|
|
+ {0xcc , 0x00},
|
|
+ {0xcd , 0x00},
|
|
+ {0xbf , 0x14},
|
|
+ {0xc0 , 0x22},
|
|
+ {0xc1 , 0x1b},
|
|
+ {0xb9 , 0x00},
|
|
+ {0xba , 0x05},
|
|
+ {0xbb , 0x05},
|
|
+ {0xaa , 0x35},
|
|
+ {0xab , 0x33},
|
|
+ {0xac , 0x33},
|
|
+ {0xad , 0x25},
|
|
+ {0xae , 0x22},
|
|
+ {0xaf , 0x27},
|
|
+ {0xb0 , 0x1d},
|
|
+ {0xb1 , 0x20},
|
|
+ {0xb2 , 0x22},
|
|
+ {0xb3 , 0x14},
|
|
+ {0xb4 , 0x15},
|
|
+ {0xb5 , 0x16},
|
|
+ {0xd0 , 0x00},
|
|
+ {0xd2 , 0x07},
|
|
+ {0xd3 , 0x08},
|
|
+ {0xd8 , 0x00},
|
|
+ {0xda , 0x13},
|
|
+ {0xdb , 0x17},
|
|
+ {0xdc , 0x00},
|
|
+ {0xde , 0x0a},
|
|
+ {0xdf , 0x08},
|
|
+ {0xd4 , 0x00},
|
|
+ {0xd6 , 0x00},
|
|
+ {0xd7 , 0x0c},
|
|
+ {0xa4 , 0x00},
|
|
+ {0xa5 , 0x00},
|
|
+ {0xa6 , 0x00},
|
|
+ {0xa7 , 0x00},
|
|
+ {0xa8 , 0x00},
|
|
+ {0xa9 , 0x00},
|
|
+ {0xa1 , 0x80},
|
|
+ {0xa2 , 0x80},
|
|
+
|
|
+ //////////cc//////////////
|
|
+ {0xfe , 0x02},
|
|
+ {0xc0 , 0x01},
|
|
+ {0xc1 , 0x40}, //Green_cc for d
|
|
+ {0xc2 , 0xfc},
|
|
+ {0xc3 , 0x05},
|
|
+ {0xc4 , 0xec},
|
|
+ {0xc5 , 0x42},
|
|
+ {0xc6 , 0xf8},
|
|
+ {0xc7 , 0x40},//for cwf
|
|
+ {0xc8 , 0xf8},
|
|
+ {0xc9 , 0x06},
|
|
+ {0xca , 0xfd},
|
|
+ {0xcb , 0x3e},
|
|
+ {0xcc , 0xf3},
|
|
+ {0xcd , 0x36},//for A
|
|
+ {0xce , 0xf6},
|
|
+ {0xcf , 0x04},
|
|
+ {0xe3 , 0x0c},
|
|
+ {0xe4 , 0x44},
|
|
+ {0xe5 , 0xe5},
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ ///////awb start ////////////////
|
|
+ //AWB clear
|
|
+ {0xfe , 0x01},
|
|
+ {0x4f , 0x00},
|
|
+ {0x4d , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x10}, // 10
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x20}, // 20
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x30},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00}, // 30
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x40}, // 40
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x50}, // 50
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x60}, // 60
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x70}, // 70
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x80}, // 80
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x90}, // 90
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0xa0}, // a0
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0xb0}, // b0
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0xc0}, // c0
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0xd0}, // d0
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4f , 0x01},
|
|
+ /////// awb value////////
|
|
+ {0xfe , 0x01},
|
|
+ {0x4f , 0x00},
|
|
+ {0x4d , 0x30},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x80},
|
|
+ {0x4e , 0x80},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4d , 0x40},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x80},
|
|
+ {0x4e , 0x80},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4d , 0x53},
|
|
+ {0x4e , 0x08},
|
|
+ {0x4e , 0x04},
|
|
+ {0x4d , 0x62},
|
|
+ {0x4e , 0x10},
|
|
+ {0x4d , 0x72},
|
|
+ {0x4e , 0x20},
|
|
+ {0x4f , 0x01},
|
|
+
|
|
+ /////awb////
|
|
+ {0xfe , 0x01},
|
|
+ {0x50 , 0x88},//c0//[6]green mode
|
|
+ {0x52 , 0x40},
|
|
+ {0x54 , 0x60},
|
|
+ {0x56 , 0x06},
|
|
+ {0x57 , 0x20}, //pre adjust
|
|
+ {0x58 , 0x01},
|
|
+ {0x5b , 0x02}, //AWB_gain_delta
|
|
+ {0x61 , 0xaa},//R/G stand
|
|
+ {0x62 , 0xaa},//R/G stand
|
|
+ {0x71 , 0x00},
|
|
+ {0x74 , 0x10}, //0x//AWB_C_max
|
|
+ {0x77 , 0x08}, // 0x//AWB_p2_x
|
|
+ {0x78 , 0xfd}, //AWB_p2_y
|
|
+ {0x86 , 0x30},
|
|
+ {0x87 , 0x00},
|
|
+ {0x88 , 0x04},//06 , 0x//[1]dark mode
|
|
+ {0x8a , 0xc0},//awb move mode
|
|
+ {0x89 , 0x75},
|
|
+ {0x84 , 0x08}, //0x//auto_window
|
|
+ {0x8b , 0x00}, // 0x//awb compare luma
|
|
+ {0x8d , 0x70}, //awb gain limit R
|
|
+ {0x8e , 0x70},//G
|
|
+ {0x8f , 0xf4},//B
|
|
+ {0xfe , 0x00},
|
|
+ {0x82 , 0x02},//awb_en
|
|
+ /////////awb end /////////////
|
|
+
|
|
+ ///==========asde
|
|
+ {0xfe , 0x01},
|
|
+ {0x21 , 0xbf},
|
|
+ {0xfe , 0x02},
|
|
+ {0xa4 , 0x00},//
|
|
+ {0xa5 , 0x40}, //lsc_th
|
|
+ {0xa2 , 0xa0}, //lsc_dec_slope
|
|
+ {0xa6 , 0x80}, //dd_th
|
|
+ {0xa7 , 0x80}, //ot_th
|
|
+ {0xab , 0x31}, //
|
|
+ {0xa9 , 0x6f}, //
|
|
+ {0xb0 , 0x99}, //0x//edge effect slope low
|
|
+ {0xb1 , 0x34},//edge effect slope low
|
|
+ {0xb3 , 0xf0}, //saturation dec slope
|
|
+ {0xde , 0xb6}, //
|
|
+ {0x38 , 0x0f}, //
|
|
+ {0x39 , 0x60}, //
|
|
+ {0xfe , 0x00},
|
|
+ {0x81 , 0x26},
|
|
+ {0xfe , 0x02},
|
|
+ {0x83 , 0x00},//
|
|
+ {0x84 , 0x45},//
|
|
+ ////////////YCP//////////
|
|
+ {0xd1 , 0x34},//saturation_cb
|
|
+ {0xd2 , 0x34},//saturation_Cr
|
|
+ {0xd3 , 0x40},//contrast ? {0xd4 , 0x80},//contrast center
|
|
+ {0xd4 , 0x80},//contrast center
|
|
+ {0xd5 , 0x00},//luma_offset
|
|
+ {0xdc , 0x30},
|
|
+ {0xdd , 0xb8},//edge_sa_g,b
|
|
+ {0xfe , 0x00},
|
|
+ ///////dndd///////////
|
|
+ {0xfe , 0x02},
|
|
+ {0x88 , 0x15},//dn_b_base
|
|
+ {0x8c , 0xf6}, //[2]b_in_dark_inc
|
|
+ {0x89 , 0x03}, //dn_c_weight
|
|
+ ////////EE ///////////
|
|
+ {0xfe , 0x02},
|
|
+ {0x90 , 0x6c},// EEINTP mode1
|
|
+ {0x97 , 0x45},// edge effect
|
|
+ ////==============RGB Gamma
|
|
+ {0xfe , 0x02},
|
|
+ {0x15 , 0x0a},
|
|
+ {0x16 , 0x12},
|
|
+ {0x17 , 0x19},
|
|
+ {0x18 , 0x1f},
|
|
+ {0x19 , 0x2c},
|
|
+ {0x1a , 0x38},
|
|
+ {0x1b , 0x42},
|
|
+ {0x1c , 0x4e},
|
|
+ {0x1d , 0x63},
|
|
+ {0x1e , 0x76},
|
|
+ {0x1f , 0x87},
|
|
+ {0x20 , 0x96},
|
|
+ {0x21 , 0xa2},
|
|
+ {0x22 , 0xb8},
|
|
+ {0x23 , 0xca},
|
|
+ {0x24 , 0xd8},
|
|
+ {0x25 , 0xe3},
|
|
+ {0x26 , 0xf0},
|
|
+ {0x27 , 0xf8},
|
|
+ {0x28 , 0xfd},
|
|
+ {0x29 , 0xff},
|
|
+
|
|
+ ///=================y gamma
|
|
+ {0xfe , 0x02},
|
|
+ {0x2b , 0x00},
|
|
+ {0x2c , 0x04},
|
|
+ {0x2d , 0x09},
|
|
+ {0x2e , 0x18},
|
|
+ {0x2f , 0x27},
|
|
+ {0x30 , 0x37},
|
|
+ {0x31 , 0x49},
|
|
+ {0x32 , 0x5c},
|
|
+ {0x33 , 0x7e},
|
|
+ {0x34 , 0xa0},
|
|
+ {0x35 , 0xc0},
|
|
+ {0x36 , 0xe0},
|
|
+ {0x37 , 0xff},
|
|
+ /////1600x1200size//
|
|
+ {0xfe , 0x00},//
|
|
+ {0x90 , 0x01}, //0x//crop enable
|
|
+ {0x94 , 0x04},
|
|
+ {0x95 , 0x04}, //0x//1600x1200
|
|
+ {0x96 , 0xb0},
|
|
+ {0x97 , 0x06},
|
|
+ {0x98 , 0x40},
|
|
+
|
|
+ {0xfe , 0x03},
|
|
+ {0x42 , 0x40},
|
|
+ {0x43 , 0x06}, //output buf width
|
|
+ {0x41 , 0x02}, // Pclk_polarity
|
|
+ {0x40 , 0x40}, //00
|
|
+ {0x17 , 0x00}, //widv
|
|
+ {0xfe , 0x00},
|
|
+ ////output DVP/////
|
|
+ {0xfe , 0x00},
|
|
+ {0x82 , 0xfe}, // fe
|
|
+ {0xf2 , 0x70},
|
|
+ {0xf3 , 0xff},
|
|
+ {0xf4 , 0x00},
|
|
+ {0xf5 , 0x30},
|
|
+ ////////sabsumple 800X600//////
|
|
+ {0xfe , 0x00},
|
|
+ {0xb6 , 0x03},
|
|
+ {0xfa , 0x00},
|
|
+
|
|
+ {0xc8 , 0x00},//close scaler
|
|
+ {0x99 , 0x22},// 1/2 subsample
|
|
+ {0x9a , 0x07},
|
|
+ {0x9b , 0x00},
|
|
+ {0x9c , 0x00},
|
|
+ {0x9d , 0x00},
|
|
+ {0x9e , 0x00},
|
|
+ {0x9f , 0x00},
|
|
+ {0xa0 , 0x00},
|
|
+ {0xa1 , 0x00},
|
|
+ {0xa2 , 0x00},
|
|
+
|
|
+ {0x90 , 0x01}, //crop enable
|
|
+ {0x95 , 0x02},
|
|
+ {0x96 , 0x58},
|
|
+ {0x97 , 0x03},
|
|
+ {0x98 , 0x20},
|
|
|
|
-/* 1600X1200 UXGA capture */
|
|
-static struct regval_list sensor_uxga_regs[] ={
|
|
-
|
|
-{0xfe , 0x00},
|
|
-{0xfa , 0x11},
|
|
-{0xc8 , 0x00},
|
|
-
|
|
-{0x99 , 0x11},// 1/2 subsample
|
|
-{0x9a , 0x06},
|
|
-{0x9b , 0x00},
|
|
-{0x9c , 0x00},
|
|
-{0x9d , 0x00},
|
|
-{0x9e , 0x00},
|
|
-{0x9f , 0x00},
|
|
-{0xa0 , 0x00},
|
|
-{0xa1 , 0x00},
|
|
-{0xa2 , 0x00},
|
|
-
|
|
-{0x90 , 0x01},
|
|
-{0x95 , 0x04},
|
|
-{0x96 , 0xb0},
|
|
-{0x97 , 0x06},
|
|
-{0x98 , 0x40},
|
|
+ #if 1
|
|
+ ///////// re zao///
|
|
+ {0xfe , 0x00},
|
|
+ {0x22 , 0xf0},
|
|
+ {0xfe , 0x01},
|
|
+ {0x21 , 0xff},
|
|
+ {0xfe , 0x02},
|
|
+ {0x8a , 0x33},
|
|
+ {0x8c , 0x76},
|
|
+ {0x8d , 0x85},
|
|
+ {0xa6 , 0xf0},
|
|
+ {0xae , 0x9f},
|
|
+ {0xa2 , 0x90},
|
|
+ {0xa5 , 0x40},
|
|
+ {0xa7 , 0x30},
|
|
+ {0xb0 , 0x88},
|
|
+ {0x38 , 0x0b},
|
|
+ {0x39 , 0x30},
|
|
+ {0xfe , 0x00},
|
|
+ {0x87 , 0xb0},
|
|
+
|
|
+ //// small RGB gamma////
|
|
+ /*
|
|
+ {0xfe , 0x02},
|
|
+ {0x15 , 0x0b},
|
|
+ {0x16 , 0x0e},
|
|
+ {0x17 , 0x10},
|
|
+ {0x18 , 0x12},
|
|
+ {0x19 , 0x19},
|
|
+ {0x1a , 0x21},
|
|
+ {0x1b , 0x29},
|
|
+ {0x1c , 0x31},
|
|
+ {0x1d , 0x41},
|
|
+ {0x1e , 0x50},
|
|
+ {0x1f , 0x5f},
|
|
+ {0x20 , 0x6d},
|
|
+ {0x21 , 0x79},
|
|
+ {0x22 , 0x91},
|
|
+ {0x23 , 0xa5},
|
|
+ {0x24 , 0xb9},
|
|
+ {0x25 , 0xc9},
|
|
+ {0x26 , 0xe1},
|
|
+ {0x27 , 0xee},
|
|
+ {0x28 , 0xf7},
|
|
+ {0x29 , 0xff},
|
|
+ */
|
|
+ ////dark sun/////
|
|
+ {0xfe , 0x02},
|
|
+ {0x40 , 0x06},
|
|
+ {0x41 , 0x23},
|
|
+ {0x42 , 0x3f},
|
|
+ {0x43 , 0x06},
|
|
+ {0x44 , 0x00},
|
|
+ {0x45 , 0x00},
|
|
+ {0x46 , 0x14},
|
|
+ {0x47 , 0x09},
|
|
+ {0xfe , 0x00},
|
|
+ #endif
|
|
+ };
|
|
+
|
|
+ /* 1600X1200 UXGA capture */
|
|
+ static struct regval_list sensor_uxga_regs_hres1[] =
|
|
+ {
|
|
+ {0xfe , 0x00},
|
|
+ {0xfa , 0x11},
|
|
+ {0xc8 , 0x00},
|
|
+
|
|
+ {0x99 , 0x11},// 1/2 subsample
|
|
+ {0x9a , 0x06},
|
|
+ {0x9b , 0x00},
|
|
+ {0x9c , 0x00},
|
|
+ {0x9d , 0x00},
|
|
+ {0x9e , 0x00},
|
|
+ {0x9f , 0x00},
|
|
+ {0xa0 , 0x00},
|
|
+ {0xa1 , 0x00},
|
|
+ {0xa2 , 0x00},
|
|
+
|
|
+ {0x90 , 0x01},
|
|
+ {0x95 , 0x04},
|
|
+ {0x96 , 0xb0},
|
|
+ {0x97 , 0x06},
|
|
+ {0x98 , 0x40},
|
|
+ };
|
|
+
|
|
+ /* 800X600 SVGA,30fps*/
|
|
+ static struct regval_list sensor_svga_regs_hres1[] =
|
|
+ {
|
|
+ {0xfe,0x00},
|
|
+ {0xb6,0x03},
|
|
+ {0xfa , 0x00},
|
|
+ {0xc8,0x00},//close scaler
|
|
+
|
|
+ {0x99,0x22},// 1/2 subsample
|
|
+ {0x9a , 0x07},
|
|
+ {0x9b,0x00},
|
|
+ {0x9c,0x00},
|
|
+ {0x9d,0x00},
|
|
+ {0x9e,0x00},
|
|
+ {0x9f,0x00},
|
|
+ {0xa0,0x00},
|
|
+ {0xa1,0x00},
|
|
+ {0xa2,0x00},
|
|
+
|
|
+ {0x90,0x01}, //crop enable
|
|
+ {0x95,0x02},
|
|
+ {0x96,0x58},
|
|
+ {0x97,0x03},
|
|
+ {0x98,0x20},
|
|
+ };
|
|
+
|
|
+ static struct regval_list sensor_default_regs_hres3[] =
|
|
+ {
|
|
+ {0xfe , 0x80},
|
|
+ {0xfe , 0x80},
|
|
+ {0xfe , 0x80},
|
|
+ {0xfc , 0x06},
|
|
+ {0xf2 , 0x00},
|
|
+ {0xf3 , 0x00},
|
|
+ {0xf4 , 0x00},
|
|
+ {0xf5 , 0x00},
|
|
+ {0xf9 , 0xfe}, //[0] pll enable
|
|
+ {0xfa , 0x00},
|
|
+ {0xf6 , 0x00},
|
|
+ {0xf7 , 0x15}, //pll enable
|
|
+
|
|
+ {0xf8 , 0x85},
|
|
+
|
|
+ {0xfe , 0x00},
|
|
+ {0x82 , 0x00}, //00
|
|
+ {0xb3 , 0x60}, //60
|
|
+ {0xb4 , 0x40}, //60 40
|
|
+ {0xb5 , 0x60}, //60
|
|
+
|
|
+ {0x03 , 0x02},
|
|
+ {0x04 , 0x80},
|
|
+
|
|
+ //////////measure window ///////////
|
|
+ {0xfe , 0x00},
|
|
+ {0xec , 0x06},//04
|
|
+ {0xed , 0x06},//04
|
|
+ {0xee , 0x62},//60
|
|
+ {0xef , 0x92},//90
|
|
+
|
|
+ ///////////analog/////////////
|
|
+ {0x0a , 0x00}, //row start
|
|
+ {0x0b , 0x10}, //row start
|
|
+ {0x0c , 0x00}, //col start
|
|
+ {0x0d , 0x04}, //4d0 = 1232
|
|
+ {0x0e , 0xe0}, //d0/b0/d0/c0
|
|
+ {0x0f , 0x06}, //Window setting
|
|
+ {0x10 , 0x58}, //40/50/58
|
|
+ {0x17 , 0x14}, //[0]mirror [1]flip [4]better colour
|
|
+
|
|
+
|
|
+ //{0x18 , 0x0a}, //0a 2012.10.26
|
|
+ {0x18 , 0x0f}, //0a 2012.10.26
|
|
+ {0x19 , 0x0a}, //AD pipe number
|
|
+
|
|
+ {0x1a , 0x01}, //CISCTL mode4
|
|
+ {0x1b , 0x8b},
|
|
+ {0x1c , 0x05}, //added
|
|
+ {0x1e , 0x88}, //analog mode1 [7] tx-high en [5:3]COL_bias
|
|
+ {0x1f , 0x08}, //[3] tx-low en//
|
|
+ {0x20 , 0x05}, //[0]adclk mode , 0x[1]rowclk_MODE [2]rsthigh_en
|
|
+ {0x21 , 0x0f}, //[6:4]rsg
|
|
+ {0x22 , 0xf0}, //[3:0]vref 0xf0
|
|
+ {0x23 , 0xc3}, //f3//ADC_r
|
|
+ {0x24 , 0x17}, //pad drive <=36MHz, use 0x00 is ok
|
|
+
|
|
+ //AEC
|
|
+ {0xfe , 0x01},
|
|
+ {0x11 , 0x20},//20 AEC_out_slope , 0x
|
|
+ {0x1f , 0xc0},//80 max_post_gain
|
|
+ {0x20 , 0x60},//40 max_pre_gain
|
|
+ {0x47 , 0x80},//30 AEC_outdoor_th
|
|
+ {0x0b , 0x13},//10
|
|
+ {0x13 , 0x75},//y_target
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ {0xfe , 0x00},
|
|
+ {0xfe , 0x00},
|
|
+ {0x05 , 0x01},//hb
|
|
+ {0x06 , 0x0d},
|
|
+ {0x07 , 0x00},//vb
|
|
+ {0x08 , 0x40},
|
|
+
|
|
+ {0xfe , 0x01},
|
|
+ {0x27 , 0x00},//step
|
|
+ {0x28 , 0xa0},//a0
|
|
+ {0x29 , 0x05},// level 0 12.5
|
|
+ {0x2a , 0x00},
|
|
+ {0x2b , 0x05},// level 1 12.5
|
|
+ {0x2c , 0x00},
|
|
+ {0x2d , 0x05},// level 2 12.5 640/10fps
|
|
+ {0x2e , 0x00},
|
|
+ {0x2f , 0x08},// level 3 7.5
|
|
+ {0x30 , 0x20},
|
|
+
|
|
+ {0xfe , 0x00},
|
|
+ {0xfe , 0x00}, //0x , 0x , 0x , 0x , 0x
|
|
+ {0xb6 , 0x03}, //AEC enable
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ /////////BLK//////
|
|
+ {0x3f, 0x00}, //prc close
|
|
+ {0x40, 0x77},//
|
|
+ {0x42, 0x7f},
|
|
+ {0x43, 0x30},
|
|
+ {0x5c, 0x08},
|
|
+ {0x5e, 0x20},
|
|
+ {0x5f, 0x20},
|
|
+ {0x60, 0x20},
|
|
+ {0x61, 0x20},
|
|
+ {0x62, 0x20},
|
|
+ {0x63, 0x20},
|
|
+ {0x64, 0x20},
|
|
+ {0x65, 0x20},
|
|
+
|
|
+ ///block////////////
|
|
+ {0x80 , 0xff},
|
|
+ {0x81 , 0x26},//38 , 0x//skin_Y 8c_debug
|
|
+ {0x87 , 0x90}, //[7]middle gamma
|
|
+ {0x84 , 0x02}, //output put foramat
|
|
+ {0x86 , 0x07}, //02 //sync plority
|
|
+ {0x8b , 0xbc},
|
|
+ {0xb0 , 0x80}, //globle gain
|
|
+ {0xc0 , 0x40},//Yuv bypass
|
|
+
|
|
+ //////lsc/////////////
|
|
+ {0xfe,0x01},
|
|
+ {0xc2,0x21},
|
|
+ {0xc3,0x1a},
|
|
+ {0xc4,0x13},
|
|
+ {0xc8,0x17},
|
|
+ {0xc9,0x0f},
|
|
+ {0xca,0x00},
|
|
+ {0xbc,0x36},
|
|
+ {0xbd,0x2b},
|
|
+ {0xbe,0x17},
|
|
+ {0xb6,0x39},
|
|
+ {0xb7,0x21},
|
|
+ {0xb8,0x1c},
|
|
+ {0xc5,0x00},
|
|
+ {0xc6,0x00},
|
|
+ {0xc7,0x00},
|
|
+ {0xcb,0x00},
|
|
+ {0xcc,0x0c},
|
|
+ {0xcd,0x15},
|
|
+ {0xbf,0x00},
|
|
+ {0xc0,0x00},
|
|
+ {0xc1,0x00},
|
|
+ {0xb9,0x00},
|
|
+ {0xba,0x00},
|
|
+ {0xbb,0x00},
|
|
+ {0xaa,0x15},
|
|
+ {0xab,0x15},
|
|
+ {0xac,0x15},
|
|
+ {0xad,0x14},
|
|
+ {0xae,0x13},
|
|
+ {0xaf,0x12},
|
|
+ {0xb0,0x1b},
|
|
+ {0xb1,0x14},
|
|
+ {0xb2,0x14},
|
|
+ {0xb3,0x1f},
|
|
+ {0xb4,0x12},
|
|
+ {0xb5,0x13},
|
|
+ {0xd0,0x00},
|
|
+ {0xd2,0x00},
|
|
+ {0xd3,0x0c},
|
|
+ {0xd8,0x00},
|
|
+ {0xda,0x00},
|
|
+ {0xdb,0x13},
|
|
+ {0xdc,0x00},
|
|
+ {0xde,0x00},
|
|
+ {0xdf,0x25},
|
|
+ {0xd4,0x00},
|
|
+ {0xd6,0x00},
|
|
+ {0xd7,0x12},
|
|
+ {0xa4,0x00},
|
|
+ {0xa5,0x00},
|
|
+ {0xa6,0x00},
|
|
+ {0xa7,0x00},
|
|
+ {0xa8,0x00},
|
|
+ {0xa9,0x00},
|
|
+ {0xa1,0x80},
|
|
+ {0xa2,0x80},
|
|
+
|
|
+ //////////cc//////////////
|
|
+ {0xfe , 0x02},
|
|
+ {0xc0 , 0x01},
|
|
+ {0xc1 , 0x40}, //Green_cc for d
|
|
+ {0xc2 , 0xfc},
|
|
+ {0xc3 , 0x05},
|
|
+ {0xc4 , 0xec},
|
|
+ {0xc5 , 0x42},
|
|
+ {0xc6 , 0xf8},
|
|
+ {0xc7 , 0x40},//for cwf
|
|
+ {0xc8 , 0xf8},
|
|
+ {0xc9 , 0x06},
|
|
+ {0xca , 0xfd},
|
|
+ {0xcb , 0x3e},
|
|
+ {0xcc , 0xf3},
|
|
+ {0xcd , 0x36},//for A
|
|
+ {0xce , 0xf6},
|
|
+ {0xcf , 0x04},
|
|
+ {0xe3 , 0x0c},
|
|
+ {0xe4 , 0x44},
|
|
+ {0xe5 , 0xe5},
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ ///////awb start ////////////////
|
|
+ //AWB clear
|
|
+ {0xfe , 0x01},
|
|
+ {0x4f , 0x00},
|
|
+ {0x4d , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x10}, // 10
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x20}, // 20
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x30},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00}, // 30
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x40}, // 40
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x50}, // 50
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x60}, // 60
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x70}, // 70
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x80}, // 80
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0x90}, // 90
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0xa0}, // a0
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0xb0}, // b0
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0xc0}, // c0
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4d , 0xd0}, // d0
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4f , 0x01},
|
|
+ /////// awb value////////
|
|
+ {0xfe , 0x01},
|
|
+ {0x4f , 0x00},
|
|
+ {0x4d , 0x30},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x80},
|
|
+ {0x4e , 0x80},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4d , 0x40},
|
|
+ {0x4e , 0x00},
|
|
+ {0x4e , 0x80},
|
|
+ {0x4e , 0x80},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4e , 0x02},
|
|
+ {0x4d , 0x53},
|
|
+ {0x4e , 0x08},
|
|
+ {0x4e , 0x04},
|
|
+ {0x4d , 0x62},
|
|
+ {0x4e , 0x10},
|
|
+ {0x4d , 0x72},
|
|
+ {0x4e , 0x20},
|
|
+ {0x4f , 0x01},
|
|
+
|
|
+ /////awb////
|
|
+ {0xfe , 0x01},
|
|
+ {0x50 , 0x88},//c0//[6]green mode
|
|
+ {0x52 , 0x40},
|
|
+ {0x54 , 0x60},
|
|
+ {0x56 , 0x06},
|
|
+ {0x57 , 0x20}, //pre adjust
|
|
+ {0x58 , 0x01},
|
|
+ {0x5b , 0x02}, //AWB_gain_delta
|
|
+ {0x61 , 0xaa},//R/G stand
|
|
+ {0x62 , 0xaa},//R/G stand
|
|
+ {0x71 , 0x00},
|
|
+ {0x74 , 0x10}, //0x//AWB_C_max
|
|
+ {0x77 , 0x08}, // 0x//AWB_p2_x
|
|
+ {0x78 , 0xfd}, //AWB_p2_y
|
|
+ {0x86 , 0x30},
|
|
+ {0x87 , 0x00},
|
|
+ {0x88 , 0x04},//06 , 0x//[1]dark mode
|
|
+ {0x8a , 0xc0},//awb move mode
|
|
+ {0x89 , 0x75},
|
|
+ {0x84 , 0x08}, //0x//auto_window
|
|
+ {0x8b , 0x00}, // 0x//awb compare luma
|
|
+ {0x8d , 0x70}, //awb gain limit R
|
|
+ {0x8e , 0x70},//G
|
|
+ {0x8f , 0xf4},//B
|
|
+ {0xfe , 0x00},
|
|
+ {0x82 , 0x02},//awb_en
|
|
+ /////////awb end /////////////
|
|
+
|
|
+ ///==========asde
|
|
+ {0xfe, 0x01},
|
|
+ {0x21, 0xbf},
|
|
+ {0xfe, 0x02},
|
|
+ {0xa4, 0x00},//
|
|
+ {0xa5, 0x40}, //lsc_th
|
|
+ {0xa2, 0xa0}, //lsc_dec_slope
|
|
+ {0x86, 0x27},//add for DPC travis 20140505
|
|
+ {0x8a, 0x33},//add for DPC travis 20140505
|
|
+ {0x8d, 0x85},//add for DPC travis 20140505
|
|
+ {0xa6, 0xf0},//80//change for DPC travis 20140505
|
|
+ {0xa7, 0x80}, //ot_th
|
|
+ {0xab, 0x31}, //
|
|
+ {0xa9, 0x6f}, //
|
|
+ {0xb0, 0x99}, //0x//edge effect slope low
|
|
+ {0xb1, 0x34},//edge effect slope low
|
|
+ {0xb3, 0x80}, //saturation dec slope
|
|
+ {0xde, 0xb6}, //
|
|
+ {0x38, 0x0f}, //
|
|
+ {0x39, 0x60}, //
|
|
+ {0xfe, 0x00},
|
|
+ {0x81, 0x26},
|
|
+ {0xfe, 0x02},
|
|
+ {0x83, 0x00},//
|
|
+ {0x84, 0x45},//
|
|
+ ////////////YCP//////////
|
|
+ {0xd1 , 0x34},//saturation_cb
|
|
+ {0xd2 , 0x34},//saturation_Cr
|
|
+ {0xd3 , 0x40},//contrast ? {0xd4 , 0x80},//contrast center
|
|
+ {0xd4 , 0x80},//contrast center
|
|
+ {0xd5 , 0x00},//luma_offset
|
|
+ {0xdc , 0x30},
|
|
+ {0xdd , 0xb8},//edge_sa_g,b
|
|
+ {0xfe , 0x00},
|
|
+ ///////dndd///////////
|
|
+ {0xfe , 0x02},
|
|
+ {0x88 , 0x15},//dn_b_base
|
|
+ {0x8c , 0xf6}, //[2]b_in_dark_inc
|
|
+ {0x89 , 0x03}, //dn_c_weight
|
|
+ ////////EE ///////////
|
|
+ {0xfe , 0x02},
|
|
+ {0x90 , 0x6c},// EEINTP mode1
|
|
+ {0x97 , 0x45},// edge effect
|
|
+ ////==============RGB Gamma
|
|
+ {0xfe , 0x02},
|
|
+ {0x15 , 0x0a},
|
|
+ {0x16 , 0x12},
|
|
+ {0x17 , 0x19},
|
|
+ {0x18 , 0x1f},
|
|
+ {0x19 , 0x2c},
|
|
+ {0x1a , 0x38},
|
|
+ {0x1b , 0x42},
|
|
+ {0x1c , 0x4e},
|
|
+ {0x1d , 0x63},
|
|
+ {0x1e , 0x76},
|
|
+ {0x1f , 0x87},
|
|
+ {0x20 , 0x96},
|
|
+ {0x21 , 0xa2},
|
|
+ {0x22 , 0xb8},
|
|
+ {0x23 , 0xca},
|
|
+ {0x24 , 0xd8},
|
|
+ {0x25 , 0xe3},
|
|
+ {0x26 , 0xf0},
|
|
+ {0x27 , 0xf8},
|
|
+ {0x28 , 0xfd},
|
|
+ {0x29 , 0xff},
|
|
+
|
|
+ ///=================y gamma
|
|
+ {0xfe , 0x02},
|
|
+ {0x2b , 0x00},
|
|
+ {0x2c , 0x04},
|
|
+ {0x2d , 0x09},
|
|
+ {0x2e , 0x18},
|
|
+ {0x2f , 0x27},
|
|
+ {0x30 , 0x37},
|
|
+ {0x31 , 0x49},
|
|
+ {0x32 , 0x5c},
|
|
+ {0x33 , 0x7e},
|
|
+ {0x34 , 0xa0},
|
|
+ {0x35 , 0xc0},
|
|
+ {0x36 , 0xe0},
|
|
+ {0x37 , 0xff},
|
|
+ /////1600x1200size//
|
|
+ {0xfe, 0x00},//
|
|
+ {0x90, 0x01}, //0x//crop enable
|
|
+ {0x94, 0x04},
|
|
+ {0x95, 0x04}, //0x//1600x1200
|
|
+ {0x96, 0xb0},
|
|
+ {0x97, 0x06},
|
|
+ {0x98, 0x40},
|
|
+
|
|
+ {0xfe , 0x03},
|
|
+ {0x40 , 0x40}, //00
|
|
+ {0x41 , 0x02}, // Pclk_polarity
|
|
+ {0x42 , 0x40},
|
|
+ {0x43 , 0x06}, //output buf width
|
|
+ {0x17 , 0x01}, //widv
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ ////output DVP/////
|
|
+ {0xfe , 0x00},
|
|
+ {0x82 , 0xfe}, // fe
|
|
+ {0xf2 , 0x70},
|
|
+ {0xf3 , 0xff},
|
|
+ {0xf4 , 0x00},
|
|
+ {0xf5 , 0x30},
|
|
|
|
+ #if 1
|
|
+ ///////// re zao///
|
|
+ {0xfe , 0x00},
|
|
+ {0x22 , 0xf0},
|
|
+ {0xfe , 0x01},
|
|
+ {0x21 , 0xff},
|
|
+ {0xfe , 0x02},
|
|
+ {0x8a , 0x33},
|
|
+ {0x8c , 0x76},
|
|
+ {0x8d , 0x85},
|
|
+ {0xa6 , 0xf0},
|
|
+ {0xae , 0x9f},
|
|
+ {0xa2 , 0x90},
|
|
+ {0xa5 , 0x40},
|
|
+ {0xa7 , 0x30},
|
|
+ {0xb0 , 0x88},
|
|
+ {0x38 , 0x0b},
|
|
+ {0x39 , 0x30},
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ {0x87 , 0xb0},
|
|
+
|
|
+ //// small RGB gamma////
|
|
+ /*
|
|
+ {0xfe , 0x02},
|
|
+ {0x15 , 0x0b},
|
|
+ {0x16 , 0x0e},
|
|
+ {0x17 , 0x10},
|
|
+ {0x18 , 0x12},
|
|
+ {0x19 , 0x19},
|
|
+ {0x1a , 0x21},
|
|
+ {0x1b , 0x29},
|
|
+ {0x1c , 0x31},
|
|
+ {0x1d , 0x41},
|
|
+ {0x1e , 0x50},
|
|
+ {0x1f , 0x5f},
|
|
+ {0x20 , 0x6d},
|
|
+ {0x21 , 0x79},
|
|
+ {0x22 , 0x91},
|
|
+ {0x23 , 0xa5},
|
|
+ {0x24 , 0xb9},
|
|
+ {0x25 , 0xc9},
|
|
+ {0x26 , 0xe1},
|
|
+ {0x27 , 0xee},
|
|
+ {0x28 , 0xf7},
|
|
+ {0x29 , 0xff},
|
|
+ */
|
|
+ ////dark sun/////
|
|
+ {0xfe , 0x02},
|
|
+ {0x40 , 0x06},
|
|
+ {0x41 , 0x23},
|
|
+ {0x42 , 0x3f},
|
|
+ {0x43 , 0x06},
|
|
+ {0x44 , 0x00},
|
|
+ {0x45 , 0x00},
|
|
+ {0x46 , 0x14},
|
|
+ {0x47 , 0x09},
|
|
+ {0xfe , 0x00},
|
|
+ #endif
|
|
+
|
|
+ };
|
|
+
|
|
+ /* 1600X1200 UXGA 20fps */
|
|
+ static struct regval_list sensor_uxga_regs_hres3[] =
|
|
+ {
|
|
+ {0xfe , 0x00},
|
|
+ {0xb6, 0x03},
|
|
+ {0xfa , 0x00},
|
|
+ {0xc8 , 0x00},
|
|
+
|
|
+ {0x99 , 0x11},// 1/2 subsample
|
|
+ {0x9a , 0x06},
|
|
+ {0x9b , 0x00},
|
|
+ {0x9c , 0x00},
|
|
+ {0x9d , 0x00},
|
|
+ {0x9e , 0x00},
|
|
+ {0x9f , 0x00},
|
|
+ {0xa0 , 0x00},
|
|
+ {0xa1 , 0x00},
|
|
+ {0xa2 , 0x00},
|
|
+
|
|
+ {0x90 , 0x01},
|
|
+ {0x95 , 0x04},
|
|
+ {0x96 , 0xb0},
|
|
+ {0x97 , 0x06},
|
|
+ {0x98 , 0x40},
|
|
+
|
|
+ };
|
|
+
|
|
+ /* 800X600 SVGA,20fps*/
|
|
+ static struct regval_list sensor_svga_regs_hres3[] =
|
|
+ {
|
|
+ {0xfe,0x00},
|
|
+ {0xb6,0x03},
|
|
+ {0xfa,0x00},
|
|
+ {0xc8,0x00},//close scaler
|
|
+
|
|
+ {0x99,0x22},// 1/2 subsample
|
|
+ {0x9a,0x07},
|
|
+ {0x9b,0x00},
|
|
+ {0x9c,0x00},
|
|
+ {0x9d,0x00},
|
|
+ {0x9e,0x00},
|
|
+ {0x9f,0x00},
|
|
+ {0xa0,0x00},
|
|
+ {0xa1,0x00},
|
|
+ {0xa2,0x00},
|
|
+
|
|
+ {0x90,0x01}, //crop enable
|
|
+ {0x95,0x02},
|
|
+ {0x96,0x58},
|
|
+ {0x97,0x03},
|
|
+ {0x98,0x20},
|
|
+ };
|
|
+
|
|
+ /* 640x480 VGA,20fps*/
|
|
+ static struct regval_list sensor_vga_regs_hres3[] =
|
|
+ {
|
|
+ {0xfe,0x00},
|
|
+ {0xb6,0x03},
|
|
+ {0xfa,0x00},
|
|
+ {0xc8,0x02}, //close scaler
|
|
+
|
|
+ {0x99,0x22},// 1/2 subsample
|
|
+ {0x9a,0x06},
|
|
+ {0x9b,0x00},
|
|
+ {0x9c,0x00},
|
|
+ {0x9d,0x00},
|
|
+ {0x9e,0x00},
|
|
+ {0x9f,0x00},
|
|
+ {0xa0,0x00},
|
|
+ {0xa1,0x00},
|
|
+ {0xa2,0x00},
|
|
+
|
|
+ {0x90,0x01}, //crop enable
|
|
+ {0x95,0x02},
|
|
+ {0x96,0x58},
|
|
+ {0x97,0x03},
|
|
+ {0x98,0x20},
|
|
+ };
|
|
+
|
|
+ /* 320x240 QVGA,20fps*/
|
|
+ static struct regval_list sensor_qvga_regs_hres3[] =
|
|
+ {
|
|
+ {0xfe,0x00},
|
|
+ {0xb6,0x03},
|
|
+ {0xfa,0x00},
|
|
+ {0xc8,0x02}, //close scaler
|
|
+
|
|
+ {0x99,0x44},// 1/2 subsample
|
|
+ {0x9a,0x06},
|
|
+ {0x9b,0x00},
|
|
+ {0x9c,0x00},
|
|
+ {0x9d,0x00},
|
|
+ {0x9e,0x00},
|
|
+ {0x9f,0x00},
|
|
+ {0xa0,0x00},
|
|
+ {0xa1,0x00},
|
|
+ {0xa2,0x00},
|
|
+
|
|
+ {0x90,0x01}, //crop enable
|
|
+ {0x95,0x02},
|
|
+ {0x96,0x58},
|
|
+ {0x97,0x03},
|
|
+ {0x98,0x20},
|
|
+ };
|
|
+
|
|
+
|
|
+ static struct regval_list sensor_default_regs_hres2[] =
|
|
+ {
|
|
+ {0xfe, 0x80},
|
|
+ {0xfe, 0x80},
|
|
+ {0xfe, 0x80},
|
|
+ {0xfc, 0x06},
|
|
+ {0xf2, 0x00},
|
|
+ {0xf3, 0x00},
|
|
+ {0xf4, 0x00},
|
|
+ {0xf5, 0x00},
|
|
+ {0xf9, 0xfe}, //[0] pll enable
|
|
+ {0xfa, 0x00},
|
|
+ {0xf6, 0x00},
|
|
+ {0xf7, 0x15}, //pll enable
|
|
+ #if 1
|
|
+ {0xf8, 0x85},
|
|
+ #else
|
|
+ {0xf8, 0x84},
|
|
+ #endif
|
|
+ {0xfe, 0x00},
|
|
+ {0x82, 0x00},
|
|
+ {0xb3, 0x60},
|
|
+ {0xb4, 0x40},
|
|
+ {0xb5, 0x60},
|
|
+
|
|
+ #if 1
|
|
+ {0x03 , 0x02},
|
|
+ {0x04 , 0x80},
|
|
+ #else
|
|
+ {0x03, 0x04},
|
|
+ {0x04, 0x9b},
|
|
+ #endif
|
|
+ //////////measure window ///////////
|
|
+ {0xfe, 0x00},
|
|
+ {0xec, 0x06},//04
|
|
+ {0xed, 0x06},//04
|
|
+ {0xee, 0x62},//60
|
|
+ {0xef, 0x92},//90
|
|
+
|
|
+ ///////////analog/////////////
|
|
+ {0x0a, 0x00}, //row start
|
|
+ {0x0c, 0x00}, //col start
|
|
+ {0x0d, 0x04},
|
|
+ {0x0e, 0xc0},
|
|
+ {0x0f, 0x06}, //Window setting
|
|
+ {0x10, 0x58},
|
|
+ {0x17, 0x14}, //[0]mirror [1]flip
|
|
+
|
|
+
|
|
+ {0x18, 0x0e}, //sdark 4 row in even frame??
|
|
+ {0x19, 0x0c}, //AD pipe number
|
|
+
|
|
+ /*
|
|
+ /// ë´Ì ÏÖÏó
|
|
+ {0x18,0x0a}, //sdark 4 row in even frame??
|
|
+ {0x19,0x0a}, //AD pipe number
|
|
+ */
|
|
+
|
|
+ {0x1a , 0x01}, //CISCTL mode4
|
|
+ {0x1b , 0x8b},
|
|
+ {0x1c , 0x05},
|
|
+ {0x1e , 0x88}, //analog mode1 [7] tx-high en [5:3]COL_bias
|
|
+ {0x1f , 0x08}, //[3] tx-low en//
|
|
+ {0x20 , 0x05}, //[0]adclk mode , 0x[1]rowclk_MODE [2]rsthigh_en
|
|
+ {0x21 , 0x0f}, //[6:4]rsg
|
|
+ {0x22 , 0xf0}, //[3:0]vref
|
|
+ {0x23 , 0xc3}, //f3//ADC_r
|
|
+ {0x24 , 0x17}, //pad drive 16
|
|
+
|
|
+ //AEC
|
|
+ {0xfe, 0x01},
|
|
+ {0x11, 0x20},//AEC_out_slope , 0x
|
|
+ {0x1f, 0xc0},//max_post_gain
|
|
+ {0x20, 0x60},//max_pre_gain
|
|
+ {0x47, 0x30},//AEC_outdoor_th
|
|
+ {0x0b, 0x10},//
|
|
+ {0x13, 0x75},//y_target
|
|
+ {0xfe, 0x00},
|
|
+
|
|
+ #if 0
|
|
+ {0x05 , 0x01},//hb
|
|
+ {0x06 , 0x11},
|
|
+ {0x07 , 0x00},//vb
|
|
+ {0x08 , 0x50},
|
|
+ {0xfe , 0x01},
|
|
+ {0x27 , 0x00},//step
|
|
+ {0x28 , 0xa0},
|
|
+ {0x29 , 0x05},//level1
|
|
+ {0x2a , 0x00},
|
|
+ {0x2b , 0x05},//level2
|
|
+ {0x2c , 0x00},
|
|
+ {0x2d , 0x06},//6e8//level3
|
|
+ {0x2e , 0xe0},
|
|
+ {0x2f , 0x0a},//level4
|
|
+ {0x30 , 0x00},
|
|
+ {0x3e , 0x40},
|
|
+ #else
|
|
+ {0xfe , 0x00},
|
|
+ {0x05 , 0x01},
|
|
+ {0x06 , 0x0d},
|
|
+ {0x07 , 0x00},
|
|
+ {0x08 , 0x40},
|
|
+ {0xfe , 0x01},
|
|
+ {0x27 , 0x00},
|
|
+ {0x28 , 0xa0},
|
|
+ {0x29 , 0x05},// level 0 12.5
|
|
+ {0x2a , 0x00},
|
|
+ {0x2b , 0x05},// level 1 12.5
|
|
+ {0x2c , 0x00},
|
|
+ {0x2d , 0x05},// level 2 12.5 640/10fps
|
|
+ {0x2e , 0x00},
|
|
+ {0x2f , 0x08},// level 3 7.5
|
|
+ {0x30 , 0x20},
|
|
+ #endif
|
|
+
|
|
+ {0xfe , 0x00},
|
|
+ {0xfe , 0x00}, //0x , 0x , 0x , 0x , 0x
|
|
+ {0xb6 , 0x03}, //AEC enable
|
|
+ {0xfe , 0x00},
|
|
+
|
|
+ /////////BLK//////
|
|
+ {0x3f, 0x00}, //prc close
|
|
+ {0x40, 0x77},//
|
|
+ {0x42, 0x7f},
|
|
+ {0x43, 0x30},
|
|
+ {0x5c, 0x08},
|
|
+ {0x5e, 0x20},
|
|
+ {0x5f, 0x20},
|
|
+ {0x60, 0x20},
|
|
+ {0x61, 0x20},
|
|
+ {0x62, 0x20},
|
|
+ {0x63, 0x20},
|
|
+ {0x64, 0x20},
|
|
+ {0x65, 0x20},
|
|
+
|
|
+ ///block////////////
|
|
+ {0x80, 0xff},
|
|
+ {0x81, 0x26},//38 , 0x//skin_Y 8c_debug
|
|
+ {0x87, 0x90}, //[7]middle gamma
|
|
+ {0x84, 0x03}, //output put foramat
|
|
+ {0x86, 0x07}, ////sync plority 02 86
|
|
+ {0x8b, 0xbc},
|
|
+ {0xb0, 0x80}, //globle gain
|
|
+ {0xc0, 0x40},//Yuv bypass
|
|
+
|
|
+ //////lsc/////////////
|
|
+ #if 0
|
|
+ {0xfe, 0x01},
|
|
+ {0xc2, 0x38},
|
|
+ {0xc3, 0x25},
|
|
+ {0xc4, 0x21},
|
|
+ {0xc8, 0x19},
|
|
+ {0xc9, 0x12},
|
|
+ {0xca, 0x0e},
|
|
+ {0xbc, 0x28},// left R 0x43
|
|
+ {0xbd, 0x18},//0x18
|
|
+ {0xbe, 0x1b},//0x1b
|
|
+ {0xb6, 0x40},//right 0x40
|
|
+ {0xb7, 0x2e},
|
|
+ {0xb8, 0x26},
|
|
+ {0xc5, 0x05},
|
|
+ {0xc6, 0x03},
|
|
+ {0xc7, 0x04},
|
|
+ {0xcb, 0x00},
|
|
+ {0xcc, 0x00},
|
|
+ {0xcd, 0x00},
|
|
+ {0xbf, 0x14},
|
|
+ {0xc0, 0x22},
|
|
+ {0xc1, 0x1b},
|
|
+ {0xb9, 0x00},
|
|
+ {0xba, 0x05},
|
|
+ {0xbb, 0x05},
|
|
+ {0xaa, 0x35},
|
|
+ {0xab, 0x33},
|
|
+ {0xac, 0x33},
|
|
+ {0xad, 0x25},
|
|
+ {0xae, 0x22},
|
|
+ {0xaf, 0x27},
|
|
+ {0xb0, 0x1d},
|
|
+ {0xb1, 0x20},
|
|
+ {0xb2, 0x22},
|
|
+ {0xb3, 0x14},
|
|
+ {0xb4, 0x15},
|
|
+ {0xb5, 0x16},
|
|
+ {0xd0, 0x00},
|
|
+ {0xd2, 0x07},
|
|
+ {0xd3, 0x08},
|
|
+ {0xd8, 0x00},
|
|
+ {0xda, 0x13},
|
|
+ {0xdb, 0x17},
|
|
+ {0xdc, 0x00},
|
|
+ {0xde, 0x0a},
|
|
+ {0xdf, 0x08},
|
|
+ {0xd4, 0x00},
|
|
+ {0xd6, 0x00},
|
|
+ {0xd7, 0x0c},
|
|
+ {0xa4, 0x00},
|
|
+ {0xa5, 0x00},
|
|
+ {0xa6, 0x00},
|
|
+ {0xa7, 0x00},
|
|
+ {0xa8, 0x00},
|
|
+ {0xa9, 0x00},
|
|
+ {0xa1, 0x80},
|
|
+ {0xa2, 0x80},
|
|
+ #else
|
|
+ //gc2035 Alight lsc reg setting list
|
|
+ ////Record date: 2013-11-29 13:30:15
|
|
+
|
|
+ {0xfe,0x01},
|
|
+ {0xc2,0x21},
|
|
+ {0xc3,0x1a},
|
|
+ {0xc4,0x13},
|
|
+ {0xc8,0x17},
|
|
+ {0xc9,0x0f},
|
|
+ {0xca,0x00},
|
|
+ {0xbc,0x36},
|
|
+ {0xbd,0x2b},
|
|
+ {0xbe,0x17},
|
|
+ {0xb6,0x39},
|
|
+ {0xb7,0x21},
|
|
+ {0xb8,0x1c},
|
|
+ {0xc5,0x00},
|
|
+ {0xc6,0x00},
|
|
+ {0xc7,0x00},
|
|
+ {0xcb,0x00},
|
|
+ {0xcc,0x0c},
|
|
+ {0xcd,0x15},
|
|
+ {0xbf,0x00},
|
|
+ {0xc0,0x00},
|
|
+ {0xc1,0x00},
|
|
+ {0xb9,0x00},
|
|
+ {0xba,0x00},
|
|
+ {0xbb,0x00},
|
|
+ {0xaa,0x15},
|
|
+ {0xab,0x15},
|
|
+ {0xac,0x15},
|
|
+ {0xad,0x14},
|
|
+ {0xae,0x13},
|
|
+ {0xaf,0x12},
|
|
+ {0xb0,0x1b},
|
|
+ {0xb1,0x14},
|
|
+ {0xb2,0x14},
|
|
+ {0xb3,0x1f},
|
|
+ {0xb4,0x12},
|
|
+ {0xb5,0x13},
|
|
+ {0xd0,0x00},
|
|
+ {0xd2,0x00},
|
|
+ {0xd3,0x0c},
|
|
+ {0xd8,0x00},
|
|
+ {0xda,0x00},
|
|
+ {0xdb,0x13},
|
|
+ {0xdc,0x00},
|
|
+ {0xde,0x00},
|
|
+ {0xdf,0x25},
|
|
+ {0xd4,0x00},
|
|
+ {0xd6,0x00},
|
|
+ {0xd7,0x12},
|
|
+ {0xa4,0x00},
|
|
+ {0xa5,0x00},
|
|
+ {0xa6,0x00},
|
|
+ {0xa7,0x00},
|
|
+ {0xa8,0x00},
|
|
+ {0xa9,0x00},
|
|
+ {0xa1,0x80},
|
|
+ {0xa2,0x80},
|
|
+ #endif
|
|
+
|
|
+ //////////cc//////////////
|
|
+ {0xfe, 0x02},
|
|
+ {0xc0, 0x01},
|
|
+ {0xc1, 0x40}, //Green_cc for d
|
|
+ {0xc2, 0xfc},
|
|
+ {0xc3, 0x05},
|
|
+ {0xc4, 0xec},
|
|
+ {0xc5, 0x42},
|
|
+ {0xc6, 0xf8},
|
|
+ {0xc7, 0x40},//for cwf
|
|
+ {0xc8, 0xf8},
|
|
+ {0xc9, 0x06},
|
|
+ {0xca, 0xfd},
|
|
+ {0xcb, 0x3e},
|
|
+ {0xcc, 0xf3},
|
|
+ {0xcd, 0x36},//for A
|
|
+ {0xce, 0xf6},
|
|
+ {0xcf, 0x04},
|
|
+ {0xe3, 0x0c},
|
|
+ {0xe4, 0x44},
|
|
+ {0xe5, 0xe5},
|
|
+ {0xfe, 0x00},
|
|
+
|
|
+ ///////awb start ////////////////
|
|
+ //AWB clear
|
|
+ {0xfe, 0x01},
|
|
+ {0x4f, 0x00},
|
|
+ {0x4d, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0x10}, // 10
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0x20}, // 20
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0x30},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00}, // 30
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0x40}, // 40
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0x50}, // 50
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0x60}, // 60
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0x70}, // 70
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0x80}, // 80
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0x90}, // 90
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0xa0}, // a0
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0xb0}, // b0
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0xc0}, // c0
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4d, 0xd0}, // d0
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4f, 0x01},
|
|
+ /////// awb value////////
|
|
+ {0xfe, 0x01},
|
|
+ {0x4f, 0x00},
|
|
+ {0x4d, 0x30},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x80},
|
|
+ {0x4e, 0x80},
|
|
+ {0x4e, 0x02},
|
|
+ {0x4e, 0x02},
|
|
+ {0x4d, 0x40},
|
|
+ {0x4e, 0x00},
|
|
+ {0x4e, 0x80},
|
|
+ {0x4e, 0x80},
|
|
+ {0x4e, 0x02},
|
|
+ {0x4e, 0x02},
|
|
+ {0x4e, 0x02},
|
|
+ {0x4d, 0x53},
|
|
+ {0x4e, 0x08},
|
|
+ {0x4e, 0x04},
|
|
+ {0x4d, 0x62},
|
|
+ {0x4e, 0x10},
|
|
+ {0x4d, 0x72},
|
|
+ {0x4e, 0x20},
|
|
+ {0x4f, 0x01},
|
|
+
|
|
+ /////awb////
|
|
+ {0xfe, 0x01},
|
|
+ {0x50, 0x88},//c0//[6]green mode
|
|
+ {0x52, 0x40},
|
|
+ {0x54, 0x60},
|
|
+ {0x56, 0x06},
|
|
+ {0x57, 0x20}, //pre adjust
|
|
+ {0x58, 0x01},
|
|
+ {0x5b, 0x02}, //AWB_gain_delta
|
|
+ {0x61, 0xaa},//R/G stand
|
|
+ {0x62, 0xaa},//R/G stand
|
|
+ {0x71, 0x00},
|
|
+ {0x74, 0x10}, //0x//AWB_C_max
|
|
+ {0x77, 0x08}, // 0x//AWB_p2_x
|
|
+ {0x78, 0xfd}, //AWB_p2_y
|
|
+ {0x86, 0x30},
|
|
+ {0x87, 0x00},
|
|
+ {0x88, 0x04},//06 , 0x//[1]dark mode
|
|
+ {0x8a, 0xc0},//awb move mode
|
|
+ {0x89, 0x75},
|
|
+ {0x84, 0x08}, //0x//auto_window
|
|
+ {0x8b, 0x00}, // 0x//awb compare luma
|
|
+ {0x8d, 0x70}, //awb gain limit R
|
|
+ {0x8e, 0x70},//G
|
|
+ {0x8f, 0xf4},//B
|
|
+ {0xfe, 0x00},
|
|
+ {0x82, 0x02},//awb_en
|
|
+ /////////awb end /////////////
|
|
+
|
|
+ ///==========asde
|
|
+ {0xfe, 0x01},
|
|
+ {0x21, 0xbf},
|
|
+ {0xfe, 0x02},
|
|
+ {0xa4, 0x00},//
|
|
+ {0xa5, 0x40}, //lsc_th
|
|
+ {0xa2, 0xa0}, //lsc_dec_slope
|
|
+ {0x86, 0x27},//add for DPC travis 20140505
|
|
+ {0x8a, 0x33},//add for DPC travis 20140505
|
|
+ {0x8d, 0x85},//add for DPC travis 20140505
|
|
+ {0xa6, 0xf0},//80//change for DPC travis 20140505
|
|
+ {0xa7, 0x80}, //ot_th
|
|
+ {0xab, 0x31}, //
|
|
+ {0xa9, 0x6f}, //
|
|
+ {0xb0, 0x99}, //0x//edge effect slope low
|
|
+ {0xb1, 0x34},//edge effect slope low
|
|
+ {0xb3, 0x80}, //saturation dec slope
|
|
+ {0xde, 0xb6}, //
|
|
+ {0x38, 0x0f}, //
|
|
+ {0x39, 0x60}, //
|
|
+ {0xfe, 0x00},
|
|
+ {0x81, 0x26},
|
|
+ {0xfe, 0x02},
|
|
+ {0x83, 0x00},//
|
|
+ {0x84, 0x45},//
|
|
+ ////////////YCP//////////
|
|
+ {0xd1, 0x38},//saturation_cb
|
|
+ {0xd2, 0x38},//saturation_Cr
|
|
+ {0xd3, 0x40},//contrast ?
|
|
+ {0xd4, 0x80},//contrast center
|
|
+ {0xd5, 0x00},//luma_offset
|
|
+ {0xdc, 0x30},
|
|
+ {0xdd, 0xb8}, //edge_sa_g,b
|
|
+ {0xfe, 0x00},
|
|
+ ///////dndd///////////
|
|
+ {0xfe, 0x02},
|
|
+ {0x88, 0x15},//dn_b_base
|
|
+ {0x8c, 0xf6}, //[2]b_in_dark_inc
|
|
+ {0x89, 0x03}, //dn_c_weight
|
|
+ ////////EE ///////////
|
|
+ {0xfe, 0x02},
|
|
+ {0x90, 0x6c},// EEINTP mode1
|
|
+ {0x97, 0x45},// edge effect
|
|
+ ////==============RGB Gamma
|
|
+ {0xfe, 0x02},
|
|
+ {0x15, 0x0a},
|
|
+ {0x16, 0x12},
|
|
+ {0x17, 0x19},
|
|
+ {0x18, 0x1f},
|
|
+ {0x19, 0x2c},
|
|
+ {0x1a, 0x38},
|
|
+ {0x1b, 0x42},
|
|
+ {0x1c, 0x4e},
|
|
+ {0x1d, 0x63},
|
|
+ {0x1e, 0x76},
|
|
+ {0x1f, 0x87},
|
|
+ {0x20, 0x96},
|
|
+ {0x21, 0xa2},
|
|
+ {0x22, 0xb8},
|
|
+ {0x23, 0xca},
|
|
+ {0x24, 0xd8},
|
|
+ {0x25, 0xe3},
|
|
+ {0x26, 0xf0},
|
|
+ {0x27, 0xf8},
|
|
+ {0x28, 0xfd},
|
|
+ {0x29, 0xff},
|
|
+
|
|
+ ///=================y gamma
|
|
+ {0xfe, 0x02},
|
|
+ {0x2b, 0x00},
|
|
+ {0x2c, 0x04},
|
|
+ {0x2d, 0x09},
|
|
+ {0x2e, 0x18},
|
|
+ {0x2f, 0x27},
|
|
+ {0x30, 0x37},
|
|
+ {0x31, 0x49},
|
|
+ {0x32, 0x5c},
|
|
+ {0x33, 0x7e},
|
|
+ {0x34, 0xa0},
|
|
+ {0x35, 0xc0},
|
|
+ {0x36, 0xe0},
|
|
+ {0x37, 0xff},
|
|
+ /////1600x1200size//
|
|
+ {0xfe, 0x00},//
|
|
+ {0x90, 0x01}, //0x//crop enable
|
|
+ {0x95, 0x04}, //0x//1600x1200
|
|
+ {0x96, 0xb0},
|
|
+ {0x97, 0x06},
|
|
+ {0x98, 0x40},
|
|
+
|
|
+ {0xfe, 0x03},
|
|
+ {0x42, 0x40},
|
|
+ {0x43, 0x06}, //output buf width
|
|
+ {0x41, 0x02}, // Pclk_polarity
|
|
+ {0x40, 0x40}, //00
|
|
+ {0x17, 0x00}, //widv
|
|
+ {0xfe, 0x00},
|
|
+ ////output DVP/////
|
|
+ {0xfe , 0x00},
|
|
+ {0xb6 , 0x03},
|
|
+ {0xfa , 0x00},
|
|
+
|
|
+ {0xc8, 0x00},//close scaler
|
|
+ {0x99, 0x22},// 1/2 subsample
|
|
+ {0x9a, 0x06},
|
|
+ {0x9b, 0x00},
|
|
+ {0x9c, 0x00},
|
|
+ {0x9d, 0x00},
|
|
+ {0x9e, 0x00},
|
|
+ {0x9f, 0x00},
|
|
+ {0xa0, 0x00},
|
|
+ {0xa1, 0x00},
|
|
+ {0xa2, 0x00},
|
|
+
|
|
+ {0x90, 0x01}, //crop enable
|
|
+ {0x94, 0x02},
|
|
+ {0x95, 0x02},
|
|
+ {0x96, 0x5a},
|
|
+ {0x97, 0x03},
|
|
+ {0x98, 0x20},
|
|
+ {0xfe, 0x00},
|
|
+ {0x82, 0xfe}, // fe
|
|
+ {0xf2, 0x70},
|
|
+ {0xf3, 0xff},
|
|
+ {0xf4, 0x00},
|
|
+ {0xf5, 0x30},
|
|
+
|
|
+ #if 0
|
|
+ ///////// re zao///
|
|
+ {0xfe,0x00},
|
|
+ {0x22,0xf0},
|
|
+ {0xfe,0x01},
|
|
+ {0x21,0xff},
|
|
+ {0xfe,0x02},
|
|
+ {0x8a,0x33},
|
|
+ {0x8c,0x76},
|
|
+ {0x8d,0x85},
|
|
+ {0xa6,0xf0},
|
|
+ {0xae,0x9f},
|
|
+ {0xa2,0x90},
|
|
+ {0xa5,0x40},
|
|
+ {0xa7,0x30},
|
|
+ {0xb0,0x88},
|
|
+ {0x38,0x0b},
|
|
+ {0x39,0x30},
|
|
+ {0xfe,0x00},
|
|
+ {0x87,0xb0},
|
|
+
|
|
+ //// small RGB gamma////
|
|
+ {0xfe, 0x02},
|
|
+ {0x15, 0x0b},
|
|
+ {0x16, 0x0e},
|
|
+ {0x17, 0x10},
|
|
+ {0x18, 0x12},
|
|
+ {0x19, 0x19},
|
|
+ {0x1a, 0x21},
|
|
+ {0x1b, 0x29},
|
|
+ {0x1c, 0x31},
|
|
+ {0x1d, 0x41},
|
|
+ {0x1e, 0x50},
|
|
+ {0x1f, 0x5f},
|
|
+ {0x20, 0x6d},
|
|
+ {0x21, 0x79},
|
|
+ {0x22, 0x91},
|
|
+ {0x23, 0xa5},
|
|
+ {0x24, 0xb9},
|
|
+ {0x25, 0xc9},
|
|
+ {0x26, 0xe1},
|
|
+ {0x27, 0xee},
|
|
+ {0x28, 0xf7},
|
|
+ {0x29, 0xff},
|
|
+
|
|
+ ////dark sun/////
|
|
+ {0xfe, 0x02},
|
|
+ {0x40, 0x06},
|
|
+ {0x41, 0x23},
|
|
+ {0x42, 0x3f},
|
|
+ {0x43, 0x06},
|
|
+ {0x44, 0x00},
|
|
+ {0x45, 0x00},
|
|
+ {0x46, 0x14},
|
|
+ {0x47, 0x09},
|
|
+ #endif
|
|
+ #ifdef Auto_LSC_debug
|
|
+ {0xfe , 0x00},
|
|
+ {0x80 , 0x08},
|
|
+ {0x81 , 0x00},
|
|
+ {0x82 , 0x00},
|
|
+ {0xa3 , 0x80},
|
|
+ {0xa4 , 0x80},
|
|
+ {0xa5 , 0x80},
|
|
+ {0xa6 , 0x80},
|
|
+ {0xa7 , 0x80},
|
|
+ {0xa8 , 0x80},
|
|
+ {0xa9 , 0x80},
|
|
+ {0xaa , 0x80},
|
|
+ {0xad , 0x80},
|
|
+ {0xae , 0x80},
|
|
+ {0xaf , 0x80},
|
|
+ {0xb3 , 0x40},
|
|
+ {0xb4 , 0x40},
|
|
+ {0xb5 , 0x40},
|
|
+ {0xfe , 0x01},
|
|
+ {0x0a , 0x40},
|
|
+ {0x13 , 0x48},
|
|
+ {0x9f , 0x40},
|
|
+ {0xfe , 0x02},
|
|
+ {0xd0 , 0x40},
|
|
+ {0xd1 , 0x20},
|
|
+ {0xd2 , 0x20},
|
|
+ {0xd3 , 0x40},
|
|
+ {0xd5 , 0x00},
|
|
+ {0xdd , 0x00},
|
|
+ {0xfe , 0x00},
|
|
+ #endif
|
|
+ };
|
|
+
|
|
+/* 640x480 VGA,15fps*/
|
|
+static struct regval_list sensor_vga_regs_hres2[] ={};
|
|
+
|
|
+/* 352x288 CIF,15fps*/
|
|
+static struct regval_list sensor_cif_regs_hres2[] = {};
|
|
+
|
|
+/* 320x240 QVGA,15fps*/
|
|
+static struct regval_list sensor_qvga_regs_hres2[] = {};
|
|
+
|
|
+static struct sensor_win_size
|
|
+sensor_win_sizes_hres0[] =
|
|
+{
|
|
+ /* UXGA */
|
|
+ {
|
|
+ .width = UXGA_WIDTH,
|
|
+ .height = UXGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_uxga_regs_hres0,
|
|
+ .regs_size = ARRAY_SIZE(sensor_uxga_regs_hres0),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+ /* 720p */
|
|
+ {
|
|
+ .width = HD720_WIDTH,
|
|
+ .height = HD720_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = Gc2015_sensor_hd720_regs_hres0,
|
|
+ .regs_size = ARRAY_SIZE(Gc2015_sensor_hd720_regs_hres0),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+ /* VGA */
|
|
+ {
|
|
+ .width = VGA_WIDTH,
|
|
+ .height = VGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_vga_regs_hres0,
|
|
+ .regs_size = ARRAY_SIZE(sensor_vga_regs_hres0),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
};
|
|
|
|
-/* 800X600 SVGA,30fps*/
|
|
-static struct regval_list sensor_svga_regs[] =
|
|
-{
|
|
-{0xfe,0x00},
|
|
-{0xb6,0x03},
|
|
-{0xfa , 0x00},
|
|
-{0xc8,0x00},//close scaler
|
|
-
|
|
-{0x99,0x22},// 1/2 subsample
|
|
-{0x9a , 0x07},
|
|
-{0x9b,0x00},
|
|
-{0x9c,0x00},
|
|
-{0x9d,0x00},
|
|
-{0x9e,0x00},
|
|
-{0x9f,0x00},
|
|
-{0xa0,0x00},
|
|
-{0xa1,0x00},
|
|
-{0xa2,0x00},
|
|
-
|
|
-{0x90,0x01}, //crop enable
|
|
-{0x95,0x02},
|
|
-{0x96,0x58},
|
|
-{0x97,0x03},
|
|
-{0x98,0x20},
|
|
+static struct sensor_win_size
|
|
+sensor_win_sizes_hres1[] =
|
|
+{
|
|
+ /* UXGA */
|
|
+ {
|
|
+ .width = UXGA_WIDTH,
|
|
+ .height = UXGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_uxga_regs_hres1,
|
|
+ .regs_size = ARRAY_SIZE(sensor_uxga_regs_hres1),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+ /* SVGA */
|
|
+ {
|
|
+ .width = SVGA_WIDTH,
|
|
+ .height = SVGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_svga_regs_hres1,
|
|
+ .regs_size = ARRAY_SIZE(sensor_svga_regs_hres1),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
};
|
|
|
|
-////1280*720---init---///
|
|
-//static struct regval_list Gc2015_sensor_hd720_regs[] = {
|
|
-//
|
|
-//
|
|
-//{0xfe , 0x00},
|
|
-//{0x05, 0x01},
|
|
-//{0x06, 0x9e},
|
|
-//{0x07, 0x01},
|
|
-//{0x08, 0x6d},
|
|
-//{0x0a , 0xf0}, //row start
|
|
-//{0x0c , 0xa0}, //col start
|
|
-//{0x0d , 0x02},
|
|
-//{0x0e , 0xd8},
|
|
-//{0x0f , 0x05}, //Window setting
|
|
-//{0x10 , 0x18},
|
|
-//
|
|
-//{0xfe, 0x01},
|
|
-//{0x27, 0x00},
|
|
-//{0x28, 0xd9},
|
|
-//{0x29, 0x04},
|
|
-//{0x2a, 0x3d},//18fps
|
|
-//{0x2b, 0x06},
|
|
-//{0x2c, 0xc8},//12.5fps
|
|
-//{0x2d, 0x0a},
|
|
-//{0x2e, 0x2c},//8fps
|
|
-//{0x3e, 0x40},//0x40 0x00
|
|
-//
|
|
-////measure window
|
|
-//{0xfe, 0x00},
|
|
-//{0xec, 0x04},
|
|
-//{0xed, 0x04},
|
|
-//{0xee, 0x50},
|
|
-//{0xef, 0x58},
|
|
-//
|
|
-//
|
|
-//
|
|
-//
|
|
-//{0x90 , 0x01}, //crop enable
|
|
-//{0x95 , 0x02},
|
|
-//{0x96 , 0xd0},
|
|
-//{0x97 , 0x05},
|
|
-//{0x98 , 0x00},
|
|
-//
|
|
-//
|
|
-//{0xfe , 0x03},
|
|
-//{0x42 , 0x80},
|
|
-//{0x43 , 0x06}, //output buf width
|
|
-//{0x41 , 0x00}, // delay
|
|
-//{0x40 , 0x00}, //fifo half full trig
|
|
-//{0x17 , 0x01}, //widv
|
|
-//{0xfe , 0x00},
|
|
-//
|
|
-//
|
|
-//{0x99, 0x11},
|
|
-//{0xc8, 0x00},
|
|
-//
|
|
-//{0xfa, 0x11},
|
|
-//
|
|
-//
|
|
-//
|
|
-//
|
|
-//
|
|
-//{0xff, 0xff},
|
|
-//
|
|
-//
|
|
-//
|
|
-//};
|
|
-
|
|
+static struct sensor_win_size
|
|
+sensor_win_sizes_hres2[] =
|
|
+{
|
|
+ /* VGA */
|
|
+ {
|
|
+ .width = VGA_WIDTH,
|
|
+ .height = VGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_vga_regs_hres2,
|
|
+ .regs_size = ARRAY_SIZE(sensor_vga_regs_hres2),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+ /* CIF */
|
|
+ {
|
|
+ .width = CIF_WIDTH,
|
|
+ .height = CIF_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_cif_regs_hres2,
|
|
+ .regs_size = ARRAY_SIZE(sensor_qvga_regs_hres2),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+ /* QVGA */
|
|
+ {
|
|
+ .width = QVGA_WIDTH,
|
|
+ .height = QVGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_qvga_regs_hres2,
|
|
+ .regs_size = ARRAY_SIZE(sensor_qvga_regs_hres2),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+};
|
|
|
|
+static struct sensor_win_size
|
|
+sensor_win_sizes_hres3[] =
|
|
+{
|
|
+ /* UXGA */
|
|
+ {
|
|
+ .width = UXGA_WIDTH,
|
|
+ .height = UXGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_uxga_regs_hres3,
|
|
+ .regs_size = ARRAY_SIZE(sensor_uxga_regs_hres3),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+ /* SVGA */
|
|
+ {
|
|
+ .width = SVGA_WIDTH,
|
|
+ .height = SVGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_svga_regs_hres3,
|
|
+ .regs_size = ARRAY_SIZE(sensor_svga_regs_hres3),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+ /* VGA */
|
|
+ {
|
|
+ .width = VGA_WIDTH,
|
|
+ .height = VGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_vga_regs_hres3,
|
|
+ .regs_size = ARRAY_SIZE(sensor_vga_regs_hres3),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+ /* QVGA */
|
|
+ {
|
|
+ .width = QVGA_WIDTH,
|
|
+ .height = QVGA_HEIGHT,
|
|
+ .hoffset = 0,
|
|
+ .voffset = 0,
|
|
+ .regs = sensor_qvga_regs_hres3,
|
|
+ .regs_size = ARRAY_SIZE(sensor_qvga_regs_hres3),
|
|
+ .set_size = NULL,
|
|
+ },
|
|
+};
|
|
|
|
/*
|
|
* The white balance settings
|
|
- * Here only tune the R G B channel gain.
|
|
+ * Here only tune the R G B channel gain.
|
|
* The white balance enalbe bit is modified in sensor_s_autowb and sensor_s_wb
|
|
*/
|
|
-static struct regval_list sensor_wb_manual[] = {
|
|
-//null
|
|
-};
|
|
+static struct regval_list sensor_wb_manual[] = {};
|
|
|
|
-static struct regval_list sensor_wb_auto_regs[] = {
|
|
+static struct regval_list sensor_wb_auto_regs[] =
|
|
+{
|
|
{0x82, 0xfe},
|
|
{0xb3, 0x61},
|
|
- {0xb4, 0x40},
|
|
+ {0xb4, 0x40},
|
|
{0xb5, 0x61},
|
|
- {0xff, 0xff},
|
|
+ {0xff, 0xff},
|
|
};
|
|
|
|
-static struct regval_list sensor_wb_incandescence_regs[] = {
|
|
- //bai re guang
|
|
+static struct regval_list sensor_wb_incandescence_regs[] =
|
|
+{
|
|
+ //bai re guang
|
|
{0x82, 0xfd},
|
|
{0xb3, 0x50},
|
|
- {0xb4, 0x40},
|
|
+ {0xb4, 0x40},
|
|
{0xb5, 0xa8},
|
|
- {0xff, 0xff},
|
|
+ {0xff, 0xff},
|
|
};
|
|
|
|
-static struct regval_list sensor_wb_fluorescent_regs[] = {
|
|
+static struct regval_list sensor_wb_fluorescent_regs[] =
|
|
+{
|
|
//ri guang deng
|
|
{0x82, 0xfd},
|
|
{0xb3, 0x72},
|
|
- {0xb4, 0x40},
|
|
+ {0xb4, 0x40},
|
|
{0xb5, 0x5b},
|
|
- {0xff, 0xff},
|
|
+ {0xff, 0xff},
|
|
};
|
|
|
|
-static struct regval_list sensor_wb_tungsten_regs[] = {
|
|
+static struct regval_list sensor_wb_tungsten_regs[] =
|
|
+{
|
|
//wu si deng
|
|
{0x82, 0xfd},
|
|
{0xb3, 0xa0},
|
|
- {0xb4, 0x45},
|
|
+ {0xb4, 0x45},
|
|
{0xb5, 0x40},
|
|
- {0xff, 0xff},
|
|
+ {0xff, 0xff},
|
|
};
|
|
|
|
-static struct regval_list sensor_wb_horizon[] = {
|
|
-//null
|
|
-};
|
|
-static struct regval_list sensor_wb_daylight_regs[] = {
|
|
+static struct regval_list sensor_wb_horizon[] = {};
|
|
+
|
|
+static struct regval_list sensor_wb_daylight_regs[] =
|
|
+{
|
|
//tai yang guang
|
|
- //Sunny
|
|
+ //Sunny
|
|
{0x82, 0xfd},
|
|
{0xb3, 0x58},
|
|
- {0xb4, 0x40},
|
|
+ {0xb4, 0x40},
|
|
{0xb5, 0x50},
|
|
- {0xff, 0xff},
|
|
+ {0xff, 0xff},
|
|
};
|
|
|
|
-static struct regval_list sensor_wb_flash[] = {
|
|
-//null
|
|
-};
|
|
+static struct regval_list sensor_wb_flash[] = {};
|
|
|
|
-static struct regval_list sensor_wb_cloud_regs[] = {
|
|
+static struct regval_list sensor_wb_cloud_regs[] =
|
|
+{
|
|
{0x82, 0xfd},
|
|
{0xb3, 0x58},
|
|
- {0xb4, 0x40},
|
|
+ {0xb4, 0x40},
|
|
{0xb5, 0x50},
|
|
- {0xff, 0xff},
|
|
+ {0xff, 0xff},
|
|
};
|
|
|
|
-static struct regval_list sensor_wb_shade[] = {
|
|
-//null
|
|
-};
|
|
+static struct regval_list sensor_wb_shade[] = {};
|
|
|
|
-static struct cfg_array sensor_wb[] = {
|
|
- {
|
|
- .regs = sensor_wb_manual, //V4L2_WHITE_BALANCE_MANUAL
|
|
+static struct cfg_array sensor_wb[] =
|
|
+{
|
|
+ {
|
|
+ .regs = sensor_wb_manual, //V4L2_WHITE_BALANCE_MANUAL
|
|
.size = ARRAY_SIZE(sensor_wb_manual),
|
|
},
|
|
{
|
|
- .regs = sensor_wb_auto_regs, //V4L2_WHITE_BALANCE_AUTO
|
|
+ .regs = sensor_wb_auto_regs, //V4L2_WHITE_BALANCE_AUTO
|
|
.size = ARRAY_SIZE(sensor_wb_auto_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_wb_incandescence_regs, //V4L2_WHITE_BALANCE_INCANDESCENT
|
|
+ .regs = sensor_wb_incandescence_regs, //V4L2_WHITE_BALANCE_INCANDESCENT
|
|
.size = ARRAY_SIZE(sensor_wb_incandescence_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_wb_fluorescent_regs, //V4L2_WHITE_BALANCE_FLUORESCENT
|
|
+ .regs = sensor_wb_fluorescent_regs, //V4L2_WHITE_BALANCE_FLUORESCENT
|
|
.size = ARRAY_SIZE(sensor_wb_fluorescent_regs),
|
|
},
|
|
{
|
|
@@ -992,23 +3428,23 @@ static struct cfg_array sensor_wb[] = {
|
|
.size = ARRAY_SIZE(sensor_wb_tungsten_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_wb_horizon, //V4L2_WHITE_BALANCE_HORIZON
|
|
+ .regs = sensor_wb_horizon, //V4L2_WHITE_BALANCE_HORIZON
|
|
.size = ARRAY_SIZE(sensor_wb_horizon),
|
|
- },
|
|
+ },
|
|
{
|
|
- .regs = sensor_wb_daylight_regs, //V4L2_WHITE_BALANCE_DAYLIGHT
|
|
+ .regs = sensor_wb_daylight_regs, //V4L2_WHITE_BALANCE_DAYLIGHT
|
|
.size = ARRAY_SIZE(sensor_wb_daylight_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_wb_flash, //V4L2_WHITE_BALANCE_FLASH
|
|
+ .regs = sensor_wb_flash, //V4L2_WHITE_BALANCE_FLASH
|
|
.size = ARRAY_SIZE(sensor_wb_flash),
|
|
},
|
|
{
|
|
- .regs = sensor_wb_cloud_regs, //V4L2_WHITE_BALANCE_CLOUDY
|
|
+ .regs = sensor_wb_cloud_regs, //V4L2_WHITE_BALANCE_CLOUDY
|
|
.size = ARRAY_SIZE(sensor_wb_cloud_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_wb_shade, //V4L2_WHITE_BALANCE_SHADE
|
|
+ .regs = sensor_wb_shade, //V4L2_WHITE_BALANCE_SHADE
|
|
.size = ARRAY_SIZE(sensor_wb_shade),
|
|
},
|
|
// {
|
|
@@ -1016,136 +3452,119 @@ static struct cfg_array sensor_wb[] = {
|
|
// .size = 0,
|
|
// },
|
|
};
|
|
-
|
|
+
|
|
|
|
/*
|
|
* The color effect settings
|
|
*/
|
|
-static struct regval_list sensor_colorfx_none_regs[] = {
|
|
- {0xfe, 0x00},
|
|
+static struct regval_list sensor_colorfx_none_regs[] =
|
|
+{
|
|
+ {0xfe, 0x00},
|
|
{0x83, 0xe0},
|
|
-
|
|
};
|
|
|
|
-static struct regval_list sensor_colorfx_bw_regs[] = {
|
|
-
|
|
-};
|
|
+static struct regval_list sensor_colorfx_bw_regs[] = {};
|
|
|
|
-static struct regval_list sensor_colorfx_sepia_regs[] = {
|
|
- {0xfe, 0x00},
|
|
+static struct regval_list sensor_colorfx_sepia_regs[] =
|
|
+{
|
|
+ {0xfe, 0x00},
|
|
{0x83, 0x82},
|
|
-
|
|
};
|
|
|
|
-static struct regval_list sensor_colorfx_negative_regs[] = {
|
|
- {0xfe, 0x00},
|
|
+static struct regval_list sensor_colorfx_negative_regs[] =
|
|
+{
|
|
+ {0xfe, 0x00},
|
|
{0x83, 0x01},
|
|
-
|
|
};
|
|
|
|
-static struct regval_list sensor_colorfx_emboss_regs[] = {
|
|
- {0xfe, 0x00},
|
|
+static struct regval_list sensor_colorfx_emboss_regs[] =
|
|
+{
|
|
+ {0xfe, 0x00},
|
|
{0x83, 0x12},///CAM_EFFECT_ENC_GRAYSCALE
|
|
};
|
|
|
|
-static struct regval_list sensor_colorfx_sketch_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_colorfx_sketch_regs[] = {};
|
|
|
|
-static struct regval_list sensor_colorfx_sky_blue_regs[] = {
|
|
- {0xfe, 0x00},
|
|
+static struct regval_list sensor_colorfx_sky_blue_regs[] =
|
|
+{
|
|
+ {0xfe, 0x00},
|
|
{0x83, 0x62},
|
|
-
|
|
};
|
|
|
|
-static struct regval_list sensor_colorfx_grass_green_regs[] = {
|
|
- {0xfe, 0x00},
|
|
+static struct regval_list sensor_colorfx_grass_green_regs[] =
|
|
+{
|
|
+ {0xfe, 0x00},
|
|
{0x83, 0x52},
|
|
};
|
|
|
|
-static struct regval_list sensor_colorfx_skin_whiten_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_colorfx_skin_whiten_regs[] = {};
|
|
|
|
-static struct regval_list sensor_colorfx_vivid_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_colorfx_vivid_regs[] = {};
|
|
|
|
-static struct regval_list sensor_colorfx_aqua_regs[] = {
|
|
-//null
|
|
-};
|
|
+static struct regval_list sensor_colorfx_aqua_regs[] = {};
|
|
|
|
-static struct regval_list sensor_colorfx_art_freeze_regs[] = {
|
|
-//null
|
|
-};
|
|
+static struct regval_list sensor_colorfx_art_freeze_regs[] = {};
|
|
|
|
-static struct regval_list sensor_colorfx_silhouette_regs[] = {
|
|
-//null
|
|
-};
|
|
+static struct regval_list sensor_colorfx_silhouette_regs[] = {};
|
|
|
|
-static struct regval_list sensor_colorfx_solarization_regs[] = {
|
|
-//null
|
|
-};
|
|
+static struct regval_list sensor_colorfx_solarization_regs[] = {};
|
|
|
|
-static struct regval_list sensor_colorfx_antique_regs[] = {
|
|
-//null
|
|
-};
|
|
+static struct regval_list sensor_colorfx_antique_regs[] = {};
|
|
|
|
-static struct regval_list sensor_colorfx_set_cbcr_regs[] = {
|
|
-//null
|
|
-};
|
|
+static struct regval_list sensor_colorfx_set_cbcr_regs[] = {};
|
|
|
|
-static struct cfg_array sensor_colorfx[] = {
|
|
+static struct cfg_array sensor_colorfx[] =
|
|
+{
|
|
{
|
|
- .regs = sensor_colorfx_none_regs, //V4L2_COLORFX_NONE = 0,
|
|
+ .regs = sensor_colorfx_none_regs, //V4L2_COLORFX_NONE = 0,
|
|
.size = ARRAY_SIZE(sensor_colorfx_none_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_bw_regs, //V4L2_COLORFX_BW = 1,
|
|
+ .regs = sensor_colorfx_bw_regs, //V4L2_COLORFX_BW = 1,
|
|
.size = ARRAY_SIZE(sensor_colorfx_bw_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_sepia_regs, //V4L2_COLORFX_SEPIA = 2,
|
|
+ .regs = sensor_colorfx_sepia_regs, //V4L2_COLORFX_SEPIA = 2,
|
|
.size = ARRAY_SIZE(sensor_colorfx_sepia_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_negative_regs, //V4L2_COLORFX_NEGATIVE = 3,
|
|
+ .regs = sensor_colorfx_negative_regs, //V4L2_COLORFX_NEGATIVE = 3,
|
|
.size = ARRAY_SIZE(sensor_colorfx_negative_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_emboss_regs, //V4L2_COLORFX_EMBOSS = 4,
|
|
+ .regs = sensor_colorfx_emboss_regs, //V4L2_COLORFX_EMBOSS = 4,
|
|
.size = ARRAY_SIZE(sensor_colorfx_emboss_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_sketch_regs, //V4L2_COLORFX_SKETCH = 5,
|
|
+ .regs = sensor_colorfx_sketch_regs, //V4L2_COLORFX_SKETCH = 5,
|
|
.size = ARRAY_SIZE(sensor_colorfx_sketch_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_sky_blue_regs, //V4L2_COLORFX_SKY_BLUE = 6,
|
|
+ .regs = sensor_colorfx_sky_blue_regs, //V4L2_COLORFX_SKY_BLUE = 6,
|
|
.size = ARRAY_SIZE(sensor_colorfx_sky_blue_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_grass_green_regs, //V4L2_COLORFX_GRASS_GREEN = 7,
|
|
+ .regs = sensor_colorfx_grass_green_regs, //V4L2_COLORFX_GRASS_GREEN = 7,
|
|
.size = ARRAY_SIZE(sensor_colorfx_grass_green_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_skin_whiten_regs, //V4L2_COLORFX_SKIN_WHITEN = 8,
|
|
+ .regs = sensor_colorfx_skin_whiten_regs, //V4L2_COLORFX_SKIN_WHITEN = 8,
|
|
.size = ARRAY_SIZE(sensor_colorfx_skin_whiten_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_vivid_regs, //V4L2_COLORFX_VIVID = 9,
|
|
+ .regs = sensor_colorfx_vivid_regs, //V4L2_COLORFX_VIVID = 9,
|
|
.size = ARRAY_SIZE(sensor_colorfx_vivid_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_aqua_regs, //V4L2_COLORFX_AQUA = 10,
|
|
+ .regs = sensor_colorfx_aqua_regs, //V4L2_COLORFX_AQUA = 10,
|
|
.size = ARRAY_SIZE(sensor_colorfx_aqua_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_art_freeze_regs, //V4L2_COLORFX_ART_FREEZE = 11,
|
|
+ .regs = sensor_colorfx_art_freeze_regs, //V4L2_COLORFX_ART_FREEZE = 11,
|
|
.size = ARRAY_SIZE(sensor_colorfx_art_freeze_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_silhouette_regs, //V4L2_COLORFX_SILHOUETTE = 12,
|
|
+ .regs = sensor_colorfx_silhouette_regs, //V4L2_COLORFX_SILHOUETTE = 12,
|
|
.size = ARRAY_SIZE(sensor_colorfx_silhouette_regs),
|
|
},
|
|
{
|
|
@@ -1153,57 +3572,38 @@ static struct cfg_array sensor_colorfx[] = {
|
|
.size = ARRAY_SIZE(sensor_colorfx_solarization_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_antique_regs, //V4L2_COLORFX_ANTIQUE = 14,
|
|
+ .regs = sensor_colorfx_antique_regs, //V4L2_COLORFX_ANTIQUE = 14,
|
|
.size = ARRAY_SIZE(sensor_colorfx_antique_regs),
|
|
},
|
|
{
|
|
- .regs = sensor_colorfx_set_cbcr_regs, //V4L2_COLORFX_SET_CBCR = 15,
|
|
+ .regs = sensor_colorfx_set_cbcr_regs, //V4L2_COLORFX_SET_CBCR = 15,
|
|
.size = ARRAY_SIZE(sensor_colorfx_set_cbcr_regs),
|
|
},
|
|
};
|
|
|
|
-
|
|
-
|
|
/*
|
|
* The brightness setttings
|
|
*/
|
|
-static struct regval_list sensor_brightness_neg4_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_brightness_neg4_regs[] = {};
|
|
|
|
-static struct regval_list sensor_brightness_neg3_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_brightness_neg3_regs[] = {};
|
|
|
|
-static struct regval_list sensor_brightness_neg2_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_brightness_neg2_regs[] = {};
|
|
|
|
-static struct regval_list sensor_brightness_neg1_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_brightness_neg1_regs[] = {};
|
|
|
|
-static struct regval_list sensor_brightness_zero_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_brightness_zero_regs[] = {};
|
|
|
|
-static struct regval_list sensor_brightness_pos1_regs[] = {
|
|
- //NULL
|
|
-};
|
|
+static struct regval_list sensor_brightness_pos1_regs[] = {};
|
|
|
|
-static struct regval_list sensor_brightness_pos2_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_brightness_pos2_regs[] = {};
|
|
|
|
-static struct regval_list sensor_brightness_pos3_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_brightness_pos3_regs[] = {};
|
|
|
|
-static struct regval_list sensor_brightness_pos4_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_brightness_pos4_regs[] = {};
|
|
|
|
-static struct cfg_array sensor_brightness[] = {
|
|
+static struct cfg_array sensor_brightness[] =
|
|
+{
|
|
{
|
|
.regs = sensor_brightness_neg4_regs,
|
|
.size = ARRAY_SIZE(sensor_brightness_neg4_regs),
|
|
@@ -1245,42 +3645,26 @@ static struct cfg_array sensor_brightness[] = {
|
|
/*
|
|
* The contrast setttings
|
|
*/
|
|
-static struct regval_list sensor_contrast_neg4_regs[] = {
|
|
-
|
|
-};
|
|
-
|
|
-static struct regval_list sensor_contrast_neg3_regs[] = {
|
|
-
|
|
-};
|
|
-
|
|
-static struct regval_list sensor_contrast_neg2_regs[] = {
|
|
-
|
|
-};
|
|
+static struct regval_list sensor_contrast_neg4_regs[] = {};
|
|
|
|
-static struct regval_list sensor_contrast_neg1_regs[] = {
|
|
+static struct regval_list sensor_contrast_neg3_regs[] = {};
|
|
|
|
-};
|
|
-
|
|
-static struct regval_list sensor_contrast_zero_regs[] = {
|
|
-
|
|
-};
|
|
+static struct regval_list sensor_contrast_neg2_regs[] = {};
|
|
|
|
-static struct regval_list sensor_contrast_pos1_regs[] = {
|
|
+static struct regval_list sensor_contrast_neg1_regs[] = {};
|
|
|
|
-};
|
|
+static struct regval_list sensor_contrast_zero_regs[] = {};
|
|
|
|
-static struct regval_list sensor_contrast_pos2_regs[] = {
|
|
+static struct regval_list sensor_contrast_pos1_regs[] = {};
|
|
|
|
-};
|
|
+static struct regval_list sensor_contrast_pos2_regs[] = {};
|
|
|
|
-static struct regval_list sensor_contrast_pos3_regs[] = {
|
|
-
|
|
-};
|
|
+static struct regval_list sensor_contrast_pos3_regs[] = {};
|
|
|
|
-static struct regval_list sensor_contrast_pos4_regs[] = {
|
|
-};
|
|
+static struct regval_list sensor_contrast_pos4_regs[] = {};
|
|
|
|
-static struct cfg_array sensor_contrast[] = {
|
|
+static struct cfg_array sensor_contrast[] =
|
|
+{
|
|
{
|
|
.regs = sensor_contrast_neg4_regs,
|
|
.size = ARRAY_SIZE(sensor_contrast_neg4_regs),
|
|
@@ -1322,43 +3706,26 @@ static struct cfg_array sensor_contrast[] = {
|
|
/*
|
|
* The saturation setttings
|
|
*/
|
|
-static struct regval_list sensor_saturation_neg4_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_saturation_neg4_regs[] = {};
|
|
|
|
-static struct regval_list sensor_saturation_neg3_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_saturation_neg3_regs[] = {};
|
|
|
|
-static struct regval_list sensor_saturation_neg2_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_saturation_neg2_regs[] = {};
|
|
|
|
-static struct regval_list sensor_saturation_neg1_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_saturation_neg1_regs[] = {};
|
|
|
|
-static struct regval_list sensor_saturation_zero_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_saturation_zero_regs[] = {};
|
|
|
|
-static struct regval_list sensor_saturation_pos1_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_saturation_pos1_regs[] = {};
|
|
|
|
-static struct regval_list sensor_saturation_pos2_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_saturation_pos2_regs[] = {};
|
|
|
|
-static struct regval_list sensor_saturation_pos3_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_saturation_pos3_regs[] = {};
|
|
|
|
-static struct regval_list sensor_saturation_pos4_regs[] = {
|
|
-//NULL
|
|
-};
|
|
+static struct regval_list sensor_saturation_pos4_regs[] = {};
|
|
|
|
-static struct cfg_array sensor_saturation[] = {
|
|
+static struct cfg_array sensor_saturation[] =
|
|
+{
|
|
{
|
|
.regs = sensor_saturation_neg4_regs,
|
|
.size = ARRAY_SIZE(sensor_saturation_neg4_regs),
|
|
@@ -1400,79 +3767,89 @@ static struct cfg_array sensor_saturation[] = {
|
|
/*
|
|
* The exposure target setttings
|
|
*/
|
|
-static struct regval_list sensor_ev_neg4_regs[] = {
|
|
+static struct regval_list sensor_ev_neg4_regs[] =
|
|
+{
|
|
{0xfe, 0x01},
|
|
{0x13, 0x40},
|
|
{0xfe, 0x02},
|
|
- {0xd5, 0xc0},
|
|
+ {0xd5, 0xc0},
|
|
{0xfe, 0x00},
|
|
};
|
|
|
|
-static struct regval_list sensor_ev_neg3_regs[] = {
|
|
+static struct regval_list sensor_ev_neg3_regs[] =
|
|
+{
|
|
{0xfe, 0x01},
|
|
- {0x13, 0x50},
|
|
+ {0x13, 0x50},
|
|
{0xfe, 0x02},
|
|
- {0xd5, 0xd0},
|
|
+ {0xd5, 0xd0},
|
|
{0xfe, 0x00},
|
|
};
|
|
|
|
-static struct regval_list sensor_ev_neg2_regs[] = {
|
|
+static struct regval_list sensor_ev_neg2_regs[] =
|
|
+{
|
|
{0xfe, 0x01},
|
|
- {0x13, 0x60},
|
|
+ {0x13, 0x60},
|
|
{0xfe, 0x02},
|
|
- {0xd5, 0xe0},
|
|
+ {0xd5, 0xe0},
|
|
{0xfe, 0x00},
|
|
};
|
|
|
|
-static struct regval_list sensor_ev_neg1_regs[] = {
|
|
+static struct regval_list sensor_ev_neg1_regs[] =
|
|
+{
|
|
{0xfe, 0x01},
|
|
- {0x13 , 0x70},
|
|
+ {0x13, 0x70},
|
|
{0xfe, 0x02},
|
|
- {0xd5, 0xf0},
|
|
+ {0xd5, 0xf0},
|
|
{0xfe, 0x00},
|
|
};
|
|
|
|
-static struct regval_list sensor_ev_zero_regs[] = {
|
|
+static struct regval_list sensor_ev_zero_regs[] =
|
|
+{
|
|
{0xfe, 0x01},
|
|
- {0x13 , 0x80},
|
|
+ {0x13, 0x80},
|
|
{0xfe, 0x02},
|
|
- {0xd5, 0x00},
|
|
+ {0xd5, 0x00},
|
|
{0xfe, 0x00},
|
|
};
|
|
|
|
-static struct regval_list sensor_ev_pos1_regs[] = {
|
|
+static struct regval_list sensor_ev_pos1_regs[] =
|
|
+{
|
|
{0xfe, 0x01},
|
|
- {0x13 , 0x98},
|
|
+ {0x13, 0x98},
|
|
{0xfe, 0x02},
|
|
- {0xd5, 0x10},
|
|
+ {0xd5, 0x10},
|
|
{0xfe, 0x00},
|
|
};
|
|
|
|
-static struct regval_list sensor_ev_pos2_regs[] = {
|
|
+static struct regval_list sensor_ev_pos2_regs[] =
|
|
+{
|
|
{0xfe, 0x01},
|
|
- {0x13 , 0xb0},
|
|
+ {0x13, 0xb0},
|
|
{0xfe, 0x02},
|
|
- {0xd5, 0x20},
|
|
+ {0xd5, 0x20},
|
|
{0xfe, 0x00},
|
|
};
|
|
|
|
-static struct regval_list sensor_ev_pos3_regs[] = {
|
|
- {0xfe, 0x01},
|
|
- {0x13 , 0xc0},
|
|
+static struct regval_list sensor_ev_pos3_regs[] =
|
|
+{
|
|
+ {0xfe, 0x01},
|
|
+ {0x13, 0xc0},
|
|
{0xfe, 0x02},
|
|
- {0xd5, 0x30},
|
|
- {0xfe, 0x00},
|
|
+ {0xd5, 0x30},
|
|
+ {0xfe, 0x00},
|
|
};
|
|
|
|
-static struct regval_list sensor_ev_pos4_regs[] = {
|
|
+static struct regval_list sensor_ev_pos4_regs[] =
|
|
+{
|
|
{0xfe, 0x01},
|
|
- {0x13 , 0xd0},
|
|
+ {0x13, 0xd0},
|
|
{0xfe, 0x02},
|
|
- {0xd5, 0x50},
|
|
- {0xfe, 0x00},
|
|
+ {0xd5, 0x50},
|
|
+ {0xfe, 0x00},
|
|
};
|
|
|
|
-static struct cfg_array sensor_ev[] = {
|
|
+static struct cfg_array sensor_ev[] =
|
|
+{
|
|
{
|
|
.regs = sensor_ev_neg4_regs,
|
|
.size = ARRAY_SIZE(sensor_ev_neg4_regs),
|
|
@@ -1514,112 +3891,205 @@ static struct cfg_array sensor_ev[] = {
|
|
/*
|
|
* Here we'll try to encapsulate the changes for just the output
|
|
* video format.
|
|
- *
|
|
+ *
|
|
*/
|
|
-
|
|
-static struct regval_list sensor_fmt_yuv422_yuyv[] = {
|
|
+static struct regval_list sensor_fmt_yuv422_yuyv[] =
|
|
+{
|
|
{0x84, 0x02}, //output put foramat
|
|
-
|
|
};
|
|
|
|
-
|
|
-static struct regval_list sensor_fmt_yuv422_yvyu[] = {
|
|
+static struct regval_list sensor_fmt_yuv422_yvyu[] =
|
|
+{
|
|
{0x84, 0x03}, //output put foramat
|
|
-
|
|
};
|
|
|
|
-static struct regval_list sensor_fmt_yuv422_vyuy[] = {
|
|
+static struct regval_list sensor_fmt_yuv422_vyuy[] =
|
|
+{
|
|
{0x84, 0x01}, //output put foramat
|
|
-
|
|
};
|
|
|
|
-static struct regval_list sensor_fmt_yuv422_uyvy[] = {
|
|
+static struct regval_list sensor_fmt_yuv422_uyvy[] =
|
|
+{
|
|
{0x84, 0x00}, //output put foramat
|
|
-
|
|
};
|
|
|
|
-static struct regval_list sensor_fmt_raw[] = {
|
|
-
|
|
+static struct regval_list sensor_fmt_raw[] =
|
|
+{
|
|
{0x84, 0x18}, //output put foramat
|
|
-
|
|
-
|
|
};
|
|
|
|
//misc
|
|
-static struct regval_list sensor_oe_disable_regs[] = {
|
|
+static struct regval_list sensor_oe_disable_regs[] =
|
|
+{
|
|
//{0x3002,0x00},
|
|
//{REG_TERM,VAL_TERM},
|
|
};
|
|
|
|
-static struct regval_list sensor_oe_enable_regs[] = {
|
|
+static struct regval_list sensor_oe_enable_regs[] =
|
|
+{
|
|
//{0x3002,0xe4},
|
|
//{REG_TERM,VAL_TERM},
|
|
};
|
|
|
|
-
|
|
-
|
|
-/*
|
|
- * Low-level register I/O.
|
|
- *
|
|
- */
|
|
-
|
|
-
|
|
/*
|
|
- * On most platforms, we'd rather do straight i2c I/O.
|
|
+ * Store information about the video data format.
|
|
*/
|
|
-static int sensor_read(struct v4l2_subdev *sd, unsigned char reg,
|
|
- unsigned char *value) //!!!!be careful of the para type!!!
|
|
+static struct sensor_format_struct
|
|
{
|
|
- int ret=0;
|
|
- int cnt=0;
|
|
-
|
|
- ret = cci_read_a8_d8(sd,reg,value);
|
|
- while(ret!=0&&cnt<2)
|
|
- {
|
|
- ret = cci_read_a8_d8(sd,reg,value);
|
|
- cnt++;
|
|
+ __u8 *desc;
|
|
+ //__u32 pixelformat;
|
|
+ enum v4l2_mbus_pixelcode mbus_code;//linux-3.0
|
|
+ struct regval_list *regs;
|
|
+ int regs_size;
|
|
+ int bpp; /* Bytes per pixel */
|
|
+} sensor_formats[] = {
|
|
+ {
|
|
+ .desc = "UYVY 4:2:2",
|
|
+ .mbus_code = V4L2_MBUS_FMT_UYVY8_2X8,//linux-3.0
|
|
+ .regs = sensor_fmt_yuv422_uyvy,
|
|
+ .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_uyvy),
|
|
+ .bpp = 2,
|
|
+ },
|
|
+ {
|
|
+ .desc = "YUYV 4:2:2",
|
|
+ .mbus_code = V4L2_MBUS_FMT_YUYV8_2X8,//linux-3.0
|
|
+ .regs = sensor_fmt_yuv422_yuyv,
|
|
+ .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_yuyv),
|
|
+ .bpp = 2,
|
|
+ },
|
|
+ {
|
|
+ .desc = "YVYU 4:2:2",
|
|
+ .mbus_code = V4L2_MBUS_FMT_YVYU8_2X8,//linux-3.0
|
|
+ .regs = sensor_fmt_yuv422_yvyu,
|
|
+ .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_yvyu),
|
|
+ .bpp = 2,
|
|
+ },
|
|
+ {
|
|
+ .desc = "VYUY 4:2:2",
|
|
+ .mbus_code = V4L2_MBUS_FMT_VYUY8_2X8,//linux-3.0
|
|
+ .regs = sensor_fmt_yuv422_vyuy,
|
|
+ .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_vyuy),
|
|
+ .bpp = 2,
|
|
+ },
|
|
+ // NOTE: when trying set fmt, like V4L2_PIX_FMT_{BGR24,SGBRG8}, driver sets BGGR 8bits format and causes segmentation fault
|
|
+ // {
|
|
+ // .desc = "RAW Bayer BGGR 8bit",
|
|
+ // .mbus_code = V4L2_MBUS_FMT_SBGGR8_1X8,//linux-3.0
|
|
+ // .regs = sensor_fmt_raw,
|
|
+ // .regs_size = ARRAY_SIZE(sensor_fmt_raw),
|
|
+ // .bpp = 1
|
|
+ // },
|
|
+};
|
|
+#define N_FMTS ARRAY_SIZE(sensor_formats)
|
|
+
|
|
+/*
|
|
+ * Store information about resolutions mode support.
|
|
+ */
|
|
+static struct sensor_resolutions_struct
|
|
+{
|
|
+ struct regval_list *regs;
|
|
+ struct sensor_win_size *win_sizes;
|
|
+ int nwin_sizes;
|
|
+ int nsize;
|
|
+ int framerate;
|
|
+ int mclk;
|
|
+} sensor_resolutions[] = {
|
|
+ {
|
|
+ .regs = sensor_default_regs_hres0,
|
|
+ .win_sizes = sensor_win_sizes_hres0,
|
|
+ .nwin_sizes = (ARRAY_SIZE(sensor_win_sizes_hres0)),
|
|
+ .nsize = ARRAY_SIZE(sensor_default_regs_hres0),
|
|
+ .framerate = 8,
|
|
+ .mclk = 24,
|
|
+ },
|
|
+ {
|
|
+ .regs = sensor_default_regs_hres1,
|
|
+ .win_sizes = sensor_win_sizes_hres1,
|
|
+ .nwin_sizes = (ARRAY_SIZE(sensor_win_sizes_hres1)),
|
|
+ .nsize = ARRAY_SIZE(sensor_default_regs_hres1),
|
|
+ .framerate = 10,
|
|
+ .mclk = 24,
|
|
+ },
|
|
+ {
|
|
+ .regs = sensor_default_regs_hres2,
|
|
+ .win_sizes = sensor_win_sizes_hres2,
|
|
+ .nwin_sizes = (ARRAY_SIZE(sensor_win_sizes_hres2)),
|
|
+ .nsize = ARRAY_SIZE(sensor_default_regs_hres2),
|
|
+ .framerate = 15,
|
|
+ .mclk = 24,
|
|
+ },
|
|
+ {
|
|
+ .regs = sensor_default_regs_hres3,
|
|
+ .win_sizes = sensor_win_sizes_hres3,
|
|
+ .nwin_sizes = (ARRAY_SIZE(sensor_win_sizes_hres3)),
|
|
+ .nsize = ARRAY_SIZE(sensor_default_regs_hres3),
|
|
+ .framerate = 20,
|
|
+ .mclk = 34,
|
|
+ },
|
|
+};
|
|
+#define N_RESOLUTIONS ARRAY_SIZE(sensor_resolutions)
|
|
+
|
|
+/*
|
|
+ * Low-level register I/O.
|
|
+ *
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * On most platforms, we'd rather do straight i2c I/O.
|
|
+ */
|
|
+static int sensor_read(struct v4l2_subdev *sd, unsigned char reg,
|
|
+ unsigned char *value) //!!!!be careful of the para type!!!
|
|
+{
|
|
+ int ret = 0;
|
|
+ int cnt = 0;
|
|
+
|
|
+ ret = cci_read_a8_d8(sd,reg,value);
|
|
+ while (ret !=0 && cnt < 2)
|
|
+ {
|
|
+ ret = cci_read_a8_d8(sd,reg,value);
|
|
+ cnt++;
|
|
}
|
|
- if(cnt>0)
|
|
+ if (cnt > 0)
|
|
vfe_dev_dbg("sensor read retry=%d\n",cnt);
|
|
-
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
static int sensor_write(struct v4l2_subdev *sd, unsigned short reg,
|
|
unsigned char value)
|
|
{
|
|
- int ret=0;
|
|
- int cnt=0;
|
|
+ int ret = 0;
|
|
+ int cnt = 0;
|
|
ret = cci_write_a8_d8(sd,reg,value);
|
|
- while(ret!=0&&cnt<2)
|
|
+ while (ret !=0 && cnt < 2)
|
|
{
|
|
ret = cci_write_a8_d8(sd,reg,value);
|
|
cnt++;
|
|
}
|
|
- if(cnt>0)
|
|
+ if (cnt > 0)
|
|
vfe_dev_dbg("sensor write retry=%d\n",cnt);
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
-
|
|
/*
|
|
* Write a list of register settings;
|
|
*/
|
|
static int sensor_write_array(struct v4l2_subdev *sd, struct regval_list *regs, int array_size)
|
|
{
|
|
- int i=0;
|
|
-
|
|
- if(!regs)
|
|
- return -EINVAL;
|
|
-
|
|
- while(i<array_size)
|
|
+ int i = 0;
|
|
+
|
|
+ if (!regs) return -EINVAL;
|
|
+
|
|
+ while (i < array_size)
|
|
{
|
|
- if(regs->addr == REG_DLY) {
|
|
+ if (regs->addr == REG_DLY)
|
|
+ {
|
|
msleep(regs->data);
|
|
- }
|
|
- else {
|
|
+ }
|
|
+ else
|
|
+ {
|
|
//printk("write 0x%x=0x%x\n", regs->addr, regs->data);
|
|
LOG_ERR_RET(sensor_write(sd, regs->addr, regs->data))
|
|
}
|
|
@@ -1636,22 +4106,24 @@ static int sensor_g_hflip(struct v4l2_subdev *sd, __s32 *value)
|
|
struct sensor_info *info = to_state(sd);
|
|
// struct regval_list regs;
|
|
unsigned char val;
|
|
-
|
|
+
|
|
ret = sensor_write(sd, 0xfe, 0x00);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_g_hflip!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
ret = sensor_read(sd, 0x17, &val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_read err at sensor_g_hflip!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
val &= (1<<0);
|
|
val = val>>0; //0x29 bit0 is mirror
|
|
-
|
|
+
|
|
*value = val;
|
|
|
|
info->hflip = *value;
|
|
@@ -1664,19 +4136,22 @@ static int sensor_s_hflip(struct v4l2_subdev *sd, int value)
|
|
struct sensor_info *info = to_state(sd);
|
|
// struct regval_list regs;
|
|
unsigned char val;
|
|
-
|
|
+
|
|
ret = sensor_write(sd, 0xfe, 0);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_s_hflip!\n");
|
|
return ret;
|
|
}
|
|
ret = sensor_read(sd, 0x17, &val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_read err at sensor_s_hflip!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
- switch (value) {
|
|
+
|
|
+ switch (value)
|
|
+ {
|
|
case 0:
|
|
val &= 0xfe;
|
|
break;
|
|
@@ -1687,13 +4162,14 @@ static int sensor_s_hflip(struct v4l2_subdev *sd, int value)
|
|
return -EINVAL;
|
|
}
|
|
ret = sensor_write(sd, 0x17, val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_s_hflip!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
usleep_range(20000,22000);
|
|
-
|
|
+
|
|
info->hflip = value;
|
|
return 0;
|
|
}
|
|
@@ -1704,22 +4180,24 @@ static int sensor_g_vflip(struct v4l2_subdev *sd, __s32 *value)
|
|
struct sensor_info *info = to_state(sd);
|
|
// struct regval_list regs;
|
|
unsigned char val;
|
|
-
|
|
+
|
|
ret = sensor_write(sd, 0xfe, 0x00);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_g_vflip!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
ret = sensor_read(sd, 0x17, &val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_read err at sensor_g_vflip!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
val &= (1<<1);
|
|
val = val>>1; //0x29 bit1 is upsidedown
|
|
-
|
|
+
|
|
*value = val;
|
|
|
|
info->vflip = *value;
|
|
@@ -1732,20 +4210,23 @@ static int sensor_s_vflip(struct v4l2_subdev *sd, int value)
|
|
struct sensor_info *info = to_state(sd);
|
|
// struct regval_list regs;
|
|
unsigned char val;
|
|
-
|
|
+
|
|
ret = sensor_write(sd, 0xfe, 0x00);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_s_vflip!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
ret = sensor_read(sd, 0x17, &val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_read err at sensor_s_vflip!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
- switch (value) {
|
|
+
|
|
+ switch (value)
|
|
+ {
|
|
case 0:
|
|
val &= 0xfd;
|
|
break;
|
|
@@ -1755,14 +4236,16 @@ static int sensor_s_vflip(struct v4l2_subdev *sd, int value)
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
+
|
|
ret = sensor_write(sd, 0x17, val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_s_vflip!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
usleep_range(20000,22000);
|
|
-
|
|
+
|
|
info->vflip = value;
|
|
return 0;
|
|
}
|
|
@@ -1781,30 +4264,32 @@ static int sensor_g_autoexp(struct v4l2_subdev *sd, __s32 *value)
|
|
{
|
|
int ret;
|
|
struct sensor_info *info = to_state(sd);
|
|
-// struct regval_list regs;
|
|
unsigned char val;
|
|
-
|
|
+
|
|
ret = sensor_write(sd, 0xfe, 0x00);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_g_autoexp!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
ret = sensor_read(sd, 0xb6, &val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_read err at sensor_g_autoexp!\n");
|
|
return ret;
|
|
}
|
|
|
|
val &= 0x01;
|
|
- if (val == 0x01) {
|
|
+ if (val == 0x01)
|
|
+ {
|
|
*value = V4L2_EXPOSURE_AUTO;
|
|
}
|
|
else
|
|
{
|
|
*value = V4L2_EXPOSURE_MANUAL;
|
|
}
|
|
-
|
|
+
|
|
info->autoexp = *value;
|
|
return 0;
|
|
}
|
|
@@ -1816,20 +4301,23 @@ static int sensor_s_autoexp(struct v4l2_subdev *sd,
|
|
struct sensor_info *info = to_state(sd);
|
|
// struct regval_list regs;
|
|
unsigned char val;
|
|
-
|
|
+
|
|
ret = sensor_write(sd, 0xfe, 0x00);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_s_autoexp!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
ret = sensor_read(sd, 0xb6, &val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_read err at sensor_s_autoexp!\n");
|
|
return ret;
|
|
}
|
|
|
|
- switch (value) {
|
|
+ switch (value)
|
|
+ {
|
|
case V4L2_EXPOSURE_AUTO:
|
|
val |= 0x01;
|
|
break;
|
|
@@ -1837,21 +4325,21 @@ static int sensor_s_autoexp(struct v4l2_subdev *sd,
|
|
val &= 0xfe;
|
|
break;
|
|
case V4L2_EXPOSURE_SHUTTER_PRIORITY:
|
|
- return -EINVAL;
|
|
+ return -EINVAL;
|
|
case V4L2_EXPOSURE_APERTURE_PRIORITY:
|
|
return -EINVAL;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
-
|
|
+
|
|
//ret = sensor_write(sd, 0xb6, val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_s_autoexp!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
usleep_range(10000,12000);
|
|
-
|
|
info->autoexp = value;
|
|
return 0;
|
|
}
|
|
@@ -1862,25 +4350,26 @@ static int sensor_g_autowb(struct v4l2_subdev *sd, int *value)
|
|
struct sensor_info *info = to_state(sd);
|
|
// struct regval_list regs;
|
|
unsigned char val;
|
|
-
|
|
+
|
|
ret = sensor_write(sd, 0xfe, 0x00);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_g_autowb!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
ret = sensor_read(sd, 0x82, &val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_read err at sensor_g_autowb!\n");
|
|
return ret;
|
|
}
|
|
|
|
val &= (1<<1);
|
|
val = val>>1; //0x42 bit1 is awb enable
|
|
-
|
|
+
|
|
*value = val;
|
|
info->autowb = *value;
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -1890,20 +4379,23 @@ static int sensor_s_autowb(struct v4l2_subdev *sd, int value)
|
|
struct sensor_info *info = to_state(sd);
|
|
// struct regval_list regs;
|
|
unsigned char val;
|
|
-
|
|
+
|
|
ret = sensor_write_array(sd, sensor_wb_auto_regs, ARRAY_SIZE(sensor_wb_auto_regs));
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write_array err at sensor_s_autowb!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
ret = sensor_read(sd, 0x82, &val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_read err at sensor_s_autowb!\n");
|
|
return ret;
|
|
}
|
|
|
|
- switch(value) {
|
|
+ switch(value)
|
|
+ {
|
|
case 0:
|
|
val &= 0xfd;
|
|
break;
|
|
@@ -1912,15 +4404,15 @@ static int sensor_s_autowb(struct v4l2_subdev *sd, int value)
|
|
break;
|
|
default:
|
|
break;
|
|
- }
|
|
+ }
|
|
ret = sensor_write(sd, 0x82, val);
|
|
- if (ret < 0) {
|
|
+ if (ret < 0)
|
|
+ {
|
|
vfe_dev_err("sensor_write err at sensor_s_autowb!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
usleep_range(10000,12000);
|
|
-
|
|
info->autowb = value;
|
|
return 0;
|
|
}
|
|
@@ -1950,7 +4442,6 @@ static int sensor_s_gain(struct v4l2_subdev *sd, int value)
|
|
static int sensor_g_brightness(struct v4l2_subdev *sd, __s32 *value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
-
|
|
*value = info->brightness;
|
|
return 0;
|
|
}
|
|
@@ -1958,13 +4449,13 @@ static int sensor_g_brightness(struct v4l2_subdev *sd, __s32 *value)
|
|
static int sensor_s_brightness(struct v4l2_subdev *sd, int value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
-
|
|
+
|
|
if(info->brightness == value)
|
|
return 0;
|
|
-
|
|
+
|
|
if(value < -4 || value > 4)
|
|
return -ERANGE;
|
|
-
|
|
+
|
|
LOG_ERR_RET(sensor_write_array(sd, sensor_brightness[value+4].regs, sensor_brightness[value+4].size))
|
|
|
|
info->brightness = value;
|
|
@@ -1974,7 +4465,6 @@ static int sensor_s_brightness(struct v4l2_subdev *sd, int value)
|
|
static int sensor_g_contrast(struct v4l2_subdev *sd, __s32 *value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
-
|
|
*value = info->contrast;
|
|
return 0;
|
|
}
|
|
@@ -1982,15 +4472,13 @@ static int sensor_g_contrast(struct v4l2_subdev *sd, __s32 *value)
|
|
static int sensor_s_contrast(struct v4l2_subdev *sd, int value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
-
|
|
- if(info->contrast == value)
|
|
- return 0;
|
|
-
|
|
- if(value < -4 || value > 4)
|
|
- return -ERANGE;
|
|
-
|
|
+
|
|
+ if (info->contrast == value) return 0;
|
|
+
|
|
+ if (value < -4 || value > 4) return -ERANGE;
|
|
+
|
|
LOG_ERR_RET(sensor_write_array(sd, sensor_contrast[value+4].regs, sensor_contrast[value+4].size))
|
|
-
|
|
+
|
|
info->contrast = value;
|
|
return 0;
|
|
}
|
|
@@ -1998,7 +4486,6 @@ static int sensor_s_contrast(struct v4l2_subdev *sd, int value)
|
|
static int sensor_g_saturation(struct v4l2_subdev *sd, __s32 *value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
-
|
|
*value = info->saturation;
|
|
return 0;
|
|
}
|
|
@@ -2006,13 +4493,11 @@ static int sensor_g_saturation(struct v4l2_subdev *sd, __s32 *value)
|
|
static int sensor_s_saturation(struct v4l2_subdev *sd, int value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
-
|
|
- if(info->saturation == value)
|
|
- return 0;
|
|
|
|
- if(value < -4 || value > 4)
|
|
- return -ERANGE;
|
|
-
|
|
+ if (info->saturation == value) return 0;
|
|
+
|
|
+ if(value < -4 || value > 4) return -ERANGE;
|
|
+
|
|
LOG_ERR_RET(sensor_write_array(sd, sensor_saturation[value+4].regs, sensor_saturation[value+4].size))
|
|
|
|
info->saturation = value;
|
|
@@ -2022,7 +4507,6 @@ static int sensor_s_saturation(struct v4l2_subdev *sd, int value)
|
|
static int sensor_g_exp_bias(struct v4l2_subdev *sd, __s32 *value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
-
|
|
*value = info->exp_bias;
|
|
return 0;
|
|
}
|
|
@@ -2031,12 +4515,10 @@ static int sensor_s_exp_bias(struct v4l2_subdev *sd, int value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
|
|
- if(info->exp_bias == value)
|
|
- return 0;
|
|
+ if(info->exp_bias == value) return 0;
|
|
+
|
|
+ if(value < -4 || value > 4) return -ERANGE;
|
|
|
|
- if(value < -4 || value > 4)
|
|
- return -ERANGE;
|
|
-
|
|
LOG_ERR_RET(sensor_write_array(sd, sensor_ev[value+4].regs, sensor_ev[value+4].size))
|
|
|
|
info->exp_bias = value;
|
|
@@ -2047,9 +4529,9 @@ static int sensor_g_wb(struct v4l2_subdev *sd, int *value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
enum v4l2_auto_n_preset_white_balance *wb_type = (enum v4l2_auto_n_preset_white_balance*)value;
|
|
-
|
|
+
|
|
*wb_type = info->wb;
|
|
-
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -2057,101 +4539,71 @@ static int sensor_s_wb(struct v4l2_subdev *sd,
|
|
enum v4l2_auto_n_preset_white_balance value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
-
|
|
- if(info->capture_mode == V4L2_MODE_IMAGE)
|
|
- return 0;
|
|
-
|
|
- if(info->wb == value)
|
|
- return 0;
|
|
-
|
|
+
|
|
+ if (info->capture_mode == V4L2_MODE_IMAGE) return 0;
|
|
+
|
|
+ if (info->wb == value) return 0;
|
|
+
|
|
LOG_ERR_RET(sensor_write_array(sd, sensor_wb[value].regs ,sensor_wb[value].size) )
|
|
-
|
|
- if (value == V4L2_WHITE_BALANCE_AUTO)
|
|
+
|
|
+ if (value == V4L2_WHITE_BALANCE_AUTO)
|
|
+ {
|
|
info->autowb = 1;
|
|
- else
|
|
+ } else {
|
|
info->autowb = 0;
|
|
-
|
|
+ }
|
|
+
|
|
info->wb = value;
|
|
return 0;
|
|
}
|
|
|
|
-static int sensor_g_colorfx(struct v4l2_subdev *sd,
|
|
- __s32 *value)
|
|
+static int sensor_g_colorfx(struct v4l2_subdev *sd, __s32 *value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
enum v4l2_colorfx *clrfx_type = (enum v4l2_colorfx*)value;
|
|
-
|
|
+
|
|
*clrfx_type = info->clrfx;
|
|
return 0;
|
|
}
|
|
|
|
-static int sensor_s_colorfx(struct v4l2_subdev *sd,
|
|
- enum v4l2_colorfx value)
|
|
+static int sensor_s_colorfx(struct v4l2_subdev *sd, enum v4l2_colorfx value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
|
|
if(info->clrfx == value)
|
|
return 0;
|
|
-
|
|
+
|
|
LOG_ERR_RET(sensor_write_array(sd, sensor_colorfx[value].regs, sensor_colorfx[value].size))
|
|
|
|
info->clrfx = value;
|
|
return 0;
|
|
}
|
|
|
|
-static int sensor_g_flash_mode(struct v4l2_subdev *sd,
|
|
- __s32 *value)
|
|
+static int sensor_g_flash_mode(struct v4l2_subdev *sd, __s32 *value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
enum v4l2_flash_led_mode *flash_mode = (enum v4l2_flash_led_mode*)value;
|
|
-
|
|
+
|
|
*flash_mode = info->flash_mode;
|
|
return 0;
|
|
}
|
|
|
|
-static int sensor_s_flash_mode(struct v4l2_subdev *sd,
|
|
- enum v4l2_flash_led_mode value)
|
|
+static int sensor_s_flash_mode(struct v4l2_subdev *sd, enum v4l2_flash_led_mode value)
|
|
{
|
|
struct sensor_info *info = to_state(sd);
|
|
-// struct vfe_dev *dev=(struct vfe_dev *)dev_get_drvdata(sd->v4l2_dev->dev);
|
|
-// int flash_on,flash_off;
|
|
-//
|
|
-// flash_on = (dev->flash_pol!=0)?1:0;
|
|
-// flash_off = (flash_on==1)?0:1;
|
|
-//
|
|
-// switch (value) {
|
|
-// case V4L2_FLASH_MODE_OFF:
|
|
-// os_gpio_write(&dev->flash_io,flash_off);
|
|
-// break;
|
|
-// case V4L2_FLASH_MODE_AUTO:
|
|
-// return -EINVAL;
|
|
-// break;
|
|
-// case V4L2_FLASH_MODE_ON:
|
|
-// os_gpio_write(&dev->flash_io,flash_on);
|
|
-// break;
|
|
-// case V4L2_FLASH_MODE_TORCH:
|
|
-// return -EINVAL;
|
|
-// break;
|
|
-// case V4L2_FLASH_MODE_RED_EYE:
|
|
-// return -EINVAL;
|
|
-// break;
|
|
-// default:
|
|
-// return -EINVAL;
|
|
-// }
|
|
-
|
|
info->flash_mode = value;
|
|
return 0;
|
|
}
|
|
|
|
static int sensor_s_sw_stby(struct v4l2_subdev *sd, int on_off)
|
|
{
|
|
- int ret=0;
|
|
+ int ret = 0;
|
|
// unsigned char rdval;
|
|
-//
|
|
+//
|
|
// ret=sensor_read(sd, 0x00, &rdval);
|
|
// if(ret!=0)
|
|
// return ret;
|
|
-//
|
|
+//
|
|
// if(on_off==CSI_STBY_ON)//sw stby on
|
|
// {
|
|
// ret=sensor_write(sd, 0x00, rdval&0x7f);
|
|
@@ -2166,11 +4618,11 @@ static int sensor_s_sw_stby(struct v4l2_subdev *sd, int on_off)
|
|
/*
|
|
* Stuff that knows about the sensor.
|
|
*/
|
|
-
|
|
+
|
|
static int sensor_power(struct v4l2_subdev *sd, int on)
|
|
{
|
|
int ret;
|
|
-
|
|
+
|
|
cci_lock(sd);
|
|
switch(on)
|
|
{
|
|
@@ -2196,7 +4648,7 @@ static int sensor_power(struct v4l2_subdev *sd, int on)
|
|
vfe_gpio_write(sd,PWDN, CSI_GPIO_LOW);
|
|
usleep_range(10000,12000);
|
|
//active mclk before stadby out
|
|
- vfe_set_mclk_freq(sd,MCLK);
|
|
+ vfe_set_mclk_freq(sd, (MCLK*1000*1000));
|
|
vfe_set_mclk(sd,ON);
|
|
usleep_range(10000,12000);
|
|
vfe_dev_print("enable oe!\n");
|
|
@@ -2208,7 +4660,7 @@ static int sensor_power(struct v4l2_subdev *sd, int on)
|
|
vfe_dev_dbg("CSI_SUBDEV_PWR_ON\n");
|
|
vfe_gpio_set_status(sd,PWDN,1);//set the gpio to output
|
|
vfe_gpio_set_status(sd,RESET,1);//set the gpio to output
|
|
- vfe_set_mclk_freq(sd,MCLK);
|
|
+ vfe_set_mclk_freq(sd,(MCLK*1000*1000));
|
|
vfe_set_mclk(sd,ON);
|
|
vfe_gpio_write(sd,PWDN, CSI_GPIO_LOW);
|
|
vfe_gpio_write(sd,RESET, CSI_GPIO_LOW);
|
|
@@ -2231,12 +4683,12 @@ static int sensor_power(struct v4l2_subdev *sd, int on)
|
|
usleep_range(5000,12000); //power supply off
|
|
vfe_gpio_write(sd,PWDN,CSI_GPIO_HIGH);
|
|
usleep_range(5000,12000);
|
|
- vfe_gpio_write(sd,RESET,CSI_GPIO_LOW);
|
|
+ vfe_gpio_write(sd,RESET,CSI_GPIO_LOW);
|
|
vfe_gpio_write(sd,POWER_EN,CSI_PWR_OFF);
|
|
vfe_set_pmu_channel(sd,AFVDD,OFF);
|
|
vfe_set_pmu_channel(sd,DVDD,OFF);
|
|
vfe_set_pmu_channel(sd,AVDD,OFF);
|
|
- vfe_set_pmu_channel(sd,IOVDD,OFF);
|
|
+ vfe_set_pmu_channel(sd,IOVDD,OFF);
|
|
usleep_range(10000,12000);
|
|
vfe_set_mclk(sd,OFF);
|
|
vfe_gpio_set_status(sd,RESET,0);//set the gpio to input
|
|
@@ -2244,11 +4696,11 @@ static int sensor_power(struct v4l2_subdev *sd, int on)
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
- }
|
|
- cci_unlock(sd);
|
|
+ }
|
|
+ cci_unlock(sd);
|
|
return 0;
|
|
}
|
|
-
|
|
+
|
|
static int sensor_reset(struct v4l2_subdev *sd, u32 val)
|
|
{
|
|
switch(val)
|
|
@@ -2264,46 +4716,46 @@ static int sensor_reset(struct v4l2_subdev *sd, u32 val)
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
-
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
static int sensor_detect(struct v4l2_subdev *sd)
|
|
{
|
|
int ret;
|
|
- unsigned int SENSOR_ID=0;
|
|
+ unsigned int SENSOR_ID = 0;
|
|
unsigned char val;
|
|
-
|
|
+
|
|
// ret = sensor_write(sd, 0xfe, 0x00);
|
|
// if (ret < 0) {
|
|
// vfe_dev_err("sensor_write err at sensor_detect!\n");
|
|
// return ret;
|
|
// }
|
|
-
|
|
+
|
|
ret = sensor_read(sd, 0xf0, &val);
|
|
SENSOR_ID|= (val<< 8);
|
|
if (ret < 0) {
|
|
vfe_dev_err("sensor_read err at sensor_detect!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
ret = sensor_read(sd, 0xf1, &val);
|
|
- SENSOR_ID|= (val);
|
|
+ SENSOR_ID |= (val);
|
|
vfe_dev_print("V4L2_IDENT_SENSOR=%x",SENSOR_ID);
|
|
if (ret < 0) {
|
|
vfe_dev_err("sensor_read err at sensor_detect!\n");
|
|
return ret;
|
|
}
|
|
-
|
|
+
|
|
if(SENSOR_ID != V4L2_IDENT_SENSOR)
|
|
return -ENODEV;
|
|
-
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
static int sensor_init(struct v4l2_subdev *sd, u32 val)
|
|
{
|
|
- int ret;
|
|
+ int ret, nsize;
|
|
vfe_dev_dbg("sensor_init\n");
|
|
/*Make sure it is a target sensor*/
|
|
ret = sensor_detect(sd);
|
|
@@ -2311,15 +4763,17 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
|
|
vfe_dev_err("chip found is not an target chip.\n");
|
|
return ret;
|
|
}
|
|
- ret = sensor_write_array(sd, sensor_default_regs , ARRAY_SIZE(sensor_default_regs));
|
|
+
|
|
+ nsize = sensor_resolutions[hres].nsize;
|
|
+ ret = sensor_write_array(sd, sensor_default_regs , nsize);
|
|
msleep(350);
|
|
- return 0;
|
|
+ return 0;
|
|
}
|
|
|
|
static int sensor_g_exif(struct v4l2_subdev *sd, struct sensor_exif_attribute *exif)
|
|
{
|
|
- int ret = 0;//, gain_val, exp_val;
|
|
- unsigned int temp=0,shutter=0, gain = 0;
|
|
+ int ret = 0; //, gain_val, exp_val;
|
|
+ unsigned int temp = 0, shutter = 0, gain = 0;
|
|
unsigned char val;
|
|
|
|
sensor_write(sd, 0xfe, 0x00);
|
|
@@ -2330,8 +4784,8 @@ static int sensor_g_exif(struct v4l2_subdev *sd, struct sensor_exif_attribute *e
|
|
temp |= (val<< 8);
|
|
sensor_read(sd, 0x04, &val);
|
|
temp |= (val & 0xff);
|
|
- shutter=temp;
|
|
-
|
|
+ shutter = temp;
|
|
+
|
|
sensor_read(sd, 0xb2, &val);
|
|
gain = val;
|
|
exif->fnumber = 280;
|
|
@@ -2346,7 +4800,7 @@ static int sensor_g_exif(struct v4l2_subdev *sd, struct sensor_exif_attribute *e
|
|
|
|
static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
|
|
{
|
|
- int ret=0;
|
|
+ int ret = 0;
|
|
//struct sensor_info *info = to_state(sd);
|
|
switch(cmd) {
|
|
case GET_SENSOR_EXIF:
|
|
@@ -2358,135 +4812,23 @@ static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
|
|
return ret;
|
|
}
|
|
|
|
-
|
|
-/*
|
|
- * Store information about the video data format.
|
|
- */
|
|
-static struct sensor_format_struct {
|
|
- __u8 *desc;
|
|
- //__u32 pixelformat;
|
|
- enum v4l2_mbus_pixelcode mbus_code;//linux-3.0
|
|
- struct regval_list *regs;
|
|
- int regs_size;
|
|
- int bpp; /* Bytes per pixel */
|
|
-} sensor_formats[] = {
|
|
- {
|
|
- .desc = "YUYV 4:2:2",
|
|
- .mbus_code = V4L2_MBUS_FMT_YUYV8_2X8,//linux-3.0
|
|
- .regs = sensor_fmt_yuv422_yuyv,
|
|
- .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_yuyv),
|
|
- .bpp = 2,
|
|
- },
|
|
- {
|
|
- .desc = "YVYU 4:2:2",
|
|
- .mbus_code = V4L2_MBUS_FMT_YVYU8_2X8,//linux-3.0
|
|
- .regs = sensor_fmt_yuv422_yvyu,
|
|
- .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_yvyu),
|
|
- .bpp = 2,
|
|
- },
|
|
- {
|
|
- .desc = "UYVY 4:2:2",
|
|
- .mbus_code = V4L2_MBUS_FMT_UYVY8_2X8,//linux-3.0
|
|
- .regs = sensor_fmt_yuv422_uyvy,
|
|
- .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_uyvy),
|
|
- .bpp = 2,
|
|
- },
|
|
- {
|
|
- .desc = "VYUY 4:2:2",
|
|
- .mbus_code = V4L2_MBUS_FMT_VYUY8_2X8,//linux-3.0
|
|
- .regs = sensor_fmt_yuv422_vyuy,
|
|
- .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_vyuy),
|
|
- .bpp = 2,
|
|
- },
|
|
- {
|
|
- .desc = "Raw RGB Bayer",
|
|
- .mbus_code = V4L2_MBUS_FMT_SBGGR8_1X8,//linux-3.0
|
|
- .regs = sensor_fmt_raw,
|
|
- .regs_size = ARRAY_SIZE(sensor_fmt_raw),
|
|
- .bpp = 1
|
|
- },
|
|
-};
|
|
-#define N_FMTS ARRAY_SIZE(sensor_formats)
|
|
-
|
|
-
|
|
-
|
|
-/*
|
|
- * Then there is the issue of window sizes. Try to capture the info here.
|
|
- */
|
|
-
|
|
-
|
|
-static struct sensor_win_size
|
|
-sensor_win_sizes[] = {
|
|
- /* UXGA */
|
|
- {
|
|
- .width = UXGA_WIDTH,
|
|
- .height = UXGA_HEIGHT,
|
|
- .hoffset = 0,
|
|
- .voffset = 0,
|
|
- .regs = sensor_uxga_regs,
|
|
- .regs_size = ARRAY_SIZE(sensor_uxga_regs),
|
|
- .set_size = NULL,
|
|
- },
|
|
-// /* 720p */
|
|
-// {
|
|
-// .width = HD720_WIDTH,
|
|
-// .height = HD720_HEIGHT,
|
|
-// .hoffset = 0,
|
|
-// .voffset = 0,
|
|
-// .regs = Gc2015_sensor_hd720_regs,
|
|
-// .regs_size = ARRAY_SIZE(Gc2015_sensor_hd720_regs),
|
|
-// .set_size = NULL,
|
|
-// },
|
|
- /* SVGA */
|
|
- {
|
|
- .width = SVGA_WIDTH,
|
|
- .height = SVGA_HEIGHT,
|
|
- .hoffset = 0,
|
|
- .voffset = 0,
|
|
- .regs = sensor_svga_regs,
|
|
- .regs_size = ARRAY_SIZE(sensor_svga_regs),
|
|
- .set_size = NULL,
|
|
- },
|
|
- /* VGA */
|
|
- /*
|
|
- {
|
|
- .width = VGA_WIDTH,
|
|
- .height = VGA_HEIGHT,
|
|
- .hoffset = 0,
|
|
- .voffset = 0,
|
|
- .regs = sensor_vga_regs,
|
|
- .regs_size = ARRAY_SIZE(sensor_vga_regs),
|
|
- .set_size = NULL,
|
|
- },
|
|
- */
|
|
-};
|
|
-
|
|
-#define N_WIN_SIZES (ARRAY_SIZE(sensor_win_sizes))
|
|
-
|
|
-static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned index,
|
|
- enum v4l2_mbus_pixelcode *code)
|
|
+static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned index, enum v4l2_mbus_pixelcode *code)
|
|
{
|
|
- if (index >= N_FMTS)
|
|
- return -EINVAL;
|
|
-
|
|
+ if (index >= N_FMTS) return -EINVAL;
|
|
*code = sensor_formats[index].mbus_code;
|
|
return 0;
|
|
}
|
|
|
|
-static int sensor_enum_size(struct v4l2_subdev *sd,
|
|
- struct v4l2_frmsizeenum *fsize)
|
|
+static int sensor_enum_size(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize)
|
|
{
|
|
- if(fsize->index > N_WIN_SIZES-1)
|
|
- return -EINVAL;
|
|
-
|
|
+ if (fsize->index > N_WIN_SIZES-1) return -EINVAL;
|
|
+
|
|
fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
|
|
fsize->discrete.width = sensor_win_sizes[fsize->index].width;
|
|
fsize->discrete.height = sensor_win_sizes[fsize->index].height;
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
-
|
|
static int sensor_try_fmt_internal(struct v4l2_subdev *sd,
|
|
struct v4l2_mbus_framefmt *fmt,
|
|
struct sensor_format_struct **ret_fmt,
|
|
@@ -2496,156 +4838,312 @@ static int sensor_try_fmt_internal(struct v4l2_subdev *sd,
|
|
struct sensor_win_size *wsize;
|
|
|
|
for (index = 0; index < N_FMTS; index++)
|
|
- if (sensor_formats[index].mbus_code == fmt->code)
|
|
- break;
|
|
+ {
|
|
+ if (sensor_formats[index].mbus_code == fmt->code) break;
|
|
+ }
|
|
+
|
|
+ if (index >= N_FMTS) return -EINVAL;
|
|
+
|
|
+ if (ret_fmt != NULL) *ret_fmt = sensor_formats + index;
|
|
|
|
- if (index >= N_FMTS)
|
|
- return -EINVAL;
|
|
-
|
|
- if (ret_fmt != NULL)
|
|
- *ret_fmt = sensor_formats + index;
|
|
-
|
|
/*
|
|
* Fields: the sensor devices claim to be progressive.
|
|
*/
|
|
-
|
|
+
|
|
fmt->field = V4L2_FIELD_NONE;
|
|
-
|
|
- /*
|
|
- * Round requested image size down to the nearest
|
|
- * we support, but not below the smallest.
|
|
- */
|
|
- for (wsize = sensor_win_sizes; wsize < sensor_win_sizes + N_WIN_SIZES;
|
|
- wsize++)
|
|
- if (fmt->width >= wsize->width && fmt->height >= wsize->height)
|
|
- break;
|
|
-
|
|
- if (wsize >= sensor_win_sizes + N_WIN_SIZES)
|
|
- wsize--; /* Take the smallest one */
|
|
- if (ret_wsize != NULL)
|
|
- *ret_wsize = wsize;
|
|
+
|
|
+ // a try format
|
|
+ // finds window format in all hres modes
|
|
+ if (ret_fmt == NULL && ret_wsize == NULL)
|
|
+ {
|
|
+ int i;
|
|
+ bool found_hres = false;
|
|
+ struct sensor_resolutions_struct *res;
|
|
+ for (i = 0; i < N_RESOLUTIONS-1; i++)
|
|
+ {
|
|
+ if (found_hres) break;
|
|
+ res = &sensor_resolutions[i];
|
|
+ for (index = 0; index < res->nwin_sizes; index++)
|
|
+ {
|
|
+ wsize = &res->win_sizes[index];
|
|
+ if (fmt->width == wsize->width && fmt->height == wsize->height)
|
|
+ {
|
|
+ vfe_dev_dbg("%s Found hres: %d / resolution: %dx%d\n", __func__, i, fmt->width, fmt->height);
|
|
+ found_hres = true;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ // set window size
|
|
+ else
|
|
+ {
|
|
+ /*
|
|
+ * Round requested image size down to the nearest
|
|
+ * we support, but not below the smallest.
|
|
+ */
|
|
+ for (wsize = sensor_win_sizes; wsize < sensor_win_sizes + N_WIN_SIZES; wsize++)
|
|
+ {
|
|
+ if (fmt->width >= wsize->width && fmt->height >= wsize->height) break;
|
|
+ }
|
|
+
|
|
+ /* Take the smallest one */
|
|
+ if (wsize >= sensor_win_sizes + N_WIN_SIZES) wsize--;
|
|
+
|
|
+ if (ret_wsize != NULL) *ret_wsize = wsize;
|
|
+ }
|
|
+
|
|
/*
|
|
* Note the size we'll actually handle.
|
|
*/
|
|
fmt->width = wsize->width;
|
|
fmt->height = wsize->height;
|
|
- //pix->bytesperline = pix->width*sensor_formats[index].bpp;
|
|
- //pix->sizeimage = pix->height*pix->bytesperline;
|
|
|
|
return 0;
|
|
}
|
|
|
|
-static int sensor_try_fmt(struct v4l2_subdev *sd,
|
|
- struct v4l2_mbus_framefmt *fmt)
|
|
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *fmt)
|
|
{
|
|
return sensor_try_fmt_internal(sd, fmt, NULL, NULL);
|
|
}
|
|
|
|
-static int sensor_g_mbus_config(struct v4l2_subdev *sd,
|
|
- struct v4l2_mbus_config *cfg)
|
|
+static int sensor_g_mbus_config(struct v4l2_subdev *sd, struct v4l2_mbus_config *cfg)
|
|
{
|
|
cfg->type = V4L2_MBUS_PARALLEL;
|
|
cfg->flags = V4L2_MBUS_MASTER | VREF_POL | HREF_POL | CLK_POL ;
|
|
-
|
|
return 0;
|
|
}
|
|
-/*
|
|
- * Set a format.
|
|
- */
|
|
-static int sensor_s_fmt(struct v4l2_subdev *sd,
|
|
- struct v4l2_mbus_framefmt *fmt)//linux-3.0
|
|
+
|
|
+/* Sets a window size
|
|
+*/
|
|
+static int sensor_s_wsize(struct v4l2_subdev *sd,
|
|
+ struct sensor_format_struct *sensor_fmt,
|
|
+ struct sensor_win_size *wsize)
|
|
{
|
|
- int ret;
|
|
- unsigned int temp=0,shutter=0;
|
|
- unsigned char val;
|
|
+ int ret;
|
|
+ unsigned int temp = 0, shutter = 0;
|
|
+ unsigned char val;
|
|
|
|
- struct sensor_format_struct *sensor_fmt;
|
|
- struct sensor_win_size *wsize;
|
|
- struct sensor_info *info = to_state(sd);
|
|
+ if (hres == 1 || hres == 3)
|
|
+ {
|
|
+ if ((wsize->width == UXGA_WIDTH) && (wsize->height == UXGA_HEIGHT))
|
|
+ {
|
|
+ sensor_write(sd, 0xfe, 0x00);
|
|
+ sensor_write(sd, 0xb6, 0x02);
|
|
+
|
|
+ /*read shutter */
|
|
+ sensor_read(sd, 0x03, &val);
|
|
+ temp |= (val<< 8);
|
|
+
|
|
+ sensor_read(sd, 0x04, &val);
|
|
+ temp |= (val & 0xff);
|
|
+ shutter = temp;
|
|
+ }
|
|
+ }
|
|
|
|
-// printk("chr wsize.width = [%d], wsize.height = [%d]\n", wsize->width, wsize->height);
|
|
- //vfe_dev_dbg("sensor_s_fmt\n");
|
|
+ if (sensor_fmt == NULL)
|
|
+ {
|
|
+ struct sensor_info *info = to_state(sd);
|
|
+ sensor_fmt = info->fmt;
|
|
+ }
|
|
+ sensor_write_array(sd, sensor_fmt->regs , sensor_fmt->regs_size);
|
|
|
|
- //////////////shutter-gain///////////////
|
|
- ret = sensor_try_fmt_internal(sd, fmt, &sensor_fmt, &wsize);
|
|
- if (ret)
|
|
- return ret;
|
|
+ ret = 0;
|
|
+ if (wsize->regs)
|
|
+ {
|
|
+ ret = sensor_write_array(sd, wsize->regs , wsize->regs_size);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
+ }
|
|
|
|
- if((wsize->width==1600)&&(wsize->height==1200)) //capture mode >640*480
|
|
- {
|
|
- // printk(" read 2035 exptime 11111111\n" );
|
|
-
|
|
- sensor_write(sd, 0xfe, 0x00);
|
|
-
|
|
- sensor_write(sd, 0xb6, 0x02);
|
|
-
|
|
- /*read shutter */
|
|
- sensor_read(sd, 0x03, &val);
|
|
- temp |= (val<< 8);
|
|
- // printk(" read 0x03 = [%x]\n", regs.value[0]);
|
|
-
|
|
- sensor_read(sd, 0x04, &val);
|
|
- temp |= (val & 0xff);
|
|
- // printk(" read 0x04 = [%x]\n", regs.value[0]);
|
|
-
|
|
- shutter=temp;
|
|
- // printk(" shutter = [%x]\n", shutter);
|
|
- }
|
|
+ if (wsize->set_size)
|
|
+ {
|
|
+ ret = wsize->set_size(sd);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
+ }
|
|
|
|
- sensor_write_array(sd, sensor_fmt->regs , sensor_fmt->regs_size);
|
|
+ if (hres == 0)
|
|
+ {
|
|
+ if ((wsize->width == UXGA_WIDTH) && (wsize->height == UXGA_HEIGHT))
|
|
+ {
|
|
+ sensor_write(sd, 0xfe, 0x00);
|
|
+ sensor_write(sd, 0xb6, 0x03); // AEC ON
|
|
+ sensor_write(sd, 0xfa, 0x08); // clk div mode
|
|
+ sensor_read(sd, 0x03, &val);
|
|
+ temp |= (val<< 8);
|
|
+ sensor_read(sd, 0x04, &val);
|
|
+ temp |= (val & 0xff);
|
|
+ shutter = temp;
|
|
+ shutter = shutter / 2;
|
|
+ if (shutter < 1) shutter = 1;
|
|
+ val = ((shutter>>8) & 0xff);
|
|
+ sensor_write(sd, 0x03, val);
|
|
+ val = (shutter & 0xff);
|
|
+ sensor_write(sd, 0x04, val);
|
|
+ msleep(550);
|
|
+ }
|
|
+
|
|
+ else if ((wsize->width == VGA_WIDTH && wsize->height == VGA_HEIGHT) ||
|
|
+ (wsize->width == HD720_WIDTH && wsize->height == HD720_HEIGHT))
|
|
+ {
|
|
+ mdelay(50);
|
|
+ sensor_write(sd, 0xb6, 0x03); // AEC ON
|
|
+
|
|
+ if (wsize->width == HD720_WIDTH && wsize->height == HD720_HEIGHT)
|
|
+ {
|
|
+ sensor_write(sd, 0xfa, 0x08); // clk div mode
|
|
+ }
|
|
+ mdelay(300);
|
|
+ }
|
|
+ }
|
|
|
|
- ret = 0;
|
|
- if (wsize->regs)
|
|
- {
|
|
- ret = sensor_write_array(sd, wsize->regs , wsize->regs_size);
|
|
- if (ret < 0)
|
|
- return ret;
|
|
- }
|
|
-
|
|
- if (wsize->set_size)
|
|
- {
|
|
- ret = wsize->set_size(sd);
|
|
- if (ret < 0)
|
|
- return ret;
|
|
- }
|
|
+ else if (hres == 1)
|
|
+ {
|
|
+ if ((wsize->width == UXGA_WIDTH) && (wsize->height == UXGA_HEIGHT))
|
|
+ {
|
|
+ sensor_write(sd, 0xfe, 0x00);
|
|
+ sensor_write(sd, 0xb6, 0x03); // AEC ON
|
|
+ sensor_write(sd, 0xfa, 0x08); // clk div mode
|
|
+
|
|
+ shutter = shutter / 2;
|
|
+ if(shutter < 1) shutter = 1;
|
|
+ val = ((shutter>>8)&0xff);
|
|
+ sensor_write(sd, 0x03, val);
|
|
+ val = (shutter&0xff);
|
|
+ sensor_write(sd, 0x04, val);
|
|
+ msleep(550);
|
|
+ }
|
|
+ }
|
|
|
|
- //////////
|
|
+ else if (hres == 2)
|
|
+ {
|
|
|
|
- #if 1
|
|
- if((wsize->width==1600)&&(wsize->height==1200))
|
|
- {
|
|
+ sensor_write(sd, 0xfe, 0x01);
|
|
+ sensor_write(sd, 0x21, 0xbf);
|
|
+ sensor_write(sd, 0xfe, 0x00);
|
|
|
|
+ sensor_write(sd, 0x03, 0);
|
|
+ sensor_write(sd, 0x04, 0);
|
|
|
|
- //printk(" write 2035 exptime 22222222\n" );
|
|
+ sensor_write(sd, 0xb6, 0x03);
|
|
+ sensor_write(sd, 0xfa, 0x00);
|
|
|
|
+ if ((wsize->width == QVGA_WIDTH && wsize->height == QVGA_HEIGHT))
|
|
+ {
|
|
+ sensor_write(sd, 0xc8, 0x02);
|
|
+ sensor_write(sd, 0x99, 0x44);
|
|
+ }
|
|
|
|
- sensor_write(sd, 0xfe, 0x00);
|
|
+ else if ((wsize->width == CIF_WIDTH && wsize->height == CIF_HEIGHT))
|
|
+ {
|
|
+ sensor_write(sd, 0xc8, 0x03);
|
|
+ sensor_write(sd, 0x99, 0x44);
|
|
+ }
|
|
|
|
- shutter= shutter /2; // 2
|
|
-
|
|
- if(shutter < 1) shutter = 1;
|
|
- val = ((shutter>>8)&0xff);
|
|
- // printk(" write0x03 = [%x]\n", regs.value[0]);
|
|
- sensor_write(sd, 0x03, val);
|
|
+ else if ((wsize->width == QVGA_WIDTH && wsize->height == QVGA_HEIGHT))
|
|
+ {
|
|
+ sensor_write(sd, 0xc8, 0x00);
|
|
+ sensor_write(sd, 0x99, 0x22);
|
|
+ }
|
|
|
|
- val = (shutter&0xff);
|
|
+ sensor_write(sd, 0x9a, 0x07);
|
|
+ sensor_write(sd, 0x9b, 0x00);
|
|
+ sensor_write(sd, 0x9c, 0x00);
|
|
+ sensor_write(sd, 0x9d, 0x00);
|
|
+ sensor_write(sd, 0x9e, 0x00);
|
|
+ sensor_write(sd, 0x9f, 0x00);
|
|
+
|
|
+ sensor_write(sd, 0xa1, 0x00);
|
|
+ sensor_write(sd, 0xa2, 0x00);
|
|
+
|
|
+ sensor_write(sd, 0x90, 0x01); // crop enable
|
|
+ sensor_write(sd, 0x94, 0x02);
|
|
+ sensor_write(sd, 0x95, 0x02);
|
|
+
|
|
+ if ((wsize->width == QVGA_WIDTH && wsize->height == QVGA_HEIGHT) ||
|
|
+ (wsize->width == CIF_WIDTH && wsize->height == CIF_HEIGHT))
|
|
+ {
|
|
+ sensor_write(sd, 0x96, 0x58);
|
|
+ } else
|
|
+ {
|
|
+ sensor_write(sd, 0x96, 0x5a);
|
|
+ }
|
|
|
|
- sensor_write(sd, 0x04, val);
|
|
+ sensor_write(sd, 0x97, 0x03);
|
|
+ sensor_write(sd, 0x98, 0x22);
|
|
+ mdelay(50);
|
|
+ }
|
|
|
|
- msleep(550);
|
|
- }
|
|
-
|
|
-#endif
|
|
-/////////////////////////////
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Set a format.
|
|
+*/
|
|
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *fmt)//linux-3.0
|
|
+{
|
|
+ int ret;
|
|
+ struct sensor_format_struct *sensor_fmt;
|
|
+ struct sensor_win_size *wsize;
|
|
+ struct sensor_info *info = to_state(sd);
|
|
+
|
|
+ int i, nsize, index;
|
|
+ bool found_hres = false;
|
|
+ struct sensor_resolutions_struct *res;
|
|
+ for (i = 0; i < N_RESOLUTIONS-1; i++)
|
|
+ {
|
|
+ if (found_hres) break;
|
|
+ res = &sensor_resolutions[i];
|
|
+ for (index = 0; index < res->nwin_sizes; index++)
|
|
+ {
|
|
+ wsize = &res->win_sizes[index];
|
|
+ if (fmt->width == wsize->width && fmt->height == wsize->height)
|
|
+ {
|
|
+ found_hres = true;
|
|
+ if (hres != i)
|
|
+ {
|
|
+ vfe_dev_dbg("%s Change hres %d to: %d\n", __func__, hres, i);
|
|
+ hres = i;
|
|
+ sensor_default_regs = res->regs;
|
|
+ sensor_win_sizes = res->win_sizes;
|
|
+ N_WIN_SIZES = res->nwin_sizes;
|
|
+ nsize = res->nsize;
|
|
+ if (!frate) SENSOR_FRAME_RATE = res->framerate;
|
|
+
|
|
+ if ((res->mclk != MCLK) && !mclk)
|
|
+ {
|
|
+ MCLK = res->mclk;
|
|
+ vfe_dev_dbg("%s Change mclk: %d\n", __func__, MCLK*1000*10000);
|
|
+ vfe_set_mclk_freq(sd, (MCLK*1000*1000));
|
|
+ vfe_set_mclk(sd, ON);
|
|
+ usleep_range(10000, 12000);
|
|
+ }
|
|
+
|
|
+ ret = sensor_write_array(sd, sensor_default_regs, nsize);
|
|
+ msleep(350);
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ ret = sensor_try_fmt_internal(sd, fmt, &sensor_fmt, &wsize);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ ret = sensor_s_wsize(sd, sensor_fmt, wsize);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
|
|
sensor_s_hflip(sd,info->hflip);
|
|
sensor_s_vflip(sd,info->vflip);
|
|
|
|
- info->fmt = sensor_fmt;
|
|
- info->width = wsize->width;
|
|
- info->height = wsize->height;
|
|
+ info->fmt = sensor_fmt;
|
|
+ info->width = wsize->width;
|
|
+ info->height = wsize->height;
|
|
|
|
- return 0;
|
|
+ return 0;
|
|
}
|
|
|
|
/*
|
|
@@ -2655,66 +5153,109 @@ static int sensor_s_fmt(struct v4l2_subdev *sd,
|
|
static int sensor_g_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *parms)
|
|
{
|
|
struct v4l2_captureparm *cp = &parms->parm.capture;
|
|
- struct sensor_info *info = to_state(sd);
|
|
|
|
- if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
|
- return -EINVAL;
|
|
+ if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) return -EINVAL;
|
|
|
|
memset(cp, 0, sizeof(struct v4l2_captureparm));
|
|
cp->capability = V4L2_CAP_TIMEPERFRAME;
|
|
cp->timeperframe.numerator = 1;
|
|
-
|
|
- if (info->width > SVGA_WIDTH && info->height > SVGA_HEIGHT) {
|
|
- cp->timeperframe.denominator = SENSOR_FRAME_RATE/2;
|
|
- }
|
|
- else {
|
|
- cp->timeperframe.denominator = SENSOR_FRAME_RATE;
|
|
- }
|
|
-
|
|
+ cp->timeperframe.denominator = SENSOR_FRAME_RATE;
|
|
return 0;
|
|
}
|
|
|
|
static int sensor_s_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *parms)
|
|
{
|
|
-// struct v4l2_captureparm *cp = &parms->parm.capture;
|
|
-// struct v4l2_fract *tpf = &cp->timeperframe;
|
|
-// struct sensor_info *info = to_state(sd);
|
|
-// int div;
|
|
-
|
|
-// if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
|
-// return -EINVAL;
|
|
-// if (cp->extendedmode != 0)
|
|
-// return -EINVAL;
|
|
-
|
|
-// if (tpf->numerator == 0 || tpf->denominator == 0)
|
|
-// div = 1; /* Reset to full rate */
|
|
-// else {
|
|
-// if (info->width > SVGA_WIDTH && info->height > SVGA_HEIGHT) {
|
|
-// div = (tpf->numerator*SENSOR_FRAME_RATE/2)/tpf->denominator;
|
|
-// }
|
|
-// else {
|
|
-// div = (tpf->numerator*SENSOR_FRAME_RATE)/tpf->denominator;
|
|
-// }
|
|
-// }
|
|
-//
|
|
-// if (div == 0)
|
|
-// div = 1;
|
|
-// else if (div > 8)
|
|
-// div = 8;
|
|
-//
|
|
-// switch()
|
|
-//
|
|
-// info->clkrc = (info->clkrc & 0x80) | div;
|
|
-// tpf->numerator = 1;
|
|
-// tpf->denominator = sensor_FRAME_RATE/div;
|
|
-//
|
|
-// sensor_write(sd, REG_CLKRC, info->clkrc);
|
|
- //return -EINVAL;
|
|
- return 0;
|
|
+ struct v4l2_captureparm *cp = &parms->parm.capture;
|
|
+ struct sensor_info *info = to_state(sd);
|
|
+ struct v4l2_fract *tpf = &cp->timeperframe;
|
|
+ int div, clkrc;
|
|
+ clkrc = 1;
|
|
+
|
|
+ if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) return -EINVAL;
|
|
+ if (cp->extendedmode != 0) return -EINVAL;
|
|
+
|
|
+ if (tpf->denominator != SENSOR_FRAME_RATE)
|
|
+ {
|
|
+ int index, i, ret;
|
|
+ // finds compatible framerate
|
|
+ for (index = 0; index < N_RESOLUTIONS-1; index++)
|
|
+ {
|
|
+ if (sensor_resolutions[index].framerate >= tpf->denominator) break;
|
|
+ }
|
|
+
|
|
+ if (hres != index)
|
|
+ {
|
|
+ // checks if exists resolution compatible with selected framerate
|
|
+ struct sensor_resolutions_struct *res;
|
|
+ struct sensor_win_size *wsize;
|
|
+ res = &sensor_resolutions[index];
|
|
+ int nsize;
|
|
+
|
|
+ for (i = 0; i < res->nwin_sizes; i++)
|
|
+ {
|
|
+
|
|
+ wsize = &res->win_sizes[i];
|
|
+ if (info->width == wsize->width && info->height == wsize->height)
|
|
+ {
|
|
+ vfe_dev_dbg("%s Change hres %d to: %d\n", __func__, hres, index);
|
|
+ hres = index;
|
|
+ sensor_default_regs = res->regs;
|
|
+ sensor_win_sizes = res->win_sizes;
|
|
+ N_WIN_SIZES = res->nwin_sizes;
|
|
+ nsize = res->nsize;
|
|
+ SENSOR_FRAME_RATE = res->framerate;
|
|
+
|
|
+ if ((res->mclk != MCLK) && !mclk)
|
|
+ {
|
|
+ MCLK = res->mclk;
|
|
+ vfe_dev_dbg("%s Change mclk: %d\n", __func__, MCLK*1000*10000);
|
|
+ vfe_set_mclk_freq(sd, (MCLK*1000*1000));
|
|
+ vfe_set_mclk(sd, ON);
|
|
+ usleep_range(10000, 12000);
|
|
+ }
|
|
+
|
|
+ ret = sensor_write_array(sd, sensor_default_regs, nsize);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
+ msleep(350);
|
|
+
|
|
+ ret = sensor_s_wsize(sd, NULL, wsize);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
+
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ // reset to full framerate
|
|
+ tpf->numerator = 0;
|
|
+
|
|
+ if (tpf->numerator == 0 || tpf->denominator == 0)
|
|
+ {
|
|
+ div = 1; // Reset to full rate
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ div = (tpf->numerator*SENSOR_FRAME_RATE)/tpf->denominator;
|
|
+ }
|
|
+
|
|
+ if (div == 0) div = 1;
|
|
+ else if (div > 8) div = 8;
|
|
+
|
|
+ clkrc = (clkrc & 0x80) | div;
|
|
+ tpf->numerator = 1;
|
|
+ tpf->denominator = SENSOR_FRAME_RATE / div;
|
|
+ sensor_write(sd, REG_CLKRC, clkrc);
|
|
+ return 0;
|
|
}
|
|
|
|
|
|
-/*
|
|
+/*
|
|
* Code for dealing with controls.
|
|
* fill with different sensor module
|
|
* different sensor module has different settings here
|
|
@@ -2728,55 +5269,65 @@ static int sensor_queryctrl(struct v4l2_subdev *sd,
|
|
/* Fill in min, max, step and default value for these controls. */
|
|
/* see include/linux/videodev2.h for details */
|
|
/* see sensor_s_parm and sensor_g_parm for the meaning of value */
|
|
-
|
|
switch (qc->id) {
|
|
-// case V4L2_CID_BRIGHTNESS:
|
|
-// return v4l2_ctrl_query_fill(qc, -4, 4, 1, 1);
|
|
-// case V4L2_CID_CONTRAST:
|
|
-// return v4l2_ctrl_query_fill(qc, -4, 4, 1, 1);
|
|
-// case V4L2_CID_SATURATION:
|
|
-// return v4l2_ctrl_query_fill(qc, -4, 4, 1, 1);
|
|
-// case V4L2_CID_HUE:
|
|
-// return v4l2_ctrl_query_fill(qc, -180, 180, 5, 0);
|
|
+ case V4L2_CID_BRIGHTNESS:
|
|
+ return v4l2_ctrl_query_fill(qc, -4, 4, 1, 1);
|
|
+
|
|
+ case V4L2_CID_CONTRAST:
|
|
+ return v4l2_ctrl_query_fill(qc, -4, 4, 1, 1);
|
|
+
|
|
+ case V4L2_CID_SATURATION:
|
|
+ return v4l2_ctrl_query_fill(qc, -4, 4, 1, 1);
|
|
+
|
|
+ case V4L2_CID_HUE:
|
|
+ return v4l2_ctrl_query_fill(qc, -180, 180, 5, 0);
|
|
+
|
|
case V4L2_CID_VFLIP:
|
|
case V4L2_CID_HFLIP:
|
|
return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
|
|
-// case V4L2_CID_GAIN:
|
|
-// return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128);
|
|
-// case V4L2_CID_AUTOGAIN:
|
|
-// return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
|
|
+
|
|
+ case V4L2_CID_GAIN:
|
|
+ return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128);
|
|
+
|
|
+ case V4L2_CID_AUTOGAIN:
|
|
+ return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
|
|
+
|
|
case V4L2_CID_EXPOSURE:
|
|
case V4L2_CID_AUTO_EXPOSURE_BIAS:
|
|
return v4l2_ctrl_query_fill(qc, -4, 4, 1, 0);
|
|
+
|
|
case V4L2_CID_EXPOSURE_AUTO:
|
|
return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
|
|
+
|
|
case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
|
|
return v4l2_ctrl_query_fill(qc, 0, 9, 1, 1);
|
|
+
|
|
case V4L2_CID_AUTO_WHITE_BALANCE:
|
|
return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
|
|
+
|
|
case V4L2_CID_COLORFX:
|
|
return v4l2_ctrl_query_fill(qc, 0, 15, 1, 0);
|
|
case V4L2_CID_FLASH_LED_MODE:
|
|
- return v4l2_ctrl_query_fill(qc, 0, 4, 1, 0);
|
|
-
|
|
-// case V4L2_CID_3A_LOCK:
|
|
-// return v4l2_ctrl_query_fill(qc, 0, V4L2_LOCK_EXPOSURE |
|
|
-// V4L2_LOCK_WHITE_BALANCE |
|
|
-// V4L2_LOCK_FOCUS, 1, 0);
|
|
-// case V4L2_CID_AUTO_FOCUS_RANGE:
|
|
-// return v4l2_ctrl_query_fill(qc, 0, 0, 0, 0);//only auto
|
|
-// case V4L2_CID_AUTO_FOCUS_INIT:
|
|
-// case V4L2_CID_AUTO_FOCUS_RELEASE:
|
|
-// case V4L2_CID_AUTO_FOCUS_START:
|
|
-// case V4L2_CID_AUTO_FOCUS_STOP:
|
|
-// case V4L2_CID_AUTO_FOCUS_STATUS:
|
|
-// return v4l2_ctrl_query_fill(qc, 0, 0, 0, 0);
|
|
-// case V4L2_CID_FOCUS_AUTO:
|
|
-// return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
|
|
-// case V4L2_CID_AUTO_EXPOSURE_WIN_NUM:
|
|
-// return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
|
|
-// case V4L2_CID_AUTO_FOCUS_WIN_NUM:
|
|
-// return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
|
|
+ return v4l2_ctrl_query_fill(qc, 0, 4, 1, 0);
|
|
+
|
|
+ case V4L2_CID_3A_LOCK:
|
|
+ return v4l2_ctrl_query_fill(qc, 0, V4L2_LOCK_EXPOSURE |
|
|
+ V4L2_LOCK_WHITE_BALANCE |
|
|
+ V4L2_LOCK_FOCUS, 1, 0);
|
|
+ case V4L2_CID_AUTO_FOCUS_RANGE:
|
|
+ return v4l2_ctrl_query_fill(qc, 0, 0, 0, 0);//only auto
|
|
+
|
|
+ case V4L2_CID_AUTO_FOCUS_STATUS:
|
|
+ return v4l2_ctrl_query_fill(qc, 0, 0, 0, 0);
|
|
+
|
|
+ case V4L2_CID_FOCUS_AUTO:
|
|
+ return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
|
|
+
|
|
+ case V4L2_CID_AUTO_EXPOSURE_WIN_NUM:
|
|
+ return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
|
|
+
|
|
+ case V4L2_CID_AUTO_FOCUS_WIN_NUM:
|
|
+ return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
|
|
}
|
|
return -EINVAL;
|
|
}
|
|
@@ -2787,54 +5338,47 @@ static int sensor_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
|
|
switch (ctrl->id) {
|
|
case V4L2_CID_BRIGHTNESS:
|
|
return sensor_g_brightness(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_CONTRAST:
|
|
return sensor_g_contrast(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_SATURATION:
|
|
return sensor_g_saturation(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_HUE:
|
|
- return sensor_g_hue(sd, &ctrl->value);
|
|
+ return sensor_g_hue(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_VFLIP:
|
|
return sensor_g_vflip(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_HFLIP:
|
|
return sensor_g_hflip(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_GAIN:
|
|
return sensor_g_gain(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_AUTOGAIN:
|
|
return sensor_g_autogain(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_EXPOSURE:
|
|
+
|
|
case V4L2_CID_AUTO_EXPOSURE_BIAS:
|
|
return sensor_g_exp_bias(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_EXPOSURE_AUTO:
|
|
return sensor_g_autoexp(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
|
|
return sensor_g_wb(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_AUTO_WHITE_BALANCE:
|
|
return sensor_g_autowb(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_COLORFX:
|
|
return sensor_g_colorfx(sd, &ctrl->value);
|
|
+
|
|
case V4L2_CID_FLASH_LED_MODE:
|
|
return sensor_g_flash_mode(sd, &ctrl->value);
|
|
-// case V4L2_CID_POWER_LINE_FREQUENCY:
|
|
-// return sensor_g_band_filter(sd, &ctrl->value);
|
|
-
|
|
-// case V4L2_CID_3A_LOCK:
|
|
-// return 0;
|
|
-// case V4L2_CID_AUTO_FOCUS_RANGE:
|
|
-// ctrl->value=0;//only auto
|
|
-// return 0;
|
|
-// case V4L2_CID_AUTO_FOCUS_INIT:
|
|
-// case V4L2_CID_AUTO_FOCUS_RELEASE:
|
|
-// case V4L2_CID_AUTO_FOCUS_START:
|
|
-// case V4L2_CID_AUTO_FOCUS_STOP:
|
|
-// case V4L2_CID_AUTO_FOCUS_STATUS:
|
|
-// return 0;//sensor_g_af_status(sd);
|
|
-//// case V4L2_CID_FOCUS_AUTO:
|
|
-// case V4L2_CID_AUTO_FOCUS_WIN_NUM:
|
|
-// ctrl->value=1;
|
|
-// return 0;
|
|
-// case V4L2_CID_AUTO_EXPOSURE_WIN_NUM:
|
|
-// ctrl->value=1;
|
|
-// return 0;
|
|
}
|
|
return -EINVAL;
|
|
}
|
|
@@ -2843,8 +5387,7 @@ static int sensor_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
|
|
{
|
|
struct v4l2_queryctrl qc;
|
|
int ret;
|
|
-
|
|
-// vfe_dev_dbg("sensor_s_ctrl ctrl->id=0x%8x\n", ctrl->id);
|
|
+
|
|
qc.id = ctrl->id;
|
|
ret = sensor_queryctrl(sd, &qc);
|
|
if (ret < 0) {
|
|
@@ -2862,62 +5405,50 @@ static int sensor_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
|
|
switch (ctrl->id) {
|
|
case V4L2_CID_BRIGHTNESS:
|
|
return sensor_s_brightness(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_CONTRAST:
|
|
return sensor_s_contrast(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_SATURATION:
|
|
return sensor_s_saturation(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_HUE:
|
|
- return sensor_s_hue(sd, ctrl->value);
|
|
+ return sensor_s_hue(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_VFLIP:
|
|
return sensor_s_vflip(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_HFLIP:
|
|
return sensor_s_hflip(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_GAIN:
|
|
return sensor_s_gain(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_AUTOGAIN:
|
|
return sensor_s_autogain(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_EXPOSURE:
|
|
case V4L2_CID_AUTO_EXPOSURE_BIAS:
|
|
return sensor_s_exp_bias(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_EXPOSURE_AUTO:
|
|
return sensor_s_autoexp(sd,
|
|
(enum v4l2_exposure_auto_type) ctrl->value);
|
|
+
|
|
case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
|
|
return sensor_s_wb(sd,
|
|
- (enum v4l2_auto_n_preset_white_balance) ctrl->value);
|
|
+ (enum v4l2_auto_n_preset_white_balance) ctrl->value);
|
|
+
|
|
case V4L2_CID_AUTO_WHITE_BALANCE:
|
|
return sensor_s_autowb(sd, ctrl->value);
|
|
+
|
|
case V4L2_CID_COLORFX:
|
|
return sensor_s_colorfx(sd,
|
|
(enum v4l2_colorfx) ctrl->value);
|
|
+
|
|
case V4L2_CID_FLASH_LED_MODE:
|
|
return sensor_s_flash_mode(sd,
|
|
(enum v4l2_flash_led_mode) ctrl->value);
|
|
-// case V4L2_CID_POWER_LINE_FREQUENCY:
|
|
-// return sensor_s_band_filter(sd,
|
|
-// (enum v4l2_power_line_frequency) ctrl->value);
|
|
-
|
|
-// case V4L2_CID_3A_LOCK:
|
|
-// return 0;//sensor_s_3a(sd, ctrl->value);
|
|
-// case V4L2_CID_AUTO_FOCUS_RANGE:
|
|
-// return 0;
|
|
-// case V4L2_CID_AUTO_FOCUS_INIT:
|
|
-// return sensor_s_init_af(sd);
|
|
-// case V4L2_CID_AUTO_FOCUS_RELEASE:
|
|
-// return sensor_s_release_af(sd);
|
|
-// case V4L2_CID_AUTO_FOCUS_START:
|
|
-// return sensor_s_single_af(sd);
|
|
-// case V4L2_CID_AUTO_FOCUS_STOP:
|
|
-// return sensor_s_pause_af(sd);
|
|
-// case V4L2_CID_AUTO_FOCUS_STATUS:
|
|
-// return 0;
|
|
-// case V4L2_CID_FOCUS_AUTO:
|
|
-// return sensor_s_continueous_af(sd, ctrl->value);
|
|
-// case V4L2_CID_AUTO_FOCUS_WIN_NUM:
|
|
-// vfe_dev_dbg("s_ctrl win value=%d\n",ctrl->value);
|
|
-// return sensor_s_af_zone(sd, (struct v4l2_win_coordinate *)(ctrl->user_pt));
|
|
-// case V4L2_CID_AUTO_EXPOSURE_WIN_NUM:
|
|
-// return 0;
|
|
}
|
|
return -EINVAL;
|
|
}
|
|
@@ -2934,7 +5465,8 @@ static int sensor_g_chip_ident(struct v4l2_subdev *sd,
|
|
|
|
/* ----------------------------------------------------------------------- */
|
|
|
|
-static const struct v4l2_subdev_core_ops sensor_core_ops = {
|
|
+static const struct v4l2_subdev_core_ops sensor_core_ops =
|
|
+{
|
|
.g_chip_ident = sensor_g_chip_ident,
|
|
.g_ctrl = sensor_g_ctrl,
|
|
.s_ctrl = sensor_s_ctrl,
|
|
@@ -2945,7 +5477,8 @@ static const struct v4l2_subdev_core_ops sensor_core_ops = {
|
|
.ioctl = sensor_ioctl,
|
|
};
|
|
|
|
-static const struct v4l2_subdev_video_ops sensor_video_ops = {
|
|
+static const struct v4l2_subdev_video_ops sensor_video_ops =
|
|
+{
|
|
.enum_mbus_fmt = sensor_enum_fmt,
|
|
.enum_framesizes = sensor_enum_size,
|
|
.try_mbus_fmt = sensor_try_fmt,
|
|
@@ -2955,36 +5488,33 @@ static const struct v4l2_subdev_video_ops sensor_video_ops = {
|
|
.g_mbus_config = sensor_g_mbus_config,
|
|
};
|
|
|
|
-static const struct v4l2_subdev_ops sensor_ops = {
|
|
+static const struct v4l2_subdev_ops sensor_ops =
|
|
+{
|
|
.core = &sensor_core_ops,
|
|
.video = &sensor_video_ops,
|
|
};
|
|
|
|
/* ----------------------------------------------------------------------- */
|
|
-static struct cci_driver cci_drv = {
|
|
+static struct cci_driver cci_drv =
|
|
+{
|
|
.name = SENSOR_NAME,
|
|
.addr_width = CCI_BITS_8,
|
|
.data_width = CCI_BITS_8,
|
|
};
|
|
|
|
-static int sensor_probe(struct i2c_client *client,
|
|
- const struct i2c_device_id *id)
|
|
+static int sensor_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|
{
|
|
struct v4l2_subdev *sd;
|
|
struct sensor_info *info;
|
|
-// int ret;
|
|
|
|
info = kzalloc(sizeof(struct sensor_info), GFP_KERNEL);
|
|
- if (info == NULL)
|
|
- return -ENOMEM;
|
|
+ if (info == NULL) return -ENOMEM;
|
|
sd = &info->sd;
|
|
cci_dev_probe_helper(sd, client, &sensor_ops, &cci_drv);
|
|
|
|
- if(client) {
|
|
- client->addr=0x78>>1;
|
|
- }
|
|
+ if(client) client->addr = 0x78>>1;
|
|
info->fmt = &sensor_formats[0];
|
|
-
|
|
+
|
|
info->brightness = 0;
|
|
info->contrast = 0;
|
|
info->saturation = 0;
|
|
@@ -2998,29 +5528,29 @@ static int sensor_probe(struct i2c_client *client,
|
|
info->autowb = 1;
|
|
info->wb = 0;
|
|
info->clrfx = 0;
|
|
-// info->clkrc = 1; /* 30fps */
|
|
-
|
|
+ //info->clkrc = 1; /* 30fps */
|
|
return 0;
|
|
}
|
|
|
|
-
|
|
static int sensor_remove(struct i2c_client *client)
|
|
{
|
|
struct v4l2_subdev *sd;
|
|
-
|
|
sd = cci_dev_remove_helper(client, &cci_drv);
|
|
kfree(to_state(sd));
|
|
return 0;
|
|
}
|
|
|
|
-static const struct i2c_device_id sensor_id[] = {
|
|
+static const struct i2c_device_id sensor_id[] =
|
|
+{
|
|
{ SENSOR_NAME, 0 },
|
|
{ }
|
|
};
|
|
+
|
|
MODULE_DEVICE_TABLE(i2c, sensor_id);
|
|
|
|
//linux-3.0
|
|
-static struct i2c_driver sensor_driver = {
|
|
+static struct i2c_driver sensor_driver =
|
|
+{
|
|
.driver = {
|
|
.owner = THIS_MODULE,
|
|
.name = SENSOR_NAME,
|
|
@@ -3029,8 +5559,20 @@ static struct i2c_driver sensor_driver = {
|
|
.remove = sensor_remove,
|
|
.id_table = sensor_id,
|
|
};
|
|
+
|
|
static __init int init_sensor(void)
|
|
{
|
|
+ if (mclk > 34) mclk = 0;
|
|
+ sensor_default_regs = sensor_resolutions[hres].regs;
|
|
+ sensor_win_sizes = sensor_resolutions[hres].win_sizes;
|
|
+ N_WIN_SIZES = sensor_resolutions[hres].nwin_sizes;
|
|
+ SENSOR_FRAME_RATE = sensor_resolutions[hres].framerate;
|
|
+ MCLK = sensor_resolutions[hres].mclk;
|
|
+
|
|
+ if (mclk) MCLK = mclk;
|
|
+
|
|
+ if (frate) SENSOR_FRAME_RATE = frate;
|
|
+
|
|
return cci_dev_init_helper(&sensor_driver);
|
|
}
|
|
|
|
--
|
|
2.11.0
|
|
|