camsys_drv: v0.0x13.0
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / gc2015.c
1 \r
2 #include "generic_sensor.h"\r
3 /*
4 *      Driver Version Note\r
5 *v0.0.1: this driver is compatible with generic_sensor\r
6 *v0.0.3:\r
7 *        add sensor_focus_af_const_pause_usr_cb;\r
8 */\r
9 static int version = KERNEL_VERSION(0,0,3);\r
10 module_param(version, int, S_IRUGO);\r
11 \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_GC2015\r
23 #define SENSOR_V4L2_IDENT V4L2_IDENT_GC2015\r
24 #define SENSOR_ID 0x2005\r
25 #define SENSOR_BUS_PARAM                                         (SOCAM_MASTER |\\r
26                                                                                          SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_LOW|\\r
27                                                                                          SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\r
28 #define SENSOR_PREVIEW_W                                         800\r
29 #define SENSOR_PREVIEW_H                                         600\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 static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect|CFG_Scene);\r
39 static unsigned int SensorChipID[] = {SENSOR_ID};\r
40 /* Sensor Driver Configuration End */\r
41 \r
42 \r
43 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
44 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
45 \r
46 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)\r
47 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
48 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
49 #define sensor_write_array generic_sensor_write_array\r
50 \r
51 struct sensor_parameter\r
52 {\r
53         unsigned int PreviewDummyPixels;\r
54         unsigned int CaptureDummyPixels;\r
55         unsigned int preview_exposure;\r
56         unsigned short int preview_line_width;\r
57         unsigned short int preview_gain;\r
58 \r
59         unsigned short int PreviewPclk;\r
60         unsigned short int CapturePclk;\r
61         char awb[6];\r
62 };\r
63 \r
64 struct specific_sensor{\r
65         struct generic_sensor common_sensor;\r
66         //define user data below\r
67         struct sensor_parameter parameter;\r
68         u16 shutter;\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                 {0xfe, 0x80}, //soft reset\r
94                 {0xfe, 0x80}, //soft reset\r
95                 {0xfe, 0x80}, //soft reset\r
96         \r
97                 {0xfe, 0x00}, //page0\r
98                 {0x45, 0x00}, //output_disable\r
99         \r
100                 //////////////////////////////////////////////////////////////////////////////////////\r
101                 //////////////////////////preview capture switch /////////////////////////////////////\r
102                 //////////////////////////////////////////////////////////////////////////////////////\r
103                 //preview\r
104                 {0x02, 0x01}, //preview mode\r
105                 {0x2a, 0xca}, //[7]col_binning, 0x[6]even skip\r
106                 {0x48, 0x40}, //manual_gain\r
107         \r
108                 ////////////////////////////////////////////////////////////////////////\r
109                 ////////////////////////// preview LSC /////////////////////////////////\r
110                 ////////////////////////////////////////////////////////////////////////\r
111                 {0xfe, 0x01}, //page1\r
112                 {0xb0, 0x03}, //[4]Y_LSC_en [3]lsc_compensate [2]signed_b4 [1:0]pixel array select\r
113                 {0xb1, 0x46}, //P_LSC_red_b2\r
114                 {0xb2, 0x40}, //P_LSC_green_b2\r
115                 {0xb3, 0x40}, //P_LSC_blue_b2\r
116                 {0xb4, 0x24}, //P_LSC_red_b4\r
117                 {0xb5, 0x20}, //P_LSC_green_b4\r
118                 {0xb6, 0x22}, //P_LSC_blue_b4\r
119                 {0xb7, 0x00}, //P_LSC_compensate_b2\r
120                 {0xb8, 0x80}, //P_LSC_row_center, 0x344, 0x (1200/2-344)/2=128, 0x, 0x\r
121                 {0xb9, 0x80}, //P_LSC_col_center, 0x544, 0x (1600/2-544)/2=128\r
122         \r
123         \r
124                 ////////////////////////////////////////////////////////////////////////\r
125                 ////////////////////////// capture LSC /////////////////////////////////\r
126                 ////////////////////////////////////////////////////////////////////////\r
127                 {0xba, 0x03}, //[4]Y_LSC_en [3]lsc_compensate [2]signed_b4 [1:0]pixel array select\r
128                 {0xbb, 0x46}, //C_LSC_red_b2\r
129                 {0xbc, 0x40}, //C_LSC_green_b2\r
130                 {0xbd, 0x40}, //C_LSC_blue_b2\r
131                 {0xbe, 0x24}, //C_LSC_red_b4\r
132                 {0xbf, 0x20}, //C_LSC_green_b4\r
133                 {0xc0, 0x22}, //C_LSC_blue_b4\r
134                 {0xc1, 0x00}, //C_Lsc_compensate_b2\r
135                 {0xc2, 0x80}, //C_LSC_row_center, 0x344, 0x (1200/2-344)/2=128\r
136                 {0xc3, 0x80}, //C_LSC_col_center, 0x544, 0x (1600/2-544)/2=128\r
137                 {0xfe, 0x00}, //page0\r
138         \r
139                 ////////////////////////////////////////////////////////////////////////\r
140                 ////////////////////////// analog configure ///////////////////////////\r
141                 ////////////////////////////////////////////////////////////////////////\r
142                 {0xfe, 0x00}, //page0\r
143                 {0x29, 0x00}, //cisctl mode 1\r
144                 {0x2b, 0x06}, //cisctl mode 3   \r
145                 {0x32, 0x1c}, //analog mode 1\r
146                 {0x33, 0x0f}, //analog mode 2\r
147                 {0x34, 0x30}, //[6:4]da_rsg\r
148         \r
149                 {0x35, 0x88}, //Vref_A25\r
150                 {0x37, 0x16}, //Drive Current\r
151         \r
152                 /////////////////////////////////////////////////////////////////////\r
153                 /////////////////////////// ISP Related /////////////////////////////\r
154                 /////////////////////////////////////////////////////////////////////\r
155                 {0x40, 0xff}, \r
156                 {0x41, 0x20}, //[5]skin_detectionenable[2]auto_gray, 0x[1]y_gamma\r
157                 {0x42, 0xf6}, //[7]auto_sa[6]auto_ee[5]auto_dndd[4]auto_lsc[3]na[2]abs, 0x[1]awb\r
158                 {0x4b, 0xe8}, //[1]AWB_gain_mode, 0x1:atpregain0:atpostgain\r
159                 {0x4d, 0x03}, //[1]inbf_en\r
160                 {0x4f, 0x01}, //AEC enable\r
161         \r
162                 ////////////////////////////////////////////////////////////////////\r
163                 ///////////////////////////  BLK  //////////////////////////////////\r
164                 ////////////////////////////////////////////////////////////////////\r
165                 {0x63, 0x77}, //BLK mode 1\r
166                 {0x66, 0x00}, //BLK global offset\r
167                 {0x6d, 0x00},\r
168                 {0x6e, 0x1a}, //BLK offset submode,offset R\r
169                 {0x6f, 0x20},\r
170                 {0x70, 0x1a},\r
171                 {0x71, 0x20},\r
172                 {0x73, 0x00},\r
173                 {0x77, 0x80},\r
174                 {0x78, 0x80},\r
175                 {0x79, 0x90},\r
176         \r
177                 ////////////////////////////////////////////////////////////////////\r
178                 /////////////////////////// DNDD ///////////////////////////////////\r
179                 ////////////////////////////////////////////////////////////////////\r
180                 {0x80, 0x07}, //[7]dn_inc_or_dec [4]zero_weight_mode[3]share [2]c_weight_adap [1]dn_lsc_mode [0]dn_b\r
181                 {0x82, 0x0c}, //DN lilat b base\r
182                 {0x83, 0x03},\r
183         \r
184                 ////////////////////////////////////////////////////////////////////\r
185                 /////////////////////////// EEINTP ////////////////////////////////\r
186                 ////////////////////////////////////////////////////////////////////\r
187                 {0x8a, 0x7c},\r
188                 {0x8c, 0x02},\r
189                 {0x8e, 0x02},\r
190                 {0x8f, 0x45},\r
191         \r
192         \r
193                 /////////////////////////////////////////////////////////////////////\r
194                 /////////////////////////// CC_t ////////////////////////////////////\r
195                 /////////////////////////////////////////////////////////////////////\r
196                 {0xb0, 0x40},   // 0x48\r
197                 {0xb1, 0xfe},\r
198                 {0xb2, 0x00},\r
199                 {0xb3, 0xf0},\r
200                 {0xb4, 0x50},\r
201                 {0xb5, 0xf8},\r
202                 {0xb6, 0x00},\r
203                 {0xb7, 0x00},\r
204                 {0xb8, 0x00},\r
205         \r
206         \r
207                 /////////////////////////////////////////////////////////////////////\r
208                 /////////////////////////// GAMMA ///////////////////////////////////\r
209                 /////////////////////////////////////////////////////////////////////\r
210                 //RGB_GAMMA\r
211                 {0xbf, 0x08}, \r
212                 {0xc0, 0x1e},\r
213                 {0xc1, 0x33},\r
214                 {0xc2, 0x47},\r
215                 {0xc3, 0x59},\r
216                 {0xc4, 0x68},\r
217                 {0xc5, 0x74},\r
218                 {0xc6, 0x86},\r
219                 {0xc7, 0x97},\r
220                 {0xc8, 0xA5},\r
221                 {0xc9, 0xB1},\r
222                 {0xca, 0xBd},\r
223                 {0xcb, 0xC8},\r
224                 {0xcc, 0xD3},\r
225                 {0xcd, 0xE4},\r
226                 {0xce, 0xF4},\r
227                 {0xcf, 0xff},\r
228                 \r
229                 /*{0xbf, 0x06},\r
230                 {0xc0, 0x1f},\r
231                 {0xc1, 0x38},\r
232                 {0xc2, 0x4c},\r
233                 {0xc3, 0x5b},\r
234                 {0xc4, 0x6b},\r
235                 {0xc5, 0x76},\r
236                 {0xc6, 0x8b},\r
237                 {0xc7, 0x9b},\r
238                 {0xc8, 0xac},\r
239                 {0xc9, 0xbb},\r
240                 {0xca, 0xc7},\r
241                 {0xcb, 0xd2},\r
242                 {0xcc, 0xdb},\r
243                 {0xcd, 0xea},\r
244                 {0xce, 0xf5},\r
245                 {0xcf, 0xff},   */\r
246         \r
247                 /////////////////////////////////////////////////////////////////////\r
248                 /////////////////////////// YCP_t ///////////////////////////////////\r
249                 /////////////////////////////////////////////////////////////////////\r
250                 {0xd1, 0x40}, //saturation       38\r
251                 {0xd2, 0x40}, //saturation       38\r
252                 \r
253                 {0xd3, 0x46},  // 2011-08-11 kim add\r
254                 \r
255                 {0xde, 0x21}, //auto_gray\r
256         \r
257                 ////////////////////////////////////////////////////////////////////\r
258                 /////////////////////////// ASDE ///////////////////////////////////\r
259                 ////////////////////////////////////////////////////////////////////\r
260                 {0x98, 0x3a}, \r
261                 {0x99, 0x60}, \r
262                 {0x9b, 0x00}, \r
263                 {0x9f, 0x12}, \r
264                 {0xa1, 0x80}, \r
265                 {0xa2, 0x21}, \r
266                 \r
267                 {0xfe, 0x01}, //page1\r
268                 {0xc5, 0x10}, \r
269                 {0xc6, 0xff}, \r
270                 {0xc7, 0xff}, \r
271                 {0xc8, 0xff}, \r
272         \r
273                 ////////////////////////////////////////////////////////////////////\r
274                 /////////////////////////// AEC ////////////////////////////////////\r
275                 ////////////////////////////////////////////////////////////////////\r
276                 {0x10, 0x09}, //AEC mode 1\r
277                 {0x11, 0x92}, //[7]fix target  // 0xb2  2011-08-11 kim \r
278                 {0x12, 0x20}, \r
279                 {0x13, 0x78},   // 0x78  2011-08-11 kim \r
280                 {0x17, 0x00}, \r
281                 {0x1c, 0x96}, \r
282                 {0x1d, 0x04}, // sunlight step \r
283                 {0x1e, 0x11}, \r
284                 {0x21, 0xc0}, //max_post_gain\r
285                 {0x22, 0x40}, //max_pre_gain   // 0x60  2011-08-11 kim \r
286                 {0x2d, 0x06}, //P_N_AEC_exp_level_1[12:8]\r
287                 {0x2e, 0x00}, //P_N_AEC_exp_level_1[7:0]\r
288                 {0x1e, 0x32}, \r
289                 {0x33, 0x00}, //[6:5]max_exp_level [4:0]min_exp_level\r
290                 {0x34, 0x04}, // min exp\r
291         \r
292                 ////////////////////////////////////////////////////////////////////\r
293                 /////////////////////////// Measure Window /////////////////////////\r
294                 ////////////////////////////////////////////////////////////////////\r
295                 {0x06, 0x07},\r
296                 {0x07, 0x03},\r
297                 {0x08, 0x64},\r
298                 {0x09, 0x4a},\r
299         \r
300                 ////////////////////////////////////////////////////////////////////\r
301                 /////////////////////////// AWB ////////////////////////////////////\r
302                 ////////////////////////////////////////////////////////////////////\r
303                 {0x57, 0x40}, //number limit\r
304                 {0x5d, 0x44}, //\r
305                 {0x5c, 0x35}, //show mode,close dark_mode\r
306                 {0x5e, 0x29}, //close color temp\r
307                 {0x5f, 0x50},\r
308                 {0x60, 0x50}, \r
309                 {0x65, 0xc0},\r
310                 ////////////////////////////////////////////////////////////////////\r
311                 /////////////////////////// ABS ////////////////////////////////////\r
312                 ////////////////////////////////////////////////////////////////////\r
313                 {0x80, 0x82},\r
314                 {0x81, 0x00},\r
315                 \r
316                 {0x82, 0x03},  /// \r
317                 \r
318                 {0x83, 0x10}, //ABS Y stretch limit\r
319                 {0xfe, 0x00},\r
320                 ////////////////////////////////////////////////////////////////////\r
321                 /////////////////////////// OUT ////////////////////////////////////\r
322                 ////////////////////////////////////////////////////////////////////\r
323                 {0xfe, 0x00},\r
324                 //crop \r
325                 {0x50, 0x01},\r
326                 {0x51, 0x00},\r
327                 {0x52, 0x00},\r
328                 {0x53, 0x00},\r
329                 {0x54, 0x00},\r
330                 {0x55, 0x02},\r
331                 {0x56, 0x58},\r
332                 {0x57, 0x03},\r
333                 {0x58, 0x20},\r
334         \r
335                 {0x44, 0xa0}, //YUV sequence\r
336                 {0x45, 0x0f}, //output enable\r
337                 {0x46, 0x02}, //sync mode\r
338                 \r
339         /*      {0xbF, 0x0B}, \r
340                 {0xc0, 0x16}, \r
341                 {0xc1, 0x29}, \r
342                 {0xc2, 0x3C}, \r
343                 {0xc3, 0x4F}, \r
344                 {0xc4, 0x5F}, \r
345                 {0xc5, 0x6F}, \r
346                 {0xc6, 0x8A}, \r
347                 {0xc7, 0x9F}, \r
348                 {0xc8, 0xB4}, \r
349                 {0xc9, 0xC6}, \r
350                 {0xcA, 0xD3}, \r
351                 {0xcB, 0xDD},  \r
352                 {0xcC, 0xE5},  \r
353                 {0xcD, 0xF1}, \r
354                 {0xcE, 0xFA}, \r
355                 {0xcF, 0xFF},*/\r
356                 \r
357                 {0x05, 0x01},//HB\r
358                 {0x06, 0xc1},\r
359                 {0x07, 0x00},//VB\r
360                 {0x08, 0x40},\r
361                 \r
362                 {0xfe, 0x01},\r
363                 {0x29, 0x00},//Anti Step 128\r
364                 {0x2a, 0x80},\r
365                 \r
366                 {0x2b, 0x05},//Level_0  10.00fps\r
367                 {0x2c, 0x00},\r
368                 {0x2d, 0x06},//Level_1   8.33fps\r
369                 {0x2e, 0x00},\r
370                 {0x2f, 0x08},//Level_2   6.25fps\r
371                 {0x30, 0x00},\r
372                 {0x31, 0x09},//Level_3   5.55fps\r
373                 {0x32, 0x00},\r
374                 {0x33, 0x20},\r
375                 {0xfe, 0x00},\r
376                 \r
377         //--------------------Updated By Mormo 2011/08/08 Start --------------------//\r
378                 {0xfe, 0x00},\r
379                 {0x32, 0x34},\r
380                 {0x34, 0x00},\r
381         //--------------------Updated By Mormo 2011/08/08 End ---------------------//   \r
382                 {0x7d, 0x80}, //\r
383                 {0x7e, 0x80},\r
384                 {0x7f, 0x84},\r
385         SensorEnd\r
386 };\r
387 /* Senor full resolution setting: recommand for capture */\r
388 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={\r
389         {0xfe, 0x00},\r
390         \r
391         {0x48, 0x80},  // 68\r
392         \r
393         {0x4f, 0x00},   // aec off\r
394         \r
395         {0x02, 0x00},\r
396         {0x2a, 0x0a},\r
397         \r
398         //subsample 1/1\r
399         {0x59,  0x11},\r
400         {0x5a,  0x06},\r
401         {0x5b,  0x00},\r
402         {0x5c,  0x00},\r
403         {0x5d,  0x00},\r
404         {0x5e , 0x00},\r
405         {0x5f,  0x00},\r
406         {0x60,  0x00},\r
407         {0x61,  0x00},\r
408         {0x62,  0x00},\r
409         \r
410         //crop \r
411         {0x50,  0x01},\r
412         {0x51,  0x00},\r
413         {0x52,  0x00},\r
414         {0x53,  0x00},\r
415         {0x54,  0x00},\r
416         {0x55,  0x04},\r
417         {0x56,  0xb0},\r
418         {0x57,  0x06},\r
419         {0x58,  0x40},\r
420         SensorEnd\r
421 \r
422 };\r
423 \r
424 /* Senor full resolution setting: recommand for video */\r
425 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={\r
426         SensorEnd\r
427 };\r
428 /* Preview resolution setting*/\r
429 static struct rk_sensor_reg sensor_preview_data[] =\r
430 {\r
431         {0xfe, 0x00},\r
432         \r
433         {0x48, 0x40},\r
434         {0x4f, 0x01},   // aec on\r
435         \r
436         {0x02, 0x01},\r
437         {0x2a, 0xca},\r
438         \r
439         //subsample 1/1\r
440         {0x59,  0x11},\r
441         {0x5a,  0x06},\r
442         {0x5b,  0x00},\r
443         {0x5c,  0x00},\r
444         {0x5d,  0x00},\r
445         {0x5e , 0x00},\r
446         {0x5f,  0x00},\r
447         {0x60,  0x00},\r
448         {0x61,  0x00},\r
449         {0x62,  0x00},\r
450         \r
451         {0x50 , 0x01},//out window\r
452         {0x51 , 0x00},\r
453         {0x52 , 0x00},\r
454         {0x53 , 0x00},\r
455         {0x54 , 0x00},\r
456         {0x55 , 0x02},\r
457         {0x56 , 0x58},// 600\r
458         {0x57 , 0x03},\r
459         {0x58 , 0x20},//800\r
460         SensorEnd\r
461 };\r
462 /* 1280x720 */\r
463 static struct rk_sensor_reg sensor_720p[]={\r
464         SensorEnd\r
465 };\r
466 \r
467 /* 1920x1080 */\r
468 static struct rk_sensor_reg sensor_1080p[]={\r
469         SensorEnd\r
470 };\r
471 \r
472 \r
473 static struct rk_sensor_reg sensor_softreset_data[]={\r
474         SensorRegVal(0xfe,80),\r
475         SensorWaitMs(5),\r
476         SensorEnd\r
477 };\r
478 \r
479 static struct rk_sensor_reg sensor_check_id_data[]={\r
480         SensorRegVal(0x00,0),\r
481         SensorRegVal(0x01,0),\r
482         SensorEnd\r
483 };\r
484 /*\r
485 *  The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx\r
486 */\r
487 static struct rk_sensor_reg sensor_WhiteB_Auto[]=\r
488 {\r
489         {0x42,0x76},\r
490         SensorEnd\r
491 };\r
492 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
493 static  struct rk_sensor_reg sensor_WhiteB_Cloudy[]=\r
494 {\r
495         {0x42 , 0x74},// [1] AWB enable  Â¹Â¦Ã„Ü¿ª¹ØAWB OFF  \r
496         {0x7a , 0x8c},  //AWB_R_gain\r
497         {0x7b , 0x50},  //AWB_G_gain\r
498         {0x7c , 0x40}, //AWB_B_gain\r
499         SensorEnd\r
500 };\r
501 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
502 static  struct rk_sensor_reg sensor_WhiteB_ClearDay[]=\r
503 {\r
504         //Sunny \r
505         {0x42 , 0x74},// [1] AWB enable  Â¹Â¦Ã„Ü¿ª¹ØAWB OFF  \r
506         {0x7a , 0x74},  //AWB_R_gain\r
507         {0x7b , 0x52},  //AWB_G_gain\r
508         {0x7c , 0x40}, //AWB_B_gain\r
509         SensorEnd\r
510 };\r
511 /* Office Colour Temperature : 3500K - 5000K  */\r
512 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=\r
513 {\r
514         //Office\r
515         {0x42 , 0x74},// [1] AWB enable  Â¹Â¦Ã„Ü¿ª¹ØAWB OFF  \r
516         {0x7a , 0x48},  //AWB_R_gain\r
517         {0x7b , 0x40},  //AWB_G_gain\r
518         {0x7c , 0x5c}, //AWB_B_gain  \r
519         SensorEnd\r
520 \r
521 };\r
522 /* Home Colour Temperature : 2500K - 3500K      */\r
523 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=\r
524 {\r
525         //Home\r
526         {0x42 , 0x74},// [1] AWB enable  Â¹Â¦Ã„Ü¿ª¹ØAWB OFF  \r
527         {0x7a , 0x40},  //AWB_R_gain\r
528         {0x7b , 0x54},  //AWB_G_gain\r
529         {0x7c , 0x70}, //AWB_B_gain\r
530         SensorEnd\r
531 };\r
532 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
533         sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
534 };\r
535 \r
536 static  struct rk_sensor_reg sensor_Brightness0[]=\r
537 {\r
538         // Brightness -2\r
539         \r
540         {0xfe, 0x01},\r
541         {0x13, 0x68}, //AEC_target_Y  \r
542         {0xfe, 0x00},\r
543         {0xd5, 0xe0},// Luma_offset  \r
544         SensorEnd\r
545 };\r
546 \r
547 static  struct rk_sensor_reg sensor_Brightness1[]=\r
548 {\r
549         // Brightness -1\r
550            {0xfe, 0x01},\r
551         {0x13, 0x70}, //AEC_target_Y  \r
552         {0xfe, 0x00},\r
553         {0xd5, 0xf0},// Luma_offset \r
554         \r
555         SensorEnd\r
556 };\r
557 \r
558 static  struct rk_sensor_reg sensor_Brightness2[]=\r
559 {\r
560         //      Brightness 0\r
561                                         \r
562         {0xfe, 0x01},\r
563         {0x13, 0x78}, //AEC_target_Y  48\r
564         {0xfe, 0x00},\r
565         {0xd5, 0x00},// Luma_offset  c0\r
566         \r
567         SensorEnd\r
568 };\r
569 \r
570 static  struct rk_sensor_reg sensor_Brightness3[]=\r
571 {\r
572         // Brightness +1\r
573                 {0xfe, 0x01},\r
574         {0x13, 0x80}, //AEC_target_Y  \r
575         {0xfe, 0x00},\r
576         {0xd5, 0x10},// Luma_offset  \r
577         \r
578         SensorEnd\r
579 };\r
580 \r
581 static  struct rk_sensor_reg sensor_Brightness4[]=\r
582 {\r
583         //      Brightness +2\r
584                 {0xfe, 0x01},\r
585         {0x13, 0x88}, //AEC_target_Y  \r
586         {0xfe, 0x00},\r
587         {0xd5, 0x20},// Luma_offset \r
588         \r
589 \r
590         SensorEnd\r
591 };\r
592 \r
593 static  struct rk_sensor_reg sensor_Brightness5[]=\r
594 {\r
595         //      Brightness +3\r
596           {0xfe, 0x01},\r
597         {0x13, 0x90}, //AEC_target_Y  \r
598         {0xfe, 0x00},\r
599         {0xd5, 0x30},// Luma_offset \r
600 \r
601         SensorEnd\r
602 };\r
603 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
604         sensor_Brightness4, sensor_Brightness5,NULL,\r
605 };\r
606 \r
607 static  struct rk_sensor_reg sensor_Effect_Normal[] =\r
608 {\r
609         {0x43, 0x00},\r
610         SensorEnd\r
611 };\r
612 \r
613 static  struct rk_sensor_reg sensor_Effect_WandB[] =\r
614 {\r
615         {0x43, 0x02},\r
616         {0xda, 0x50},\r
617         {0xdb, 0xe0},\r
618         SensorEnd\r
619 };\r
620 \r
621 static  struct rk_sensor_reg sensor_Effect_Sepia[] =\r
622 {\r
623         {0x43, 0x02},\r
624         {0xda, 0xd0},\r
625         {0xdb, 0x28},\r
626         SensorEnd\r
627 };\r
628 \r
629 static  struct rk_sensor_reg sensor_Effect_Negative[] =\r
630 {\r
631         //Negative\r
632         {0x43, 0x01},\r
633         //{0xda, 0xc0},\r
634         //{0xdb, 0xc0},\r
635         SensorEnd\r
636 };\r
637 static  struct rk_sensor_reg sensor_Effect_Bluish[] =\r
638 {\r
639         // Bluish\r
640                 {0x43, 0x02},\r
641         {0xda, 0x00},\r
642         {0xdb, 0x00},\r
643         SensorEnd\r
644 };\r
645 \r
646 static  struct rk_sensor_reg sensor_Effect_Green[] =\r
647 {\r
648         //      Greenish\r
649         {0x43, 0x02},\r
650         {0xda, 0xc0},\r
651         {0xdb, 0xc0},\r
652         SensorEnd\r
653 };\r
654 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
655         sensor_Effect_Bluish, sensor_Effect_Green,NULL,\r
656 };\r
657 \r
658 static  struct rk_sensor_reg sensor_Exposure0[]=\r
659 {\r
660 \r
661         SensorEnd\r
662 };\r
663 \r
664 static  struct rk_sensor_reg sensor_Exposure1[]=\r
665 {\r
666         SensorEnd\r
667 };\r
668 \r
669 static  struct rk_sensor_reg sensor_Exposure2[]=\r
670 {\r
671         SensorEnd\r
672 };\r
673 \r
674 static  struct rk_sensor_reg sensor_Exposure3[]=\r
675 {\r
676         SensorEnd\r
677 };\r
678 \r
679 static  struct rk_sensor_reg sensor_Exposure4[]=\r
680 {\r
681         SensorEnd\r
682 };\r
683 \r
684 static  struct rk_sensor_reg sensor_Exposure5[]=\r
685 {\r
686 \r
687         SensorEnd\r
688 };\r
689 \r
690 static  struct rk_sensor_reg sensor_Exposure6[]=\r
691 {\r
692         SensorEnd\r
693 };\r
694 \r
695 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
696         sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
697 };\r
698 \r
699 static  struct rk_sensor_reg sensor_Saturation0[]=\r
700 {\r
701         SensorEnd\r
702 };\r
703 \r
704 static  struct rk_sensor_reg sensor_Saturation1[]=\r
705 {\r
706         SensorEnd\r
707 };\r
708 \r
709 static  struct rk_sensor_reg sensor_Saturation2[]=\r
710 {\r
711         SensorEnd\r
712 };\r
713 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
714 \r
715 static  struct rk_sensor_reg sensor_Contrast0[]=\r
716 {\r
717         //Contrast -3\r
718         {0xfe, 0x00},    \r
719         {0xd3, 0x2c}, \r
720 \r
721         SensorEnd\r
722 };\r
723 \r
724 static  struct rk_sensor_reg sensor_Contrast1[]=\r
725 {\r
726         //Contrast -2\r
727         {0xfe, 0x00},    \r
728         {0xd3, 0x30},\r
729 \r
730         SensorEnd\r
731 };\r
732 \r
733 static  struct rk_sensor_reg sensor_Contrast2[]=\r
734 {\r
735         // Contrast -1\r
736         {0xfe, 0x00},            \r
737         {0xd3, 0x38},\r
738 \r
739         SensorEnd\r
740 };\r
741 \r
742 static  struct rk_sensor_reg sensor_Contrast3[]=\r
743 {\r
744         //Contrast 0\r
745         {0xfe, 0x00},    \r
746         {0xd3, 0x40},\r
747 \r
748         SensorEnd\r
749 };\r
750 \r
751 static  struct rk_sensor_reg sensor_Contrast4[]=\r
752 {\r
753         //Contrast +1\r
754         {0xfe, 0x00},            \r
755         {0xd3, 0x48},\r
756 \r
757         SensorEnd\r
758 };\r
759 \r
760 \r
761 static  struct rk_sensor_reg sensor_Contrast5[]=\r
762 {\r
763         //Contrast +2\r
764         {0xfe, 0x00},    \r
765         {0xd3, 0x50},\r
766 \r
767         SensorEnd\r
768 };\r
769 \r
770 static  struct rk_sensor_reg sensor_Contrast6[]=\r
771 {\r
772         //Contrast +3\r
773         {0xfe, 0x00},    \r
774         {0xd3, 0x58},\r
775 \r
776         SensorEnd\r
777 };\r
778 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
779         sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
780 };\r
781 static  struct rk_sensor_reg sensor_SceneAuto[] =\r
782 {\r
783         {0xfe, 0x01},\r
784         {0x33, 0x00},\r
785         {0xfe, 0x00},\r
786         SensorEnd\r
787 };\r
788 \r
789 static  struct rk_sensor_reg sensor_SceneNight[] =\r
790 {\r
791         //30fps ~ 5fps night mode for 60/50Hz light environment, 24Mhz clock input,36Mzh pclk\r
792         {0xfe, 0x01},\r
793         {0x33, 0x20},\r
794         {0xfe, 0x00},\r
795         SensorEnd\r
796 };\r
797 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
798 \r
799 static struct rk_sensor_reg sensor_Zoom0[] =\r
800 {\r
801         SensorEnd\r
802 };\r
803 \r
804 static struct rk_sensor_reg sensor_Zoom1[] =\r
805 {\r
806         SensorEnd\r
807 };\r
808 \r
809 static struct rk_sensor_reg sensor_Zoom2[] =\r
810 {\r
811         SensorEnd\r
812 };\r
813 \r
814 \r
815 static struct rk_sensor_reg sensor_Zoom3[] =\r
816 {\r
817         SensorEnd\r
818 };\r
819 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
820 \r
821 /*\r
822 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu\r
823 */\r
824 static struct v4l2_querymenu sensor_menus[] =\r
825 {\r
826 };\r
827 /*\r
828 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl\r
829 */\r
830 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =\r
831 {\r
832 };\r
833 \r
834 //MUST define the current used format as the first item   \r
835 static struct rk_sensor_datafmt sensor_colour_fmts[] = {\r
836         {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG} \r
837 };\r
838 static struct soc_camera_ops sensor_ops;\r
839 \r
840 \r
841 /*\r
842 **********************************************************\r
843 * Following is local code:\r
844\r
845 * Please codeing your program here \r
846 **********************************************************\r
847 */\r
848 static u16 GC2015_read_shutter(struct i2c_client *client);      // add 2011-08-11 kim\r
849 static void GC2015_set_shutter(struct i2c_client *client, u16 shutter);  // add 2011-08-11 kim\r
850 \r
851 \r
852 ////// add 2011-08-11 kim\r
853 static u16 GC2015_read_shutter(struct i2c_client *client)\r
854 {\r
855         u8 temp_reg1, temp_reg2;\r
856         u16 shutter;\r
857         \r
858         /* Backup the preview mode last shutter & sensor gain. */\r
859         sensor_read(client, 0x03, &temp_reg1);\r
860         sensor_read(client, 0x04, &temp_reg2);\r
861         \r
862         shutter = (temp_reg1 << 8) | (temp_reg2 & 0xFF);\r
863                 \r
864         return shutter;\r
865 }        /* GC2015_read_shutter */\r
866 \r
867 static void GC2015_set_shutter(struct i2c_client *client, u16 shutter)\r
868 {\r
869         u16 temp_reg;\r
870 \r
871         temp_reg = shutter * 10 / 20;   //// \r
872 \r
873         /*Set Shutter start*/\r
874         if(temp_reg < 1) temp_reg = 1;\r
875         sensor_write(client ,0x03 , (temp_reg>>8)&0xff);                   \r
876         sensor_write(client ,0x04 , temp_reg&0xff); \r
877         /*Set Shutter end*/\r
878 }       \r
879 //////// end add kim \r
880 /*\r
881 **********************************************************\r
882 * Following is callback\r
883 * If necessary, you could coding these callback\r
884 **********************************************************\r
885 */\r
886 /*\r
887 * the function is called in open sensor  \r
888 */\r
889 static int sensor_activate_cb(struct i2c_client *client)\r
890 {\r
891         \r
892         return 0;\r
893 }\r
894 /*\r
895 * the function is called in close sensor\r
896 */\r
897 static int sensor_deactivate_cb(struct i2c_client *client)\r
898 {\r
899         \r
900         return 0;\r
901 }\r
902 /*\r
903 * the function is called before sensor register setting in VIDIOC_S_FMT  \r
904 */\r
905 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
906 {\r
907         struct generic_sensor *sensor = to_generic_sensor(client);\r
908         struct specific_sensor *spsensor = to_specific_sensor(sensor);\r
909         spsensor->shutter= GC2015_read_shutter(client); // add 2011-08-11 kim\r
910 \r
911         return 0;\r
912 }\r
913 /*\r
914 * the function is called after sensor register setting finished in VIDIOC_S_FMT  \r
915 */\r
916 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
917 {\r
918         struct generic_sensor *sensor = to_generic_sensor(client);\r
919         struct specific_sensor *spsensor = to_specific_sensor(sensor);\r
920         if(mf->width >=1024)\r
921                 GC2015_set_shutter(client, spsensor->shutter); // add 2011-08-11 kim\r
922         return 0;\r
923 }\r
924 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)\r
925 {\r
926         return 0;\r
927 }\r
928 \r
929 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
930 {\r
931         \r
932         return 0;\r
933 }\r
934 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
935 {\r
936         return 0;\r
937 }\r
938 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
939 {\r
940         //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
941                 \r
942         if (pm_msg.event == PM_EVENT_SUSPEND) {\r
943                 SENSOR_DG("Suspend");\r
944                 \r
945         } else {\r
946                 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);\r
947                 return -EINVAL;\r
948         }\r
949         return 0;\r
950 }\r
951 \r
952 static int sensor_resume(struct soc_camera_device *icd)\r
953 {\r
954 \r
955         SENSOR_DG("Resume");\r
956 \r
957         return 0;\r
958 \r
959 }\r
960 static int sensor_mirror_cb (struct i2c_client *client, int mirror)\r
961 {\r
962         char val;\r
963         int err = 0;\r
964         \r
965         SENSOR_DG("mirror: %d",mirror);\r
966         if (mirror) {\r
967                 sensor_write(client, 0xfe, 0);\r
968                 err = sensor_read(client, 0x29, &val);\r
969                 if (err == 0) {\r
970                         if((val & 0x1) == 0)\r
971                                 err = sensor_write(client, 0x29, (val |0x1));\r
972                         else \r
973                                 err = sensor_write(client, 0x29, (val & 0xfe));\r
974                 }\r
975         } else {\r
976                 //do nothing\r
977         }\r
978 \r
979         return err;    \r
980 }\r
981 /*\r
982 * the function is v4l2 control V4L2_CID_HFLIP callback  \r
983 */\r
984 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
985                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
986 {\r
987         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
988 \r
989         if (sensor_mirror_cb(client,ext_ctrl->value) != 0)\r
990                 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);\r
991         \r
992         SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);\r
993         return 0;\r
994 }\r
995 \r
996 static int sensor_flip_cb(struct i2c_client *client, int flip)\r
997 {\r
998         char val;\r
999         int err = 0;    \r
1000 \r
1001         SENSOR_DG("flip: %d",flip);\r
1002         if (flip) {\r
1003                 \r
1004                 sensor_write(client, 0xfe, 0);\r
1005                 err = sensor_read(client, 0x29, &val);\r
1006                 if (err == 0) {\r
1007                         if((val & 0x2) == 0)\r
1008                                 err = sensor_write(client, 0x29, (val |0x2));\r
1009                         else \r
1010                                 err = sensor_write(client, 0x29, (val & 0xfc));\r
1011                 }\r
1012         } else {\r
1013                 //do nothing\r
1014         }\r
1015 \r
1016         return err;    \r
1017 }\r
1018 /*\r
1019 * the function is v4l2 control V4L2_CID_VFLIP callback  \r
1020 */\r
1021 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1022                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
1023 {\r
1024         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1025 \r
1026         if (sensor_flip_cb(client,ext_ctrl->value) != 0)\r
1027                 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);\r
1028         \r
1029         SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);\r
1030         return 0;\r
1031 }\r
1032 /*\r
1033 * the functions are focus callbacks\r
1034 */\r
1035 static int sensor_focus_init_usr_cb(struct i2c_client *client){\r
1036         return 0;\r
1037 }\r
1038 \r
1039 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){\r
1040         return 0;\r
1041 }\r
1042 \r
1043 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){\r
1044         return 0;\r
1045 }\r
1046 \r
1047 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){\r
1048         return 0;\r
1049 }\r
1050 \r
1051 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos) {\r
1052         return 0;\r
1053 }\r
1054 \r
1055 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){\r
1056         return 0;\r
1057 }\r
1058 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1059 {
1060     return 0;
1061 }\r
1062 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){\r
1063         return 0;\r
1064 }\r
1065 \r
1066 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)\r
1067 {\r
1068         return 0;\r
1069 }\r
1070 \r
1071 /*\r
1072 face defect call back\r
1073 */\r
1074 static int      sensor_face_detect_usr_cb(struct i2c_client *client,int on){\r
1075         return 0;\r
1076 }\r
1077 \r
1078 /*\r
1079 *       The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some\r
1080 * initialization in the function. \r
1081 */\r
1082 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)\r
1083 {\r
1084         return;\r
1085 }\r
1086 \r
1087 /*\r
1088 * :::::WARNING:::::\r
1089 * It is not allowed to modify the following code\r
1090 */\r
1091 \r
1092 sensor_init_parameters_default_code();\r
1093 \r
1094 sensor_v4l2_struct_initialization();\r
1095 \r
1096 sensor_probe_default_code();\r
1097 \r
1098 sensor_remove_default_code();\r
1099 \r
1100 sensor_driver_default_module_code();\r
1101 \r
1102 \r
1103 \r
1104 \r