2 #include "generic_sensor.h"
\r
5 * Driver Version Note
\r
6 *v0.0.1: this driver is compatible with generic_sensor
\r
8 * add sensor_focus_af_const_pause_usr_cb;
\r
10 static int version = KERNEL_VERSION(0,0,3);
\r
11 module_param(version, int, S_IRUGO);
\r
15 module_param(debug, int, S_IRUGO|S_IWUSR);
\r
17 #define dprintk(level, fmt, arg...) do { \
\r
18 if (debug >= level) \
\r
19 printk(KERN_WARNING fmt , ## arg); } while (0)
\r
21 /* Sensor Driver Configuration Begin */
\r
22 #define SENSOR_NAME RK29_CAM_SENSOR_GC0307
\r
23 #define SENSOR_V4L2_IDENT V4L2_IDENT_GC0307
\r
24 #define SENSOR_ID 0x99
\r
25 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\
\r
26 V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_LOW|\
\r
27 V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
\r
28 #define SENSOR_PREVIEW_W 640
\r
29 #define SENSOR_PREVIEW_H 480
\r
30 #define SENSOR_PREVIEW_FPS 15000 // 15fps
\r
31 #define SENSOR_FULLRES_L_FPS 7500 // 7.5fps
\r
32 #define SENSOR_FULLRES_H_FPS 7500 // 7.5fps
\r
33 #define SENSOR_720P_FPS 0
\r
34 #define SENSOR_1080P_FPS 0
\r
36 #define SENSOR_REGISTER_LEN 1 // sensor register address bytes
\r
37 #define SENSOR_VALUE_LEN 1 // sensor register value bytes
\r
39 static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect|CFG_Scene);
\r
40 static unsigned int SensorChipID[] = {SENSOR_ID};
\r
41 /* Sensor Driver Configuration End */
\r
44 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))
\r
45 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)
\r
47 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)
\r
48 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
49 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
50 #define sensor_write_array generic_sensor_write_array
\r
52 struct sensor_parameter
\r
54 unsigned int PreviewDummyPixels;
\r
55 unsigned int CaptureDummyPixels;
\r
56 unsigned int preview_exposure;
\r
57 unsigned short int preview_line_width;
\r
58 unsigned short int preview_gain;
\r
60 unsigned short int PreviewPclk;
\r
61 unsigned short int CapturePclk;
\r
65 struct specific_sensor{
\r
66 struct generic_sensor common_sensor;
\r
67 //define user data below
\r
68 struct sensor_parameter parameter;
\r
73 * The follow setting need been filled.
\r
76 * sensor_init_data : Sensor initial setting;
\r
77 * sensor_fullres_lowfps_data : Sensor full resolution setting with best auality, recommand for video;
\r
78 * sensor_preview_data : Sensor preview resolution setting, recommand it is vga or svga;
\r
79 * sensor_softreset_data : Sensor software reset register;
\r
80 * sensor_check_id_data : Sensir chip id register;
\r
83 * sensor_fullres_highfps_data: Sensor full resolution setting with high framerate, recommand for video;
\r
84 * sensor_720p: Sensor 720p setting, it is for video;
\r
85 * sensor_1080p: Sensor 1080p setting, it is for video;
\r
88 * The SensorEnd which is the setting end flag must be filled int the last of each setting;
\r
91 /* Sensor initial setting */
\r
92 static struct rk_sensor_reg sensor_init_data[] ={
\r
93 //========= close output
\r
97 //========= close some functions
\r
98 // open them after configure their parmameters
\r
102 {0x47 ,0x00}, //mode1,
\r
103 {0x48 ,0xc3}, //mode2,
\r
104 {0x49 ,0x00}, //dither_mode
\r
105 {0x4a ,0x00}, //clock_gating_en
\r
106 {0x4b ,0x00}, //mode_reg3
\r
107 {0x4E ,0x22},//0x23}, //sync mode yaowei
\r
108 {0x4F ,0x01}, //AWB, AEC, every N frame
\r
110 //========= frame timing
\r
113 {0x1C ,0x00}, //Vs_st
\r
114 {0x1D ,0x00}, //Vs_et
\r
115 {0x10 ,0x00}, //high 4 bits of VB, HB
\r
116 {0x11 ,0x05}, //row_tail, AD_pipe_number
\r
122 //========= windowing
\r
123 {0x05 ,0x00}, //row_start
\r
125 {0x07 ,0x00}, //col start
\r
127 {0x09 ,0x01}, //win height
\r
129 {0x0B ,0x02}, //win width, pixel array only 640
\r
133 {0x0D ,0x22}, //rsh_width
\r
135 {0x0E ,0x02}, //CISCTL mode2,
\r
138 {0x12 ,0x70}, //7 hrst, 6_4 darsg,
\r
139 {0x13 ,0x00}, //7 CISCTL_restart, 0 apwd
\r
141 {0x15 ,0xba}, //7_4 vref
\r
142 {0x16 ,0x13}, //5to4 _coln_r, __1to0__da18
\r
143 {0x17 ,0x52}, //opa_r, ref_r, sRef_r
\r
144 //{0x18 ,0xc0}, //analog_mode, best case for left band.
\r
146 {0x1E ,0x0d}, //tsp_width
\r
147 {0x1F ,0x32}, //sh_delay
\r
150 {0x47 ,0x00}, //7__test_image, __6__fixed_pga, __5__auto_DN, __4__CbCr_fix,
\r
151 //__3to2__dark_sequence, __1__allow_pclk_vcync, __0__LSC_test_image
\r
152 {0x19 ,0x06}, //pga_o
\r
153 {0x1a ,0x06}, //pga_e
\r
155 {0x31 ,0x00}, //4 //pga_oFFset , high 8bits of 11bits
\r
156 {0x3B ,0x00}, //global_oFFset, low 8bits of 11bits
\r
158 {0x59 ,0x0f}, //offset_mode
\r
159 {0x58 ,0x88}, //DARK_VALUE_RATIO_G, DARK_VALUE_RATIO_RB
\r
160 {0x57 ,0x08}, //DARK_CURRENT_RATE
\r
161 {0x56 ,0x77}, //PGA_OFFSET_EVEN_RATIO, PGA_OFFSET_ODD_RATIO
\r
164 {0x35 ,0xd8}, //blk_mode
\r
180 {0x7e ,0x50},//0x45 ylz++
\r
181 {0x7f ,0x76}, //0x66
\r
187 //========= manual_gain
\r
188 {0x61 ,0x80}, //manual_gain_g1
\r
189 {0x63 ,0x80}, //manual_gain_r
\r
190 {0x65 ,0x98}, //manual_gai_b, 0xa0=1.25, 0x98=1.1875
\r
191 {0x67 ,0x80}, //manual_gain_g2
\r
192 {0x68 ,0x18}, //global_manual_gain 2.4bits
\r
214 {0x7d ,0x2f}, //dn_mode
\r
215 {0x80 ,0x0c}, //when auto_dn, check 7e,7f
\r
220 {0x83 ,0x18}, //DD_TH1
\r
221 {0x84 ,0x18}, //DD_TH2
\r
222 {0x85 ,0x04}, //DD_TH3
\r
223 {0x87 ,0x34}, //32 b DNDD_low_range X16, DNDD_low_range_C_weight_center
\r
226 //=========intp-ee
\r
246 {0x77 ,0x80}, //contrast_center
\r
247 {0x78 ,0x00}, //fixed_Cb
\r
248 {0x79 ,0x00}, //fixed_Cr
\r
249 {0x7a ,0x00}, //luma_offset
\r
250 {0x7b ,0x40}, //hue_cos
\r
251 {0x7c ,0x00}, //hue_sin
\r
254 {0xa0 ,0x40}, //global_saturation
\r
255 {0xa1 ,0x42}, //luma_contrast
\r
256 {0xa2 ,0x40}, //saturation_Cb //ylz 34
\r
257 {0xa3 ,0x34}, //saturation_Cr
\r
292 {0xc4 ,0x1c}, //18//20
\r
300 {0xcd ,0x80}, //R_ratio
\r
301 {0xce ,0x80}, //G_ratio , cold_white white
\r
302 {0xcf ,0x80}, //B_ratio
\r
305 {0x20 ,0x06},//0x02
\r
314 {0x28 ,0x02}, //AEC_exp_level_1bit11to8
\r
315 {0x29 ,0x58}, //AEC_exp_level_1bit7to0
\r
316 {0x2a ,0x03}, //AEC_exp_level_2bit11to8
\r
317 {0x2b ,0x84}, //AEC_exp_level_2bit7to0
\r
318 {0x2c ,0x09}, //AEC_exp_level_3bit11to8 659 - 8FPS, 8ca - 6FPS //
\r
319 {0x2d ,0x60}, //AEC_exp_level_3bit7to0
\r
320 {0x2e ,0x0a}, //AEC_exp_level_4bit11to8 4FPS
\r
321 {0x2f ,0x8c}, //AEC_exp_level_4bit7to0
\r
331 {0xd1 ,0x40}, //AEC_target_Y
\r
332 {0xd2 ,0x61},//0xf2
\r
334 {0xd5 ,0x01}, // william 0318
\r
335 {0xd6 ,0x96}, //antiflicker_step
\r
336 {0xd7 ,0x03}, //AEC_exp_time_min ,william 20090312
\r
339 {0xdd ,0x12},//0x12
\r
341 //========= measure window
\r
352 //========= close_frame
\r
353 {0xed ,0x00}, //close_frame_num1 ,can be use to reduce FPS
\r
354 {0xee ,0x00}, //close_frame_num2
\r
355 {0xef ,0x00}, //close_frame_num
\r
358 {0xf0 ,0x01}, //select page1
\r
392 //=============================lscP
\r
417 //============================= ccP
\r
419 {0x69 ,0x03}, //cc_mode
\r
438 //============================= AGP
\r
441 {0x7f ,0x20}, //x040
\r
464 //about gamma1 is hex r oct
\r
483 //========= open functions
\r
484 {0xf0 ,0x00}, //set back to page0
\r
488 ///// Çë×¢Ò⣬µ÷ÕûGC0307µÄ¾µÏñºÍ·×ª£¬ÐèҪͬʱÐÞ¸ÄÈý¸ö¼Ä´æÆ÷£¬ÈçÏÂ:
\r
493 ///banding setting
\r
494 { 0x01 ,0xfa}, // 24M
\r
512 ///// ËÄÖÖ²»Í¬µÄ·×ªºÍ¾µÏñÉ趨£¬¿Í»§¿ÉÖ±½Ó¸´ÖÆ!!!!!!
\r
526 // IMAGE_V_MIRROR:
\r
531 // IMAGE_HV_MIRROR: // 180
\r
541 /* Senor full resolution setting: recommand for capture */
\r
542 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={
\r
546 /* Senor full resolution setting: recommand for video */
\r
547 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={
\r
550 /* Preview resolution setting*/
\r
551 static struct rk_sensor_reg sensor_preview_data[] =
\r
557 { 0x08 , 0x00},//0x10 james 20100715
\r
561 { 0x0c , 0x88},//0x80 james 20100715
\r
562 { 0x45 , 0x24}, // bit[7:2]=001001
\r
563 { 0x48 , 0x84}, // bit[7]=1
\r
585 static struct rk_sensor_reg sensor_720p[]={
\r
590 static struct rk_sensor_reg sensor_1080p[]={
\r
595 static struct rk_sensor_reg sensor_softreset_data[]={
\r
599 static struct rk_sensor_reg sensor_check_id_data[]={
\r
600 SensorRegVal(0x00,0),
\r
604 * The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx
\r
606 static struct rk_sensor_reg sensor_WhiteB_Auto[]=
\r
608 {0xc7,0x4c}, //for AWB can adjust back
\r
614 /* Cloudy Colour Temperature : 6500K - 8000K */
\r
615 static struct rk_sensor_reg sensor_WhiteB_Cloudy[]=
\r
617 {0x41,0x2b}, // Enable AWB
\r
618 {0xc7,0x5a}, //WB_manual_gain
\r
623 /* ClearDay Colour Temperature : 5000K - 6500K */
\r
624 static struct rk_sensor_reg sensor_WhiteB_ClearDay[]=
\r
627 {0x41,0x2b}, // Enable AWB
\r
633 /* Office Colour Temperature : 3500K - 5000K */
\r
634 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=
\r
637 {0x41,0x2b}, // Enable AWB
\r
644 /* Home Colour Temperature : 2500K - 3500K */
\r
645 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=
\r
648 {0x41,0x2b}, // Enable AWB
\r
654 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,
\r
655 sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,
\r
658 static struct rk_sensor_reg sensor_Brightness0[]=
\r
665 static struct rk_sensor_reg sensor_Brightness1[]=
\r
673 static struct rk_sensor_reg sensor_Brightness2[]=
\r
681 static struct rk_sensor_reg sensor_Brightness3[]=
\r
688 static struct rk_sensor_reg sensor_Brightness4[]=
\r
695 static struct rk_sensor_reg sensor_Brightness5[]=
\r
701 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,
\r
702 sensor_Brightness4, sensor_Brightness5,NULL,
\r
705 static struct rk_sensor_reg sensor_Effect_Normal[] =
\r
726 static struct rk_sensor_reg sensor_Effect_WandB[] =
\r
728 {0x41,0x2f}, // danse
\r
747 static struct rk_sensor_reg sensor_Effect_Sepia[] =
\r
768 static struct rk_sensor_reg sensor_Effect_Negative[] =
\r
789 static struct rk_sensor_reg sensor_Effect_Bluish[] =
\r
811 static struct rk_sensor_reg sensor_Effect_Green[] =
\r
833 static struct rk_sensor_reg sensor_Effect_Grayscale[]=
\r
849 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,
\r
850 sensor_Effect_Bluish, sensor_Effect_Green,NULL,
\r
853 static struct rk_sensor_reg sensor_Exposure0[]=
\r
861 static struct rk_sensor_reg sensor_Exposure1[]=
\r
868 static struct rk_sensor_reg sensor_Exposure2[]=
\r
875 static struct rk_sensor_reg sensor_Exposure3[]=
\r
882 static struct rk_sensor_reg sensor_Exposure4[]=
\r
889 static struct rk_sensor_reg sensor_Exposure5[]=
\r
897 static struct rk_sensor_reg sensor_Exposure6[]=
\r
904 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,
\r
905 sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,
\r
908 static struct rk_sensor_reg sensor_Saturation0[]=
\r
913 static struct rk_sensor_reg sensor_Saturation1[]=
\r
918 static struct rk_sensor_reg sensor_Saturation2[]=
\r
922 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};
\r
924 static struct rk_sensor_reg sensor_Contrast0[]=
\r
930 static struct rk_sensor_reg sensor_Contrast1[]=
\r
936 static struct rk_sensor_reg sensor_Contrast2[]=
\r
942 static struct rk_sensor_reg sensor_Contrast3[]=
\r
948 static struct rk_sensor_reg sensor_Contrast4[]=
\r
955 static struct rk_sensor_reg sensor_Contrast5[]=
\r
961 static struct rk_sensor_reg sensor_Contrast6[]=
\r
966 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,
\r
967 sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,
\r
969 static struct rk_sensor_reg sensor_SceneAuto[] =
\r
971 { 0xdd ,0x22}, //0x12
\r
978 static struct rk_sensor_reg sensor_SceneNight[] =
\r
986 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};
\r
988 static struct rk_sensor_reg sensor_Zoom0[] =
\r
993 static struct rk_sensor_reg sensor_Zoom1[] =
\r
998 static struct rk_sensor_reg sensor_Zoom2[] =
\r
1004 static struct rk_sensor_reg sensor_Zoom3[] =
\r
1008 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
\r
1011 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu
\r
1013 static struct v4l2_querymenu sensor_menus[] =
\r
1017 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl
\r
1019 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =
\r
1023 //MUST define the current used format as the first item
\r
1024 static struct rk_sensor_datafmt sensor_colour_fmts[] = {
\r
1025 {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}
\r
1027 /*static struct soc_camera_ops sensor_ops;*/
\r
1031 **********************************************************
\r
1032 * Following is local code:
\r
1034 * Please codeing your program here
\r
1035 **********************************************************
\r
1038 **********************************************************
\r
1039 * Following is callback
\r
1040 * If necessary, you could coding these callback
\r
1041 **********************************************************
\r
1044 * the function is called in open sensor
\r
1046 static int sensor_activate_cb(struct i2c_client *client)
\r
1052 * the function is called in close sensor
\r
1054 static int sensor_deactivate_cb(struct i2c_client *client)
\r
1060 * the function is called before sensor register setting in VIDIOC_S_FMT
\r
1062 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
1068 * the function is called after sensor register setting finished in VIDIOC_S_FMT
\r
1070 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
1074 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)
\r
1079 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
1084 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
1088 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)
\r
1090 //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1092 if (pm_msg.event == PM_EVENT_SUSPEND) {
\r
1093 SENSOR_DG("Suspend");
\r
1096 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);
\r
1102 static int sensor_resume(struct soc_camera_device *icd)
\r
1105 SENSOR_DG("Resume");
\r
1110 static int sensor_mirror_cb (struct i2c_client *client, int mirror)
\r
1112 char val1,val2,val3;
\r
1115 SENSOR_DG("mirror: %d",mirror);
\r
1117 sensor_write(client, 0xf0, 0);
\r
1118 err = sensor_read(client,0x0f,&val1);
\r
1119 err = sensor_read(client,0x45,&val2);
\r
1120 err = sensor_read(client,0x47,&val3);
\r
1122 if((val1 == 0xb2) && (val2 == 0x27) && (val3 == 0x2c)){//normal
\r
1123 err = sensor_write(client, 0x0f, 0xa2);
\r
1124 err = sensor_write(client, 0x45, 0x26);
\r
1125 err = sensor_write(client, 0x47, 0x28);
\r
1126 }else if((val1 == 0xa2) && (val2 == 0x26) && (val3 == 0x28)){//h_mir
\r
1127 err = sensor_write(client, 0x0f, 0xb2);
\r
1128 err = sensor_write(client, 0x45, 0x27);
\r
1129 err = sensor_write(client, 0x47, 0x2c);
\r
1130 }else if((val1 == 0x92) && (val2 == 0x25) && (val3 == 0x24)){//v_flip
\r
1131 err = sensor_write(client, 0x0f, 0x82);
\r
1132 err = sensor_write(client, 0x45, 0x24);
\r
1133 err = sensor_write(client, 0x47, 0x20);
\r
1134 }else if((val1 == 0x82) && (val2 == 0x24) && (val3 == 0x20)){//h_v_mir
\r
1135 err = sensor_write(client, 0x0f, 0x92);
\r
1136 err = sensor_write(client, 0x45, 0x25);
\r
1137 err = sensor_write(client, 0x47, 0x24);
\r
1149 * the function is v4l2 control V4L2_CID_HFLIP callback
\r
1151 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
1152 struct v4l2_ext_control *ext_ctrl)
\r
1154 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1156 if (sensor_mirror_cb(client,ext_ctrl->value) != 0)
\r
1157 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);
\r
1159 SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);
\r
1163 static int sensor_flip_cb(struct i2c_client *client, int flip)
\r
1165 char val1,val2,val3;
\r
1168 SENSOR_DG("flip: %d",flip);
\r
1170 sensor_write(client, 0xf0, 0);
\r
1171 err = sensor_read(client,0x0f,&val1);
\r
1172 err = sensor_read(client,0x45,&val2);
\r
1173 err = sensor_read(client,0x47,&val3);
\r
1175 if((val1 == 0xb2) && (val2 == 0x27) && (val3 == 0x2c)){//normal
\r
1176 err = sensor_write(client, 0x0f, 0x92);
\r
1177 err = sensor_write(client, 0x45, 0x25);
\r
1178 err = sensor_write(client, 0x47, 0x24);
\r
1179 }else if((val1 == 0xa2) && (val2 == 0x26) && (val3 == 0x28)){//h_mir
\r
1180 err = sensor_write(client, 0x0f, 0x82);
\r
1181 err = sensor_write(client, 0x45, 0x24);
\r
1182 err = sensor_write(client, 0x47, 0x20);
\r
1183 }else if((val1 == 0x92) && (val2 == 0x25) && (val3 == 0x24)){//v_flip
\r
1184 err = sensor_write(client, 0x0f, 0xb2);
\r
1185 err = sensor_write(client, 0x45, 0x27);
\r
1186 err = sensor_write(client, 0x47, 0x2c);
\r
1187 }else if((val1 == 0x82) && (val2 == 0x24) && (val3 == 0x20)){//h_v_mir
\r
1188 err = sensor_write(client, 0x0f, 0xa2);
\r
1189 err = sensor_write(client, 0x45, 0x26);
\r
1190 err = sensor_write(client, 0x47, 0x28);
\r
1202 * the function is v4l2 control V4L2_CID_VFLIP callback
\r
1204 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
1205 struct v4l2_ext_control *ext_ctrl)
\r
1207 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1209 if (sensor_flip_cb(client,ext_ctrl->value) != 0)
\r
1210 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);
\r
1212 SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);
\r
1216 * the functions are focus callbacks
\r
1218 static int sensor_focus_init_usr_cb(struct i2c_client *client){
\r
1222 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){
\r
1226 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){
\r
1230 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){
\r
1234 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){
\r
1238 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){
\r
1241 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1245 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){
\r
1249 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)
\r
1255 face defect call back
\r
1257 static int sensor_face_detect_usr_cb(struct i2c_client *client,int on){
\r
1262 * The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some
\r
1263 * initialization in the function.
\r
1265 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)
\r
1271 * :::::WARNING:::::
\r
1272 * It is not allowed to modify the following code
\r
1275 sensor_init_parameters_default_code();
\r
1277 sensor_v4l2_struct_initialization();
\r
1279 sensor_probe_default_code();
\r
1281 sensor_remove_default_code();
\r
1283 sensor_driver_default_module_code();
\r