Merge branch 'linux-linaro-lsk-v4.4-android' of git://git.linaro.org/kernel/linux...
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / gc0307.c
1 \r
2 #include "generic_sensor.h"\r
3 \r
4 /*
5 *      Driver Version Note\r
6 *v0.0.1: this driver is compatible with generic_sensor\r
7 *v0.0.3:\r
8 *        add sensor_focus_af_const_pause_usr_cb;\r
9 */\r
10 static int version = KERNEL_VERSION(0,0,3);\r
11 module_param(version, int, S_IRUGO);\r
12 \r
13 \r
14 static int debug;\r
15 module_param(debug, int, S_IRUGO|S_IWUSR);\r
16 \r
17 #define dprintk(level, fmt, arg...) do {                        \\r
18         if (debug >= level)                                     \\r
19         printk(KERN_WARNING fmt , ## arg); } while (0)\r
20 \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_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
35 \r
36 #define SENSOR_REGISTER_LEN                              1                 // sensor register address bytes\r
37 #define SENSOR_VALUE_LEN                                         1                 // sensor register value bytes\r
38                                                                         \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
42 \r
43 \r
44 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
45 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
46 \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
51 \r
52 struct sensor_parameter\r
53 {\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
59 \r
60         unsigned short int PreviewPclk;\r
61         unsigned short int CapturePclk;\r
62         char awb[6];\r
63 };\r
64 \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
69 \r
70 };\r
71 \r
72 /*\r
73 *  The follow setting need been filled.\r
74 *  \r
75 *  Must 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
81 *\r
82 *  Optional filled:\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
86 *\r
87 *  :::::WARNING:::::\r
88 *  The SensorEnd which is the setting end flag must be filled int the last of each setting;\r
89 */\r
90 \r
91 /* Sensor initial setting */\r
92 static struct rk_sensor_reg sensor_init_data[] ={\r
93         //========= close output\r
94                 {0x43  ,0x00}, \r
95                 {0x44  ,0xa2}, \r
96                 \r
97                 //========= close some functions\r
98                 // open them after configure their parmameters\r
99                 {0x40  ,0x10}, \r
100                 {0x41  ,0x00},                  \r
101                 {0x42  ,0x10},                                          \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
109                 \r
110                 //========= frame timing\r
111                 {0x01  ,0x6a}, //HB\r
112                 {0x02  ,0x70}, //VB\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
117         \r
118         \r
119                                         \r
120                 \r
121                 \r
122                 //========= windowing\r
123                 {0x05  ,0x00}, //row_start\r
124                 {0x06  ,0x00},\r
125                 {0x07  ,0x00}, //col start\r
126                 {0x08  ,0x00}, \r
127                 {0x09  ,0x01}, //win height\r
128                 {0x0A  ,0xE8},\r
129                 {0x0B  ,0x02}, //win width, pixel array only 640\r
130                 {0x0C  ,0x80},\r
131                 \r
132                 //========= analog\r
133                 {0x0D  ,0x22}, //rsh_width\r
134                                                   \r
135                 {0x0E  ,0x02}, //CISCTL mode2,  \r
136         \r
137                                   \r
138                 {0x12  ,0x70}, //7 hrst, 6_4 darsg,\r
139                 {0x13  ,0x00}, //7 CISCTL_restart, 0 apwd\r
140                 {0x14  ,0x00}, //NA\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
145                 \r
146                 {0x1E  ,0x0d}, //tsp_width                 \r
147                 {0x1F  ,0x32}, //sh_delay\r
148                 \r
149                 //========= offset\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
154                 \r
155                 {0x31  ,0x00},  //4 //pga_oFFset ,       high 8bits of 11bits\r
156                 {0x3B  ,0x00},  //global_oFFset, low 8bits of 11bits\r
157                 \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
162                 \r
163                 //========= blk\r
164                 {0x35  ,0xd8},  //blk_mode\r
165         \r
166                 {0x36  ,0x40},  \r
167                 \r
168                 {0x3C  ,0x00}, \r
169                 {0x3D  ,0x00}, \r
170                 {0x3E  ,0x00}, \r
171                 {0x3F  ,0x00}, \r
172                 \r
173                 {0xb5  ,0x70}, \r
174                 {0xb6  ,0x40}, \r
175                 {0xb7  ,0x00}, \r
176                 {0xb8  ,0x38}, \r
177                 {0xb9  ,0xc3},            \r
178                 {0xba  ,0x0f}, \r
179                 \r
180                 {0x7e  ,0x50},//0x45 ylz++ \r
181                 {0x7f  ,0x76},   //0x66\r
182                 \r
183                 {0x5c  ,0x48}, //78\r
184                 {0x5d  ,0x58}, //88\r
185                 \r
186                 \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
193                 \r
194                 //=========CC _R\r
195                 {0x69  ,0x58},  //54\r
196                 {0x6A  ,0xf6},  //ff\r
197                 {0x6B  ,0xfb},  //fe\r
198                 {0x6C  ,0xf4},  //ff\r
199                 {0x6D  ,0x5a},  //5f\r
200                 {0x6E  ,0xe6},  //e1\r
201         \r
202                 {0x6f  ,0x00},  \r
203                 \r
204                 //=========lsc                                                    \r
205                 {0x70  ,0x14}, \r
206                 {0x71  ,0x1c}, \r
207                 {0x72  ,0x20}, \r
208                 \r
209                 {0x73  ,0x10},  \r
210                 {0x74  ,0x3c}, \r
211                 {0x75  ,0x52}, \r
212                 \r
213                 //=========dn                                                                                                                                                    \r
214                 {0x7d  ,0x2f},  //dn_mode               \r
215                 {0x80  ,0x0c}, //when auto_dn, check 7e,7f\r
216                 {0x81  ,0x0c},\r
217                 {0x82  ,0x44},\r
218                                                                                                                                                                                         \r
219                 //dd                                                                                                                                               \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
224                 \r
225                    \r
226                 //=========intp-ee                                                                                                                                                 \r
227                 {0x88  ,0x04},                                                                                                             \r
228                 {0x89  ,0x01},                                                                                    \r
229                 {0x8a  ,0x50},//60                                                                                         \r
230                 {0x8b  ,0x50},//60                                                                                         \r
231                 {0x8c  ,0x07},                                                                                                                                    \r
232                                                                                                                                                                                   \r
233                 {0x50  ,0x0c},                                                                  \r
234                 {0x5f  ,0x3c},                                                                                                                                                                   \r
235                                                                                                                                                                                  \r
236                 {0x8e  ,0x02},                                                                                                                            \r
237                 {0x86  ,0x02},                                                                                                                                    \r
238                                                                                                                                                                                 \r
239                 {0x51  ,0x20},                                                                                                                                  \r
240                 {0x52  ,0x08},  \r
241                 {0x53  ,0x00}, \r
242                 \r
243                 \r
244                 //========= YCP \r
245                 //contrast_center                                                                                                                                                         \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
252                                                                                                                                                                                                  \r
253                 //saturation                                                                                                                                                              \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
258                                                                                                                                                                         \r
259                 {0xa4  ,0xc8},                                                                                                                            \r
260                 {0xa5  ,0x02}, \r
261                 {0xa6  ,0x28},                                                                                                                                                    \r
262                 {0xa7  ,0x02}, \r
263                 \r
264                 //skin                                                                                                                                                                                            \r
265                 {0xa8  ,0xee},                                                                                                                    \r
266                 {0xa9  ,0x12},                                                                                                                    \r
267                 {0xaa  ,0x01},                                                                                                            \r
268                 {0xab  ,0x20},                                                                                                    \r
269                 {0xac  ,0xf0},                                                                                                            \r
270                 {0xad  ,0x10},                                                                                                                    \r
271                         \r
272                 //========= ABS\r
273                 {0xae  ,0x18}, \r
274                 {0xaf  ,0x74}, \r
275                 {0xb0  ,0xe0},    \r
276                 {0xb1  ,0x20}, \r
277                 {0xb2  ,0x6c}, \r
278                 {0xb3  ,0x40}, \r
279                 {0xb4  ,0x04}, \r
280                         \r
281                 //========= AWB \r
282                 {0xbb  ,0x42}, \r
283                 {0xbc  ,0x60},\r
284                 {0xbd  ,0x50},\r
285                 {0xbe  ,0x50},\r
286                 \r
287                 {0xbf  ,0x0c}, \r
288                 {0xc0  ,0x06}, \r
289                 {0xc1  ,0x60}, \r
290                 {0xc2  ,0xf1},  //f1\r
291                 {0xc3  ,0x40},\r
292                 {0xc4  ,0x1c}, //18//20\r
293                 {0xc5  ,0x56},  //33\r
294                 {0xc6  ,0x1d}, \r
295         \r
296                 {0xca  ,0x70}, \r
297                 {0xcb  ,0x70}, \r
298                 {0xcc  ,0x78},\r
299                 \r
300                 {0xcd  ,0x80}, //R_ratio                                                                         \r
301                 {0xce  ,0x80}, //G_ratio  , cold_white white                                                               \r
302                 {0xcf  ,0x80}, //B_ratio        \r
303                 \r
304                 //=========  aecT  \r
305                 {0x20  ,0x06},//0x02 \r
306                 {0x21  ,0xc0}, \r
307                 {0x22  ,0x40},    \r
308                 {0x23  ,0x88}, \r
309                 {0x24  ,0x96}, \r
310                 {0x25  ,0x30}, \r
311                 {0x26  ,0xd0}, \r
312                 {0x27  ,0x00}, \r
313                 \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
322                 \r
323                 {0x30  ,0x20},                                            \r
324                 {0x31  ,0x00},                                     \r
325                 {0x32  ,0x1c}, \r
326                 {0x33  ,0x90},                    \r
327                 {0x34  ,0x10},  \r
328                 \r
329                 {0xd0  ,0x34}, \r
330                                    \r
331                 {0xd1  ,0x40}, //AEC_target_Y                                              \r
332                 {0xd2  ,0x61},//0xf2      \r
333                 {0xd4  ,0x96}, \r
334                 {0xd5  ,0x01}, // william 0318\r
335                 {0xd6  ,0x96}, //antiflicker_step                                          \r
336                 {0xd7  ,0x03}, //AEC_exp_time_min ,william 20090312                \r
337                 {0xd8  ,0x02}, \r
338                                    \r
339                 {0xdd  ,0x12},//0x12 \r
340                                                                                                                                         \r
341                 //========= measure window                                                                              \r
342                 {0xe0  ,0x03},                                           \r
343                 {0xe1  ,0x02},                                                   \r
344                 {0xe2  ,0x27},                                                           \r
345                 {0xe3  ,0x1e},                           \r
346                 {0xe8  ,0x3b},                                   \r
347                 {0xe9  ,0x6e},                                           \r
348                 {0xea  ,0x2c},                                   \r
349                 {0xeb  ,0x50},                                   \r
350                 {0xec  ,0x73},           \r
351                 \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
356                 \r
357                 // page1\r
358                 {0xf0  ,0x01}, //select page1 \r
359                 \r
360                 {0x00  ,0x20},                                                    \r
361                 {0x01  ,0x20},                                                    \r
362                 {0x02  ,0x20},                                                                  \r
363                 {0x03  ,0x20},                                                  \r
364                 {0x04  ,0x78}, \r
365                 {0x05  ,0x78},                                   \r
366                 {0x06  ,0x78},                                                            \r
367                 {0x07  ,0x78},                                                                   \r
368                 \r
369                 \r
370                 \r
371                 {0x10  ,0x04},                                            \r
372                 {0x11  ,0x04},                                                    \r
373                 {0x12  ,0x04},                                            \r
374                 {0x13  ,0x04},                                                    \r
375                 {0x14  ,0x01},                                                    \r
376                 {0x15  ,0x01},                                                    \r
377                 {0x16  ,0x01},                                           \r
378                 {0x17  ,0x01},                                           \r
379                           \r
380                                                                                                                  \r
381                 {0x20  ,0x00},                                    \r
382                 {0x21  ,0x00},                                    \r
383                 {0x22  ,0x00},                                            \r
384                 {0x23  ,0x00},                                            \r
385                 {0x24  ,0x00},                                    \r
386                 {0x25  ,0x00},                                            \r
387                 {0x26  ,0x00},                                    \r
388                 {0x27  ,0x00},                                                    \r
389                 \r
390                 {0x40  ,0x11}, \r
391                 \r
392                 //=============================lscP \r
393                 {0x45  ,0x06},   \r
394                 {0x46  ,0x06},                   \r
395                 {0x47  ,0x05}, \r
396                 \r
397                 {0x48  ,0x04},  \r
398                 {0x49  ,0x03},           \r
399                 {0x4a  ,0x03}, \r
400                 \r
401         \r
402                 {0x62  ,0xd8}, \r
403                 {0x63  ,0x24}, \r
404                 {0x64  ,0x24},\r
405                 {0x65  ,0x24}, \r
406                 {0x66  ,0xd8}, \r
407                 {0x67  ,0x24},\r
408                 \r
409                 {0x5a  ,0x00}, \r
410                 {0x5b  ,0x00}, \r
411                 {0x5c  ,0x00}, \r
412                 {0x5d  ,0x00}, \r
413                 {0x5e  ,0x00}, \r
414                 {0x5f  ,0x00}, \r
415                 \r
416                 \r
417                 //============================= ccP \r
418                 \r
419                 {0x69  ,0x03}, //cc_mode\r
420                           \r
421                 //CC_G\r
422                 {0x70  ,0x5d}, \r
423                 {0x71  ,0xed}, \r
424                 {0x72  ,0xff}, \r
425                 {0x73  ,0xe5}, \r
426                 {0x74  ,0x5f}, \r
427                 {0x75  ,0xe6}, \r
428                 \r
429                   //CC_B\r
430                 {0x76  ,0x41}, \r
431                 {0x77  ,0xef}, \r
432                 {0x78  ,0xff}, \r
433                 {0x79  ,0xff}, \r
434                 {0x7a  ,0x5f}, \r
435                 {0x7b  ,0xfa},   \r
436                 \r
437                 \r
438                 //============================= AGP\r
439                 \r
440                 {0x7e  ,0x00},  \r
441                 {0x7f  ,0x20},  //x040\r
442                 {0x80  ,0x48},  \r
443                 {0x81  ,0x06},  \r
444                 {0x82  ,0x08},  \r
445                 \r
446                 {0x83  ,0x23},  \r
447                 {0x84  ,0x38},  \r
448                 {0x85  ,0x4F},  \r
449                 {0x86  ,0x61},  \r
450                 {0x87  ,0x72},  \r
451                 {0x88  ,0x80},  \r
452                 {0x89  ,0x8D},  \r
453                 {0x8a  ,0xA2},  \r
454                 {0x8b  ,0xB2},  \r
455                 {0x8c  ,0xC0},  \r
456                 {0x8d  ,0xCA},  \r
457                 {0x8e  ,0xD3},  \r
458                 {0x8f  ,0xDB},  \r
459                 {0x90  ,0xE2},  \r
460                 {0x91  ,0xED},  \r
461                 {0x92  ,0xF6},  \r
462                 {0x93  ,0xFD},  \r
463                 \r
464                 //about gamma1 is hex r oct\r
465                 {0x94  ,0x04},  \r
466                 {0x95  ,0x0E},  \r
467                 {0x96  ,0x1B},  \r
468                 {0x97  ,0x28},  \r
469                 {0x98  ,0x35},  \r
470                 {0x99  ,0x41},  \r
471                 {0x9a  ,0x4E},  \r
472                 {0x9b  ,0x67},  \r
473                 {0x9c  ,0x7E},  \r
474                 {0x9d  ,0x94},  \r
475                 {0x9e  ,0xA7},  \r
476                 {0x9f  ,0xBA},  \r
477                 {0xa0  ,0xC8},  \r
478                 {0xa1  ,0xD4},  \r
479                 {0xa2  ,0xE7},  \r
480                 {0xa3  ,0xF4},  \r
481                 {0xa4  ,0xFA}, \r
482                 \r
483                 //========= open functions      \r
484                 {0xf0  ,0x00}, //set back to page0      \r
485                 {0x40  ,0x7e}, \r
486                 {0x41  ,0x2F},\r
487         \r
488         /////  Çë×¢Ò⣬µ÷ÕûGC0307µÄ¾µÏñºÍ·­×ª£¬ÐèҪͬʱÐÞ¸ÄÈý¸ö¼Ä´æÆ÷£¬ÈçÏÂ:\r
489         \r
490                 {0x0f, 0xb2},\r
491                 {0x45, 0x27},\r
492                 {0x47, 0x2c},   \r
493         ///banding setting       \r
494                         {  0x01  ,0xfa}, // 24M  \r
495                         {  0x02  ,0x70}, \r
496                         {  0x10  ,0x01},   \r
497                         {  0xd6  ,0x64}, \r
498                         {  0x28  ,0x02}, \r
499                         {  0x29  ,0x58}, \r
500                         {  0x2a  ,0x02}, \r
501                         {  0x2b  ,0x58}, \r
502                         {  0x2c  ,0x02}, \r
503                         {  0x2d  ,0x58}, \r
504                         {  0x2e  ,0x06}, \r
505                         {  0x2f  ,0x40}, \r
506                 \r
507                 /************\r
508                    {0x0f, 0x02},//82\r
509                 {0x45, 0x24},\r
510                 {0x47, 0x20},   \r
511                 **************/\r
512         /////  ËÄÖÖ²»Í¬µÄ·­×ªºÍ¾µÏñÉ趨£¬¿Í»§¿ÉÖ±½Ó¸´ÖÆ!!!!!!\r
513         \r
514         \r
515 #if 0\r
516         //      IMAGE_NORMAL:\r
517                 {0x0f, 0xb2},\r
518                 {0x45, 0x27},\r
519                 {0x47, 0x2c},                   \r
520         \r
521         // IMAGE_H_MIRROR:\r
522                 {0x0f, 0xa2},\r
523                 {0x45, 0x26},\r
524                 {0x47, 0x28},   \r
525                 \r
526         // IMAGE_V_MIRROR:                      \r
527                 {0x0f, 0x92},\r
528                 {0x45, 0x25},\r
529                 {0x47, 0x24},                   \r
530         \r
531         // IMAGE_HV_MIRROR:    // 180\r
532                 {0x0f, 0x82},\r
533                 {0x45, 0x24},\r
534                 {0x47, 0x20},           \r
535 #endif\r
536         {0x43, 0x40},\r
537                 {0x44, 0xe2},   \r
538 \r
539         SensorEnd\r
540 };\r
541 /* Senor full resolution setting: recommand for capture */\r
542 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={\r
543         SensorEnd\r
544 \r
545 };\r
546 /* Senor full resolution setting: recommand for video */\r
547 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={\r
548         SensorEnd\r
549 };\r
550 /* Preview resolution setting*/\r
551 static struct rk_sensor_reg sensor_preview_data[] =\r
552 {\r
553 #if 1\r
554         {       0x05 ,  0x00},\r
555         {       0x06 ,  0x00},\r
556         {       0x07 ,  0x00},\r
557         {       0x08 ,  0x00},//0x10  james 20100715\r
558         {       0x09 ,  0x01},\r
559         {       0x0a ,  0xe8},\r
560         {       0x0b ,  0x02},\r
561         {       0x0c ,  0x88},//0x80   james 20100715\r
562         {       0x45 ,  0x24},          // bit[7:2]=001001\r
563         {       0x48 ,  0x84},          // bit[7]=1\r
564         {       0xe0 ,  0x03},\r
565         {       0xe1 ,  0x02},\r
566         {       0xe2 ,  0x27},\r
567         {       0xe3 ,  0x1e},\r
568         {       0xe8 ,  0x3b},\r
569         {       0xe9 ,  0x6e},\r
570         {       0xea ,  0x2c},\r
571         {       0xeb ,  0x50},\r
572         {       0xec ,  0x73},\r
573 #else\r
574         {0x17, 0x13},\r
575         {0x18, 0x01},\r
576         {0x32, 0xbf},\r
577         {0x19, 0x03},\r
578         {0x1a, 0x7b},\r
579         {0x03, 0x0a},\r
580         \r
581 #endif\r
582         SensorEnd\r
583 };\r
584 /* 1280x720 */\r
585 static struct rk_sensor_reg sensor_720p[]={\r
586         SensorEnd\r
587 };\r
588 \r
589 /* 1920x1080 */\r
590 static struct rk_sensor_reg sensor_1080p[]={\r
591         SensorEnd\r
592 };\r
593 \r
594 \r
595 static struct rk_sensor_reg sensor_softreset_data[]={\r
596         SensorEnd\r
597 };\r
598 \r
599 static struct rk_sensor_reg sensor_check_id_data[]={\r
600         SensorRegVal(0x00,0),\r
601         SensorEnd\r
602 };\r
603 /*\r
604 *  The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx\r
605 */\r
606 static struct rk_sensor_reg sensor_WhiteB_Auto[]=\r
607 {\r
608         {0xc7,0x4c}, //for AWB can adjust back\r
609         {0xc8,0x40},\r
610         {0xc9,0x4a},                    \r
611         {0x41,0x2f},\r
612         SensorEnd\r
613 };\r
614 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
615 static  struct rk_sensor_reg sensor_WhiteB_Cloudy[]=\r
616 {\r
617         {0x41,0x2b},   // Enable AWB \r
618         {0xc7,0x5a}, //WB_manual_gain\r
619         {0xc8,0x42},\r
620         {0xc9,0x40},\r
621         SensorEnd\r
622 };\r
623 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
624 static  struct rk_sensor_reg sensor_WhiteB_ClearDay[]=\r
625 {\r
626         //Sunny\r
627                 {0x41,0x2b},   // Enable AWB \r
628                 {0xc7,0x50},\r
629                 {0xc8,0x45},\r
630                 {0xc9,0x40},\r
631         SensorEnd\r
632 };\r
633 /* Office Colour Temperature : 3500K - 5000K  */\r
634 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=\r
635 {\r
636         //Office\r
637                 {0x41,0x2b},   // Enable AWB \r
638                 {0xc7,0x48},\r
639                 {0xc8,0x40},\r
640                 {0xc9,0x5c},\r
641         SensorEnd\r
642 \r
643 };\r
644 /* Home Colour Temperature : 2500K - 3500K      */\r
645 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=\r
646 {\r
647         //Home\r
648                 {0x41,0x2b},   // Enable AWB \r
649                 {0xc7,0x40},\r
650                 {0xc8,0x42},\r
651                 {0xc9,0x50},\r
652         SensorEnd\r
653 };\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
656 };\r
657 \r
658 static  struct rk_sensor_reg sensor_Brightness0[]=\r
659 {\r
660         // Brightness -2\r
661         {0x7a, 0xe0},\r
662         SensorEnd\r
663 };\r
664 \r
665 static  struct rk_sensor_reg sensor_Brightness1[]=\r
666 {\r
667         // Brightness -1\r
668         {0x7a, 0xf0},\r
669 \r
670         SensorEnd\r
671 };\r
672 \r
673 static  struct rk_sensor_reg sensor_Brightness2[]=\r
674 {\r
675         //      Brightness 0\r
676         {0x7a, 0x00},\r
677 \r
678         SensorEnd\r
679 };\r
680 \r
681 static  struct rk_sensor_reg sensor_Brightness3[]=\r
682 {\r
683         // Brightness +1\r
684         {0x7a, 0x10},\r
685         SensorEnd\r
686 };\r
687 \r
688 static  struct rk_sensor_reg sensor_Brightness4[]=\r
689 {\r
690         //      Brightness +2\r
691         {0x7a, 0x20},\r
692         SensorEnd\r
693 };\r
694 \r
695 static  struct rk_sensor_reg sensor_Brightness5[]=\r
696 {\r
697         //      Brightness +3\r
698         {0x7a, 0x30},\r
699         SensorEnd\r
700 };\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
703 };\r
704 \r
705 static  struct rk_sensor_reg sensor_Effect_Normal[] =\r
706 {\r
707                   {0x41,0x2f},                  //      1\r
708         {0x40,0x7e},\r
709         {0x42,0x10},\r
710         {0x47,0x24},//20\r
711         {0x48,0xc3},\r
712         {0x8a,0x50},//60\r
713         {0x8b,0x50},\r
714         {0x8c,0x07},\r
715         {0x50,0x0c},\r
716         {0x77,0x80},\r
717         {0xa1,0x40},\r
718         {0x7a,0x00},\r
719         {0x78,0x00},\r
720         {0x79,0x00},\r
721         {0x7b,0x40},\r
722         {0x7c,0x00},\r
723         SensorEnd\r
724 };\r
725 \r
726 static  struct rk_sensor_reg sensor_Effect_WandB[] =\r
727 {\r
728            {0x41,0x2f},         // danse        \r
729         {0x40,0x7e},\r
730         {0x42,0x10},\r
731         {0x47,0x3c},\r
732         {0x48,0xc3},\r
733         {0x8a,0x60},\r
734         {0x8b,0x60},\r
735         {0x8c,0x07},\r
736         {0x50,0x0c},\r
737         {0x77,0x80},\r
738         {0xa1,0x40},\r
739         {0x7a,0x00},\r
740         {0x78,0x00},\r
741         {0x79,0x00},\r
742         {0x7b,0x40},\r
743         {0x7c,0x00},    \r
744         SensorEnd\r
745 };\r
746 \r
747 static  struct rk_sensor_reg sensor_Effect_Sepia[] =\r
748 {\r
749         {0x41,0x2f},                    \r
750                 {0x40,0x7e},\r
751                 {0x42,0x10},\r
752                 {0x47,0x3c},\r
753                 {0x48,0xc3},\r
754                 {0x8a,0x60},\r
755                 {0x8b,0x60},\r
756                 {0x8c,0x07},\r
757                 {0x50,0x0c},\r
758                 {0x77,0x80},\r
759                 {0xa1,0x40},\r
760                 {0x7a,0x00},\r
761                 {0x78,0xc0},\r
762                 {0x79,0x20},\r
763                 {0x7b,0x40},\r
764                 {0x7c,0x00},\r
765         SensorEnd\r
766 };\r
767 \r
768 static  struct rk_sensor_reg sensor_Effect_Negative[] =\r
769 {\r
770         //Negative\r
771           {0x41,0x6f},                  // 4\r
772                         {0x40,0x7e},\r
773                         {0x42,0x10},\r
774                         {0x47,0x20},\r
775                         {0x48,0xc3},\r
776                         {0x8a,0x60},\r
777                         {0x8b,0x60},\r
778                         {0x8c,0x07},\r
779                         {0x50,0x0c},\r
780                         {0x77,0x80},\r
781                         {0xa1,0x40},\r
782                         {0x7a,0x00},\r
783                         {0x78,0x00},\r
784                         {0x79,0x00},\r
785                         {0x7b,0x40},\r
786                         {0x7c,0x00},\r
787         SensorEnd\r
788 };\r
789 static  struct rk_sensor_reg sensor_Effect_Bluish[] =\r
790 {\r
791         // Bluish\r
792                                          {0x41,0x2f},           // 5\r
793                         {0x40,0x7e},\r
794                         {0x42,0x10},\r
795                         {0x47,0x2c},\r
796                         {0x48,0xc3},\r
797                         {0x8a,0x60},\r
798                         {0x8b,0x60},\r
799                         {0x8c,0x07},\r
800                         {0x50,0x0c},\r
801                         {0x77,0x80},\r
802                         {0xa1,0x40},\r
803                         {0x7a,0x00},\r
804                         {0x78,0x70},\r
805                         {0x79,0x00},\r
806                         {0x7b,0x3f},\r
807                         {0x7c,0xf5},\r
808         SensorEnd\r
809 };\r
810 \r
811 static  struct rk_sensor_reg sensor_Effect_Green[] =\r
812 {\r
813         //      Greenish   6\r
814                 {0x41,0x2f},                    \r
815                         {0x40,0x7e},\r
816                         {0x42,0x10},\r
817                         {0x47,0x3c},\r
818                         {0x48,0xc3},\r
819                         {0x8a,0x60},\r
820                         {0x8b,0x60},\r
821                         {0x8c,0x07},\r
822                         {0x50,0x0c},\r
823                         {0x77,0x80},\r
824                         {0xa1,0x40},\r
825                         {0x7a,0x00},\r
826                         {0x78,0xc0},\r
827                         {0x79,0xc0},\r
828                         {0x7b,0x40},\r
829                         {0x7c,0x00},\r
830         SensorEnd\r
831 };\r
832 #if 0\r
833 static struct rk_sensor_reg sensor_Effect_Grayscale[]=\r
834 {\r
835         {0x23,0x02},    \r
836         {0x2d,0x0a},\r
837         {0x20,0xff},\r
838         {0xd2,0x90},\r
839         {0x73,0x00},\r
840 \r
841         {0xb3,0x40},\r
842         {0xb4,0x80},\r
843         {0xba,0x00},\r
844         {0xbb,0x00},\r
845         {0x00,0x00},\r
846         SensorEnd\r
847 };\r
848 #endif\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
851 };\r
852 \r
853 static  struct rk_sensor_reg sensor_Exposure0[]=\r
854 {\r
855         //-3\r
856         {0xd1, 0x38},\r
857 \r
858         SensorEnd\r
859 };\r
860 \r
861 static  struct rk_sensor_reg sensor_Exposure1[]=\r
862 {\r
863         //-2\r
864         {0xd1, 0x40},\r
865         SensorEnd\r
866 };\r
867 \r
868 static  struct rk_sensor_reg sensor_Exposure2[]=\r
869 {\r
870         //-1\r
871         {0xd1, 0x48},\r
872         SensorEnd\r
873 };\r
874 \r
875 static  struct rk_sensor_reg sensor_Exposure3[]=\r
876 {\r
877         //default\r
878         {0xd1, 0x50},\r
879         SensorEnd\r
880 };\r
881 \r
882 static  struct rk_sensor_reg sensor_Exposure4[]=\r
883 {\r
884         // 1\r
885         {0xd1, 0x58},\r
886         SensorEnd\r
887 };\r
888 \r
889 static  struct rk_sensor_reg sensor_Exposure5[]=\r
890 {\r
891         // 2\r
892         {0xd1, 0x60},\r
893 \r
894         SensorEnd\r
895 };\r
896 \r
897 static  struct rk_sensor_reg sensor_Exposure6[]=\r
898 {\r
899         // 3\r
900         {0xd1, 0x68},\r
901         SensorEnd\r
902 };\r
903 \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
906 };\r
907 \r
908 static  struct rk_sensor_reg sensor_Saturation0[]=\r
909 {\r
910         SensorEnd\r
911 };\r
912 \r
913 static  struct rk_sensor_reg sensor_Saturation1[]=\r
914 {\r
915         SensorEnd\r
916 };\r
917 \r
918 static  struct rk_sensor_reg sensor_Saturation2[]=\r
919 {\r
920         SensorEnd\r
921 };\r
922 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
923 \r
924 static  struct rk_sensor_reg sensor_Contrast0[]=\r
925 {\r
926 \r
927         SensorEnd\r
928 };\r
929 \r
930 static  struct rk_sensor_reg sensor_Contrast1[]=\r
931 {\r
932 \r
933         SensorEnd\r
934 };\r
935 \r
936 static  struct rk_sensor_reg sensor_Contrast2[]=\r
937 {\r
938 \r
939         SensorEnd\r
940 };\r
941 \r
942 static  struct rk_sensor_reg sensor_Contrast3[]=\r
943 {\r
944 \r
945         SensorEnd\r
946 };\r
947 \r
948 static  struct rk_sensor_reg sensor_Contrast4[]=\r
949 {\r
950 \r
951         SensorEnd\r
952 };\r
953 \r
954 \r
955 static  struct rk_sensor_reg sensor_Contrast5[]=\r
956 {\r
957 \r
958         SensorEnd\r
959 };\r
960 \r
961 static  struct rk_sensor_reg sensor_Contrast6[]=\r
962 {\r
963 \r
964         SensorEnd\r
965 };\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
968 };\r
969 static  struct rk_sensor_reg sensor_SceneAuto[] =\r
970 {\r
971         {       0xdd  ,0x22},  //0x12\r
972                 {       0x41  ,0x2f}, \r
973                 {       0x21  ,0xc0},\r
974                 {       0xd2  ,0x02},\r
975         SensorEnd\r
976 };\r
977 \r
978 static  struct rk_sensor_reg sensor_SceneNight[] =\r
979 {\r
980         {       0xdd  ,0x32},\r
981                 {       0x41  ,0x0f},\r
982                 {       0xb0  ,0x10},\r
983                 {       0x21  ,0xf0},\r
984         SensorEnd\r
985 };\r
986 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
987 \r
988 static struct rk_sensor_reg sensor_Zoom0[] =\r
989 {\r
990         SensorEnd\r
991 };\r
992 \r
993 static struct rk_sensor_reg sensor_Zoom1[] =\r
994 {\r
995         SensorEnd\r
996 };\r
997 \r
998 static struct rk_sensor_reg sensor_Zoom2[] =\r
999 {\r
1000         SensorEnd\r
1001 };\r
1002 \r
1003 \r
1004 static struct rk_sensor_reg sensor_Zoom3[] =\r
1005 {\r
1006         SensorEnd\r
1007 };\r
1008 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
1009 \r
1010 /*\r
1011 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu\r
1012 */\r
1013 static struct v4l2_querymenu sensor_menus[] =\r
1014 {\r
1015 };\r
1016 /*\r
1017 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl\r
1018 */\r
1019 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =\r
1020 {\r
1021 };\r
1022 \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
1026 };\r
1027 /*static struct soc_camera_ops sensor_ops;*/\r
1028 \r
1029 \r
1030 /*\r
1031 **********************************************************\r
1032 * Following is local code:\r
1033\r
1034 * Please codeing your program here \r
1035 **********************************************************\r
1036 */\r
1037 /*\r
1038 **********************************************************\r
1039 * Following is callback\r
1040 * If necessary, you could coding these callback\r
1041 **********************************************************\r
1042 */\r
1043 /*\r
1044 * the function is called in open sensor  \r
1045 */\r
1046 static int sensor_activate_cb(struct i2c_client *client)\r
1047 {\r
1048         \r
1049         return 0;\r
1050 }\r
1051 /*\r
1052 * the function is called in close sensor\r
1053 */\r
1054 static int sensor_deactivate_cb(struct i2c_client *client)\r
1055 {\r
1056         \r
1057         return 0;\r
1058 }\r
1059 /*\r
1060 * the function is called before sensor register setting in VIDIOC_S_FMT  \r
1061 */\r
1062 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
1063 {\r
1064 \r
1065         return 0;\r
1066 }\r
1067 /*\r
1068 * the function is called after sensor register setting finished in VIDIOC_S_FMT  \r
1069 */\r
1070 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
1071 {\r
1072         return 0;\r
1073 }\r
1074 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)\r
1075 {\r
1076         return 0;\r
1077 }\r
1078 \r
1079 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
1080 {\r
1081         \r
1082         return 0;\r
1083 }\r
1084 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
1085 {\r
1086         return 0;\r
1087 }\r
1088 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
1089 {\r
1090         //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1091                 \r
1092         if (pm_msg.event == PM_EVENT_SUSPEND) {\r
1093                 SENSOR_DG("Suspend");\r
1094                 \r
1095         } else {\r
1096                 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);\r
1097                 return -EINVAL;\r
1098         }\r
1099         return 0;\r
1100 }\r
1101 \r
1102 static int sensor_resume(struct soc_camera_device *icd)\r
1103 {\r
1104 \r
1105         SENSOR_DG("Resume");\r
1106 \r
1107         return 0;\r
1108 \r
1109 }\r
1110 static int sensor_mirror_cb (struct i2c_client *client, int mirror)\r
1111 {\r
1112         char val1,val2,val3;\r
1113         int err = 0;\r
1114         \r
1115         SENSOR_DG("mirror: %d",mirror);\r
1116         if (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
1121                         if(err ==0){\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
1138                                 }\r
1139 \r
1140                         }\r
1141                         \r
1142                 } else {\r
1143                         //do nothing\r
1144                 }\r
1145 \r
1146         return err;    \r
1147 }\r
1148 /*\r
1149 * the function is v4l2 control V4L2_CID_HFLIP callback  \r
1150 */\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
1153 {\r
1154         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1155 \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
1158         \r
1159         SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);\r
1160         return 0;\r
1161 }\r
1162 \r
1163 static int sensor_flip_cb(struct i2c_client *client, int flip)\r
1164 {\r
1165         char val1,val2,val3;\r
1166         int err = 0;    \r
1167 \r
1168         SENSOR_DG("flip: %d",flip);\r
1169         if (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
1174                         if(err ==0){\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
1191                                 }\r
1192         \r
1193                         }\r
1194                         \r
1195                 } else {\r
1196                         //do nothing\r
1197                 }\r
1198 \r
1199         return err;    \r
1200 }\r
1201 /*\r
1202 * the function is v4l2 control V4L2_CID_VFLIP callback  \r
1203 */\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
1206 {\r
1207         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1208 \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
1211         \r
1212         SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);\r
1213         return 0;\r
1214 }\r
1215 /*\r
1216 * the functions are focus callbacks\r
1217 */\r
1218 static int sensor_focus_init_usr_cb(struct i2c_client *client){\r
1219         return 0;\r
1220 }\r
1221 \r
1222 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){\r
1223         return 0;\r
1224 }\r
1225 \r
1226 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){\r
1227         return 0;\r
1228 }\r
1229 \r
1230 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){\r
1231         return 0;\r
1232 }\r
1233 \r
1234 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){\r
1235         return 0;\r
1236 }\r
1237 \r
1238 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){\r
1239         return 0;\r
1240 }\r
1241 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1242 {
1243     return 0;
1244 }\r
1245 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){\r
1246         return 0;\r
1247 }\r
1248 \r
1249 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)\r
1250 {\r
1251         return 0;\r
1252 }\r
1253 \r
1254 /*\r
1255 face defect call back\r
1256 */\r
1257 static int      sensor_face_detect_usr_cb(struct i2c_client *client,int on){\r
1258         return 0;\r
1259 }\r
1260 \r
1261 /*\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
1264 */\r
1265 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)\r
1266 {\r
1267         return;\r
1268 }\r
1269 \r
1270 /*\r
1271 * :::::WARNING:::::\r
1272 * It is not allowed to modify the following code\r
1273 */\r
1274 \r
1275 sensor_init_parameters_default_code();\r
1276 \r
1277 sensor_v4l2_struct_initialization();\r
1278 \r
1279 sensor_probe_default_code();\r
1280 \r
1281 sensor_remove_default_code();\r
1282 \r
1283 sensor_driver_default_module_code();\r
1284 \r
1285 \r
1286 \r
1287 \r
1288 \r