/* * The code contained herein is licensed under the GNU General Public * License. You may obtain a copy of the GNU General Public License * Version 2 or later at the following locations: * * http://www.opensource.org/licenses/gpl-license.html * http://www.gnu.org/copyleft/gpl.html */ #include <linux/module.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/ctype.h> #include <linux/types.h> #include <linux/delay.h> #include <linux/device.h> #include <linux/i2c.h> #include <linux/regulator/consumer.h> #include <mach/hardware.h> #include <media/v4l2-int-device.h> #include "mxc_v4l2_capture.h" #define HI253_VOLTAGE_ANALOG 2800000 #define HI253_VOLTAGE_DIGITAL_CORE 1500000 #define HI253_VOLTAGE_DIGITAL_IO 1800000 #define HI253_VOLTAGE_DIGITAL_GPO 2800000 /* Check these values! */ #define MIN_FPS 15 #define MAX_FPS 30 #define DEFAULT_FPS 30 #define HI253_XCLK_MIN 6000000 #define HI253_XCLK_MAX 48000000 #define REG_TERM 0xff /* terminating list entry for reg */ #define VAL_TERM 0xff /* terminating list entry for val */ enum hi253_mode { hi253_mode_MIN = 0, hi253_mode_VGA_640_480 = 0, hi253_mode_QVGA_320_240 = 1, hi253_mode_XGA_1024_768 = 2, hi253_mode_QXGA_1600_1200 = 3, hi253_mode_NTSC_720_480 = 4, hi253_mode_PAL_720_576 = 5, hi253_mode_MAX = 5 }; enum hi253_frame_rate { hi253_15_fps, hi253_30_fps }; struct reg_value { u16 u16RegAddr; u8 u8Val; u8 u8Mask; u32 u32Delay_ms; }; struct sensor_reg { u16 reg; u8 val; }; struct hi253_mode_info { enum hi253_mode mode; u32 width; u32 height; /*struct reg_value *init_data_ptr;*/ struct sensor_reg *init_data_ptr; u32 init_data_size; }; /*! * Maintains the information on the current state of the sesor. */ struct sensor { const struct hi253_platform_data *platform_data; struct v4l2_int_device *v4l2_int_device; struct i2c_client *i2c_client; struct v4l2_pix_format pix; struct v4l2_captureparm streamcap; bool on; /* control settings */ int brightness; int hue; int contrast; int saturation; int red; int green; int blue; int ae_mode; u32 mclk; int csi; } hi253_data; static struct sensor_reg hi253_setting_15fps_QXGA_1600_1200[] = { /* * Only support 7.5fps for QXGA to workaround screen tearing issue * for 15fps when capturing still image. */ {0x01, 0xf9}, //sleep on {0x08, 0x0f}, //Hi-Z on {0x01, 0xf8}, //sleep off {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x03}, //PLL On {0x0e, 0x70}, //PLLx2 {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x00}, //PLL off {0x01, 0xf1}, //sleep on {0x08, 0x00}, //Hi-Z off {0x01, 0xf3}, {0x01, 0xf1}, {0x03, 0x20}, //page 20 {0x10, 0x9c}, //ae off {0x03, 0x22}, //page 22 {0x10, 0xe9}, //awb off {0x03, 0x00}, {0x10, 0x00}, // Sub1/2_Preview2 Mode_H binning {0x11, 0x91}, {0x12, 0x22}, //21 {0x0b, 0xaa}, // ESD Check Register {0x0c, 0xaa}, // ESD Check Register {0x0d, 0xaa}, // ESD Check Register {0x20, 0x00}, // Windowing start point Y {0x21, 0x04}, {0x22, 0x00}, // Windowing start point X {0x23, 0x07}, {0x24, 0x04}, {0x25, 0xb0}, {0x26, 0x06}, {0x27, 0x40}, // WINROW END {0x40, 0x01}, //Hblank 408 {0x41, 0x68}, {0x42, 0x00}, //Vblank 20 {0x43, 0x14}, {0x45, 0x04}, {0x46, 0x18}, {0x47, 0xd8}, {0x80, 0x2e}, {0x81, 0x7e}, {0x82, 0x90}, {0x83, 0x00}, {0x84, 0x0c}, {0x85, 0x00}, {0x90, 0x14}, //BLC_TIME_TH_ON {0x91, 0x14}, //BLC_TIME_TH_OFF {0x92, 0x98}, //BLC_AG_TH_ON {0x93, 0x90}, //BLC_AG_TH_OFF {0x94, 0x75}, {0x95, 0x70}, {0x96, 0xdc}, {0x97, 0xfe}, {0x98, 0x38}, {0x99, 0x43}, {0x9a, 0x43}, {0x9b, 0x43}, {0x9c, 0x43}, {0xa0, 0x00}, {0xa2, 0x00}, {0xa4, 0x00}, {0xa6, 0x00}, {0xa8, 0x43}, {0xaa, 0x43}, {0xac, 0x43}, {0xae, 0x43}, {0x03, 0x02}, {0x12, 0x03}, {0x13, 0x03}, {0x16, 0x00}, {0x17, 0x8C}, {0x18, 0x4c}, //Double_AG off {0x19, 0x00}, {0x1a, 0x39}, //ADC400->560 {0x1c, 0x09}, {0x1d, 0x40}, {0x1e, 0x30}, {0x1f, 0x10}, {0x20, 0x77}, {0x21, 0xde}, {0x22, 0xa7}, {0x23, 0x30}, //CLAMP {0x27, 0x3c}, {0x2b, 0x80}, {0x2e, 0x11}, {0x2f, 0xa1}, {0x30, 0x05}, //For Hi-253 never no change 0x05 {0x50, 0x20}, {0x52, 0x01}, {0x55, 0x1c}, {0x56, 0x11}, {0x5d, 0xa2}, {0x5e, 0x5a}, {0x60, 0x87}, {0x61, 0x99}, {0x62, 0x88}, {0x63, 0x97}, {0x64, 0x88}, {0x65, 0x97}, {0x67, 0x0c}, {0x68, 0x0c}, {0x69, 0x0c}, {0x72, 0x89}, {0x73, 0x96}, {0x74, 0x89}, {0x75, 0x96}, {0x76, 0x89}, {0x77, 0x96}, {0x7c, 0x85}, {0x7d, 0xaf}, {0x80, 0x01}, {0x81, 0x7f}, {0x82, 0x13}, {0x83, 0x24}, {0x84, 0x7d}, {0x85, 0x81}, {0x86, 0x7d}, {0x87, 0x81}, {0x92, 0x48}, {0x93, 0x54}, {0x94, 0x7d}, {0x95, 0x81}, {0x96, 0x7d}, {0x97, 0x81}, {0xa0, 0x02}, {0xa1, 0x7b}, {0xa2, 0x02}, {0xa3, 0x7b}, {0xa4, 0x7b}, {0xa5, 0x02}, {0xa6, 0x7b}, {0xa7, 0x02}, {0xa8, 0x85}, {0xa9, 0x8c}, {0xaa, 0x85}, {0xab, 0x8c}, {0xac, 0x10}, {0xad, 0x16}, {0xae, 0x10}, {0xaf, 0x16}, {0xb0, 0x99}, {0xb1, 0xa3}, {0xb2, 0xa4}, {0xb3, 0xae}, {0xb4, 0x9b}, {0xb5, 0xa2}, {0xb6, 0xa6}, {0xb7, 0xac}, {0xb8, 0x9b}, {0xb9, 0x9f}, {0xba, 0xa6}, {0xbb, 0xaa}, {0xbc, 0x9b}, {0xbd, 0x9f}, {0xbe, 0xa6}, {0xbf, 0xaa}, {0xc4, 0x2c}, {0xc5, 0x43}, {0xc6, 0x63}, {0xc7, 0x79}, {0xc8, 0x2d}, {0xc9, 0x42}, {0xca, 0x2d}, {0xcb, 0x42}, {0xcc, 0x64}, {0xcd, 0x78}, {0xce, 0x64}, {0xcf, 0x78}, {0xd0, 0x0a}, {0xd1, 0x09}, {0xd4, 0x14}, //DCDC_TIME_TH_ON {0xd5, 0x14}, //DCDC_TIME_TH_OFF {0xd6, 0x98}, //DCDC_AG_TH_ON {0xd7, 0x90}, //DCDC_AG_TH_OFF {0xe0, 0xc4}, {0xe1, 0xc4}, {0xe2, 0xc4}, {0xe3, 0xc4}, {0xe4, 0x00}, {0xe8, 0x80}, {0xe9, 0x40}, {0xea, 0x7f}, {0x03, 0x03}, {0x10, 0x10}, {0x03, 0x10}, {0x10, 0x01}, // CrYCbY // For Demoset 0x03 {0x12, 0x30}, {0x13, 0x0a}, // contrast on {0x20, 0x00}, {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x30}, {0x35, 0x00}, {0x36, 0x00}, {0x38, 0x00}, {0x3e, 0x58}, {0x3f, 0x00}, {0x40, 0x80}, // YOFS {0x41, 0x10}, // DYOFS {0x48, 0x84}, // Contrast {0x50, 0x90}, // Contrast {0x60, 0x6c}, //67 {0x61, 0x70}, //7e //8e //88 //80 {0x62, 0x68}, //7e //8e //88 //80 {0x63, 0x50}, //Double_AG 50->30 {0x64, 0x41}, {0x66, 0x42}, {0x67, 0x20}, {0x6a, 0x80}, //8a {0x6b, 0x84}, //74 {0x6c, 0x80}, //7e //7a {0x6d, 0x80}, //8e {0x03, 0x11}, {0x10, 0x7f}, {0x11, 0x40}, {0x12, 0x0a}, /* Blue Max-Filter Delete*/ {0x13, 0xbb}, {0x26, 0x31}, /* Double_AG 31->20*/ {0x27, 0x34}, /* Double_AG 34->22*/ {0x28, 0x0f}, {0x29, 0x10}, {0x2b, 0x30}, {0x2c, 0x32}, {0x30, 0x70}, {0x31, 0x10}, {0x32, 0x58}, {0x33, 0x09}, {0x34, 0x06}, {0x35, 0x03}, {0x36, 0x70}, {0x37, 0x18}, {0x38, 0x58}, {0x39, 0x09}, {0x3a, 0x06}, {0x3b, 0x03}, {0x3c, 0x80}, {0x3d, 0x18}, {0x3e, 0x83}, /*80*/ {0x3f, 0x0c}, {0x40, 0x03}, {0x41, 0x06}, {0x42, 0x80}, {0x43, 0x18}, {0x44, 0x83}, /*80*/ {0x45, 0x12}, {0x46, 0x10}, {0x47, 0x10}, {0x48, 0x90}, {0x49, 0x40}, {0x4a, 0x80}, {0x4b, 0x13}, {0x4c, 0x10}, {0x4d, 0x11}, {0x4e, 0x80}, {0x4f, 0x30}, {0x50, 0x80}, {0x51, 0x13}, {0x52, 0x10}, {0x53, 0x13}, {0x54, 0x11}, {0x55, 0x17}, {0x56, 0x20}, {0x57, 0x01}, {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x1f}, /*18*/ {0x5b, 0x00}, {0x5c, 0x00}, {0x60, 0x3f}, {0x62, 0x60}, {0x70, 0x06}, {0x03, 0x12}, {0x20, 0x00}, {0x21, 0x00}, {0x25, 0x00}, {0x28, 0x00}, {0x29, 0x00}, {0x2a, 0x00}, {0x30, 0x50}, {0x31, 0x18}, {0x32, 0x32}, {0x33, 0x40}, {0x34, 0x50}, {0x35, 0x70}, {0x36, 0xa0}, {0x40, 0xa0}, {0x41, 0x40}, {0x42, 0xa0}, {0x43, 0x90}, {0x44, 0x90}, {0x45, 0x80}, {0x46, 0xb0}, {0x47, 0x55}, {0x48, 0xa0}, {0x49, 0x90}, {0x4a, 0x90}, {0x4b, 0x80}, {0x4c, 0xb0}, {0x4d, 0x40}, {0x4e, 0x90}, {0x4f, 0x90}, {0x50, 0xa0}, {0x51, 0x60}, {0x52, 0xb0}, {0x53, 0x60}, {0x54, 0xc0}, {0x55, 0xc0}, {0x56, 0x80}, {0x57, 0x57}, {0x58, 0x90}, {0x59, 0x40}, {0x5a, 0xd0}, {0x5b, 0xd0}, {0x5c, 0xe0}, {0x5d, 0x80}, {0x5e, 0x88}, {0x5f, 0x40}, {0x60, 0xe0}, {0x61, 0xe0}, {0x62, 0xe0}, {0x63, 0x80}, {0x70, 0x15}, {0x71, 0x01}, /*Don't Touch register*/ {0x72, 0x18}, {0x73, 0x01}, /*Don't Touch register*/ {0x74, 0x25}, {0x75, 0x15}, {0x80, 0x20}, {0x81, 0x40}, {0x82, 0x65}, {0x85, 0x1a}, {0x88, 0x00}, {0x89, 0x00}, {0x90, 0x5d}, /*For Preview*/ /*Dont Touch register*/ {0xD0, 0x0c}, {0xD1, 0x80}, {0xD2, 0x67}, {0xD3, 0x00}, {0xD4, 0x00}, {0xD5, 0x02}, {0xD6, 0xff}, {0xD7, 0x18}, {0x3b, 0x06}, {0x3c, 0x06}, {0xc5, 0x00}, /*55->48*/ {0xc6, 0x00}, /*48->40*/ {0x03, 0x13}, {0x10, 0xcb}, {0x11, 0x7b}, {0x12, 0x07}, {0x14, 0x00}, {0x20, 0x15}, {0x21, 0x13}, {0x22, 0x33}, {0x23, 0x05}, {0x24, 0x09}, {0x25, 0x0a}, {0x26, 0x18}, {0x27, 0x30}, {0x29, 0x12}, {0x2a, 0x50}, {0x2b, 0x02}, {0x2c, 0x02}, {0x25, 0x06}, {0x2d, 0x0c}, {0x2e, 0x12}, {0x2f, 0x12}, {0x50, 0x10}, {0x51, 0x14}, {0x52, 0x12}, {0x53, 0x0c}, {0x54, 0x0f}, {0x55, 0x0c}, {0x56, 0x10}, {0x57, 0x13}, {0x58, 0x12}, {0x59, 0x0c}, {0x5a, 0x0f}, {0x5b, 0x0c}, {0x5c, 0x0a}, {0x5d, 0x0b}, {0x5e, 0x0a}, {0x5f, 0x08}, {0x60, 0x09}, {0x61, 0x08}, {0x62, 0x08}, {0x63, 0x08}, {0x64, 0x08}, {0x65, 0x06}, {0x66, 0x06}, {0x67, 0x06}, {0x68, 0x07}, {0x69, 0x07}, {0x6a, 0x07}, {0x6b, 0x05}, {0x6c, 0x05}, {0x6d, 0x05}, {0x6e, 0x07}, {0x6f, 0x07}, {0x70, 0x07}, {0x71, 0x05}, {0x72, 0x05}, {0x73, 0x05}, {0x80, 0xfd}, {0x81, 0x1f}, {0x82, 0x05}, {0x83, 0x31}, {0x90, 0x05}, {0x91, 0x05}, {0x92, 0x33}, {0x93, 0x30}, {0x94, 0x03}, {0x95, 0x14}, {0x97, 0x20}, {0x99, 0x20}, {0xa0, 0x01}, {0xa1, 0x02}, {0xa2, 0x01}, {0xa3, 0x02}, {0xa4, 0x05}, {0xa5, 0x05}, {0xa6, 0x07}, {0xa7, 0x08}, {0xa8, 0x07}, {0xa9, 0x08}, {0xaa, 0x07}, {0xab, 0x08}, {0xb0, 0x22}, {0xb1, 0x2a}, {0xb2, 0x28}, {0xb3, 0x22}, {0xb4, 0x2a}, {0xb5, 0x28}, {0xb6, 0x22}, {0xb7, 0x2a}, {0xb8, 0x28}, {0xb9, 0x22}, {0xba, 0x2a}, {0xbb, 0x28}, {0xbc, 0x25}, {0xbd, 0x2a}, {0xbe, 0x27}, {0xbf, 0x25}, {0xc0, 0x2a}, {0xc1, 0x27}, {0xc2, 0x1e}, {0xc3, 0x24}, {0xc4, 0x20}, {0xc5, 0x1e}, {0xc6, 0x24}, {0xc7, 0x20}, {0xc8, 0x18}, {0xc9, 0x20}, {0xca, 0x1e}, {0xcb, 0x18}, {0xcc, 0x20}, {0xcd, 0x1e}, {0xce, 0x18}, {0xcf, 0x20}, {0xd0, 0x1e}, {0xd1, 0x18}, {0xd2, 0x20}, {0xd3, 0x1e}, {0x03, 0x14}, {0x10, 0x11}, {0x14, 0x80}, // GX {0x15, 0x80}, // GY {0x16, 0x80}, // RX {0x17, 0x80}, // RY {0x18, 0x80}, // BX {0x19, 0x80}, // BY {0x20, 0x60}, //X 60 //a0 {0x21, 0x80}, //Y {0x22, 0x80}, {0x23, 0x80}, {0x24, 0x80}, {0x30, 0xc8}, {0x31, 0x2b}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x90}, {0x40, 0x48}, //31 {0x50, 0x34}, //23 //32 {0x60, 0x29}, // {0x70, 0x34}, //23 //32 {0x03, 0x15}, {0x10, 0x0f}, {0x14, 0x42}, //CMCOFSGH_Day //4c {0x15, 0x32}, //CMCOFSGM_CWF //3c {0x16, 0x24}, //CMCOFSGL_A //2e {0x17, 0x2f}, //CMC SIGN {0x30, 0x8f}, {0x31, 0x59}, {0x32, 0x0a}, {0x33, 0x15}, {0x34, 0x5b}, {0x35, 0x06}, {0x36, 0x07}, {0x37, 0x40}, {0x38, 0x87}, //86 {0x40, 0x92}, {0x41, 0x1b}, {0x42, 0x89}, {0x43, 0x81}, {0x44, 0x00}, {0x45, 0x01}, {0x46, 0x89}, {0x47, 0x9e}, {0x48, 0x28}, {0x50, 0x02}, {0x51, 0x82}, {0x52, 0x00}, {0x53, 0x07}, {0x54, 0x11}, {0x55, 0x98}, {0x56, 0x00}, {0x57, 0x0b}, {0x58, 0x8b}, {0x80, 0x03}, {0x85, 0x40}, {0x87, 0x02}, {0x88, 0x00}, {0x89, 0x00}, {0x8a, 0x00}, {0x03, 0x16}, {0x10, 0x31}, {0x18, 0x5e}, // Double_AG 5e->37 {0x19, 0x5d}, // Double_AG 5e->36 {0x1a, 0x0e}, {0x1b, 0x01}, {0x1c, 0xdc}, {0x1d, 0xfe}, {0x30, 0x00}, {0x31, 0x0a}, {0x32, 0x1f}, {0x33, 0x33}, {0x34, 0x53}, {0x35, 0x6c}, {0x36, 0x81}, {0x37, 0x94}, {0x38, 0xa4}, {0x39, 0xb3}, {0x3a, 0xc0}, {0x3b, 0xcb}, {0x3c, 0xd5}, {0x3d, 0xde}, {0x3e, 0xe6}, {0x3f, 0xee}, {0x40, 0xf5}, {0x41, 0xfc}, {0x42, 0xff}, {0x50, 0x00}, {0x51, 0x09}, {0x52, 0x1f}, {0x53, 0x37}, {0x54, 0x5b}, {0x55, 0x76}, {0x56, 0x8d}, {0x57, 0xa1}, {0x58, 0xb2}, {0x59, 0xbe}, {0x5a, 0xc9}, {0x5b, 0xd2}, {0x5c, 0xdb}, {0x5d, 0xe3}, {0x5e, 0xeb}, {0x5f, 0xf0}, {0x60, 0xf5}, {0x61, 0xf7}, {0x62, 0xf8}, {0x70, 0x00}, {0x71, 0x08}, {0x72, 0x17}, {0x73, 0x2f}, {0x74, 0x53}, {0x75, 0x6c}, {0x76, 0x81}, {0x77, 0x94}, {0x78, 0xa4}, {0x79, 0xb3}, {0x7a, 0xc0}, {0x7b, 0xcb}, {0x7c, 0xd5}, {0x7d, 0xde}, {0x7e, 0xe6}, {0x7f, 0xee}, {0x80, 0xf4}, {0x81, 0xfa}, {0x82, 0xff}, {0x03, 0x17}, {0x10, 0xf7}, {0x03, 0x18}, {0x12, 0x20}, {0x10, 0x07}, {0x11, 0x00}, {0x20, 0x05}, {0x21, 0x20}, {0x22, 0x03}, {0x23, 0xd8}, {0x24, 0x00}, {0x25, 0x10}, {0x26, 0x00}, {0x27, 0x0c}, {0x28, 0x05}, {0x29, 0x10}, {0x2a, 0x03}, {0x2b, 0xcc}, {0x2c, 0x09}, {0x2d, 0xc1}, {0x2e, 0x09}, {0x2f, 0xc1}, {0x30, 0x41}, {0x03, 0x20}, {0x11, 0x1c}, {0x18, 0x30}, {0x1a, 0x08}, {0x20, 0x01}, //05_lowtemp Y Mean off {0x21, 0x30}, {0x22, 0x10}, {0x23, 0x00}, {0x24, 0x00}, //Uniform Scene Off {0x28, 0xe7}, {0x29, 0x0d}, //20100305 ad->0d {0x2a, 0xff}, {0x2b, 0x04}, //f4->Adaptive off {0x2c, 0xc2}, {0x2d, 0xcf}, //ff->AE Speed option {0x2e, 0x33}, {0x30, 0x78}, //f8 {0x32, 0x03}, {0x33, 0x2e}, {0x34, 0x30}, {0x35, 0xd4}, {0x36, 0xfe}, {0x37, 0x32}, {0x38, 0x04}, {0x39, 0x22}, //AE_escapeC10 {0x3a, 0xde}, //AE_escapeC11 {0x3b, 0x22}, //AE_escapeC1 {0x3c, 0xde}, //AE_escapeC2 {0x50, 0x45}, {0x51, 0x88}, {0x56, 0x03}, {0x57, 0xf7}, {0x58, 0x14}, {0x59, 0x88}, {0x5a, 0x04}, {0x60, 0x55}, // AEWGT1 {0x61, 0x55}, // AEWGT2 {0x62, 0x6a}, // AEWGT3 {0x63, 0xa9}, // AEWGT4 {0x64, 0x6a}, // AEWGT5 {0x65, 0xa9}, // AEWGT6 {0x66, 0x6a}, // AEWGT7 {0x67, 0xa9}, // AEWGT8 {0x68, 0x6b}, // AEWGT9 {0x69, 0xe9}, // AEWGT10 {0x6a, 0x6a}, // AEWGT11 {0x6b, 0xa9}, // AEWGT12 {0x6c, 0x6a}, // AEWGT13 {0x6d, 0xa9}, // AEWGT14 {0x6e, 0x55}, // AEWGT15 {0x6f, 0x55}, // AEWGT16 {0x70, 0x70}, //6e {0x71, 0x00}, //82(+8)->+0 {0x76, 0x43}, {0x77, 0xe2}, //04 {0x78, 0x23}, //Yth1 {0x79, 0x42}, //Yth2 {0x7a, 0x23}, //23 {0x7b, 0x22}, //22 {0x7d, 0x23}, {0x83, 0x01}, //EXP Normal 33.33 fps {0x84, 0xb7}, {0x85, 0x74}, {0x86, 0x01}, //EXPMin 5859.38 fps {0x87, 0xf4}, {0x88, 0x05}, //EXP Max 10.00 fps {0x89, 0xb8}, {0x8a, 0xd8}, {0x8B, 0x49}, //EXP100 {0x8C, 0x3e}, {0x8D, 0x3c}, //EXP120 {0x8E, 0x8c}, {0x9c, 0x17}, //EXP Limit 488.28 fps {0x9d, 0x70}, {0x9e, 0x01}, //EXP Unit {0x9f, 0xf4}, //AE_Middle Time option //{0xa0, 0x03}, //{0xa1, 0xa9}, //{0xa2, 0x80}, {0xb0, 0x18}, {0xb1, 0x14}, //ADC 400->560 {0xb2, 0xa0}, //d0 {0xb3, 0x18}, {0xb4, 0x1a}, {0xb5, 0x44}, {0xb6, 0x2f}, {0xb7, 0x28}, {0xb8, 0x25}, {0xb9, 0x22}, {0xba, 0x21}, {0xbb, 0x20}, {0xbc, 0x1f}, {0xbd, 0x1f}, //AE_Adaptive Time option //{0xc0, 0x10}, //{0xc1, 0x2b}, //{0xc2, 0x2b}, //{0xc3, 0x2b}, //{0xc4, 0x08}, {0xc8, 0x80}, {0xc9, 0x40}, /////// PAGE 22 START /////// {0x03, 0x22}, {0x10, 0xfd}, {0x11, 0x2e}, {0x19, 0x01}, // Low On // {0x20, 0x30}, {0x21, 0x80}, {0x24, 0x01}, //{0x25, 0x00}, //7f New Lock Cond & New light stable {0x30, 0x80}, {0x31, 0x80}, {0x38, 0x11}, {0x39, 0x34}, {0x40, 0xf4}, {0x41, 0x55}, //44 {0x42, 0x33}, //43 {0x43, 0xf6}, {0x44, 0x55}, //44 {0x45, 0x44}, //33 {0x46, 0x00}, {0x50, 0xb2}, {0x51, 0x81}, {0x52, 0x98}, {0x80, 0x40}, //3e {0x81, 0x20}, {0x82, 0x3e}, {0x83, 0x5e}, //5e {0x84, 0x1e}, //24 {0x85, 0x5e}, //54 //56 //5a {0x86, 0x22}, //24 //22 {0x87, 0x49}, {0x88, 0x39}, {0x89, 0x37}, //38 {0x8a, 0x28}, //2a {0x8b, 0x41}, //47 {0x8c, 0x39}, {0x8d, 0x34}, {0x8e, 0x28}, //2c {0x8f, 0x53}, //4e {0x90, 0x52}, //4d {0x91, 0x51}, //4c {0x92, 0x4e}, //4a {0x93, 0x4a}, //46 {0x94, 0x45}, {0x95, 0x3d}, {0x96, 0x31}, {0x97, 0x28}, {0x98, 0x24}, {0x99, 0x20}, {0x9a, 0x20}, {0x9b, 0x77}, {0x9c, 0x77}, {0x9d, 0x48}, {0x9e, 0x38}, {0x9f, 0x30}, {0xa0, 0x60}, {0xa1, 0x34}, {0xa2, 0x6f}, {0xa3, 0xff}, {0xa4, 0x14}, //1500fps {0xa5, 0x2c}, // 700fps {0xa6, 0xcf}, {0xad, 0x40}, {0xae, 0x4a}, {0xaf, 0x28}, // low temp Rgain {0xb0, 0x26}, // low temp Rgain {0xb1, 0x00}, //0x20 -> 0x00 0405 modify {0xb4, 0xea}, {0xb8, 0xa0}, //a2: b-2, R+2 //b4 B-3, R+4 lowtemp {0xb9, 0x00}, /////// PAGE 20 /////// {0x03, 0x20}, {0x10, 0x8c}, // PAGE 20 {0x03, 0x20}, //page 20 {0x10, 0x9c}, //ae off // PAGE 22 {0x03, 0x22}, //page 22 {0x10, 0xe9}, //awb off // PAGE 0 {0x03, 0x00}, {0x0e, 0x03}, //PLL On {0x0e, 0x73}, //PLLx2 {0x03, 0x00}, // Dummy 750us {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, /* start {0x03, 0x20}, {0x03, 0x00}, {0x20, 0x00}, {0x21, 0x0a}, {0x22, 0x00}, {0x23, 0x0a}, {0x40, 0x01}, //360 {0x41, 0x68}, {0x42, 0x00}, {0x43, 0x14}, {0x03, 0x10}, {0x3f, 0x00}, //Page12 {0x03, 0x12}, {0x20, 0x0f}, {0x21, 0x0f}, {0x90, 0x5d}, //Page13 {0x03, 0x13}, {0x80, 0xfd}, // 1600*1200 {0x03,0x00}, {0x10,0x00}, {0x03, 0x00}, {0x12, 0x21}, {0x03, 0x20}, {0x86, 0x01}, {0x87, 0xf4}, {0x8b, 0x3a}, {0x8c, 0x98}, {0x8d, 0x30}, {0x8e, 0xd4}, {0x9c, 0x17}, {0x9d, 0x70}, {0x9e, 0x01}, {0x9f, 0xf4}, {0x03, 0x20}, {0x03, 0x00}, end*/ {0x03, 0x00}, // Page 0 {0x01, 0xf8}, // Sleep Off 0xf8->0x50 for solve green line issue }; static struct sensor_reg hi253_setting_15fps_XGA_1024_768[] = { /* * Only support 7.5fps for QXGA to workaround screen tearing issue * for 15fps when capturing still image. */ {0x01, 0xf9}, //sleep on {0x08, 0x0f}, //Hi-Z on {0x01, 0xf8}, //sleep off {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x03}, //PLL On {0x0e, 0x73}, //PLLx2 {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x00}, //PLL off {0x01, 0xf1}, //sleep on {0x08, 0x00}, //Hi-Z off {0x01, 0xf3}, {0x01, 0xf1}, {0x03, 0x20}, //page 20 {0x10, 0x1c}, //ae off {0x03, 0x22}, //page 22 {0x10, 0x69}, //awb off {0x03, 0x00}, {0x10, 0x11}, // Sub1/2_Preview2 Mode_H binning {0x11, 0x91}, {0x12, 0x20}, //21 {0x0b, 0xaa}, // ESD Check Register {0x0c, 0xaa}, // ESD Check Register {0x0d, 0xaa}, // ESD Check Register {0x20, 0x00}, // Windowing start point Y {0x21, 0x04}, {0x22, 0x00}, // Windowing start point X {0x23, 0x07}, {0x24, 0x04}, {0x25, 0xb0}, {0x26, 0x06}, {0x27, 0x40}, // WINROW END {0x40, 0x01}, //Hblank 408 {0x41, 0x68}, {0x42, 0x00}, //Vblank 20 {0x43, 0x14}, {0x45, 0x04}, {0x46, 0x18}, {0x47, 0xd8}, {0x80, 0x2e}, {0x81, 0x7e}, {0x82, 0x90}, {0x83, 0x00}, {0x84, 0x0c}, {0x85, 0x00}, {0x90, 0x14}, //BLC_TIME_TH_ON {0x91, 0x14}, //BLC_TIME_TH_OFF {0x92, 0x98}, //BLC_AG_TH_ON {0x93, 0x90}, //BLC_AG_TH_OFF {0x94, 0x75}, {0x95, 0x70}, {0x96, 0xdc}, {0x97, 0xfe}, {0x98, 0x38}, {0x99, 0x43}, {0x9a, 0x43}, {0x9b, 0x43}, {0x9c, 0x43}, {0xa0, 0x00}, {0xa2, 0x00}, {0xa4, 0x00}, {0xa6, 0x00}, {0xa8, 0x43}, {0xaa, 0x43}, {0xac, 0x43}, {0xae, 0x43}, {0x03, 0x02}, {0x12, 0x03}, {0x13, 0x03}, {0x16, 0x00}, {0x17, 0x8C}, {0x18, 0x4c}, //Double_AG off {0x19, 0x00}, {0x1a, 0x39}, //ADC400->560 {0x1c, 0x09}, {0x1d, 0x40}, {0x1e, 0x30}, {0x1f, 0x10}, {0x20, 0x77}, {0x21, 0xde}, {0x22, 0xa7}, {0x23, 0x30}, //CLAMP {0x27, 0x3c}, {0x2b, 0x80}, {0x2e, 0x11}, {0x2f, 0xa1}, {0x30, 0x05}, //For Hi-253 never no change 0x05 {0x50, 0x20}, {0x52, 0x01}, {0x55, 0x1c}, {0x56, 0x11}, {0x5d, 0xa2}, {0x5e, 0x5a}, {0x60, 0x87}, {0x61, 0x99}, {0x62, 0x88}, {0x63, 0x97}, {0x64, 0x88}, {0x65, 0x97}, {0x67, 0x0c}, {0x68, 0x0c}, {0x69, 0x0c}, {0x72, 0x89}, {0x73, 0x96}, {0x74, 0x89}, {0x75, 0x96}, {0x76, 0x89}, {0x77, 0x96}, {0x7c, 0x85}, {0x7d, 0xaf}, {0x80, 0x01}, {0x81, 0x7f}, {0x82, 0x13}, {0x83, 0x24}, {0x84, 0x7d}, {0x85, 0x81}, {0x86, 0x7d}, {0x87, 0x81}, {0x92, 0x48}, {0x93, 0x54}, {0x94, 0x7d}, {0x95, 0x81}, {0x96, 0x7d}, {0x97, 0x81}, {0xa0, 0x02}, {0xa1, 0x7b}, {0xa2, 0x02}, {0xa3, 0x7b}, {0xa4, 0x7b}, {0xa5, 0x02}, {0xa6, 0x7b}, {0xa7, 0x02}, {0xa8, 0x85}, {0xa9, 0x8c}, {0xaa, 0x85}, {0xab, 0x8c}, {0xac, 0x10}, {0xad, 0x16}, {0xae, 0x10}, {0xaf, 0x16}, {0xb0, 0x99}, {0xb1, 0xa3}, {0xb2, 0xa4}, {0xb3, 0xae}, {0xb4, 0x9b}, {0xb5, 0xa2}, {0xb6, 0xa6}, {0xb7, 0xac}, {0xb8, 0x9b}, {0xb9, 0x9f}, {0xba, 0xa6}, {0xbb, 0xaa}, {0xbc, 0x9b}, {0xbd, 0x9f}, {0xbe, 0xa6}, {0xbf, 0xaa}, {0xc4, 0x2c}, {0xc5, 0x43}, {0xc6, 0x63}, {0xc7, 0x79}, {0xc8, 0x2d}, {0xc9, 0x42}, {0xca, 0x2d}, {0xcb, 0x42}, {0xcc, 0x64}, {0xcd, 0x78}, {0xce, 0x64}, {0xcf, 0x78}, {0xd0, 0x0a}, {0xd1, 0x09}, {0xd4, 0x14}, //DCDC_TIME_TH_ON {0xd5, 0x14}, //DCDC_TIME_TH_OFF {0xd6, 0x98}, //DCDC_AG_TH_ON {0xd7, 0x90}, //DCDC_AG_TH_OFF {0xe0, 0xc4}, {0xe1, 0xc4}, {0xe2, 0xc4}, {0xe3, 0xc4}, {0xe4, 0x00}, {0xe8, 0x80}, {0xe9, 0x40}, {0xea, 0x7f}, {0x03, 0x03}, {0x10, 0x10}, {0x03, 0x10}, {0x10, 0x01}, // CrYCbY // For Demoset 0x03 {0x12, 0x30}, {0x13, 0x0a}, // contrast on {0x20, 0x00}, {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x30}, {0x35, 0x00}, {0x36, 0x00}, {0x38, 0x00}, {0x3e, 0x58}, {0x3f, 0x00}, {0x40, 0x80}, // YOFS {0x41, 0x10}, // DYOFS {0x48, 0x84}, // Contrast {0x50, 0x90}, // Contrast {0x60, 0x6c}, //67 {0x61, 0x70}, //7e //8e //88 //80 {0x62, 0x68}, //7e //8e //88 //80 {0x63, 0x50}, //Double_AG 50->30 {0x64, 0x41}, {0x66, 0x42}, {0x67, 0x20}, {0x6a, 0x80}, //8a {0x6b, 0x84}, //74 {0x6c, 0x80}, //7e //7a {0x6d, 0x80}, //8e {0x03, 0x11}, {0x10, 0x7f}, {0x11, 0x40}, {0x12, 0x0a}, /* Blue Max-Filter Delete*/ {0x13, 0xbb}, {0x26, 0x31}, /* Double_AG 31->20*/ {0x27, 0x34}, /* Double_AG 34->22*/ {0x28, 0x0f}, {0x29, 0x10}, {0x2b, 0x30}, {0x2c, 0x32}, {0x30, 0x70}, {0x31, 0x10}, {0x32, 0x58}, {0x33, 0x09}, {0x34, 0x06}, {0x35, 0x03}, {0x36, 0x70}, {0x37, 0x18}, {0x38, 0x58}, {0x39, 0x09}, {0x3a, 0x06}, {0x3b, 0x03}, {0x3c, 0x80}, {0x3d, 0x18}, {0x3e, 0x83}, /*80*/ {0x3f, 0x0c}, {0x40, 0x03}, {0x41, 0x06}, {0x42, 0x80}, {0x43, 0x18}, {0x44, 0x83}, /*80*/ {0x45, 0x12}, {0x46, 0x10}, {0x47, 0x10}, {0x48, 0x90}, {0x49, 0x40}, {0x4a, 0x80}, {0x4b, 0x13}, {0x4c, 0x10}, {0x4d, 0x11}, {0x4e, 0x80}, {0x4f, 0x30}, {0x50, 0x80}, {0x51, 0x13}, {0x52, 0x10}, {0x53, 0x13}, {0x54, 0x11}, {0x55, 0x17}, {0x56, 0x20}, {0x57, 0x01}, {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x1f}, /*18*/ {0x5b, 0x00}, {0x5c, 0x00}, {0x60, 0x3f}, {0x62, 0x60}, {0x70, 0x06}, {0x03, 0x12}, {0x20, 0x00}, {0x21, 0x00}, {0x25, 0x00}, {0x28, 0x00}, {0x29, 0x00}, {0x2a, 0x00}, {0x30, 0x50}, {0x31, 0x18}, {0x32, 0x32}, {0x33, 0x40}, {0x34, 0x50}, {0x35, 0x70}, {0x36, 0xa0}, {0x40, 0xa0}, {0x41, 0x40}, {0x42, 0xa0}, {0x43, 0x90}, {0x44, 0x90}, {0x45, 0x80}, {0x46, 0xb0}, {0x47, 0x55}, {0x48, 0xa0}, {0x49, 0x90}, {0x4a, 0x90}, {0x4b, 0x80}, {0x4c, 0xb0}, {0x4d, 0x40}, {0x4e, 0x90}, {0x4f, 0x90}, {0x50, 0xa0}, {0x51, 0x60}, {0x52, 0xb0}, {0x53, 0x60}, {0x54, 0xc0}, {0x55, 0xc0}, {0x56, 0x80}, {0x57, 0x57}, {0x58, 0x90}, {0x59, 0x40}, {0x5a, 0xd0}, {0x5b, 0xd0}, {0x5c, 0xe0}, {0x5d, 0x80}, {0x5e, 0x88}, {0x5f, 0x40}, {0x60, 0xe0}, {0x61, 0xe0}, {0x62, 0xe0}, {0x63, 0x80}, {0x70, 0x15}, {0x71, 0x01}, /*Don't Touch register*/ {0x72, 0x18}, {0x73, 0x01}, /*Don't Touch register*/ {0x74, 0x25}, {0x75, 0x15}, {0x80, 0x20}, {0x81, 0x40}, {0x82, 0x65}, {0x85, 0x1a}, {0x88, 0x00}, {0x89, 0x00}, {0x90, 0x5d}, /*For Preview*/ /*Dont Touch register*/ {0xD0, 0x0c}, {0xD1, 0x80}, {0xD2, 0x67}, {0xD3, 0x00}, {0xD4, 0x00}, {0xD5, 0x02}, {0xD6, 0xff}, {0xD7, 0x18}, {0x3b, 0x06}, {0x3c, 0x06}, {0xc5, 0x00}, /*55->48*/ {0xc6, 0x00}, /*48->40*/ {0x03, 0x13}, {0x10, 0xcb}, {0x11, 0x7b}, {0x12, 0x07}, {0x14, 0x00}, {0x20, 0x15}, {0x21, 0x13}, {0x22, 0x33}, {0x23, 0x05}, {0x24, 0x09}, {0x25, 0x0a}, {0x26, 0x18}, {0x27, 0x30}, {0x29, 0x12}, {0x2a, 0x50}, {0x2b, 0x02}, {0x2c, 0x02}, {0x25, 0x06}, {0x2d, 0x0c}, {0x2e, 0x12}, {0x2f, 0x12}, {0x50, 0x10}, {0x51, 0x14}, {0x52, 0x12}, {0x53, 0x0c}, {0x54, 0x0f}, {0x55, 0x0c}, {0x56, 0x10}, {0x57, 0x13}, {0x58, 0x12}, {0x59, 0x0c}, {0x5a, 0x0f}, {0x5b, 0x0c}, {0x5c, 0x0a}, {0x5d, 0x0b}, {0x5e, 0x0a}, {0x5f, 0x08}, {0x60, 0x09}, {0x61, 0x08}, {0x62, 0x08}, {0x63, 0x08}, {0x64, 0x08}, {0x65, 0x06}, {0x66, 0x06}, {0x67, 0x06}, {0x68, 0x07}, {0x69, 0x07}, {0x6a, 0x07}, {0x6b, 0x05}, {0x6c, 0x05}, {0x6d, 0x05}, {0x6e, 0x07}, {0x6f, 0x07}, {0x70, 0x07}, {0x71, 0x05}, {0x72, 0x05}, {0x73, 0x05}, {0x80, 0xfd}, {0x81, 0x1f}, {0x82, 0x05}, {0x83, 0x31}, {0x90, 0x05}, {0x91, 0x05}, {0x92, 0x33}, {0x93, 0x30}, {0x94, 0x03}, {0x95, 0x14}, {0x97, 0x20}, {0x99, 0x20}, {0xa0, 0x01}, {0xa1, 0x02}, {0xa2, 0x01}, {0xa3, 0x02}, {0xa4, 0x05}, {0xa5, 0x05}, {0xa6, 0x07}, {0xa7, 0x08}, {0xa8, 0x07}, {0xa9, 0x08}, {0xaa, 0x07}, {0xab, 0x08}, {0xb0, 0x22}, {0xb1, 0x2a}, {0xb2, 0x28}, {0xb3, 0x22}, {0xb4, 0x2a}, {0xb5, 0x28}, {0xb6, 0x22}, {0xb7, 0x2a}, {0xb8, 0x28}, {0xb9, 0x22}, {0xba, 0x2a}, {0xbb, 0x28}, {0xbc, 0x25}, {0xbd, 0x2a}, {0xbe, 0x27}, {0xbf, 0x25}, {0xc0, 0x2a}, {0xc1, 0x27}, {0xc2, 0x1e}, {0xc3, 0x24}, {0xc4, 0x20}, {0xc5, 0x1e}, {0xc6, 0x24}, {0xc7, 0x20}, {0xc8, 0x18}, {0xc9, 0x20}, {0xca, 0x1e}, {0xcb, 0x18}, {0xcc, 0x20}, {0xcd, 0x1e}, {0xce, 0x18}, {0xcf, 0x20}, {0xd0, 0x1e}, {0xd1, 0x18}, {0xd2, 0x20}, {0xd3, 0x1e}, {0x03, 0x14}, {0x10, 0x11}, {0x14, 0x80}, // GX {0x15, 0x80}, // GY {0x16, 0x80}, // RX {0x17, 0x80}, // RY {0x18, 0x80}, // BX {0x19, 0x80}, // BY {0x20, 0x60}, //X 60 //a0 {0x21, 0x80}, //Y {0x22, 0x80}, {0x23, 0x80}, {0x24, 0x80}, {0x30, 0xc8}, {0x31, 0x2b}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x90}, {0x40, 0x48}, //31 {0x50, 0x34}, //23 //32 {0x60, 0x29}, // {0x70, 0x34}, //23 //32 {0x03, 0x15}, {0x10, 0x0f}, {0x14, 0x42}, //CMCOFSGH_Day //4c {0x15, 0x32}, //CMCOFSGM_CWF //3c {0x16, 0x24}, //CMCOFSGL_A //2e {0x17, 0x2f}, //CMC SIGN {0x30, 0x8f}, {0x31, 0x59}, {0x32, 0x0a}, {0x33, 0x15}, {0x34, 0x5b}, {0x35, 0x06}, {0x36, 0x07}, {0x37, 0x40}, {0x38, 0x87}, //86 {0x40, 0x92}, {0x41, 0x1b}, {0x42, 0x89}, {0x43, 0x81}, {0x44, 0x00}, {0x45, 0x01}, {0x46, 0x89}, {0x47, 0x9e}, {0x48, 0x28}, {0x50, 0x02}, {0x51, 0x82}, {0x52, 0x00}, {0x53, 0x07}, {0x54, 0x11}, {0x55, 0x98}, {0x56, 0x00}, {0x57, 0x0b}, {0x58, 0x8b}, {0x80, 0x03}, {0x85, 0x40}, {0x87, 0x02}, {0x88, 0x00}, {0x89, 0x00}, {0x8a, 0x00}, {0x03, 0x16}, {0x10, 0x31}, {0x18, 0x5e}, // Double_AG 5e->37 {0x19, 0x5d}, // Double_AG 5e->36 {0x1a, 0x0e}, {0x1b, 0x01}, {0x1c, 0xdc}, {0x1d, 0xfe}, {0x30, 0x00}, {0x31, 0x0a}, {0x32, 0x1f}, {0x33, 0x33}, {0x34, 0x53}, {0x35, 0x6c}, {0x36, 0x81}, {0x37, 0x94}, {0x38, 0xa4}, {0x39, 0xb3}, {0x3a, 0xc0}, {0x3b, 0xcb}, {0x3c, 0xd5}, {0x3d, 0xde}, {0x3e, 0xe6}, {0x3f, 0xee}, {0x40, 0xf5}, {0x41, 0xfc}, {0x42, 0xff}, {0x50, 0x00}, {0x51, 0x09}, {0x52, 0x1f}, {0x53, 0x37}, {0x54, 0x5b}, {0x55, 0x76}, {0x56, 0x8d}, {0x57, 0xa1}, {0x58, 0xb2}, {0x59, 0xbe}, {0x5a, 0xc9}, {0x5b, 0xd2}, {0x5c, 0xdb}, {0x5d, 0xe3}, {0x5e, 0xeb}, {0x5f, 0xf0}, {0x60, 0xf5}, {0x61, 0xf7}, {0x62, 0xf8}, {0x70, 0x00}, {0x71, 0x08}, {0x72, 0x17}, {0x73, 0x2f}, {0x74, 0x53}, {0x75, 0x6c}, {0x76, 0x81}, {0x77, 0x94}, {0x78, 0xa4}, {0x79, 0xb3}, {0x7a, 0xc0}, {0x7b, 0xcb}, {0x7c, 0xd5}, {0x7d, 0xde}, {0x7e, 0xe6}, {0x7f, 0xee}, {0x80, 0xf4}, {0x81, 0xfa}, {0x82, 0xff}, {0x03, 0x17}, {0x10, 0xf7}, {0x03, 0x18}, {0x12, 0x20}, {0x10, 0x07}, {0x11, 0x00}, {0x20, 0x05}, {0x21, 0x20}, {0x22, 0x03}, {0x23, 0xd8}, {0x24, 0x00}, {0x25, 0x10}, {0x26, 0x00}, {0x27, 0x0c}, {0x28, 0x05}, {0x29, 0x10}, {0x2a, 0x03}, {0x2b, 0xcc}, {0x2c, 0x09}, {0x2d, 0xc1}, {0x2e, 0x09}, {0x2f, 0xc1}, {0x30, 0x41}, {0x03, 0x20}, {0x11, 0x1c}, {0x18, 0x30}, {0x1a, 0x08}, {0x20, 0x01}, //05_lowtemp Y Mean off {0x21, 0x30}, {0x22, 0x10}, {0x23, 0x00}, {0x24, 0x00}, //Uniform Scene Off {0x28, 0xe7}, {0x29, 0x0d}, //20100305 ad->0d {0x2a, 0xff}, {0x2b, 0x04}, //f4->Adaptive off {0x2c, 0xc2}, {0x2d, 0xcf}, //ff->AE Speed option {0x2e, 0x33}, {0x30, 0x78}, //f8 {0x32, 0x03}, {0x33, 0x2e}, {0x34, 0x30}, {0x35, 0xd4}, {0x36, 0xfe}, {0x37, 0x32}, {0x38, 0x04}, {0x39, 0x22}, //AE_escapeC10 {0x3a, 0xde}, //AE_escapeC11 {0x3b, 0x22}, //AE_escapeC1 {0x3c, 0xde}, //AE_escapeC2 {0x50, 0x45}, {0x51, 0x88}, {0x56, 0x03}, {0x57, 0xf7}, {0x58, 0x14}, {0x59, 0x88}, {0x5a, 0x04}, {0x60, 0x55}, // AEWGT1 {0x61, 0x55}, // AEWGT2 {0x62, 0x6a}, // AEWGT3 {0x63, 0xa9}, // AEWGT4 {0x64, 0x6a}, // AEWGT5 {0x65, 0xa9}, // AEWGT6 {0x66, 0x6a}, // AEWGT7 {0x67, 0xa9}, // AEWGT8 {0x68, 0x6b}, // AEWGT9 {0x69, 0xe9}, // AEWGT10 {0x6a, 0x6a}, // AEWGT11 {0x6b, 0xa9}, // AEWGT12 {0x6c, 0x6a}, // AEWGT13 {0x6d, 0xa9}, // AEWGT14 {0x6e, 0x55}, // AEWGT15 {0x6f, 0x55}, // AEWGT16 {0x70, 0x70}, //6e {0x71, 0x00}, //82(+8)->+0 {0x76, 0x43}, {0x77, 0xe2}, //04 {0x78, 0x23}, //Yth1 {0x79, 0x42}, //Yth2 {0x7a, 0x23}, //23 {0x7b, 0x22}, //22 {0x7d, 0x23}, {0x83, 0x01}, //EXP Normal 33.33 fps {0x84, 0xb7}, {0x85, 0x74}, {0x86, 0x01}, //EXPMin 5859.38 fps {0x87, 0xf4}, {0x88, 0x05}, //EXP Max 10.00 fps {0x89, 0xb8}, {0x8a, 0xd8}, {0x8B, 0x49}, //EXP100 {0x8C, 0x3e}, {0x8D, 0x3c}, //EXP120 {0x8E, 0x8c}, {0x9c, 0x17}, //EXP Limit 488.28 fps {0x9d, 0x70}, {0x9e, 0x01}, //EXP Unit {0x9f, 0xf4}, //AE_Middle Time option //{0xa0, 0x03}, //{0xa1, 0xa9}, //{0xa2, 0x80}, {0xb0, 0x18}, {0xb1, 0x14}, //ADC 400->560 {0xb2, 0xa0}, //d0 {0xb3, 0x18}, {0xb4, 0x1a}, {0xb5, 0x44}, {0xb6, 0x2f}, {0xb7, 0x28}, {0xb8, 0x25}, {0xb9, 0x22}, {0xba, 0x21}, {0xbb, 0x20}, {0xbc, 0x1f}, {0xbd, 0x1f}, //AE_Adaptive Time option //{0xc0, 0x10}, //{0xc1, 0x2b}, //{0xc2, 0x2b}, //{0xc3, 0x2b}, //{0xc4, 0x08}, {0xc8, 0x80}, {0xc9, 0x40}, /////// PAGE 22 START /////// {0x03, 0x22}, {0x10, 0xfd}, {0x11, 0x2e}, {0x19, 0x01}, // Low On // {0x20, 0x30}, {0x21, 0x80}, {0x24, 0x01}, //{0x25, 0x00}, //7f New Lock Cond & New light stable {0x30, 0x80}, {0x31, 0x80}, {0x38, 0x11}, {0x39, 0x34}, {0x40, 0xf4}, {0x41, 0x55}, //44 {0x42, 0x33}, //43 {0x43, 0xf6}, {0x44, 0x55}, //44 {0x45, 0x44}, //33 {0x46, 0x00}, {0x50, 0xb2}, {0x51, 0x81}, {0x52, 0x98}, {0x80, 0x40}, //3e {0x81, 0x20}, {0x82, 0x3e}, {0x83, 0x5e}, //5e {0x84, 0x1e}, //24 {0x85, 0x5e}, //54 //56 //5a {0x86, 0x22}, //24 //22 {0x87, 0x49}, {0x88, 0x39}, {0x89, 0x37}, //38 {0x8a, 0x28}, //2a {0x8b, 0x41}, //47 {0x8c, 0x39}, {0x8d, 0x34}, {0x8e, 0x28}, //2c {0x8f, 0x53}, //4e {0x90, 0x52}, //4d {0x91, 0x51}, //4c {0x92, 0x4e}, //4a {0x93, 0x4a}, //46 {0x94, 0x45}, {0x95, 0x3d}, {0x96, 0x31}, {0x97, 0x28}, {0x98, 0x24}, {0x99, 0x20}, {0x9a, 0x20}, {0x9b, 0x77}, {0x9c, 0x77}, {0x9d, 0x48}, {0x9e, 0x38}, {0x9f, 0x30}, {0xa0, 0x60}, {0xa1, 0x34}, {0xa2, 0x6f}, {0xa3, 0xff}, {0xa4, 0x14}, //1500fps {0xa5, 0x2c}, // 700fps {0xa6, 0xcf}, {0xad, 0x40}, {0xae, 0x4a}, {0xaf, 0x28}, // low temp Rgain {0xb0, 0x26}, // low temp Rgain {0xb1, 0x00}, //0x20 -> 0x00 0405 modify {0xb4, 0xea}, {0xb8, 0xa0}, //a2: b-2, R+2 //b4 B-3, R+4 lowtemp {0xb9, 0x00}, /////// PAGE 20 /////// {0x03, 0x20}, {0x10, 0x8c}, // PAGE 20 {0x03, 0x20}, //page 20 {0x10, 0x9c}, //ae off // PAGE 22 {0x03, 0x22}, //page 22 {0x10, 0xe9}, //awb off // PAGE 0 {0x03, 0x00}, {0x0e, 0x03}, //PLL On {0x0e, 0x73}, //PLLx2 {0x03, 0x00}, // Dummy 750us {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, /*1024*768 add by joe*/ {0x03, 0x00}, {0x10, 0x00}, {0x03, 0x18}, {0x12, 0x20}, {0x10, 0x07}, {0x11, 0x00}, {0x20, 0x05}, {0x21, 0x20}, {0x22, 0x03}, {0x23, 0xd8}, {0x24, 0x00}, {0x25, 0x90}, {0x26, 0x00}, {0x27, 0x6c}, {0x28, 0x04}, {0x29, 0x90}, {0x2a, 0x03}, {0x2b, 0x6c}, {0x2c, 0x09}, {0x2d, 0xc1}, {0x2e, 0x09}, {0x2f, 0xc1}, {0x30, 0x56}, {0x03, 0x00}, // Page 0 {0x01, 0xf8}, // Sleep Off 0xf8->0x50 for solve green line issue }; static struct sensor_reg hi253_setting_30fps_XGA_1024_768[] = { {0x0, 0x0} }; static struct sensor_reg hi253_setting_15fps_VGA_640_480[] = { /* * Only support 7.5fps for QXGA to workaround screen tearing issue * for 15fps when capturing still image. */ {0x01, 0xf9}, //sleep on {0x08, 0x0f}, //Hi-Z on {0x01, 0xf8}, //sleep off {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x03}, //PLL On {0x0e, 0x73}, //PLLx2 {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x00}, //PLL off {0x01, 0xf1}, //sleep on {0x08, 0x00}, //Hi-Z off {0x01, 0xf3}, {0x01, 0xf1}, {0x03, 0x20}, //page 20 {0x10, 0x1c}, //ae off {0x03, 0x22}, //page 22 {0x10, 0x69}, //awb off {0x03, 0x00}, {0x10, 0x11}, // Sub1/2_Preview2 Mode_H binning {0x11, 0x91}, {0x12, 0x20}, //21 {0x0b, 0xaa}, // ESD Check Register {0x0c, 0xaa}, // ESD Check Register {0x0d, 0xaa}, // ESD Check Register {0x20, 0x00}, // Windowing start point Y {0x21, 0x04}, {0x22, 0x00}, // Windowing start point X {0x23, 0x07}, {0x24, 0x04}, {0x25, 0xb0}, {0x26, 0x06}, {0x27, 0x40}, // WINROW END {0x40, 0x01}, //Hblank 408 {0x41, 0x68}, {0x42, 0x00}, //Vblank 20 {0x43, 0x14}, {0x45, 0x04}, {0x46, 0x18}, {0x47, 0xd8}, {0x80, 0x2e}, {0x81, 0x7e}, {0x82, 0x90}, {0x83, 0x00}, {0x84, 0x0c}, {0x85, 0x00}, {0x90, 0x14}, //BLC_TIME_TH_ON {0x91, 0x14}, //BLC_TIME_TH_OFF {0x92, 0x98}, //BLC_AG_TH_ON {0x93, 0x90}, //BLC_AG_TH_OFF {0x94, 0x75}, {0x95, 0x70}, {0x96, 0xdc}, {0x97, 0xfe}, {0x98, 0x38}, {0x99, 0x43}, {0x9a, 0x43}, {0x9b, 0x43}, {0x9c, 0x43}, {0xa0, 0x00}, {0xa2, 0x00}, {0xa4, 0x00}, {0xa6, 0x00}, {0xa8, 0x43}, {0xaa, 0x43}, {0xac, 0x43}, {0xae, 0x43}, {0x03, 0x02}, {0x12, 0x03}, {0x13, 0x03}, {0x16, 0x00}, {0x17, 0x8C}, {0x18, 0x4c}, //Double_AG off {0x19, 0x00}, {0x1a, 0x39}, //ADC400->560 {0x1c, 0x09}, {0x1d, 0x40}, {0x1e, 0x30}, {0x1f, 0x10}, {0x20, 0x77}, {0x21, 0xde}, {0x22, 0xa7}, {0x23, 0x30}, //CLAMP {0x27, 0x3c}, {0x2b, 0x80}, {0x2e, 0x11}, {0x2f, 0xa1}, {0x30, 0x05}, //For Hi-253 never no change 0x05 {0x50, 0x20}, {0x52, 0x01}, {0x55, 0x1c}, {0x56, 0x11}, {0x5d, 0xa2}, {0x5e, 0x5a}, {0x60, 0x87}, {0x61, 0x99}, {0x62, 0x88}, {0x63, 0x97}, {0x64, 0x88}, {0x65, 0x97}, {0x67, 0x0c}, {0x68, 0x0c}, {0x69, 0x0c}, {0x72, 0x89}, {0x73, 0x96}, {0x74, 0x89}, {0x75, 0x96}, {0x76, 0x89}, {0x77, 0x96}, {0x7c, 0x85}, {0x7d, 0xaf}, {0x80, 0x01}, {0x81, 0x7f}, {0x82, 0x13}, {0x83, 0x24}, {0x84, 0x7d}, {0x85, 0x81}, {0x86, 0x7d}, {0x87, 0x81}, {0x92, 0x48}, {0x93, 0x54}, {0x94, 0x7d}, {0x95, 0x81}, {0x96, 0x7d}, {0x97, 0x81}, {0xa0, 0x02}, {0xa1, 0x7b}, {0xa2, 0x02}, {0xa3, 0x7b}, {0xa4, 0x7b}, {0xa5, 0x02}, {0xa6, 0x7b}, {0xa7, 0x02}, {0xa8, 0x85}, {0xa9, 0x8c}, {0xaa, 0x85}, {0xab, 0x8c}, {0xac, 0x10}, {0xad, 0x16}, {0xae, 0x10}, {0xaf, 0x16}, {0xb0, 0x99}, {0xb1, 0xa3}, {0xb2, 0xa4}, {0xb3, 0xae}, {0xb4, 0x9b}, {0xb5, 0xa2}, {0xb6, 0xa6}, {0xb7, 0xac}, {0xb8, 0x9b}, {0xb9, 0x9f}, {0xba, 0xa6}, {0xbb, 0xaa}, {0xbc, 0x9b}, {0xbd, 0x9f}, {0xbe, 0xa6}, {0xbf, 0xaa}, {0xc4, 0x2c}, {0xc5, 0x43}, {0xc6, 0x63}, {0xc7, 0x79}, {0xc8, 0x2d}, {0xc9, 0x42}, {0xca, 0x2d}, {0xcb, 0x42}, {0xcc, 0x64}, {0xcd, 0x78}, {0xce, 0x64}, {0xcf, 0x78}, {0xd0, 0x0a}, {0xd1, 0x09}, {0xd4, 0x14}, //DCDC_TIME_TH_ON {0xd5, 0x14}, //DCDC_TIME_TH_OFF {0xd6, 0x98}, //DCDC_AG_TH_ON {0xd7, 0x90}, //DCDC_AG_TH_OFF {0xe0, 0xc4}, {0xe1, 0xc4}, {0xe2, 0xc4}, {0xe3, 0xc4}, {0xe4, 0x00}, {0xe8, 0x80}, {0xe9, 0x40}, {0xea, 0x7f}, {0x03, 0x03}, {0x10, 0x10}, {0x03, 0x10}, {0x10, 0x01}, // CrYCbY // For Demoset 0x03 {0x12, 0x30}, {0x13, 0x0a}, // contrast on {0x20, 0x00}, {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x30}, {0x35, 0x00}, {0x36, 0x00}, {0x38, 0x00}, {0x3e, 0x58}, {0x3f, 0x00}, {0x40, 0x80}, // YOFS {0x41, 0x10}, // DYOFS {0x48, 0x84}, // Contrast {0x50, 0x90}, // Contrast {0x60, 0x6c}, //67 {0x61, 0x70}, //7e //8e //88 //80 {0x62, 0x68}, //7e //8e //88 //80 {0x63, 0x50}, //Double_AG 50->30 {0x64, 0x41}, {0x66, 0x42}, {0x67, 0x20}, {0x6a, 0x80}, //8a {0x6b, 0x84}, //74 {0x6c, 0x80}, //7e //7a {0x6d, 0x80}, //8e {0x03, 0x11}, {0x10, 0x7f}, {0x11, 0x40}, {0x12, 0x0a}, /* Blue Max-Filter Delete*/ {0x13, 0xbb}, {0x26, 0x31}, /* Double_AG 31->20*/ {0x27, 0x34}, /* Double_AG 34->22*/ {0x28, 0x0f}, {0x29, 0x10}, {0x2b, 0x30}, {0x2c, 0x32}, {0x30, 0x70}, {0x31, 0x10}, {0x32, 0x58}, {0x33, 0x09}, {0x34, 0x06}, {0x35, 0x03}, {0x36, 0x70}, {0x37, 0x18}, {0x38, 0x58}, {0x39, 0x09}, {0x3a, 0x06}, {0x3b, 0x03}, {0x3c, 0x80}, {0x3d, 0x18}, {0x3e, 0x83}, /*80*/ {0x3f, 0x0c}, {0x40, 0x03}, {0x41, 0x06}, {0x42, 0x80}, {0x43, 0x18}, {0x44, 0x83}, /*80*/ {0x45, 0x12}, {0x46, 0x10}, {0x47, 0x10}, {0x48, 0x90}, {0x49, 0x40}, {0x4a, 0x80}, {0x4b, 0x13}, {0x4c, 0x10}, {0x4d, 0x11}, {0x4e, 0x80}, {0x4f, 0x30}, {0x50, 0x80}, {0x51, 0x13}, {0x52, 0x10}, {0x53, 0x13}, {0x54, 0x11}, {0x55, 0x17}, {0x56, 0x20}, {0x57, 0x01}, {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x1f}, /*18*/ {0x5b, 0x00}, {0x5c, 0x00}, {0x60, 0x3f}, {0x62, 0x60}, {0x70, 0x06}, {0x03, 0x12}, {0x20, 0x00}, {0x21, 0x00}, {0x25, 0x00}, {0x28, 0x00}, {0x29, 0x00}, {0x2a, 0x00}, {0x30, 0x50}, {0x31, 0x18}, {0x32, 0x32}, {0x33, 0x40}, {0x34, 0x50}, {0x35, 0x70}, {0x36, 0xa0}, {0x40, 0xa0}, {0x41, 0x40}, {0x42, 0xa0}, {0x43, 0x90}, {0x44, 0x90}, {0x45, 0x80}, {0x46, 0xb0}, {0x47, 0x55}, {0x48, 0xa0}, {0x49, 0x90}, {0x4a, 0x90}, {0x4b, 0x80}, {0x4c, 0xb0}, {0x4d, 0x40}, {0x4e, 0x90}, {0x4f, 0x90}, {0x50, 0xa0}, {0x51, 0x60}, {0x52, 0xb0}, {0x53, 0x60}, {0x54, 0xc0}, {0x55, 0xc0}, {0x56, 0x80}, {0x57, 0x57}, {0x58, 0x90}, {0x59, 0x40}, {0x5a, 0xd0}, {0x5b, 0xd0}, {0x5c, 0xe0}, {0x5d, 0x80}, {0x5e, 0x88}, {0x5f, 0x40}, {0x60, 0xe0}, {0x61, 0xe0}, {0x62, 0xe0}, {0x63, 0x80}, {0x70, 0x15}, {0x71, 0x01}, /*Don't Touch register*/ {0x72, 0x18}, {0x73, 0x01}, /*Don't Touch register*/ {0x74, 0x25}, {0x75, 0x15}, {0x80, 0x20}, {0x81, 0x40}, {0x82, 0x65}, {0x85, 0x1a}, {0x88, 0x00}, {0x89, 0x00}, {0x90, 0x5d}, /*For Preview*/ /*Dont Touch register*/ {0xD0, 0x0c}, {0xD1, 0x80}, {0xD2, 0x67}, {0xD3, 0x00}, {0xD4, 0x00}, {0xD5, 0x02}, {0xD6, 0xff}, {0xD7, 0x18}, {0x3b, 0x06}, {0x3c, 0x06}, {0xc5, 0x00}, /*55->48*/ {0xc6, 0x00}, /*48->40*/ {0x03, 0x13}, {0x10, 0xcb}, {0x11, 0x7b}, {0x12, 0x07}, {0x14, 0x00}, {0x20, 0x15}, {0x21, 0x13}, {0x22, 0x33}, {0x23, 0x05}, {0x24, 0x09}, {0x25, 0x0a}, {0x26, 0x18}, {0x27, 0x30}, {0x29, 0x12}, {0x2a, 0x50}, {0x2b, 0x02}, {0x2c, 0x02}, {0x25, 0x06}, {0x2d, 0x0c}, {0x2e, 0x12}, {0x2f, 0x12}, {0x50, 0x10}, {0x51, 0x14}, {0x52, 0x12}, {0x53, 0x0c}, {0x54, 0x0f}, {0x55, 0x0c}, {0x56, 0x10}, {0x57, 0x13}, {0x58, 0x12}, {0x59, 0x0c}, {0x5a, 0x0f}, {0x5b, 0x0c}, {0x5c, 0x0a}, {0x5d, 0x0b}, {0x5e, 0x0a}, {0x5f, 0x08}, {0x60, 0x09}, {0x61, 0x08}, {0x62, 0x08}, {0x63, 0x08}, {0x64, 0x08}, {0x65, 0x06}, {0x66, 0x06}, {0x67, 0x06}, {0x68, 0x07}, {0x69, 0x07}, {0x6a, 0x07}, {0x6b, 0x05}, {0x6c, 0x05}, {0x6d, 0x05}, {0x6e, 0x07}, {0x6f, 0x07}, {0x70, 0x07}, {0x71, 0x05}, {0x72, 0x05}, {0x73, 0x05}, {0x80, 0xfd}, {0x81, 0x1f}, {0x82, 0x05}, {0x83, 0x31}, {0x90, 0x05}, {0x91, 0x05}, {0x92, 0x33}, {0x93, 0x30}, {0x94, 0x03}, {0x95, 0x14}, {0x97, 0x20}, {0x99, 0x20}, {0xa0, 0x01}, {0xa1, 0x02}, {0xa2, 0x01}, {0xa3, 0x02}, {0xa4, 0x05}, {0xa5, 0x05}, {0xa6, 0x07}, {0xa7, 0x08}, {0xa8, 0x07}, {0xa9, 0x08}, {0xaa, 0x07}, {0xab, 0x08}, {0xb0, 0x22}, {0xb1, 0x2a}, {0xb2, 0x28}, {0xb3, 0x22}, {0xb4, 0x2a}, {0xb5, 0x28}, {0xb6, 0x22}, {0xb7, 0x2a}, {0xb8, 0x28}, {0xb9, 0x22}, {0xba, 0x2a}, {0xbb, 0x28}, {0xbc, 0x25}, {0xbd, 0x2a}, {0xbe, 0x27}, {0xbf, 0x25}, {0xc0, 0x2a}, {0xc1, 0x27}, {0xc2, 0x1e}, {0xc3, 0x24}, {0xc4, 0x20}, {0xc5, 0x1e}, {0xc6, 0x24}, {0xc7, 0x20}, {0xc8, 0x18}, {0xc9, 0x20}, {0xca, 0x1e}, {0xcb, 0x18}, {0xcc, 0x20}, {0xcd, 0x1e}, {0xce, 0x18}, {0xcf, 0x20}, {0xd0, 0x1e}, {0xd1, 0x18}, {0xd2, 0x20}, {0xd3, 0x1e}, {0x03, 0x14}, {0x10, 0x11}, {0x14, 0x80}, // GX {0x15, 0x80}, // GY {0x16, 0x80}, // RX {0x17, 0x80}, // RY {0x18, 0x80}, // BX {0x19, 0x80}, // BY {0x20, 0x60}, //X 60 //a0 {0x21, 0x80}, //Y {0x22, 0x80}, {0x23, 0x80}, {0x24, 0x80}, {0x30, 0xc8}, {0x31, 0x2b}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x90}, {0x40, 0x48}, //31 {0x50, 0x34}, //23 //32 {0x60, 0x29}, // {0x70, 0x34}, //23 //32 {0x03, 0x15}, {0x10, 0x0f}, {0x14, 0x42}, //CMCOFSGH_Day //4c {0x15, 0x32}, //CMCOFSGM_CWF //3c {0x16, 0x24}, //CMCOFSGL_A //2e {0x17, 0x2f}, //CMC SIGN {0x30, 0x8f}, {0x31, 0x59}, {0x32, 0x0a}, {0x33, 0x15}, {0x34, 0x5b}, {0x35, 0x06}, {0x36, 0x07}, {0x37, 0x40}, {0x38, 0x87}, //86 {0x40, 0x92}, {0x41, 0x1b}, {0x42, 0x89}, {0x43, 0x81}, {0x44, 0x00}, {0x45, 0x01}, {0x46, 0x89}, {0x47, 0x9e}, {0x48, 0x28}, {0x50, 0x02}, {0x51, 0x82}, {0x52, 0x00}, {0x53, 0x07}, {0x54, 0x11}, {0x55, 0x98}, {0x56, 0x00}, {0x57, 0x0b}, {0x58, 0x8b}, {0x80, 0x03}, {0x85, 0x40}, {0x87, 0x02}, {0x88, 0x00}, {0x89, 0x00}, {0x8a, 0x00}, {0x03, 0x16}, {0x10, 0x31}, {0x18, 0x5e}, // Double_AG 5e->37 {0x19, 0x5d}, // Double_AG 5e->36 {0x1a, 0x0e}, {0x1b, 0x01}, {0x1c, 0xdc}, {0x1d, 0xfe}, {0x30, 0x00}, {0x31, 0x0a}, {0x32, 0x1f}, {0x33, 0x33}, {0x34, 0x53}, {0x35, 0x6c}, {0x36, 0x81}, {0x37, 0x94}, {0x38, 0xa4}, {0x39, 0xb3}, {0x3a, 0xc0}, {0x3b, 0xcb}, {0x3c, 0xd5}, {0x3d, 0xde}, {0x3e, 0xe6}, {0x3f, 0xee}, {0x40, 0xf5}, {0x41, 0xfc}, {0x42, 0xff}, {0x50, 0x00}, {0x51, 0x09}, {0x52, 0x1f}, {0x53, 0x37}, {0x54, 0x5b}, {0x55, 0x76}, {0x56, 0x8d}, {0x57, 0xa1}, {0x58, 0xb2}, {0x59, 0xbe}, {0x5a, 0xc9}, {0x5b, 0xd2}, {0x5c, 0xdb}, {0x5d, 0xe3}, {0x5e, 0xeb}, {0x5f, 0xf0}, {0x60, 0xf5}, {0x61, 0xf7}, {0x62, 0xf8}, {0x70, 0x00}, {0x71, 0x08}, {0x72, 0x17}, {0x73, 0x2f}, {0x74, 0x53}, {0x75, 0x6c}, {0x76, 0x81}, {0x77, 0x94}, {0x78, 0xa4}, {0x79, 0xb3}, {0x7a, 0xc0}, {0x7b, 0xcb}, {0x7c, 0xd5}, {0x7d, 0xde}, {0x7e, 0xe6}, {0x7f, 0xee}, {0x80, 0xf4}, {0x81, 0xfa}, {0x82, 0xff}, {0x03, 0x17}, {0x10, 0xf7}, {0x03, 0x18}, {0x12, 0x20}, {0x10, 0x07}, {0x11, 0x00}, {0x20, 0x05}, {0x21, 0x20}, {0x22, 0x03}, {0x23, 0xd8}, {0x24, 0x00}, {0x25, 0x10}, {0x26, 0x00}, {0x27, 0x0c}, {0x28, 0x05}, {0x29, 0x10}, {0x2a, 0x03}, {0x2b, 0xcc}, {0x2c, 0x09}, {0x2d, 0xc1}, {0x2e, 0x09}, {0x2f, 0xc1}, {0x30, 0x41}, {0x03, 0x20}, {0x11, 0x1c}, {0x18, 0x30}, {0x1a, 0x08}, {0x20, 0x01}, //05_lowtemp Y Mean off {0x21, 0x30}, {0x22, 0x10}, {0x23, 0x00}, {0x24, 0x00}, //Uniform Scene Off {0x28, 0xe7}, {0x29, 0x0d}, //20100305 ad->0d {0x2a, 0xff}, {0x2b, 0x04}, //f4->Adaptive off {0x2c, 0xc2}, {0x2d, 0xcf}, //ff->AE Speed option {0x2e, 0x33}, {0x30, 0x78}, //f8 {0x32, 0x03}, {0x33, 0x2e}, {0x34, 0x30}, {0x35, 0xd4}, {0x36, 0xfe}, {0x37, 0x32}, {0x38, 0x04}, {0x39, 0x22}, //AE_escapeC10 {0x3a, 0xde}, //AE_escapeC11 {0x3b, 0x22}, //AE_escapeC1 {0x3c, 0xde}, //AE_escapeC2 {0x50, 0x45}, {0x51, 0x88}, {0x56, 0x03}, {0x57, 0xf7}, {0x58, 0x14}, {0x59, 0x88}, {0x5a, 0x04}, {0x60, 0x55}, // AEWGT1 {0x61, 0x55}, // AEWGT2 {0x62, 0x6a}, // AEWGT3 {0x63, 0xa9}, // AEWGT4 {0x64, 0x6a}, // AEWGT5 {0x65, 0xa9}, // AEWGT6 {0x66, 0x6a}, // AEWGT7 {0x67, 0xa9}, // AEWGT8 {0x68, 0x6b}, // AEWGT9 {0x69, 0xe9}, // AEWGT10 {0x6a, 0x6a}, // AEWGT11 {0x6b, 0xa9}, // AEWGT12 {0x6c, 0x6a}, // AEWGT13 {0x6d, 0xa9}, // AEWGT14 {0x6e, 0x55}, // AEWGT15 {0x6f, 0x55}, // AEWGT16 {0x70, 0x70}, //6e {0x71, 0x00}, //82(+8)->+0 {0x76, 0x43}, {0x77, 0xe2}, //04 {0x78, 0x23}, //Yth1 {0x79, 0x42}, //Yth2 {0x7a, 0x23}, //23 {0x7b, 0x22}, //22 {0x7d, 0x23}, {0x83, 0x01}, //EXP Normal 33.33 fps {0x84, 0xb7}, {0x85, 0x74}, {0x86, 0x01}, //EXPMin 5859.38 fps {0x87, 0xf4}, {0x88, 0x05}, //EXP Max 10.00 fps {0x89, 0xb8}, {0x8a, 0xd8}, {0x8B, 0x49}, //EXP100 {0x8C, 0x3e}, {0x8D, 0x3c}, //EXP120 {0x8E, 0x8c}, {0x9c, 0x17}, //EXP Limit 488.28 fps {0x9d, 0x70}, {0x9e, 0x01}, //EXP Unit {0x9f, 0xf4}, //AE_Middle Time option //{0xa0, 0x03}, //{0xa1, 0xa9}, //{0xa2, 0x80}, {0xb0, 0x18}, {0xb1, 0x14}, //ADC 400->560 {0xb2, 0xa0}, //d0 {0xb3, 0x18}, {0xb4, 0x1a}, {0xb5, 0x44}, {0xb6, 0x2f}, {0xb7, 0x28}, {0xb8, 0x25}, {0xb9, 0x22}, {0xba, 0x21}, {0xbb, 0x20}, {0xbc, 0x1f}, {0xbd, 0x1f}, //AE_Adaptive Time option //{0xc0, 0x10}, //{0xc1, 0x2b}, //{0xc2, 0x2b}, //{0xc3, 0x2b}, //{0xc4, 0x08}, {0xc8, 0x80}, {0xc9, 0x40}, /////// PAGE 22 START /////// {0x03, 0x22}, {0x10, 0xfd}, {0x11, 0x2e}, {0x19, 0x01}, // Low On // {0x20, 0x30}, {0x21, 0x80}, {0x24, 0x01}, //{0x25, 0x00}, //7f New Lock Cond & New light stable {0x30, 0x80}, {0x31, 0x80}, {0x38, 0x11}, {0x39, 0x34}, {0x40, 0xf4}, {0x41, 0x55}, //44 {0x42, 0x33}, //43 {0x43, 0xf6}, {0x44, 0x55}, //44 {0x45, 0x44}, //33 {0x46, 0x00}, {0x50, 0xb2}, {0x51, 0x81}, {0x52, 0x98}, {0x80, 0x40}, //3e {0x81, 0x20}, {0x82, 0x3e}, {0x83, 0x5e}, //5e {0x84, 0x1e}, //24 {0x85, 0x5e}, //54 //56 //5a {0x86, 0x22}, //24 //22 {0x87, 0x49}, {0x88, 0x39}, {0x89, 0x37}, //38 {0x8a, 0x28}, //2a {0x8b, 0x41}, //47 {0x8c, 0x39}, {0x8d, 0x34}, {0x8e, 0x28}, //2c {0x8f, 0x53}, //4e {0x90, 0x52}, //4d {0x91, 0x51}, //4c {0x92, 0x4e}, //4a {0x93, 0x4a}, //46 {0x94, 0x45}, {0x95, 0x3d}, {0x96, 0x31}, {0x97, 0x28}, {0x98, 0x24}, {0x99, 0x20}, {0x9a, 0x20}, {0x9b, 0x77}, {0x9c, 0x77}, {0x9d, 0x48}, {0x9e, 0x38}, {0x9f, 0x30}, {0xa0, 0x60}, {0xa1, 0x34}, {0xa2, 0x6f}, {0xa3, 0xff}, {0xa4, 0x14}, //1500fps {0xa5, 0x2c}, // 700fps {0xa6, 0xcf}, {0xad, 0x40}, {0xae, 0x4a}, {0xaf, 0x28}, // low temp Rgain {0xb0, 0x26}, // low temp Rgain {0xb1, 0x00}, //0x20 -> 0x00 0405 modify {0xb4, 0xea}, {0xb8, 0xa0}, //a2: b-2, R+2 //b4 B-3, R+4 lowtemp {0xb9, 0x00}, /////// PAGE 20 /////// {0x03, 0x20}, {0x10, 0x8c}, // PAGE 20 {0x03, 0x20}, //page 20 {0x10, 0x9c}, //ae off // PAGE 22 {0x03, 0x22}, //page 22 {0x10, 0xe9}, //awb off // PAGE 0 {0x03, 0x00}, {0x0e, 0x03}, //PLL On {0x0e, 0x73}, //PLLx2 {0x03, 0x00}, // Dummy 750us {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, /*640*480 */ {0x03, 0x00}, {0x10, 0x11},// {0x20, 0x00}, {0x21, 0x07}, {0x22, 0x00}, {0x23, 0x20}, {0x24, 0x03}, {0x25, 0xc0}, {0x26, 0x05}, {0x27, 0x00}, {0x03, 0x18}, {0x10, 0x07}, {0x11, 0x00}, {0x12, 0x20}, {0x20, 0x05}, {0x21, 0x00}, {0x22, 0x03}, {0x23, 0xc0}, {0x24, 0x00}, {0x25, 0x04}, {0x26, 0x00}, {0x27, 0x04}, {0x28, 0x05}, {0x29, 0x04}, {0x2a, 0x03}, {0x2b, 0xc4}, {0x2c, 0x0a}, {0x2d, 0x00}, {0x2e, 0x0a}, {0x2f, 0x00}, {0x30, 0x41}, //41->44 {0x03, 0x00}, // Page 0 {0x01, 0xf8}, // Sleep Off 0xf8->0x50 for solve green line issue }; static struct sensor_reg hi253_setting_30fps_VGA_640_480[] = { /* * Only support 7.5fps for QXGA to workaround screen tearing issue * for 15fps when capturing still image. */ {0x01, 0xf9}, //sleep on {0x08, 0x0f}, //Hi-Z on {0x01, 0xf8}, //sleep off {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x03}, //PLL On {0x0e, 0x73}, //PLLx2 {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x00}, //PLL off {0x01, 0xf1}, //sleep on {0x08, 0x00}, //Hi-Z off {0x01, 0xf3}, {0x01, 0xf1}, {0x03, 0x20}, //page 20 {0x10, 0x1c}, //ae off {0x03, 0x22}, //page 22 {0x10, 0x69}, //awb off {0x03, 0x00}, {0x10, 0x11}, // Sub1/2_Preview2 Mode_H binning {0x11, 0x91}, {0x12, 0x20}, //21 {0x0b, 0xaa}, // ESD Check Register {0x0c, 0xaa}, // ESD Check Register {0x0d, 0xaa}, // ESD Check Register {0x20, 0x00}, // Windowing start point Y {0x21, 0x04}, {0x22, 0x00}, // Windowing start point X {0x23, 0x07}, {0x24, 0x04}, {0x25, 0xb0}, {0x26, 0x06}, {0x27, 0x40}, // WINROW END {0x40, 0x01}, //Hblank 408 {0x41, 0x68}, {0x42, 0x00}, //Vblank 20 {0x43, 0x14}, {0x45, 0x04}, {0x46, 0x18}, {0x47, 0xd8}, {0x80, 0x2e}, {0x81, 0x7e}, {0x82, 0x90}, {0x83, 0x00}, {0x84, 0x0c}, {0x85, 0x00}, {0x90, 0x14}, //BLC_TIME_TH_ON {0x91, 0x14}, //BLC_TIME_TH_OFF {0x92, 0x98}, //BLC_AG_TH_ON {0x93, 0x90}, //BLC_AG_TH_OFF {0x94, 0x75}, {0x95, 0x70}, {0x96, 0xdc}, {0x97, 0xfe}, {0x98, 0x38}, {0x99, 0x43}, {0x9a, 0x43}, {0x9b, 0x43}, {0x9c, 0x43}, {0xa0, 0x00}, {0xa2, 0x00}, {0xa4, 0x00}, {0xa6, 0x00}, {0xa8, 0x43}, {0xaa, 0x43}, {0xac, 0x43}, {0xae, 0x43}, {0x03, 0x02}, {0x12, 0x03}, {0x13, 0x03}, {0x16, 0x00}, {0x17, 0x8C}, {0x18, 0x4c}, //Double_AG off {0x19, 0x00}, {0x1a, 0x39}, //ADC400->560 {0x1c, 0x09}, {0x1d, 0x40}, {0x1e, 0x30}, {0x1f, 0x10}, {0x20, 0x77}, {0x21, 0xde}, {0x22, 0xa7}, {0x23, 0x30}, //CLAMP {0x27, 0x3c}, {0x2b, 0x80}, {0x2e, 0x11}, {0x2f, 0xa1}, {0x30, 0x05}, //For Hi-253 never no change 0x05 {0x50, 0x20}, {0x52, 0x01}, {0x55, 0x1c}, {0x56, 0x11}, {0x5d, 0xa2}, {0x5e, 0x5a}, {0x60, 0x87}, {0x61, 0x99}, {0x62, 0x88}, {0x63, 0x97}, {0x64, 0x88}, {0x65, 0x97}, {0x67, 0x0c}, {0x68, 0x0c}, {0x69, 0x0c}, {0x72, 0x89}, {0x73, 0x96}, {0x74, 0x89}, {0x75, 0x96}, {0x76, 0x89}, {0x77, 0x96}, {0x7c, 0x85}, {0x7d, 0xaf}, {0x80, 0x01}, {0x81, 0x7f}, {0x82, 0x13}, {0x83, 0x24}, {0x84, 0x7d}, {0x85, 0x81}, {0x86, 0x7d}, {0x87, 0x81}, {0x92, 0x48}, {0x93, 0x54}, {0x94, 0x7d}, {0x95, 0x81}, {0x96, 0x7d}, {0x97, 0x81}, {0xa0, 0x02}, {0xa1, 0x7b}, {0xa2, 0x02}, {0xa3, 0x7b}, {0xa4, 0x7b}, {0xa5, 0x02}, {0xa6, 0x7b}, {0xa7, 0x02}, {0xa8, 0x85}, {0xa9, 0x8c}, {0xaa, 0x85}, {0xab, 0x8c}, {0xac, 0x10}, {0xad, 0x16}, {0xae, 0x10}, {0xaf, 0x16}, {0xb0, 0x99}, {0xb1, 0xa3}, {0xb2, 0xa4}, {0xb3, 0xae}, {0xb4, 0x9b}, {0xb5, 0xa2}, {0xb6, 0xa6}, {0xb7, 0xac}, {0xb8, 0x9b}, {0xb9, 0x9f}, {0xba, 0xa6}, {0xbb, 0xaa}, {0xbc, 0x9b}, {0xbd, 0x9f}, {0xbe, 0xa6}, {0xbf, 0xaa}, {0xc4, 0x2c}, {0xc5, 0x43}, {0xc6, 0x63}, {0xc7, 0x79}, {0xc8, 0x2d}, {0xc9, 0x42}, {0xca, 0x2d}, {0xcb, 0x42}, {0xcc, 0x64}, {0xcd, 0x78}, {0xce, 0x64}, {0xcf, 0x78}, {0xd0, 0x0a}, {0xd1, 0x09}, {0xd4, 0x14}, //DCDC_TIME_TH_ON {0xd5, 0x14}, //DCDC_TIME_TH_OFF {0xd6, 0x98}, //DCDC_AG_TH_ON {0xd7, 0x90}, //DCDC_AG_TH_OFF {0xe0, 0xc4}, {0xe1, 0xc4}, {0xe2, 0xc4}, {0xe3, 0xc4}, {0xe4, 0x00}, {0xe8, 0x80}, {0xe9, 0x40}, {0xea, 0x7f}, {0x03, 0x03}, {0x10, 0x10}, {0x03, 0x10}, {0x10, 0x01}, // CrYCbY // For Demoset 0x03 {0x12, 0x30}, {0x13, 0x0a}, // contrast on {0x20, 0x00}, {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x30}, {0x35, 0x00}, {0x36, 0x00}, {0x38, 0x00}, {0x3e, 0x58}, {0x3f, 0x00}, {0x40, 0x80}, // YOFS {0x41, 0x10}, // DYOFS {0x48, 0x84}, // Contrast {0x50, 0x90}, // Contrast {0x60, 0x6c}, //67 {0x61, 0x70}, //7e //8e //88 //80 {0x62, 0x68}, //7e //8e //88 //80 {0x63, 0x50}, //Double_AG 50->30 {0x64, 0x41}, {0x66, 0x42}, {0x67, 0x20}, {0x6a, 0x80}, //8a {0x6b, 0x84}, //74 {0x6c, 0x80}, //7e //7a {0x6d, 0x80}, //8e {0x03, 0x11}, {0x10, 0x7f}, {0x11, 0x40}, {0x12, 0x0a}, /* Blue Max-Filter Delete*/ {0x13, 0xbb}, {0x26, 0x31}, /* Double_AG 31->20*/ {0x27, 0x34}, /* Double_AG 34->22*/ {0x28, 0x0f}, {0x29, 0x10}, {0x2b, 0x30}, {0x2c, 0x32}, {0x30, 0x70}, {0x31, 0x10}, {0x32, 0x58}, {0x33, 0x09}, {0x34, 0x06}, {0x35, 0x03}, {0x36, 0x70}, {0x37, 0x18}, {0x38, 0x58}, {0x39, 0x09}, {0x3a, 0x06}, {0x3b, 0x03}, {0x3c, 0x80}, {0x3d, 0x18}, {0x3e, 0x83}, /*80*/ {0x3f, 0x0c}, {0x40, 0x03}, {0x41, 0x06}, {0x42, 0x80}, {0x43, 0x18}, {0x44, 0x83}, /*80*/ {0x45, 0x12}, {0x46, 0x10}, {0x47, 0x10}, {0x48, 0x90}, {0x49, 0x40}, {0x4a, 0x80}, {0x4b, 0x13}, {0x4c, 0x10}, {0x4d, 0x11}, {0x4e, 0x80}, {0x4f, 0x30}, {0x50, 0x80}, {0x51, 0x13}, {0x52, 0x10}, {0x53, 0x13}, {0x54, 0x11}, {0x55, 0x17}, {0x56, 0x20}, {0x57, 0x01}, {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x1f}, /*18*/ {0x5b, 0x00}, {0x5c, 0x00}, {0x60, 0x3f}, {0x62, 0x60}, {0x70, 0x06}, {0x03, 0x12}, {0x20, 0x00}, {0x21, 0x00}, {0x25, 0x00}, {0x28, 0x00}, {0x29, 0x00}, {0x2a, 0x00}, {0x30, 0x50}, {0x31, 0x18}, {0x32, 0x32}, {0x33, 0x40}, {0x34, 0x50}, {0x35, 0x70}, {0x36, 0xa0}, {0x40, 0xa0}, {0x41, 0x40}, {0x42, 0xa0}, {0x43, 0x90}, {0x44, 0x90}, {0x45, 0x80}, {0x46, 0xb0}, {0x47, 0x55}, {0x48, 0xa0}, {0x49, 0x90}, {0x4a, 0x90}, {0x4b, 0x80}, {0x4c, 0xb0}, {0x4d, 0x40}, {0x4e, 0x90}, {0x4f, 0x90}, {0x50, 0xa0}, {0x51, 0x60}, {0x52, 0xb0}, {0x53, 0x60}, {0x54, 0xc0}, {0x55, 0xc0}, {0x56, 0x80}, {0x57, 0x57}, {0x58, 0x90}, {0x59, 0x40}, {0x5a, 0xd0}, {0x5b, 0xd0}, {0x5c, 0xe0}, {0x5d, 0x80}, {0x5e, 0x88}, {0x5f, 0x40}, {0x60, 0xe0}, {0x61, 0xe0}, {0x62, 0xe0}, {0x63, 0x80}, {0x70, 0x15}, {0x71, 0x01}, /*Don't Touch register*/ {0x72, 0x18}, {0x73, 0x01}, /*Don't Touch register*/ {0x74, 0x25}, {0x75, 0x15}, {0x80, 0x20}, {0x81, 0x40}, {0x82, 0x65}, {0x85, 0x1a}, {0x88, 0x00}, {0x89, 0x00}, {0x90, 0x5d}, /*For Preview*/ /*Dont Touch register*/ {0xD0, 0x0c}, {0xD1, 0x80}, {0xD2, 0x67}, {0xD3, 0x00}, {0xD4, 0x00}, {0xD5, 0x02}, {0xD6, 0xff}, {0xD7, 0x18}, {0x3b, 0x06}, {0x3c, 0x06}, {0xc5, 0x00}, /*55->48*/ {0xc6, 0x00}, /*48->40*/ {0x03, 0x13}, {0x10, 0xcb}, {0x11, 0x7b}, {0x12, 0x07}, {0x14, 0x00}, {0x20, 0x15}, {0x21, 0x13}, {0x22, 0x33}, {0x23, 0x05}, {0x24, 0x09}, {0x25, 0x0a}, {0x26, 0x18}, {0x27, 0x30}, {0x29, 0x12}, {0x2a, 0x50}, {0x2b, 0x02}, {0x2c, 0x02}, {0x25, 0x06}, {0x2d, 0x0c}, {0x2e, 0x12}, {0x2f, 0x12}, {0x50, 0x10}, {0x51, 0x14}, {0x52, 0x12}, {0x53, 0x0c}, {0x54, 0x0f}, {0x55, 0x0c}, {0x56, 0x10}, {0x57, 0x13}, {0x58, 0x12}, {0x59, 0x0c}, {0x5a, 0x0f}, {0x5b, 0x0c}, {0x5c, 0x0a}, {0x5d, 0x0b}, {0x5e, 0x0a}, {0x5f, 0x08}, {0x60, 0x09}, {0x61, 0x08}, {0x62, 0x08}, {0x63, 0x08}, {0x64, 0x08}, {0x65, 0x06}, {0x66, 0x06}, {0x67, 0x06}, {0x68, 0x07}, {0x69, 0x07}, {0x6a, 0x07}, {0x6b, 0x05}, {0x6c, 0x05}, {0x6d, 0x05}, {0x6e, 0x07}, {0x6f, 0x07}, {0x70, 0x07}, {0x71, 0x05}, {0x72, 0x05}, {0x73, 0x05}, {0x80, 0xfd}, {0x81, 0x1f}, {0x82, 0x05}, {0x83, 0x31}, {0x90, 0x05}, {0x91, 0x05}, {0x92, 0x33}, {0x93, 0x30}, {0x94, 0x03}, {0x95, 0x14}, {0x97, 0x20}, {0x99, 0x20}, {0xa0, 0x01}, {0xa1, 0x02}, {0xa2, 0x01}, {0xa3, 0x02}, {0xa4, 0x05}, {0xa5, 0x05}, {0xa6, 0x07}, {0xa7, 0x08}, {0xa8, 0x07}, {0xa9, 0x08}, {0xaa, 0x07}, {0xab, 0x08}, {0xb0, 0x22}, {0xb1, 0x2a}, {0xb2, 0x28}, {0xb3, 0x22}, {0xb4, 0x2a}, {0xb5, 0x28}, {0xb6, 0x22}, {0xb7, 0x2a}, {0xb8, 0x28}, {0xb9, 0x22}, {0xba, 0x2a}, {0xbb, 0x28}, {0xbc, 0x25}, {0xbd, 0x2a}, {0xbe, 0x27}, {0xbf, 0x25}, {0xc0, 0x2a}, {0xc1, 0x27}, {0xc2, 0x1e}, {0xc3, 0x24}, {0xc4, 0x20}, {0xc5, 0x1e}, {0xc6, 0x24}, {0xc7, 0x20}, {0xc8, 0x18}, {0xc9, 0x20}, {0xca, 0x1e}, {0xcb, 0x18}, {0xcc, 0x20}, {0xcd, 0x1e}, {0xce, 0x18}, {0xcf, 0x20}, {0xd0, 0x1e}, {0xd1, 0x18}, {0xd2, 0x20}, {0xd3, 0x1e}, {0x03, 0x14}, {0x10, 0x11}, {0x14, 0x80}, // GX {0x15, 0x80}, // GY {0x16, 0x80}, // RX {0x17, 0x80}, // RY {0x18, 0x80}, // BX {0x19, 0x80}, // BY {0x20, 0x60}, //X 60 //a0 {0x21, 0x80}, //Y {0x22, 0x80}, {0x23, 0x80}, {0x24, 0x80}, {0x30, 0xc8}, {0x31, 0x2b}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x90}, {0x40, 0x48}, //31 {0x50, 0x34}, //23 //32 {0x60, 0x29}, // {0x70, 0x34}, //23 //32 {0x03, 0x15}, {0x10, 0x0f}, {0x14, 0x42}, //CMCOFSGH_Day //4c {0x15, 0x32}, //CMCOFSGM_CWF //3c {0x16, 0x24}, //CMCOFSGL_A //2e {0x17, 0x2f}, //CMC SIGN {0x30, 0x8f}, {0x31, 0x59}, {0x32, 0x0a}, {0x33, 0x15}, {0x34, 0x5b}, {0x35, 0x06}, {0x36, 0x07}, {0x37, 0x40}, {0x38, 0x87}, //86 {0x40, 0x92}, {0x41, 0x1b}, {0x42, 0x89}, {0x43, 0x81}, {0x44, 0x00}, {0x45, 0x01}, {0x46, 0x89}, {0x47, 0x9e}, {0x48, 0x28}, {0x50, 0x02}, {0x51, 0x82}, {0x52, 0x00}, {0x53, 0x07}, {0x54, 0x11}, {0x55, 0x98}, {0x56, 0x00}, {0x57, 0x0b}, {0x58, 0x8b}, {0x80, 0x03}, {0x85, 0x40}, {0x87, 0x02}, {0x88, 0x00}, {0x89, 0x00}, {0x8a, 0x00}, {0x03, 0x16}, {0x10, 0x31}, {0x18, 0x5e}, // Double_AG 5e->37 {0x19, 0x5d}, // Double_AG 5e->36 {0x1a, 0x0e}, {0x1b, 0x01}, {0x1c, 0xdc}, {0x1d, 0xfe}, {0x30, 0x00}, {0x31, 0x0a}, {0x32, 0x1f}, {0x33, 0x33}, {0x34, 0x53}, {0x35, 0x6c}, {0x36, 0x81}, {0x37, 0x94}, {0x38, 0xa4}, {0x39, 0xb3}, {0x3a, 0xc0}, {0x3b, 0xcb}, {0x3c, 0xd5}, {0x3d, 0xde}, {0x3e, 0xe6}, {0x3f, 0xee}, {0x40, 0xf5}, {0x41, 0xfc}, {0x42, 0xff}, {0x50, 0x00}, {0x51, 0x09}, {0x52, 0x1f}, {0x53, 0x37}, {0x54, 0x5b}, {0x55, 0x76}, {0x56, 0x8d}, {0x57, 0xa1}, {0x58, 0xb2}, {0x59, 0xbe}, {0x5a, 0xc9}, {0x5b, 0xd2}, {0x5c, 0xdb}, {0x5d, 0xe3}, {0x5e, 0xeb}, {0x5f, 0xf0}, {0x60, 0xf5}, {0x61, 0xf7}, {0x62, 0xf8}, {0x70, 0x00}, {0x71, 0x08}, {0x72, 0x17}, {0x73, 0x2f}, {0x74, 0x53}, {0x75, 0x6c}, {0x76, 0x81}, {0x77, 0x94}, {0x78, 0xa4}, {0x79, 0xb3}, {0x7a, 0xc0}, {0x7b, 0xcb}, {0x7c, 0xd5}, {0x7d, 0xde}, {0x7e, 0xe6}, {0x7f, 0xee}, {0x80, 0xf4}, {0x81, 0xfa}, {0x82, 0xff}, {0x03, 0x17}, {0x10, 0xf7}, {0x03, 0x18}, {0x12, 0x20}, {0x10, 0x07}, {0x11, 0x00}, {0x20, 0x05}, {0x21, 0x20}, {0x22, 0x03}, {0x23, 0xd8}, {0x24, 0x00}, {0x25, 0x10}, {0x26, 0x00}, {0x27, 0x0c}, {0x28, 0x05}, {0x29, 0x10}, {0x2a, 0x03}, {0x2b, 0xcc}, {0x2c, 0x09}, {0x2d, 0xc1}, {0x2e, 0x09}, {0x2f, 0xc1}, {0x30, 0x41}, {0x03, 0x20}, {0x11, 0x1c}, {0x18, 0x30}, {0x1a, 0x08}, {0x20, 0x01}, //05_lowtemp Y Mean off {0x21, 0x30}, {0x22, 0x10}, {0x23, 0x00}, {0x24, 0x00}, //Uniform Scene Off {0x28, 0xe7}, {0x29, 0x0d}, //20100305 ad->0d {0x2a, 0xff}, {0x2b, 0x04}, //f4->Adaptive off {0x2c, 0xc2}, {0x2d, 0xcf}, //ff->AE Speed option {0x2e, 0x33}, {0x30, 0x78}, //f8 {0x32, 0x03}, {0x33, 0x2e}, {0x34, 0x30}, {0x35, 0xd4}, {0x36, 0xfe}, {0x37, 0x32}, {0x38, 0x04}, {0x39, 0x22}, //AE_escapeC10 {0x3a, 0xde}, //AE_escapeC11 {0x3b, 0x22}, //AE_escapeC1 {0x3c, 0xde}, //AE_escapeC2 {0x50, 0x45}, {0x51, 0x88}, {0x56, 0x03}, {0x57, 0xf7}, {0x58, 0x14}, {0x59, 0x88}, {0x5a, 0x04}, {0x60, 0x55}, // AEWGT1 {0x61, 0x55}, // AEWGT2 {0x62, 0x6a}, // AEWGT3 {0x63, 0xa9}, // AEWGT4 {0x64, 0x6a}, // AEWGT5 {0x65, 0xa9}, // AEWGT6 {0x66, 0x6a}, // AEWGT7 {0x67, 0xa9}, // AEWGT8 {0x68, 0x6b}, // AEWGT9 {0x69, 0xe9}, // AEWGT10 {0x6a, 0x6a}, // AEWGT11 {0x6b, 0xa9}, // AEWGT12 {0x6c, 0x6a}, // AEWGT13 {0x6d, 0xa9}, // AEWGT14 {0x6e, 0x55}, // AEWGT15 {0x6f, 0x55}, // AEWGT16 {0x70, 0x70}, //6e {0x71, 0x00}, //82(+8)->+0 {0x76, 0x43}, {0x77, 0xe2}, //04 {0x78, 0x23}, //Yth1 {0x79, 0x42}, //Yth2 {0x7a, 0x23}, //23 {0x7b, 0x22}, //22 {0x7d, 0x23}, {0x83, 0x01}, //EXP Normal 33.33 fps {0x84, 0xb7}, {0x85, 0x74}, {0x86, 0x01}, //EXPMin 5859.38 fps {0x87, 0xf4}, {0x88, 0x05}, //EXP Max 10.00 fps {0x89, 0xb8}, {0x8a, 0xd8}, {0x8B, 0x49}, //EXP100 {0x8C, 0x3e}, {0x8D, 0x3c}, //EXP120 {0x8E, 0x8c}, {0x9c, 0x17}, //EXP Limit 488.28 fps {0x9d, 0x70}, {0x9e, 0x01}, //EXP Unit {0x9f, 0xf4}, //AE_Middle Time option //{0xa0, 0x03}, //{0xa1, 0xa9}, //{0xa2, 0x80}, {0xb0, 0x18}, {0xb1, 0x14}, //ADC 400->560 {0xb2, 0xa0}, //d0 {0xb3, 0x18}, {0xb4, 0x1a}, {0xb5, 0x44}, {0xb6, 0x2f}, {0xb7, 0x28}, {0xb8, 0x25}, {0xb9, 0x22}, {0xba, 0x21}, {0xbb, 0x20}, {0xbc, 0x1f}, {0xbd, 0x1f}, //AE_Adaptive Time option //{0xc0, 0x10}, //{0xc1, 0x2b}, //{0xc2, 0x2b}, //{0xc3, 0x2b}, //{0xc4, 0x08}, {0xc8, 0x80}, {0xc9, 0x40}, /////// PAGE 22 START /////// {0x03, 0x22}, {0x10, 0xfd}, {0x11, 0x2e}, {0x19, 0x01}, // Low On // {0x20, 0x30}, {0x21, 0x80}, {0x24, 0x01}, //{0x25, 0x00}, //7f New Lock Cond & New light stable {0x30, 0x80}, {0x31, 0x80}, {0x38, 0x11}, {0x39, 0x34}, {0x40, 0xf4}, {0x41, 0x55}, //44 {0x42, 0x33}, //43 {0x43, 0xf6}, {0x44, 0x55}, //44 {0x45, 0x44}, //33 {0x46, 0x00}, {0x50, 0xb2}, {0x51, 0x81}, {0x52, 0x98}, {0x80, 0x40}, //3e {0x81, 0x20}, {0x82, 0x3e}, {0x83, 0x5e}, //5e {0x84, 0x1e}, //24 {0x85, 0x5e}, //54 //56 //5a {0x86, 0x22}, //24 //22 {0x87, 0x49}, {0x88, 0x39}, {0x89, 0x37}, //38 {0x8a, 0x28}, //2a {0x8b, 0x41}, //47 {0x8c, 0x39}, {0x8d, 0x34}, {0x8e, 0x28}, //2c {0x8f, 0x53}, //4e {0x90, 0x52}, //4d {0x91, 0x51}, //4c {0x92, 0x4e}, //4a {0x93, 0x4a}, //46 {0x94, 0x45}, {0x95, 0x3d}, {0x96, 0x31}, {0x97, 0x28}, {0x98, 0x24}, {0x99, 0x20}, {0x9a, 0x20}, {0x9b, 0x77}, {0x9c, 0x77}, {0x9d, 0x48}, {0x9e, 0x38}, {0x9f, 0x30}, {0xa0, 0x60}, {0xa1, 0x34}, {0xa2, 0x6f}, {0xa3, 0xff}, {0xa4, 0x14}, //1500fps {0xa5, 0x2c}, // 700fps {0xa6, 0xcf}, {0xad, 0x40}, {0xae, 0x4a}, {0xaf, 0x28}, // low temp Rgain {0xb0, 0x26}, // low temp Rgain {0xb1, 0x00}, //0x20 -> 0x00 0405 modify {0xb4, 0xea}, {0xb8, 0xa0}, //a2: b-2, R+2 //b4 B-3, R+4 lowtemp {0xb9, 0x00}, /////// PAGE 20 /////// {0x03, 0x20}, {0x10, 0x8c}, // PAGE 20 {0x03, 0x20}, //page 20 {0x10, 0x9c}, //ae off // PAGE 22 {0x03, 0x22}, //page 22 {0x10, 0xe9}, //awb off // PAGE 0 {0x03, 0x00}, {0x0e, 0x03}, //PLL On {0x0e, 0x73}, //PLLx2 {0x03, 0x00}, // Dummy 750us {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, /*640*480 */ {0x03, 0x00}, {0x10, 0x11},// {0x20, 0x00}, {0x21, 0x07}, {0x22, 0x00}, {0x23, 0x20}, {0x24, 0x03}, {0x25, 0xc0}, {0x26, 0x05}, {0x27, 0x00}, {0x03, 0x18}, {0x10, 0x07}, {0x11, 0x00}, {0x12, 0x20}, {0x20, 0x05}, {0x21, 0x00}, {0x22, 0x03}, {0x23, 0xc0}, {0x24, 0x00}, {0x25, 0x04}, {0x26, 0x00}, {0x27, 0x04}, {0x28, 0x05}, {0x29, 0x04}, {0x2a, 0x03}, {0x2b, 0xc4}, {0x2c, 0x0a}, {0x2d, 0x00}, {0x2e, 0x0a}, {0x2f, 0x00}, {0x30, 0x41}, //41->44 {0x03, 0x00}, // Page 0 {0x01, 0xf8}, // Sleep Off 0xf8->0x50 for solve green line issue }; static struct sensor_reg hi253_setting_15fps_QVGA_320_240[] = { {0x86, 0x03}, }; static struct sensor_reg hi253_setting_30fps_QVGA_320_240[] = { {0x12, 0x80}, }; static struct sensor_reg hi253_setting_15fps_NTSC_720_480[] = { {0x12, 0x80}, }; static struct sensor_reg hi253_setting_15fps_PAL_720_576[] = { {0x12, 0x80}, }; static struct sensor_reg hi253_setting_30fps_NTSC_720_480[] = { {0x12, 0x80}, }; static struct sensor_reg hi253_setting_30fps_PAL_720_576[] = { {0x12, 0x80}, }; static struct hi253_mode_info hi253_mode_info_data[2][hi253_mode_MAX + 1] = { { {hi253_mode_VGA_640_480, 640, 480, hi253_setting_15fps_VGA_640_480, ARRAY_SIZE(hi253_setting_15fps_VGA_640_480)}, {hi253_mode_QVGA_320_240, 320, 240, hi253_setting_15fps_QVGA_320_240, ARRAY_SIZE(hi253_setting_15fps_QVGA_320_240)}, {hi253_mode_XGA_1024_768, 1024, 768, hi253_setting_15fps_XGA_1024_768, ARRAY_SIZE(hi253_setting_15fps_XGA_1024_768)}, {hi253_mode_QXGA_1600_1200, 1600, 1200, hi253_setting_15fps_QXGA_1600_1200, ARRAY_SIZE(hi253_setting_15fps_QXGA_1600_1200)}, {hi253_mode_NTSC_720_480, 720, 480, hi253_setting_15fps_NTSC_720_480, ARRAY_SIZE(hi253_setting_15fps_NTSC_720_480)}, {hi253_mode_PAL_720_576, 720, 576, hi253_setting_15fps_PAL_720_576, ARRAY_SIZE(hi253_setting_15fps_PAL_720_576)}, }, { {hi253_mode_VGA_640_480, 640, 480, hi253_setting_30fps_VGA_640_480, ARRAY_SIZE(hi253_setting_30fps_VGA_640_480)}, {hi253_mode_QVGA_320_240, 320, 240, hi253_setting_30fps_QVGA_320_240, ARRAY_SIZE(hi253_setting_30fps_QVGA_320_240)}, {hi253_mode_XGA_1024_768, 1024, 768, hi253_setting_30fps_XGA_1024_768, ARRAY_SIZE(hi253_setting_30fps_XGA_1024_768)}, {hi253_mode_QXGA_1600_1200, 0, 0, NULL, 0}, {hi253_mode_NTSC_720_480, 720, 480, hi253_setting_30fps_NTSC_720_480, ARRAY_SIZE(hi253_setting_30fps_NTSC_720_480)}, {hi253_mode_PAL_720_576, 720, 576, hi253_setting_30fps_PAL_720_576, ARRAY_SIZE(hi253_setting_30fps_PAL_720_576)}, }, }; static struct sensor_reg sensor_initialize[] = { /////// Start Sleep /////// {0x01, 0xf9}, //sleep on {0x08, 0x0f}, //Hi-Z on {0x01, 0xf8}, //sleep off {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x03}, //PLL On {0x0e, 0x73}, //PLLx2 {0x03, 0x00}, // Dummy 750us START {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Dummy 750us END {0x0e, 0x00}, //PLL off {0x01, 0xf1}, //sleep on {0x08, 0x00}, //Hi-Z off {0x01, 0xf3}, {0x01, 0xf1}, // PAGE 20 {0x03, 0x20}, //page 20 {0x10, 0x1c}, //ae off // PAGE 22 {0x03, 0x22}, //page 22 {0x10, 0x69}, //awb off //Initial Start /////// PAGE 0 START /////// {0x03, 0x00}, {0x10, 0x11}, // Sub1/2_Preview2 Mode_H binning {0x11, 0x91}, {0x12, 0x20},//21 {0x0b, 0xaa}, // ESD Check Register {0x0c, 0xaa}, // ESD Check Register {0x0d, 0xaa}, // ESD Check Register {0x20, 0x00}, // Windowing start point Y {0x21, 0x04}, {0x22, 0x00}, // Windowing start point X {0x23, 0x07}, {0x24, 0x04}, {0x25, 0xb0}, {0x26, 0x06}, {0x27, 0x40}, // WINROW END {0x40, 0x01}, //Hblank 408 {0x41, 0x68}, {0x42, 0x00}, //Vblank 20 {0x43, 0x14}, {0x45, 0x04}, {0x46, 0x18}, {0x47, 0xd8}, //BLC {0x80, 0x2e}, {0x81, 0x7e}, {0x82, 0x90}, {0x83, 0x00}, {0x84, 0x0c}, {0x85, 0x00}, {0x90, 0x14}, //BLC_TIME_TH_ON {0x91, 0x14}, //BLC_TIME_TH_OFF {0x92, 0x98}, //BLC_AG_TH_ON {0x93, 0x90}, //BLC_AG_TH_OFF {0x94, 0x75}, {0x95, 0x70}, {0x96, 0xdc}, {0x97, 0xfe}, {0x98, 0x38}, //OutDoor BLC {0x99, 0x43}, {0x9a, 0x43}, {0x9b, 0x43}, {0x9c, 0x43}, //Dark BLC {0xa0, 0x00}, {0xa2, 0x00}, {0xa4, 0x00}, {0xa6, 0x00}, //Normal BLC {0xa8, 0x43}, {0xaa, 0x43}, {0xac, 0x43}, {0xae, 0x43}, /////// PAGE 2 START /////// {0x03, 0x02}, {0x12, 0x03}, {0x13, 0x03}, {0x16, 0x00}, {0x17, 0x8C}, {0x18, 0x4c}, //Double_AG off {0x19, 0x00}, {0x1a, 0x39}, //ADC400->560 {0x1c, 0x09}, {0x1d, 0x40}, {0x1e, 0x30}, {0x1f, 0x10}, {0x20, 0x77}, {0x21, 0xde}, {0x22, 0xa7}, {0x23, 0x30}, //CLAMP {0x27, 0x3c}, {0x2b, 0x80}, {0x2e, 0x11}, {0x2f, 0xa1}, {0x30, 0x05}, //For Hi-253 never no change 0x05 {0x50, 0x20}, {0x52, 0x01}, {0x55, 0x1c}, {0x56, 0x11}, {0x5d, 0xa2}, {0x5e, 0x5a}, {0x60, 0x87}, {0x61, 0x99}, {0x62, 0x88}, {0x63, 0x97}, {0x64, 0x88}, {0x65, 0x97}, {0x67, 0x0c}, {0x68, 0x0c}, {0x69, 0x0c}, {0x72, 0x89}, {0x73, 0x96}, {0x74, 0x89}, {0x75, 0x96}, {0x76, 0x89}, {0x77, 0x96}, {0x7c, 0x85}, {0x7d, 0xaf}, {0x80, 0x01}, {0x81, 0x7f}, {0x82, 0x13}, {0x83, 0x24}, {0x84, 0x7d}, {0x85, 0x81}, {0x86, 0x7d}, {0x87, 0x81}, {0x92, 0x48}, {0x93, 0x54}, {0x94, 0x7d}, {0x95, 0x81}, {0x96, 0x7d}, {0x97, 0x81}, {0xa0, 0x02}, {0xa1, 0x7b}, {0xa2, 0x02}, {0xa3, 0x7b}, {0xa4, 0x7b}, {0xa5, 0x02}, {0xa6, 0x7b}, {0xa7, 0x02}, {0xa8, 0x85}, {0xa9, 0x8c}, {0xaa, 0x85}, {0xab, 0x8c}, {0xac, 0x10}, {0xad, 0x16}, {0xae, 0x10}, {0xaf, 0x16}, {0xb0, 0x99}, {0xb1, 0xa3}, {0xb2, 0xa4}, {0xb3, 0xae}, {0xb4, 0x9b}, {0xb5, 0xa2}, {0xb6, 0xa6}, {0xb7, 0xac}, {0xb8, 0x9b}, {0xb9, 0x9f}, {0xba, 0xa6}, {0xbb, 0xaa}, {0xbc, 0x9b}, {0xbd, 0x9f}, {0xbe, 0xa6}, {0xbf, 0xaa}, {0xc4, 0x2c}, {0xc5, 0x43}, {0xc6, 0x63}, {0xc7, 0x79}, {0xc8, 0x2d}, {0xc9, 0x42}, {0xca, 0x2d}, {0xcb, 0x42}, {0xcc, 0x64}, {0xcd, 0x78}, {0xce, 0x64}, {0xcf, 0x78}, {0xd0, 0x0a}, {0xd1, 0x09}, {0xd4, 0x14}, //DCDC_TIME_TH_ON {0xd5, 0x14}, //DCDC_TIME_TH_OFF {0xd6, 0x98}, //DCDC_AG_TH_ON {0xd7, 0x90}, //DCDC_AG_TH_OFF {0xe0, 0xc4}, {0xe1, 0xc4}, {0xe2, 0xc4}, {0xe3, 0xc4}, {0xe4, 0x00}, {0xe8, 0x80}, {0xe9, 0x40}, {0xea, 0x7f}, /////// PAGE 3 /////// {0x03, 0x03}, {0x10, 0x10}, /////// PAGE 10 START /////// {0x03, 0x10}, {0x10, 0x01}, // CrYCbY // For Demoset 0x03 {0x12, 0x30}, {0x13, 0x0a}, // contrast on {0x20, 0x00}, {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x30}, {0x35, 0x00}, {0x36, 0x00}, {0x38, 0x00}, {0x3e, 0x58}, {0x3f, 0x00}, {0x40, 0x80}, // YOFS {0x41, 0x10}, // DYOFS {0x48, 0x84}, // Contrast {0x50, 0x90}, // Contrast {0x60, 0x6c},//67 {0x61, 0x70}, //7e //8e //88 //80 {0x62, 0x68}, //7e //8e //88 //80 {0x63, 0x50}, //Double_AG 50->30 {0x64, 0x41}, {0x66, 0x42}, {0x67, 0x20}, {0x6a, 0x80}, //8a {0x6b, 0x84}, //74 {0x6c, 0x80}, //7e //7a {0x6d, 0x80}, //8e /*Don't touch////////////////////////// //{0x72, 0x84}, //{0x76, 0x19}, //{0x73, 0x70}, //{0x74, 0x68}, //{0x75, 0x60}, // white protection ON //{0x77, 0x0e}, //08 //0a //{0x78, 0x2a}, //20 //{0x79, 0x08}, //////////////////////////////////////*/ /*////// PAGE 11 START ///////*/ {0x03, 0x11}, {0x10, 0x7f}, {0x11, 0x40}, {0x12, 0x0a}, /* Blue Max-Filter Delete*/ {0x13, 0xbb}, {0x26, 0x31}, /* Double_AG 31->20*/ {0x27, 0x34}, /* Double_AG 34->22*/ {0x28, 0x0f}, {0x29, 0x10}, {0x2b, 0x30}, {0x2c, 0x32}, /*Out2 D-LPF th*/ {0x30, 0x70}, {0x31, 0x10}, {0x32, 0x58}, {0x33, 0x09}, {0x34, 0x06}, {0x35, 0x03}, /*Out1 D-LPF th*/ {0x36, 0x70}, {0x37, 0x18}, {0x38, 0x58}, {0x39, 0x09}, {0x3a, 0x06}, {0x3b, 0x03}, /*Indoor D-LPF th*/ {0x3c, 0x80}, {0x3d, 0x18}, {0x3e, 0x83}, /*80*/ {0x3f, 0x0c}, {0x40, 0x03}, {0x41, 0x06}, {0x42, 0x80}, {0x43, 0x18}, {0x44, 0x83}, /*80*/ {0x45, 0x12}, {0x46, 0x10}, {0x47, 0x10}, {0x48, 0x90}, {0x49, 0x40}, {0x4a, 0x80}, {0x4b, 0x13}, {0x4c, 0x10}, {0x4d, 0x11}, {0x4e, 0x80}, {0x4f, 0x30}, {0x50, 0x80}, {0x51, 0x13}, {0x52, 0x10}, {0x53, 0x13}, {0x54, 0x11}, {0x55, 0x17}, {0x56, 0x20}, {0x57, 0x01}, {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x1f}, /*18*/ {0x5b, 0x00}, {0x5c, 0x00}, {0x60, 0x3f}, {0x62, 0x60}, {0x70, 0x06}, /*////// PAGE 12 START ///////*/ {0x03, 0x12}, {0x20, 0x00}, {0x21, 0x00}, {0x25, 0x00}, /*0x30*/ {0x28, 0x00}, {0x29, 0x00}, {0x2a, 0x00}, {0x30, 0x50}, {0x31, 0x18}, {0x32, 0x32}, {0x33, 0x40}, {0x34, 0x50}, {0x35, 0x70}, {0x36, 0xa0}, /*Out2 th*/ {0x40, 0xa0}, {0x41, 0x40}, {0x42, 0xa0}, {0x43, 0x90}, {0x44, 0x90}, {0x45, 0x80}, /*Out1 th*/ {0x46, 0xb0}, {0x47, 0x55}, {0x48, 0xa0}, {0x49, 0x90}, {0x4a, 0x90}, {0x4b, 0x80}, /*Indoor th*/ {0x4c, 0xb0}, {0x4d, 0x40}, {0x4e, 0x90}, {0x4f, 0x90}, {0x50, 0xa0}, {0x51, 0x60}, /*Dark1 th*/ {0x52, 0xb0}, {0x53, 0x60}, {0x54, 0xc0}, {0x55, 0xc0}, {0x56, 0x80}, {0x57, 0x57}, /*Dark2 th*/ {0x58, 0x90}, {0x59, 0x40}, {0x5a, 0xd0}, {0x5b, 0xd0}, {0x5c, 0xe0}, {0x5d, 0x80}, /*Dark3 th*/ {0x5e, 0x88}, {0x5f, 0x40}, {0x60, 0xe0}, {0x61, 0xe0}, {0x62, 0xe0}, {0x63, 0x80}, {0x70, 0x15}, {0x71, 0x01}, /*Don't Touch register*/ {0x72, 0x18}, {0x73, 0x01}, /*Don't Touch register*/ {0x74, 0x25}, {0x75, 0x15}, {0x80, 0x20}, {0x81, 0x40}, {0x82, 0x65}, {0x85, 0x1a}, {0x88, 0x00}, {0x89, 0x00}, {0x90, 0x5d}, /*For Preview*/ /*Dont Touch register*/ {0xD0, 0x0c}, {0xD1, 0x80}, {0xD2, 0x67}, {0xD3, 0x00}, {0xD4, 0x00}, {0xD5, 0x02}, {0xD6, 0xff}, {0xD7, 0x18}, /*End*/ {0x3b, 0x06}, {0x3c, 0x06}, {0xc5, 0x00},/*55->48*/ {0xc6, 0x00},/*48->40*/ /*////// PAGE 13 START //////*/ {0x03, 0x13}, /*Edge*/ {0x10, 0xcb}, {0x11, 0x7b}, {0x12, 0x07}, {0x14, 0x00}, {0x20, 0x15}, {0x21, 0x13}, {0x22, 0x33}, {0x23, 0x05}, {0x24, 0x09}, {0x25, 0x0a}, {0x26, 0x18}, {0x27, 0x30}, {0x29, 0x12}, {0x2a, 0x50}, /*Low clip th*/ {0x2b, 0x02}, {0x2c, 0x02}, {0x25, 0x06}, {0x2d, 0x0c}, {0x2e, 0x12}, {0x2f, 0x12}, /*Out2 Edge*/ {0x50, 0x10}, {0x51, 0x14}, {0x52, 0x12}, {0x53, 0x0c}, {0x54, 0x0f}, {0x55, 0x0c}, /*Out1 Edge*/ {0x56, 0x10}, {0x57, 0x13}, {0x58, 0x12}, {0x59, 0x0c}, {0x5a, 0x0f}, {0x5b, 0x0c}, /*Indoor Edge*/ {0x5c, 0x0a}, {0x5d, 0x0b}, {0x5e, 0x0a}, {0x5f, 0x08}, {0x60, 0x09}, {0x61, 0x08}, /*Dark1 Edge*/ {0x62, 0x08}, {0x63, 0x08}, {0x64, 0x08}, {0x65, 0x06}, {0x66, 0x06}, {0x67, 0x06}, /*Dark2 Edge*/ {0x68, 0x07}, {0x69, 0x07}, {0x6a, 0x07}, {0x6b, 0x05}, {0x6c, 0x05}, {0x6d, 0x05}, /*Dark3 Edge*/ {0x6e, 0x07}, {0x6f, 0x07}, {0x70, 0x07}, {0x71, 0x05}, {0x72, 0x05}, {0x73, 0x05}, /*2DY*/ {0x80, 0xfd}, {0x81, 0x1f}, {0x82, 0x05}, {0x83, 0x31}, {0x90, 0x05}, {0x91, 0x05}, {0x92, 0x33}, {0x93, 0x30}, {0x94, 0x03}, {0x95, 0x14}, {0x97, 0x20}, {0x99, 0x20}, {0xa0, 0x01}, {0xa1, 0x02}, {0xa2, 0x01}, {0xa3, 0x02}, {0xa4, 0x05}, {0xa5, 0x05}, {0xa6, 0x07}, {0xa7, 0x08}, {0xa8, 0x07}, {0xa9, 0x08}, {0xaa, 0x07}, {0xab, 0x08}, //Out2 {0xb0, 0x22}, {0xb1, 0x2a}, {0xb2, 0x28}, {0xb3, 0x22}, {0xb4, 0x2a}, {0xb5, 0x28}, //Out1 {0xb6, 0x22}, {0xb7, 0x2a}, {0xb8, 0x28}, {0xb9, 0x22}, {0xba, 0x2a}, {0xbb, 0x28}, //Indoor {0xbc, 0x25}, {0xbd, 0x2a}, {0xbe, 0x27}, {0xbf, 0x25}, {0xc0, 0x2a}, {0xc1, 0x27}, //Dark1 {0xc2, 0x1e}, {0xc3, 0x24}, {0xc4, 0x20}, {0xc5, 0x1e}, {0xc6, 0x24}, {0xc7, 0x20}, //Dark2 {0xc8, 0x18}, {0xc9, 0x20}, {0xca, 0x1e}, {0xcb, 0x18}, {0xcc, 0x20}, {0xcd, 0x1e}, //Dark3 {0xce, 0x18}, {0xcf, 0x20}, {0xd0, 0x1e}, {0xd1, 0x18}, {0xd2, 0x20}, {0xd3, 0x1e}, /////// PAGE 14 START /////// {0x03, 0x14}, {0x10, 0x11}, {0x14, 0x80}, // GX {0x15, 0x80}, // GY {0x16, 0x80}, // RX {0x17, 0x80}, // RY {0x18, 0x80}, // BX {0x19, 0x80}, // BY {0x20, 0x60}, //X 60 //a0 {0x21, 0x80}, //Y {0x22, 0x80}, {0x23, 0x80}, {0x24, 0x80}, {0x30, 0xc8}, {0x31, 0x2b}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x90}, {0x40, 0x48}, //31 {0x50, 0x34}, //23 //32 {0x60, 0x29}, // {0x70, 0x34}, //23 //32 /////// PAGE 15 START /////// {0x03, 0x15}, {0x10, 0x0f}, //Rstep H 16 //Rstep L 14 {0x14, 0x42}, //CMCOFSGH_Day //4c {0x15, 0x32}, //CMCOFSGM_CWF //3c {0x16, 0x24}, //CMCOFSGL_A //2e {0x17, 0x2f}, //CMC SIGN //CMC_Default_CWF {0x30, 0x8f}, {0x31, 0x59}, {0x32, 0x0a}, {0x33, 0x15}, {0x34, 0x5b}, {0x35, 0x06}, {0x36, 0x07}, {0x37, 0x40}, {0x38, 0x87}, //86 //CMC OFS L_A {0x40, 0x92}, {0x41, 0x1b}, {0x42, 0x89}, {0x43, 0x81}, {0x44, 0x00}, {0x45, 0x01}, {0x46, 0x89}, {0x47, 0x9e}, {0x48, 0x28}, //{0x40, 0x93}, //{0x41, 0x1c}, //{0x42, 0x89}, //{0x43, 0x82}, //{0x44, 0x01}, //{0x45, 0x01}, //{0x46, 0x8a}, //{0x47, 0x9d}, //{0x48, 0x28}, //CMC POFS H_DAY {0x50, 0x02}, {0x51, 0x82}, {0x52, 0x00}, {0x53, 0x07}, {0x54, 0x11}, {0x55, 0x98}, {0x56, 0x00}, {0x57, 0x0b}, {0x58, 0x8b}, {0x80, 0x03}, {0x85, 0x40}, {0x87, 0x02}, {0x88, 0x00}, {0x89, 0x00}, {0x8a, 0x00}, /////// PAGE 16 START /////// {0x03, 0x16}, {0x10, 0x31}, {0x18, 0x5e},// Double_AG 5e->37 {0x19, 0x5d},// Double_AG 5e->36 {0x1a, 0x0e}, {0x1b, 0x01}, {0x1c, 0xdc}, {0x1d, 0xfe}, //GMA Default {0x30, 0x00}, {0x31, 0x0a}, {0x32, 0x1f}, {0x33, 0x33}, {0x34, 0x53}, {0x35, 0x6c}, {0x36, 0x81}, {0x37, 0x94}, {0x38, 0xa4}, {0x39, 0xb3}, {0x3a, 0xc0}, {0x3b, 0xcb}, {0x3c, 0xd5}, {0x3d, 0xde}, {0x3e, 0xe6}, {0x3f, 0xee}, {0x40, 0xf5}, {0x41, 0xfc}, {0x42, 0xff}, {0x50, 0x00}, {0x51, 0x09}, {0x52, 0x1f}, {0x53, 0x37}, {0x54, 0x5b}, {0x55, 0x76}, {0x56, 0x8d}, {0x57, 0xa1}, {0x58, 0xb2}, {0x59, 0xbe}, {0x5a, 0xc9}, {0x5b, 0xd2}, {0x5c, 0xdb}, {0x5d, 0xe3}, {0x5e, 0xeb}, {0x5f, 0xf0}, {0x60, 0xf5}, {0x61, 0xf7}, {0x62, 0xf8}, {0x70, 0x00}, {0x71, 0x08}, {0x72, 0x17}, {0x73, 0x2f}, {0x74, 0x53}, {0x75, 0x6c}, {0x76, 0x81}, {0x77, 0x94}, {0x78, 0xa4}, {0x79, 0xb3}, {0x7a, 0xc0}, {0x7b, 0xcb}, {0x7c, 0xd5}, {0x7d, 0xde}, {0x7e, 0xe6}, {0x7f, 0xee}, {0x80, 0xf4}, {0x81, 0xfa}, {0x82, 0xff}, /////// PAGE 17 START /////// {0x03, 0x17}, {0x10, 0xf7}, {0x03, 0x18}, {0x12, 0x20}, {0x10, 0x07}, {0x11, 0x00}, {0x20, 0x05}, {0x21, 0x20}, {0x22, 0x03}, {0x23, 0xd8}, {0x24, 0x00}, {0x25, 0x10}, {0x26, 0x00}, {0x27, 0x0c}, {0x28, 0x05}, {0x29, 0x10}, {0x2a, 0x03}, {0x2b, 0xcc}, {0x2c, 0x09}, {0x2d, 0xc1}, {0x2e, 0x09}, {0x2f, 0xc1}, {0x30, 0x41}, /////// PAGE 20 START /////// {0x03, 0x20}, {0x11, 0x1c}, {0x18, 0x30}, {0x1a, 0x08}, {0x20, 0x01}, //05_lowtemp Y Mean off {0x21, 0x30}, {0x22, 0x10}, {0x23, 0x00}, {0x24, 0x00}, //Uniform Scene Off {0x28, 0xe7}, {0x29, 0x0d}, //20100305 ad->0d {0x2a, 0xff}, {0x2b, 0x04}, //f4->Adaptive off {0x2c, 0xc2}, {0x2d, 0xcf}, //ff->AE Speed option {0x2e, 0x33}, {0x30, 0x78}, //f8 {0x32, 0x03}, {0x33, 0x2e}, {0x34, 0x30}, {0x35, 0xd4}, {0x36, 0xfe}, {0x37, 0x32}, {0x38, 0x04}, {0x39, 0x22}, //AE_escapeC10 {0x3a, 0xde}, //AE_escapeC11 {0x3b, 0x22}, //AE_escapeC1 {0x3c, 0xde}, //AE_escapeC2 {0x50, 0x45}, {0x51, 0x88}, {0x56, 0x03}, {0x57, 0xf7}, {0x58, 0x14}, {0x59, 0x88}, {0x5a, 0x04}, //New Weight For Samsung //{0x60, 0xaa}, //{0x61, 0xaa}, //{0x62, 0xaa}, //{0x63, 0xaa}, //{0x64, 0xaa}, //{0x65, 0xaa}, //{0x66, 0xab}, //{0x67, 0xEa}, //{0x68, 0xab}, //{0x69, 0xEa}, //{0x6a, 0xaa}, //{0x6b, 0xaa}, //{0x6c, 0xaa}, //{0x6d, 0xaa}, //{0x6e, 0xaa}, //{0x6f, 0xaa}, {0x60, 0x55}, // AEWGT1 {0x61, 0x55}, // AEWGT2 {0x62, 0x6a}, // AEWGT3 {0x63, 0xa9}, // AEWGT4 {0x64, 0x6a}, // AEWGT5 {0x65, 0xa9}, // AEWGT6 {0x66, 0x6a}, // AEWGT7 {0x67, 0xa9}, // AEWGT8 {0x68, 0x6b}, // AEWGT9 {0x69, 0xe9}, // AEWGT10 {0x6a, 0x6a}, // AEWGT11 {0x6b, 0xa9}, // AEWGT12 {0x6c, 0x6a}, // AEWGT13 {0x6d, 0xa9}, // AEWGT14 {0x6e, 0x55}, // AEWGT15 {0x6f, 0x55}, // AEWGT16 {0x70, 0x70}, //6e {0x71, 0x00}, //82(+8)->+0 // haunting control {0x76, 0x43}, {0x77, 0xe2}, //04 {0x78, 0x23}, //Yth1 {0x79, 0x42}, //Yth2 {0x7a, 0x23}, //23 {0x7b, 0x22}, //22 {0x7d, 0x23}, {0x83, 0x01}, //EXP Normal 33.33 fps {0x84, 0xb7}, {0x85, 0x74}, {0x86, 0x01}, //EXPMin 5859.38 fps {0x87, 0xf4}, {0x88, 0x05}, //EXP Max 10.00 fps {0x89, 0xb8}, {0x8a, 0xd8}, {0x8B, 0x49}, //EXP100 {0x8C, 0x3e}, {0x8D, 0x3c}, //EXP120 {0x8E, 0x8c}, {0x9c, 0x17}, //EXP Limit 488.28 fps {0x9d, 0x70}, {0x9e, 0x01}, //EXP Unit {0x9f, 0xf4}, //AE_Middle Time option //{0xa0, 0x03}, //{0xa1, 0xa9}, //{0xa2, 0x80}, {0xb0, 0x18}, {0xb1, 0x14}, //ADC 400->560 {0xb2, 0xa0}, //d0 {0xb3, 0x18}, {0xb4, 0x1a}, {0xb5, 0x44}, {0xb6, 0x2f}, {0xb7, 0x28}, {0xb8, 0x25}, {0xb9, 0x22}, {0xba, 0x21}, {0xbb, 0x20}, {0xbc, 0x1f}, {0xbd, 0x1f}, //AE_Adaptive Time option //{0xc0, 0x10}, //{0xc1, 0x2b}, //{0xc2, 0x2b}, //{0xc3, 0x2b}, //{0xc4, 0x08}, {0xc8, 0x80}, {0xc9, 0x40}, /////// PAGE 22 START /////// {0x03, 0x22}, {0x10, 0xfd}, {0x11, 0x2e}, {0x19, 0x01}, // Low On // {0x20, 0x30}, {0x21, 0x80}, {0x24, 0x01}, //{0x25, 0x00}, //7f New Lock Cond & New light stable {0x30, 0x80}, {0x31, 0x80}, {0x38, 0x11}, {0x39, 0x34}, {0x40, 0xf4}, {0x41, 0x55}, //44 {0x42, 0x33}, //43 {0x43, 0xf6}, {0x44, 0x55}, //44 {0x45, 0x44}, //33 {0x46, 0x00}, {0x50, 0xb2}, {0x51, 0x81}, {0x52, 0x98}, {0x80, 0x40}, //3e {0x81, 0x20}, {0x82, 0x3e}, {0x83, 0x5e}, //5e {0x84, 0x1e}, //24 {0x85, 0x5e}, //54 //56 //5a {0x86, 0x22}, //24 //22 {0x87, 0x49}, {0x88, 0x39}, {0x89, 0x37}, //38 {0x8a, 0x28}, //2a {0x8b, 0x41}, //47 {0x8c, 0x39}, {0x8d, 0x34}, {0x8e, 0x28}, //2c {0x8f, 0x53}, //4e {0x90, 0x52}, //4d {0x91, 0x51}, //4c {0x92, 0x4e}, //4a {0x93, 0x4a}, //46 {0x94, 0x45}, {0x95, 0x3d}, {0x96, 0x31}, {0x97, 0x28}, {0x98, 0x24}, {0x99, 0x20}, {0x9a, 0x20}, {0x9b, 0x77}, {0x9c, 0x77}, {0x9d, 0x48}, {0x9e, 0x38}, {0x9f, 0x30}, {0xa0, 0x60}, {0xa1, 0x34}, {0xa2, 0x6f}, {0xa3, 0xff}, {0xa4, 0x14}, //1500fps {0xa5, 0x2c}, // 700fps {0xa6, 0xcf}, {0xad, 0x40}, {0xae, 0x4a}, {0xaf, 0x28}, // low temp Rgain {0xb0, 0x26}, // low temp Rgain {0xb1, 0x00}, //0x20 -> 0x00 0405 modify {0xb4, 0xea}, {0xb8, 0xa0}, //a2: b-2, R+2 //b4 B-3, R+4 lowtemp {0xb9, 0x00}, /////// PAGE 20 /////// {0x03, 0x20}, {0x10, 0x8c}, // PAGE 20 {0x03, 0x20}, //page 20 {0x10, 0x9c}, //ae off // PAGE 22 {0x03, 0x22}, //page 22 {0x10, 0xe9}, //awb off // PAGE 0 {0x03, 0x00}, {0x0e, 0x03}, //PLL On {0x0e, 0x73}, //PLLx2 {0x03, 0x00}, // Dummy 750us {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, {0x03, 0x00}, // Page 0 {0x01, 0xf8}, // Sleep Off 0xf8->0x50 for solve green line issue {REG_TERM, VAL_TERM} }; static struct regulator *io_regulator; static struct regulator *core_regulator; static struct regulator *analog_regulator; static struct regulator *gpo_regulator; static struct mxc_camera_platform_data *camera_plat; static int hi253_probe(struct i2c_client *adapter, const struct i2c_device_id *device_id); static int hi253_remove(struct i2c_client *client); static s32 hi253_read_reg(u16 reg, u8 *val); static s32 hi253_write_reg(u16 reg, u8 val); static const struct i2c_device_id hi253_id[] = { {"hi253", 0}, {}, }; MODULE_DEVICE_TABLE(i2c, hi253_id); static struct i2c_driver hi253_i2c_driver = { .driver = { .owner = THIS_MODULE, .name = "hi253", }, .probe = hi253_probe, .remove = hi253_remove, .id_table = hi253_id, }; extern void gpio_sensor_active(unsigned int csi_index); extern void gpio_sensor_inactive(unsigned int csi); static s32 hi253_write_reg(u16 reg, u8 val) { u8 au8Buf[3] = {0}; //au8Buf[0] = reg >> 8; au8Buf[0] = reg & 0xff; au8Buf[1] = val; if (i2c_master_send(hi253_data.i2c_client, au8Buf, 2) < 0) { pr_err("%s:write reg error:reg=%x,val=%x\n", __func__, reg, val); return -1; } return 0; } static s32 hi253_read_reg(u16 reg, u8 *val) { u8 au8RegBuf[2] = {0}; u8 u8RdVal = 0; //au8RegBuf[0] = reg >> 8; au8RegBuf[0] = reg & 0xff; printk("\n=== [joe]=== %s, %d, %s\n", __FILE__,__LINE__,__func__); if (2 != i2c_master_send(hi253_data.i2c_client, au8RegBuf, 1)) { pr_err("%s:write reg error:reg=%x\n", __func__, reg); return -1; } if (1 != i2c_master_recv(hi253_data.i2c_client, &u8RdVal, 1)) { pr_err("%s:read reg error:reg=%x,val=%x\n", __func__, reg, u8RdVal); return -1; } *val = u8RdVal; return 0; } static int hi253_init_mode(enum hi253_frame_rate frame_rate, enum hi253_mode mode) { struct sensor_reg *pModeSetting = NULL; s32 i = 0; s32 iModeSettingArySize = 0; register u16 RegAddr = 0; register u8 Val = 0; int retval = 0; if (mode > hi253_mode_MAX || mode < hi253_mode_MIN) { pr_err("Wrong hi253 mode detected!\n"); return -1; } printk("\n\n====joe==========frame=%d, mode=%d ======\n\n",frame_rate,mode); pModeSetting = hi253_mode_info_data[frame_rate][mode].init_data_ptr; iModeSettingArySize = hi253_mode_info_data[frame_rate][mode].init_data_size; printk("\n=========iModeSettingArySize=%d ===========\n",iModeSettingArySize); hi253_data.pix.width = hi253_mode_info_data[frame_rate][mode].width; hi253_data.pix.height = hi253_mode_info_data[frame_rate][mode].height; printk("\n\n====joe=======width=%d, height=%d ======\n\n",hi253_data.pix.width,hi253_data.pix.height); for (i = 0; i < iModeSettingArySize; ++i, ++pModeSetting) { RegAddr = pModeSetting->reg; Val = pModeSetting->val; retval = hi253_write_reg(RegAddr, Val); if (retval < 0) { printk("\n ERROR: Write register fail. hi253_init_mode\n"); return -1; } } if ( mode == 0 ) { msleep(500); } /* retval = hi253_write_reg(0x03, 0x00); retval = hi253_write_reg(0x03, 0x20); if (retval < 0) { printk("\n ERROR: Write register fail. hi253_init_mode\n"); return -1; } */ return 0; /* int err; struct sensor_reg *next = sensor_initialize; printk("=== [joe]hi253_init_mode=== %s, %d, %s\n", __FILE__,__LINE__,__func__); if (mode > hi253_mode_MAX || mode < hi253_mode_MIN) { pr_err("Wrong hi253 mode detected!\n"); return -1; } while (!((next->reg == REG_TERM) && (next->val == VAL_TERM))) { //printk("====hi253_init_mode reg=%d, val=%d =====\n",next->reg,next->val); if(next->reg == REG_TERM && next->val != VAL_TERM) { mdelay(next->val); printk("Sensor init Delay[%d]!!!! \n", next->val); next++; } else { err = hi253_write_reg(next->reg, next->val); if (err) { printk("ERROR: Sensor I2C !!!! \n"); return -1; }else { next++; } } } return 0; */ } /* --------------- IOCTL functions from v4l2_int_ioctl_desc --------------- */ static int ioctl_g_ifparm(struct v4l2_int_device *s, struct v4l2_ifparm *p) { if (s == NULL) { pr_err(" ERROR!! no slave device set!\n"); return -1; } printk("\n=== [joe]=== %s, %d, %s\n", __FILE__,__LINE__,__func__); memset(p, 0, sizeof(*p)); p->u.bt656.clock_curr = hi253_data.mclk; pr_debug(" clock_curr=mclk=%d\n", hi253_data.mclk); p->if_type = V4L2_IF_TYPE_BT656; p->u.bt656.mode = V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT; p->u.bt656.clock_min = HI253_XCLK_MIN; p->u.bt656.clock_max = HI253_XCLK_MAX; p->u.bt656.bt_sync_correct = 1; /* Indicate external vsync */ return 0; } /*! * ioctl_s_power - V4L2 sensor interface handler for VIDIOC_S_POWER ioctl * @s: pointer to standard V4L2 device structure * @on: indicates power mode (on or off) * * Turns the power on or off, depending on the value of on and returns the * appropriate error code. */ static int ioctl_s_power(struct v4l2_int_device *s, int on) { struct sensor *sensor = s->priv; printk("\n=== [joe]=== %s, %d, %s\n", __FILE__,__LINE__,__func__); if (on && !sensor->on) { gpio_sensor_active(hi253_data.csi); if (io_regulator) if (regulator_enable(io_regulator) != 0) return -EIO; if (core_regulator) if (regulator_enable(core_regulator) != 0) return -EIO; if (gpo_regulator) if (regulator_enable(gpo_regulator) != 0) return -EIO; if (analog_regulator) if (regulator_enable(analog_regulator) != 0) return -EIO; /* Make sure power on */ if (camera_plat->pwdn) camera_plat->pwdn(0); } else if (!on && sensor->on) { if (analog_regulator) regulator_disable(analog_regulator); if (core_regulator) regulator_disable(core_regulator); if (io_regulator) regulator_disable(io_regulator); if (gpo_regulator) regulator_disable(gpo_regulator); gpio_sensor_inactive(hi253_data.csi); } sensor->on = on; return 0; } /*! * ioctl_g_parm - V4L2 sensor interface handler for VIDIOC_G_PARM ioctl * @s: pointer to standard V4L2 device structure * @a: pointer to standard V4L2 VIDIOC_G_PARM ioctl structure * * Returns the sensor's video CAPTURE parameters. */ static int ioctl_g_parm(struct v4l2_int_device *s, struct v4l2_streamparm *a) { struct sensor *sensor = s->priv; struct v4l2_captureparm *cparm = &a->parm.capture; int ret = 0; printk("\n=== [joe]=== %s, %d, %s\n", __FILE__,__LINE__,__func__); switch (a->type) { /* This is the only case currently handled. */ case V4L2_BUF_TYPE_VIDEO_CAPTURE: memset(a, 0, sizeof(*a)); a->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; cparm->capability = sensor->streamcap.capability; cparm->timeperframe = sensor->streamcap.timeperframe; cparm->capturemode = sensor->streamcap.capturemode; printk("\n++++++++cparm->capturemode=%d +++++++++\n",cparm->capturemode ); ret = 0; break; /* These are all the possible cases. */ case V4L2_BUF_TYPE_VIDEO_OUTPUT: case V4L2_BUF_TYPE_VIDEO_OVERLAY: case V4L2_BUF_TYPE_VBI_CAPTURE: case V4L2_BUF_TYPE_VBI_OUTPUT: case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: ret = -EINVAL; break; default: pr_debug(" type is unknown - %d\n", a->type); ret = -EINVAL; break; } return ret; } /*! * ioctl_s_parm - V4L2 sensor interface handler for VIDIOC_S_PARM ioctl * @s: pointer to standard V4L2 device structure * @a: pointer to standard V4L2 VIDIOC_S_PARM ioctl structure * * Configures the sensor to use the input parameters, if possible. If * not possible, reverts to the old parameters and returns the * appropriate error code. */ static int ioctl_s_parm(struct v4l2_int_device *s, struct v4l2_streamparm *a) { struct sensor *sensor = s->priv; struct v4l2_fract *timeperframe = &a->parm.capture.timeperframe; u32 tgt_fps; /* target frames per secound */ enum hi253_frame_rate frame_rate; int ret = 0; printk("\n=== [joe]=== %s, %d, %s\n", __FILE__,__LINE__,__func__); /* Make sure power on */ if (camera_plat->pwdn) camera_plat->pwdn(0); switch (a->type) { /* This is the only case currently handled. */ case V4L2_BUF_TYPE_VIDEO_CAPTURE: /* Check that the new frame rate is allowed. */ if ((timeperframe->numerator == 0) || (timeperframe->denominator == 0)) { timeperframe->denominator = DEFAULT_FPS; timeperframe->numerator = 1; } tgt_fps = timeperframe->denominator / timeperframe->numerator; if (tgt_fps > MAX_FPS) { timeperframe->denominator = MAX_FPS; timeperframe->numerator = 1; } else if (tgt_fps < MIN_FPS) { timeperframe->denominator = MIN_FPS; timeperframe->numerator = 1; } /* Actual frame rate we use */ tgt_fps = timeperframe->denominator / timeperframe->numerator; if (tgt_fps == 15) frame_rate = hi253_15_fps; else if (tgt_fps == 30) frame_rate = hi253_30_fps; else { pr_err(" The camera frame rate is not supported!\n"); return -EINVAL; } sensor->streamcap.timeperframe = *timeperframe; sensor->streamcap.capturemode = (u32)a->parm.capture.capturemode; ret = hi253_init_mode(frame_rate, sensor->streamcap.capturemode); break; /* These are all the possible cases. */ case V4L2_BUF_TYPE_VIDEO_OUTPUT: case V4L2_BUF_TYPE_VIDEO_OVERLAY: case V4L2_BUF_TYPE_VBI_CAPTURE: case V4L2_BUF_TYPE_VBI_OUTPUT: case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: pr_debug(" type is not " \ "V4L2_BUF_TYPE_VIDEO_CAPTURE but %d\n", a->type); ret = -EINVAL; break; default: pr_debug(" type is unknown - %d\n", a->type); ret = -EINVAL; break; } return ret; } /*! * ioctl_g_fmt_cap - V4L2 sensor interface handler for ioctl_g_fmt_cap * @s: pointer to standard V4L2 device structure * @f: pointer to standard V4L2 v4l2_format structure * * Returns the sensor's current pixel format in the v4l2_format * parameter. */ static int ioctl_g_fmt_cap(struct v4l2_int_device *s, struct v4l2_format *f) { struct sensor *sensor = s->priv; /* u8 HI253_Sleep_Mode; u8 CLK_DIV_REG; u32 HI253_pv_HI253_exposure_lines; u32 HI253_cp_HI253_exposure_lines; int retval = 0; */ f->fmt.pix = sensor->pix; f->win.w.width /* HI253_Sleep_Mode = (hi253_read_reg(0x01,0xff) & 0xfe); HI253_Sleep_Mode |= 0x01; retval = hi253_write_reg(0x01, HI253_Sleep_Mode); CLK_DIV_REG=(hi253_read_reg(0x12,0xff)&0xFc); // don't divide,PCLK=48M //read the shutter (manual exptime) retval = hi253_write_reg(0x03, 0x20); HI253_pv_HI253_exposure_lines = (hi253_read_reg(0x80,0xff) << 16)|(hi253_read_reg(0x81,0xff) << 8)|hi253_read_reg(0x82,0xff); HI253_cp_HI253_exposure_lines = HI253_pv_HI253_exposure_lines/2; retval = hi253_write_reg(0x03, 0x00); retval = hi253_write_reg(0x20, 0x00); retval = hi253_write_reg(0x21, 0x0a); retval = hi253_write_reg(0x22, 0x00); retval = hi253_write_reg(0x23, 0x0a); retval = hi253_write_reg(0x40, 0x01); //360 retval = hi253_write_reg(0x41, 0x68); retval = hi253_write_reg(0x42, 0x00); retval = hi253_write_reg(0x43, 0x14); retval = hi253_write_reg(0x03, 0x10); retval = hi253_write_reg(0x3f, 0x00); //Page12 retval = hi253_write_reg(0x03, 0x12); retval = hi253_write_reg(0x20, 0x0f); retval = hi253_write_reg(0x21, 0x0f); retval = hi253_write_reg(0x90, 0x5d); //Page13 retval = hi253_write_reg(0x03, 0x13); retval = hi253_write_reg(0x80, 0xfd); // 1600*1200 retval = hi253_write_reg(0x03,0x00); retval = hi253_write_reg(0x10,0x00); retval = hi253_write_reg(0x03, 0x00); retval = hi253_write_reg(0x12,21); retval = hi253_write_reg(0x03, 0x20); retval = hi253_write_reg(0x86, 0x01); retval = hi253_write_reg(0x87, 0xf4); retval = hi253_write_reg(0x8b, 0x3a); retval = hi253_write_reg(0x8c, 0x98); retval = hi253_write_reg(0x8d, 0x30); retval = hi253_write_reg(0x8e, 0xd4); retval = hi253_write_reg(0x9c, 0x17); retval = hi253_write_reg(0x9d, 0x70); retval = hi253_write_reg(0x9e, 0x01); retval = hi253_write_reg(0x9f, 0xf4); if(HI253_cp_HI253_exposure_lines<1) HI253_cp_HI253_exposure_lines=1; retval = hi253_write_reg(0x03, 0x20); retval = hi253_write_reg(0x83, HI253_cp_HI253_exposure_lines >> 16); retval = hi253_write_reg(0x84, (HI253_cp_HI253_exposure_lines >> 8) & 0x000000FF); retval = hi253_write_reg(0x85, HI253_cp_HI253_exposure_lines & 0x000000FF); retval = hi253_write_reg(0x03,0x00); HI253_Sleep_Mode = (hi253_read_reg(0x01,0xff) & 0xfe); HI253_Sleep_Mode |= 0x00; retval = hi253_write_reg(0x01, HI253_Sleep_Mode); */ return 0; } /*! * ioctl_g_ctrl - V4L2 sensor interface handler for VIDIOC_G_CTRL ioctl * @s: pointer to standard V4L2 device structure * @vc: standard V4L2 VIDIOC_G_CTRL ioctl structure * * If the requested control is supported, returns the control's current * value from the video_control[] array. Otherwise, returns -EINVAL * if the control is not supported. */ static int ioctl_g_ctrl(struct v4l2_int_device *s, struct v4l2_control *vc) { int ret = 0; switch (vc->id) { case V4L2_CID_BRIGHTNESS: vc->value = hi253_data.brightness; break; case V4L2_CID_HUE: vc->value = hi253_data.hue; break; case V4L2_CID_CONTRAST: vc->value = hi253_data.contrast; break; case V4L2_CID_SATURATION: vc->value = hi253_data.saturation; break; case V4L2_CID_RED_BALANCE: vc->value = hi253_data.red; break; case V4L2_CID_BLUE_BALANCE: vc->value = hi253_data.blue; break; case V4L2_CID_EXPOSURE: vc->value = hi253_data.ae_mode; break; default: ret = -EINVAL; } return ret; } /*! * ioctl_s_ctrl - V4L2 sensor interface handler for VIDIOC_S_CTRL ioctl * @s: pointer to standard V4L2 device structure * @vc: standard V4L2 VIDIOC_S_CTRL ioctl structure * * If the requested control is supported, sets the control's current * value in HW (and updates the video_control[] array). Otherwise, * returns -EINVAL if the control is not supported. */ static int ioctl_s_ctrl(struct v4l2_int_device *s, struct v4l2_control *vc) { int retval = 0; printk("\n=== [joe]=== %s, %d, %s\n", __FILE__,__LINE__,__func__); pr_debug("In hi253:ioctl_s_ctrl %d\n", vc->id); switch (vc->id) { case V4L2_CID_BRIGHTNESS: break; case V4L2_CID_CONTRAST: break; case V4L2_CID_SATURATION: break; case V4L2_CID_HUE: break; case V4L2_CID_AUTO_WHITE_BALANCE: break; case V4L2_CID_DO_WHITE_BALANCE: break; case V4L2_CID_RED_BALANCE: break; case V4L2_CID_BLUE_BALANCE: break; case V4L2_CID_GAMMA: break; case V4L2_CID_EXPOSURE: break; case V4L2_CID_AUTOGAIN: break; case V4L2_CID_GAIN: break; case V4L2_CID_HFLIP: break; case V4L2_CID_VFLIP: break; default: retval = -EPERM; break; } return retval; } /*! * ioctl_init - V4L2 sensor interface handler for VIDIOC_INT_INIT * @s: pointer to standard V4L2 device structure */ static int ioctl_init(struct v4l2_int_device *s) { return 0; } /*! * ioctl_dev_init - V4L2 sensor interface handler for vidioc_int_dev_init_num * @s: pointer to standard V4L2 device structure * * Initialise the device when slave attaches to the master. */ static int ioctl_dev_init(struct v4l2_int_device *s) { struct sensor *sensor = s->priv; u32 tgt_xclk; /* target xclk */ u32 tgt_fps; /* target frames per secound */ enum hi253_frame_rate frame_rate; gpio_sensor_active(hi253_data.csi); hi253_data.on = true; /* mclk */ tgt_xclk = hi253_data.mclk; tgt_xclk = min(tgt_xclk, (u32)HI253_XCLK_MAX); tgt_xclk = max(tgt_xclk, (u32)HI253_XCLK_MIN); hi253_data.mclk = tgt_xclk; pr_debug(" Setting mclk to %d MHz\n", tgt_xclk / 1000000); set_mclk_rate(&hi253_data.mclk, hi253_data.csi); /* Default camera frame rate is set in probe */ tgt_fps = sensor->streamcap.timeperframe.denominator / sensor->streamcap.timeperframe.numerator; if (tgt_fps == 15) frame_rate = hi253_15_fps; else if (tgt_fps == 30) frame_rate = hi253_30_fps; else return -EINVAL; /* Only support 15fps or 30fps now. */ return hi253_init_mode(frame_rate, sensor->streamcap.capturemode); } /*! * ioctl_dev_exit - V4L2 sensor interface handler for vidioc_int_dev_exit_num * @s: pointer to standard V4L2 device structure * * Delinitialise the device when slave detaches to the master. */ static int ioctl_dev_exit(struct v4l2_int_device *s) { gpio_sensor_inactive(hi253_data.csi); printk("\n=== [joe]=== %s, %d, %s\n", __FILE__,__LINE__,__func__); return 0; } /*! * This structure defines all the ioctls for this module and links them to the * enumeration. */ static struct v4l2_int_ioctl_desc hi253_ioctl_desc[] = { {vidioc_int_dev_init_num, (v4l2_int_ioctl_func *)ioctl_dev_init}, {vidioc_int_dev_exit_num, ioctl_dev_exit}, {vidioc_int_s_power_num, (v4l2_int_ioctl_func *)ioctl_s_power}, {vidioc_int_g_ifparm_num, (v4l2_int_ioctl_func *)ioctl_g_ifparm}, /* {vidioc_int_g_needs_reset_num, (v4l2_int_ioctl_func *)ioctl_g_needs_reset}, */ /* {vidioc_int_reset_num, (v4l2_int_ioctl_func *)ioctl_reset}, */ {vidioc_int_init_num, (v4l2_int_ioctl_func *)ioctl_init}, /* {vidioc_int_enum_fmt_cap_num, (v4l2_int_ioctl_func *)ioctl_enum_fmt_cap}, */ /* {vidioc_int_try_fmt_cap_num, (v4l2_int_ioctl_func *)ioctl_try_fmt_cap}, */ {vidioc_int_g_fmt_cap_num, (v4l2_int_ioctl_func *)ioctl_g_fmt_cap}, /* {vidioc_int_s_fmt_cap_num, (v4l2_int_ioctl_func *)ioctl_s_fmt_cap}, */ {vidioc_int_g_parm_num, (v4l2_int_ioctl_func *)ioctl_g_parm}, {vidioc_int_s_parm_num, (v4l2_int_ioctl_func *)ioctl_s_parm}, /* {vidioc_int_queryctrl_num, (v4l2_int_ioctl_func *)ioctl_queryctrl}, */ {vidioc_int_g_ctrl_num, (v4l2_int_ioctl_func *)ioctl_g_ctrl}, {vidioc_int_s_ctrl_num, (v4l2_int_ioctl_func *)ioctl_s_ctrl}, }; static struct v4l2_int_slave hi253_slave = { .ioctls = hi253_ioctl_desc, .num_ioctls = ARRAY_SIZE(hi253_ioctl_desc), }; static struct v4l2_int_device hi253_int_device = { .module = THIS_MODULE, .name = "hi253", .type = v4l2_int_type_slave, .u = { .slave = &hi253_slave, }, }; /*! * hi253 I2C probe function * * @param adapter struct i2c_adapter * * @return Error code indicating success or failure */ static int hi253_probe(struct i2c_client *client, const struct i2c_device_id *id) { int retval; struct mxc_camera_platform_data *plat_data = client->dev.platform_data; printk("\n=== [joe]=== %s, %d, %s\n", __FILE__,__LINE__,__func__); /* Set initial values for the sensor struct. */ memset(&hi253_data, 0, sizeof(hi253_data)); hi253_data.mclk = 24000000; /* 6 - 54 MHz, typical 24MHz */ hi253_data.mclk = plat_data->mclk; hi253_data.csi = plat_data->csi; hi253_data.i2c_client = client; hi253_data.pix.pixelformat = V4L2_PIX_FMT_UYVY; hi253_data.pix.width = 640; hi253_data.pix.height = 480; hi253_data.streamcap.capability = V4L2_MODE_HIGHQUALITY | V4L2_CAP_TIMEPERFRAME; hi253_data.streamcap.capturemode = 0; hi253_data.streamcap.timeperframe.denominator = DEFAULT_FPS; hi253_data.streamcap.timeperframe.numerator = 1; if (plat_data->io_regulator) { io_regulator = regulator_get(&client->dev, plat_data->io_regulator); if (!IS_ERR(io_regulator)) { regulator_set_voltage(io_regulator, HI253_VOLTAGE_DIGITAL_IO, HI253_VOLTAGE_DIGITAL_IO); if (regulator_enable(io_regulator) != 0) { pr_err("%s:io set voltage error\n", __func__); goto err1; } else { dev_dbg(&client->dev, "%s:io set voltage ok\n", __func__); } } else io_regulator = NULL; } if (plat_data->core_regulator) { core_regulator = regulator_get(&client->dev, plat_data->core_regulator); if (!IS_ERR(core_regulator)) { regulator_set_voltage(core_regulator, HI253_VOLTAGE_DIGITAL_CORE, HI253_VOLTAGE_DIGITAL_CORE); if (regulator_enable(core_regulator) != 0) { pr_err("%s:core set voltage error\n", __func__); goto err2; } else { dev_dbg(&client->dev, "%s:core set voltage ok\n", __func__); } } else core_regulator = NULL; } if (plat_data->analog_regulator) { analog_regulator = regulator_get(&client->dev, plat_data->analog_regulator); if (!IS_ERR(analog_regulator)) { regulator_set_voltage(analog_regulator, HI253_VOLTAGE_ANALOG, HI253_VOLTAGE_ANALOG); if (regulator_enable(analog_regulator) != 0) { pr_err("%s:analog set voltage error\n", __func__); goto err3; } else { dev_dbg(&client->dev, "%s:analog set voltage ok\n", __func__); } } else analog_regulator = NULL; } if (plat_data->gpo_regulator) { gpo_regulator = regulator_get(&client->dev, plat_data->gpo_regulator); if (!IS_ERR(gpo_regulator)) { regulator_set_voltage(gpo_regulator, HI253_VOLTAGE_DIGITAL_GPO, HI253_VOLTAGE_DIGITAL_GPO); if (regulator_enable(gpo_regulator) != 0) { pr_err("%s:gpo enable error\n", __func__); goto err4; } else { dev_dbg(&client->dev, "%s:gpo enable ok\n", __func__); } } else gpo_regulator = NULL; } if (plat_data->pwdn) plat_data->pwdn(0); camera_plat = plat_data; hi253_int_device.priv = &hi253_data; retval = v4l2_int_device_register(&hi253_int_device); return retval; err4: if (analog_regulator) { regulator_disable(analog_regulator); regulator_put(analog_regulator); } err3: if (core_regulator) { regulator_disable(core_regulator); regulator_put(core_regulator); } err2: if (io_regulator) { regulator_disable(io_regulator); regulator_put(io_regulator); } err1: return -1; } /*! * hi253 I2C detach function * * @param client struct i2c_client * * @return Error code indicating success or failure */ static int hi253_remove(struct i2c_client *client) { v4l2_int_device_unregister(&hi253_int_device); if (gpo_regulator) { regulator_disable(gpo_regulator); regulator_put(gpo_regulator); } if (analog_regulator) { regulator_disable(analog_regulator); regulator_put(analog_regulator); } if (core_regulator) { regulator_disable(core_regulator); regulator_put(core_regulator); } if (io_regulator) { regulator_disable(io_regulator); regulator_put(io_regulator); } return 0; } /*! * hi253 init function * Called by insmod hi253_camera.ko. * * @return Error code indicating success or failure */ static __init int hi253_init(void) { u8 err; err = i2c_add_driver(&hi253_i2c_driver); if (err != 0) pr_err("%s:driver registration failed, error=%d \n", __func__, err); return err; } /*! * HI253 cleanup function * Called on rmmod hi253_camera.ko * * @return Error code indicating success or failure */ static void __exit hi253_clean(void) { i2c_del_driver(&hi253_i2c_driver); } module_init(hi253_init); module_exit(hi253_clean); MODULE_AUTHOR("XXX,Inc. JOE"); MODULE_DESCRIPTION("HI253 Camera Driver"); MODULE_LICENSE("GPL"); MODULE_VERSION("1.0"); MODULE_ALIAS("CSI");