249598724488363cafd6a8097958e931f01e6718
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / gc0328.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 static int debug =1;\r
13 module_param(debug, int, S_IRUGO|S_IWUSR);\r
14 \r
15 #define dprintk(level, fmt, arg...) do {                        \\r
16         if (debug >= level)                                     \\r
17         printk(KERN_WARNING fmt , ## arg); } while (0)\r
18 \r
19 /* Sensor Driver Configuration Begin */\r
20 #define SENSOR_NAME RK29_CAM_SENSOR_GC0328\r
21 #define SENSOR_V4L2_IDENT V4L2_IDENT_GC0328\r
22 #define SENSOR_ID 0x9d\r
23 #define SENSOR_BUS_PARAM                                         (SOCAM_MASTER |\\r
24                                                                                          SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_LOW|\\r
25                                                                                          SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\r
26 #define SENSOR_PREVIEW_W                                         640\r
27 #define SENSOR_PREVIEW_H                                         480\r
28 #define SENSOR_PREVIEW_FPS                                       15000     // 15fps \r
29 #define SENSOR_FULLRES_L_FPS                             7500      // 7.5fps\r
30 #define SENSOR_FULLRES_H_FPS                             7500      // 7.5fps\r
31 #define SENSOR_720P_FPS                                          0\r
32 #define SENSOR_1080P_FPS                                         0\r
33 \r
34 #define SENSOR_REGISTER_LEN                              1                 // sensor register address bytes\r
35 #define SENSOR_VALUE_LEN                                         1                 // sensor register value bytes\r
36 static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect|CFG_Scene);                                                                      \r
37 /* Sensor Driver Configuration End */\r
38 \r
39 \r
40 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
41 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
42 \r
43 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)\r
44 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
45 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
46 #define sensor_write_array generic_sensor_write_array\r
47 \r
48 struct sensor_parameter\r
49 {\r
50         unsigned int PreviewDummyPixels;\r
51         unsigned int CaptureDummyPixels;\r
52         unsigned int preview_exposure;\r
53         unsigned short int preview_line_width;\r
54         unsigned short int preview_gain;\r
55 \r
56         unsigned short int PreviewPclk;\r
57         unsigned short int CapturePclk;\r
58         char awb[6];\r
59 };\r
60 \r
61 struct specific_sensor{\r
62         struct generic_sensor common_sensor;\r
63         //define user data below\r
64         struct sensor_parameter parameter;\r
65 \r
66 };\r
67 \r
68 /*\r
69 *  The follow setting need been filled.\r
70 *  \r
71 *  Must Filled:\r
72 *  sensor_init_data :                           Sensor initial setting;\r
73 *  sensor_fullres_lowfps_data :         Sensor full resolution setting with best auality, recommand for video;\r
74 *  sensor_preview_data :                        Sensor preview resolution setting, recommand it is vga or svga;\r
75 *  sensor_softreset_data :                      Sensor software reset register;\r
76 *  sensor_check_id_data :                       Sensir chip id register;\r
77 *\r
78 *  Optional filled:\r
79 *  sensor_fullres_highfps_data:         Sensor full resolution setting with high framerate, recommand for video;\r
80 *  sensor_720p:                                         Sensor 720p setting, it is for video;\r
81 *  sensor_1080p:                                        Sensor 1080p setting, it is for video;\r
82 *\r
83 *  :::::WARNING:::::\r
84 *  The SensorEnd which is the setting end flag must be filled int the last of each setting;\r
85 */\r
86 static unsigned int SensorChipID[] = {SENSOR_ID};\r
87 /* Sensor initial setting */\r
88 static struct rk_sensor_reg sensor_init_data[] ={\r
89                         {0xfe , 0x80},\r
90                         {0xfe , 0x80},\r
91                         {0xfc , 0x16}, //clock enable\r
92                         {0xfc , 0x16}, //clock enable\r
93                         {0xfc , 0x16}, //clock enable\r
94                         {0xfc , 0x16}, //clock enable\r
95         \r
96                         {0x42 , 0x02},\r
97         \r
98                         {0xfe , 0x01},\r
99                         {0x4c , 0x01}, //AWB Buffer reset\r
100                         {0xfe , 0x00},\r
101         \r
102                         {0xfe , 0x00},\r
103                         {0x0d , 0x01}, //{8}cis_win_height      486 1e6\r
104                         {0x0e , 0xe8}, //{7:0}cis_win_height\r
105                         {0x0f , 0x02}, //{9:8}cis_win_width 646 286\r
106                         {0x10 , 0x88}, //{7:0}cis_win_width\r
107                         {0x09 , 0x00}, //row_start\r
108                         {0x0a , 0x00},\r
109                         {0x0b , 0x00}, //col_start\r
110                         {0x0c , 0x00},\r
111                         {0x16 , 0x80},\r
112                         {0x17 , 0x14}, //[7]hsync_always, [6]close_2_frame_dbrow, [5:4]CFA_seqence, [3:2]dark_CFA_seqence,      [1]updown, [0]mirror\r
113                         {0x19 , 0x06}, //AD Pipe line number\r
114                         {0x1f , 0xC8}, //txlow\r
115                         {0x20 , 0x01},\r
116                         {0x21 , 0x78}, //68  \r
117                         {0x22 , 0xb0},\r
118                         {0x24 , 0x16},\r
119                         {0x26 , 0x01},\r
120         \r
121                         {0x50 , 0x01}, //crop mode\r
122         \r
123                         //global gain for range\r
124                         {0x70 , 0x45},\r
125         \r
126                         ////////////////////////////////////////////////\r
127                         ////////////     BLK      //////////////////////\r
128                         ////////////////////////////////////////////////\r
129                         {0x27 , 0x27},\r
130                         {0x28 , 0x7F}, //BLK LIMIT\r
131                         {0x29 , 0x20}, //global offset\r
132                         {0x33 , 0x1A},//offset_ratio_G1\r
133                         {0x34 , 0x1A}, //offset_ratio_R\r
134                         {0x35 , 0x1A},\r
135                         {0x36 , 0x1A},\r
136                         {0x37 , 0x20},          \r
137                         {0x38 , 0x20},\r
138                         {0x39 , 0x20},\r
139                         {0x3a , 0x20},\r
140                         {0x47 , 0x00},\r
141                         {0x48 , 0x75},//00\r
142         \r
143         \r
144         \r
145                         ////////////////////////////////////////////////\r
146                         ////////////     block enable      /////////////\r
147                         ////////////////////////////////////////////////\r
148                         {0x40 , 0x7f}, //\r
149                         {0x41 , 0x22},//\r
150                                                         \r
151         \r
152                         {0x42 , 0xff},//\r
153                         {0x45 , 0x00},\r
154                         {0x44 , 0x02},\r
155                         {0x46 , 0x02},\r
156                         {0x4b , 0x01},\r
157                         {0x50 , 0x01}, //crop mode\r
158         \r
159                         //DN & EEINTP\r
160                         {0x7e , 0x0a}, //\r
161                         {0x7f , 0x03}, //c3 //1D DN\r
162                         {0x81 , 0x15},\r
163                         {0x82 , 0x85}, //8f//bilt_base_b\r
164                         {0x83 , 0x02}, //02 //DN C weight\r
165                         {0x84 , 0xe5},\r
166                         {0x90 , 0xac},\r
167                         {0x92 , 0x02}, //5\r
168                         {0x94 , 0x05},\r
169                         {0x95 , 0x63}, \r
170         \r
171         \r
172                         ///////YCP\r
173                         {0xd1 , 0x38},\r
174                         {0xd2 , 0x38}, // cb,cr saturation\r
175                         {0xdd , 0x54},\r
176                         {0xde , 0x38}, //autogray_mode\r
177                         {0xe4 , 0x88},\r
178                         {0xe5 , 0x40},\r
179                         {0xd7 , 0x0e},\r
180                         //rgb gamma\r
181                         {0xBF , 0x0E},                  \r
182                         {0xc0 , 0x1C},  \r
183                         {0xc1 , 0x34},\r
184                         {0xc2 , 0x48},\r
185                         {0xc3 , 0x5A},\r
186                         {0xc4 , 0x6B},\r
187                         {0xc5 , 0x7B},\r
188                         {0xc6 , 0x95},\r
189                         {0xc7 , 0xAB},\r
190                         {0xc8 , 0xBF},\r
191                         {0xc9 , 0xCE},\r
192                         {0xcA , 0xD9},\r
193                         {0xcB , 0xE4},\r
194                         {0xcC , 0xEC},\r
195                         {0xcD , 0xF7},\r
196                         {0xcE , 0xFD},\r
197                         {0xcF , 0xFF},\r
198         \r
199                         ///Y gamma\r
200                         {0xfe , 0x00},\r
201                         {0x63 , 0x00},\r
202                         {0x64 , 0x05},\r
203                         {0x65 , 0x0b},\r
204                         {0x66 , 0x19},\r
205                         {0x67 , 0x2e},\r
206                         {0x68 , 0x40},\r
207                         {0x69 , 0x54},\r
208                         {0x6a , 0x66},\r
209                         {0x6b , 0x86},\r
210                         {0x6c , 0xa7},\r
211                         {0x6d , 0xc6},\r
212                         {0x6e , 0xe4},\r
213                         {0x6f , 0xff},\r
214         \r
215                         //ASDE\r
216                         {0xfe , 0x01},\r
217                         {0x18 , 0x02},\r
218                         {0xfe , 0x00},\r
219                         {0x97 , 0x30}, //Y offset TH\r
220                         {0xa4 , 0x10}, //ASDE auto sa slope\r
221                         {0xa8 , 0x80}, //ASDE LSC SLOPE\r
222                         {0x9c , 0x60}, //auto Y offset Slope\r
223                         {0xa2 , 0x23},\r
224                         {0xad , 0x01}, //ASDE ee,ddMODE\r
225                         {0x9c , 0x01}, //ABS manual K\r
226         \r
227                         {0xfe , 0x01},\r
228                         {0x9c , 0x00}, //ABS manual K\r
229                         {0x08 , 0xa0},\r
230                         {0x09 , 0xe8},\r
231         \r
232                         {0x10 , 0x08},//[7]win_mode,[6]show_mode [3]measure_point\r
233         \r
234                         {0x11 , 0x21}, //[7]fix target\r
235                         {0x12 , 0x10},             \r
236                         {0x13 , 0x45}, //AEC Y target\r
237                         {0x15 , 0xfc}, //high range for count\r
238                         {0x21 , 0xf0}, //c0 //post_gain limit\r
239                         {0x22 , 0x60},\r
240                         {0x23 , 0x30},//20 //dggain max\r
241                         {0x25 , 0x00},\r
242                         {0x24 , 0x14}, //Max index\r
243         \r
244         \r
245                         {0xfe , 0x01},\r
246                         {0x51 , 0x20},\r
247                         {0x52 , 0x4f},\r
248                         {0x53 , 0x40},\r
249                         {0x54 , 0x9f},\r
250                         {0x55 , 0x01},\r
251                         {0x56 , 0x18}, //18\r
252                         {0x5b , 0x02},\r
253                         {0xb1 , 0xdc},\r
254                         {0xb2 , 0xdc}, //R2G STAND\r
255                         {0x7c , 0x71}, //AWB speed,AWB margin\r
256                         {0x7d , 0x10}, //AWB every N\r
257                         {0x76 , 0x8f}, //move mode en,Move mode TH\r
258         \r
259         \r
260                         {0x50 , 0x80},\r
261                         {0x4f , 0x00},\r
262                         {0x4d , 0x01},\r
263                         {0x4e , 0x02},\r
264                         {0x4d , 0x35},\r
265                         {0x4e , 0x01},\r
266                         {0x4e , 0x01},\r
267                         {0x4e , 0x01},\r
268                         {0x4d , 0x44},\r
269                         {0x4e , 0x04},\r
270                         {0x4e , 0x04},\r
271                         {0x4e , 0x02}, \r
272                         {0x4d , 0x53},\r
273                         {0x4e , 0x08},\r
274                         {0x4e , 0x00},\r
275                         {0x4e , 0x04},\r
276                         {0x4d , 0x03},\r
277                         {0x4e , 0x08},\r
278                         {0x4d , 0x72},\r
279                         {0x4e , 0x20}, \r
280                         {0x4e , 0x20},\r
281                         {0x4d , 0x83}, \r
282                         {0x4e , 0x20},\r
283                         {0x4d , 0x92},\r
284                         {0x4e , 0x40},\r
285                         {0x4e , 0x40},\r
286                         {0x4f , 0x01}, \r
287                         {0xfe , 0x00}, //page0\r
288         \r
289                         {0xad , 0x00},\r
290         \r
291                         {0xfe , 0x01},\r
292                         {0xc0 , 0x11},\r
293                         {0xc1 , 0x0b},\r
294                         {0xc2 , 0x09},\r
295                         {0xc6 , 0x0f},\r
296                         {0xc7 , 0x0a},\r
297                         {0xc8 , 0x07},\r
298                         {0xba , 0x2d},\r
299                         {0xbb , 0x1e},\r
300                         {0xbc , 0x1e},\r
301                         {0xb4 , 0x38},\r
302                         {0xb5 , 0x26},\r
303                         {0xb6 , 0x23},\r
304                         {0xc3 , 0x00},\r
305                         {0xc4 , 0x00},\r
306                         {0xc5 , 0x00},\r
307                         {0xc9 , 0x00},\r
308                         {0xca , 0x00},\r
309                         {0xcb , 0x00},\r
310                         {0xbd , 0x0a},\r
311                         {0xbe , 0x00},\r
312                         {0xbf , 0x00},\r
313                         {0xb7 , 0x04},\r
314                         {0xb8 , 0x00},\r
315                         {0xb9 , 0x00},\r
316                         {0xa8 , 0x08},\r
317                         {0xa9 , 0x00},\r
318                         {0xaa , 0x00},\r
319                         {0xab , 0x07},\r
320                         {0xac , 0x00},\r
321                         {0xad , 0x07},\r
322                         {0xae , 0x0e},\r
323                         {0xaf , 0x03},\r
324                         {0xb0 , 0x03},\r
325                         {0xb1 , 0x0d},\r
326                         {0xb2 , 0x00},\r
327                         {0xb3 , 0x08},\r
328                         {0xa4 , 0x00},\r
329                         {0xa5 , 0x00},\r
330                         {0xa6 , 0x00},\r
331                         {0xa7 , 0x00},\r
332                         {0xa1 , 0x3c},\r
333                         {0xa2 , 0x50},\r
334                         {0xfe , 0x00},\r
335         \r
336                         {0xB1 , 0x08},// 40\r
337                         {0xB2 , 0x02},\r
338                         {0xB3 , 0x07},\r
339                         {0xB4 , 0xe0},\r
340                         {0xB5 , 0x00},//\r
341                         {0xB6 , 0xf0},\r
342         \r
343                         {0xf1 , 0x07},\r
344                         {0xf1 , 0x07},\r
345                         {0xf2 , 0x01},\r
346                         \r
347                         {0x4f , 0x01},\r
348         \r
349         \r
350         \r
351                         {0x05, 0x02},   \r
352                         {0x06, 0x2c}, \r
353                         {0x07, 0x00},\r
354                         {0x08, 0xb8},\r
355                         {0xfe, 0x01},\r
356                         //GC0328_SET_PAGE1,\r
357                         {0x29, 0x00},   //anti-flicker step [11:8]\r
358                         {0x2a, 0x60},   //anti-flicker step [7:0]\r
359                         \r
360                         {0x2b, 0x02},   //exp level 0  14.28fps\r
361                         {0x2c, 0xa0}, \r
362                         {0x2d, 0x03},   //exp level 1  12.50fps\r
363                         {0x2e, 0x00}, \r
364                         {0x2f, 0x03},   //exp level 2  10.00fps\r
365                         {0x30, 0xc0}, \r
366                         {0x31, 0x05},   //exp level 3  7.14fps\r
367                         {0x32, 0x40}, \r
368         \r
369                         {0xfe, 0x00},\r
370         \r
371         \r
372         //-------------H_V_Switch(4)---------------//\r
373                         {0x17 , 0x14},  //\r
374         \r
375         \r
376                  /*GC0328_H_V_Switch,\r
377         \r
378                         1:      // normal\r
379                                         {0x17 , 0x14},\r
380                                         \r
381                         2:      // IMAGE_H_MIRROR\r
382                                         {0x17 , 0x15},\r
383                                         \r
384                         3:      // IMAGE_V_MIRROR\r
385                                         {0x17 , 0x16},\r
386                                         \r
387                         4:      // IMAGE_HV_MIRROR\r
388                                         {0x17 , 0x17},\r
389                 */                      \r
390                 //-------------H_V_Select End--------------//\r
391         SensorEnd\r
392 };\r
393 /* Senor full resolution setting: recommand for capture */\r
394 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={\r
395         SensorEnd\r
396 \r
397 };\r
398 \r
399 /* Senor full resolution setting: recommand for video */\r
400 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={\r
401         SensorEnd\r
402 };\r
403 /* Preview resolution setting*/\r
404 static struct rk_sensor_reg sensor_preview_data[] =\r
405 {\r
406 \r
407         SensorEnd\r
408 };\r
409 /* 1280x720 */\r
410 static struct rk_sensor_reg sensor_720p[]={\r
411         SensorEnd\r
412 };\r
413 \r
414 /* 1920x1080 */\r
415 static struct rk_sensor_reg sensor_1080p[]={\r
416         SensorEnd\r
417 };\r
418 \r
419 \r
420 static struct rk_sensor_reg sensor_softreset_data[]={\r
421         SensorEnd\r
422 };\r
423 \r
424 static struct rk_sensor_reg sensor_check_id_data[]={\r
425         SensorRegVal(0xf0,0),\r
426         SensorEnd\r
427 };\r
428 /*\r
429 *  The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx\r
430 */\r
431 static struct rk_sensor_reg sensor_WhiteB_Auto[]=\r
432 {\r
433         {0xfe, 0x00},\r
434         {0x77, 0x57}, \r
435         {0x78, 0x4d},\r
436         {0x79, 0x45},\r
437         {0x42, 0x57},\r
438         SensorEnd\r
439 };\r
440 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
441 static  struct rk_sensor_reg sensor_WhiteB_Cloudy[]=\r
442 {\r
443         {0xfe, 0x00},\r
444         {0x42, 0x55},   // Disable AWB \r
445         {0x77, 0x8c},\r
446         {0x78, 0x50},\r
447         {0x79, 0x40},\r
448         SensorEnd\r
449 };\r
450 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
451 static  struct rk_sensor_reg sensor_WhiteB_ClearDay[]=\r
452 {\r
453         //Sunny\r
454         {0xfe, 0x00},\r
455         {0x42, 0x55},   // Disable AWB \r
456         {0x77, 0x74},\r
457         {0x78, 0x52},\r
458         {0x79, 0x40},\r
459         SensorEnd\r
460 };\r
461 /* Office Colour Temperature : 3500K - 5000K  */\r
462 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=\r
463 {\r
464         //Office\r
465                 {0xfe, 0x00},\r
466         {0x42, 0x55},    // Disable AWB \r
467         {0x77, 0x48},\r
468         {0x78, 0x40},\r
469         {0x79, 0x5c},\r
470         SensorEnd\r
471 \r
472 };\r
473 /* Home Colour Temperature : 2500K - 3500K      */\r
474 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=\r
475 {\r
476         //Home\r
477                 {0xfe, 0x00},\r
478         {0x42, 0x55},   // Disable AWB \r
479         {0x77, 0x40},\r
480         {0x78, 0x42}, \r
481         {0x79, 0x50},\r
482         SensorEnd\r
483 };\r
484 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
485         sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
486 };\r
487 \r
488 static  struct rk_sensor_reg sensor_Brightness0[]=\r
489 {\r
490         // Brightness -2\r
491         {0xfe, 0x00},\r
492         {0xd5, 0xe0},\r
493         SensorEnd\r
494 };\r
495 \r
496 static  struct rk_sensor_reg sensor_Brightness1[]=\r
497 {\r
498         // Brightness -1\r
499         {0xfe, 0x00},\r
500         {0xd5, 0xf0},\r
501         SensorEnd\r
502 };\r
503 \r
504 static  struct rk_sensor_reg sensor_Brightness2[]=\r
505 {\r
506         //      Brightness 0\r
507         {0xfe, 0x00},\r
508         {0xd5, 0x00},\r
509         SensorEnd\r
510 };\r
511 \r
512 static  struct rk_sensor_reg sensor_Brightness3[]=\r
513 {\r
514         // Brightness +1\r
515         {0xfe, 0x00},\r
516         {0xd5, 0x20},\r
517         SensorEnd\r
518 };\r
519 \r
520 static  struct rk_sensor_reg sensor_Brightness4[]=\r
521 {\r
522         //      Brightness +2\r
523         {0xfe, 0x00},\r
524         {0xd5, 0x30},\r
525         SensorEnd\r
526 };\r
527 \r
528 static  struct rk_sensor_reg sensor_Brightness5[]=\r
529 {\r
530         //      Brightness +3\r
531         {0xfe, 0x00},\r
532         {0xd5, 0x40},\r
533         SensorEnd\r
534 };\r
535 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
536         sensor_Brightness4, sensor_Brightness5,NULL,\r
537 };\r
538 \r
539 static  struct rk_sensor_reg sensor_Effect_Normal[] =\r
540 {\r
541         {0x43,0x00}, \r
542         SensorEnd\r
543 };\r
544 \r
545 static  struct rk_sensor_reg sensor_Effect_WandB[] =\r
546 {\r
547         {0x43,0x02}, \r
548         {0xda,0x00}, \r
549         {0xdb,0x00}, \r
550         SensorEnd\r
551 };\r
552 \r
553 static  struct rk_sensor_reg sensor_Effect_Sepia[] =\r
554 {\r
555         {0x43,0x02},\r
556         {0xda,0xd0},\r
557         {0xdb,0x28},\r
558         SensorEnd\r
559 };\r
560 \r
561 static  struct rk_sensor_reg sensor_Effect_Negative[] =\r
562 {\r
563         //Negative\r
564         {0x43,0x01},\r
565         SensorEnd\r
566 };\r
567 static  struct rk_sensor_reg sensor_Effect_Bluish[] =\r
568 {\r
569         // Bluish\r
570         {0x423,0x02},\r
571         {0xda,0x50},\r
572         {0xdb,0xe0},\r
573         SensorEnd\r
574 };\r
575 \r
576 static  struct rk_sensor_reg sensor_Effect_Green[] =\r
577 {\r
578         //      Greenish\r
579         {0x43,0x02},\r
580         \r
581         {0xda,0xc0},\r
582         {0xdb,0xc0},\r
583         SensorEnd\r
584 };\r
585 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
586         sensor_Effect_Bluish, sensor_Effect_Green,NULL,\r
587 };\r
588 \r
589 static  struct rk_sensor_reg sensor_Exposure0[]=\r
590 {\r
591         {0xfe, 0x01},\r
592         {0x13, 0x30},\r
593         {0xfe, 0x00},\r
594         SensorEnd\r
595 };\r
596 \r
597 static  struct rk_sensor_reg sensor_Exposure1[]=\r
598 {\r
599         {0xfe, 0x01},\r
600         {0x13, 0x38},\r
601         {0xfe, 0x00},\r
602         SensorEnd\r
603 };\r
604 \r
605 static  struct rk_sensor_reg sensor_Exposure2[]=\r
606 {\r
607         {0xfe, 0x01},\r
608         {0x13, 0x40},\r
609         {0xfe, 0x00},\r
610         SensorEnd\r
611 };\r
612 \r
613 static  struct rk_sensor_reg sensor_Exposure3[]=\r
614 {\r
615         {0xfe, 0x01},\r
616         {0x13, 0x45},\r
617         {0xfe, 0x00},\r
618         SensorEnd\r
619 };\r
620 \r
621 static  struct rk_sensor_reg sensor_Exposure4[]=\r
622 {\r
623         {0xfe, 0x01},\r
624         {0x13, 0x50},\r
625         {0xfe, 0x00},\r
626         SensorEnd\r
627 };\r
628 \r
629 static  struct rk_sensor_reg sensor_Exposure5[]=\r
630 {\r
631         {0xfe, 0x01},\r
632         {0x13, 0x58},\r
633         {0xfe, 0x00},\r
634 \r
635         SensorEnd\r
636 };\r
637 \r
638 static  struct rk_sensor_reg sensor_Exposure6[]=\r
639 {\r
640         {0xfe, 0x01},\r
641         {0x13, 0x60},\r
642         {0xfe, 0x00},\r
643         SensorEnd\r
644 };\r
645 \r
646 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
647         sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
648 };\r
649 \r
650 static  struct rk_sensor_reg sensor_Saturation0[]=\r
651 {\r
652         SensorEnd\r
653 };\r
654 \r
655 static  struct rk_sensor_reg sensor_Saturation1[]=\r
656 {\r
657         SensorEnd\r
658 };\r
659 \r
660 static  struct rk_sensor_reg sensor_Saturation2[]=\r
661 {\r
662         SensorEnd\r
663 };\r
664 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
665 \r
666 static  struct rk_sensor_reg sensor_Contrast0[]=\r
667 {\r
668         {0xb3,0x34},\r
669 \r
670         SensorEnd\r
671 };\r
672 \r
673 static  struct rk_sensor_reg sensor_Contrast1[]=\r
674 {\r
675         {0xb3,0x38},\r
676 \r
677         SensorEnd\r
678 };\r
679 \r
680 static  struct rk_sensor_reg sensor_Contrast2[]=\r
681 {\r
682         {0xb3,0x3d},\r
683 \r
684         SensorEnd\r
685 };\r
686 \r
687 static  struct rk_sensor_reg sensor_Contrast3[]=\r
688 {\r
689         {0xb3,0x40},\r
690 \r
691         SensorEnd\r
692 };\r
693 \r
694 static  struct rk_sensor_reg sensor_Contrast4[]=\r
695 {\r
696         {0xb3,0x44},\r
697 \r
698         SensorEnd\r
699 };\r
700 \r
701 \r
702 static  struct rk_sensor_reg sensor_Contrast5[]=\r
703 {\r
704         {0xb3,0x48},\r
705 \r
706         SensorEnd\r
707 };\r
708 \r
709 static  struct rk_sensor_reg sensor_Contrast6[]=\r
710 {\r
711         {0xb3,0x50},\r
712 \r
713         SensorEnd\r
714 };\r
715 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
716         sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
717 };\r
718 static  struct rk_sensor_reg sensor_SceneAuto[] =\r
719 {\r
720         {0xfe, 0x01},\r
721         {0x33, 0x20},\r
722         {0xfe, 0x00},\r
723         SensorEnd\r
724 };\r
725 \r
726 static  struct rk_sensor_reg sensor_SceneNight[] =\r
727 {\r
728         {0xfe, 0x01},\r
729         {0x33, 0x30},\r
730         {0xfe, 0x00},\r
731         SensorEnd\r
732 };\r
733 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
734 \r
735 static struct rk_sensor_reg sensor_Zoom0[] =\r
736 {\r
737         SensorEnd\r
738 };\r
739 \r
740 static struct rk_sensor_reg sensor_Zoom1[] =\r
741 {\r
742         SensorEnd\r
743 };\r
744 \r
745 static struct rk_sensor_reg sensor_Zoom2[] =\r
746 {\r
747         SensorEnd\r
748 };\r
749 \r
750 \r
751 static struct rk_sensor_reg sensor_Zoom3[] =\r
752 {\r
753         SensorEnd\r
754 };\r
755 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
756 \r
757 /*\r
758 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu\r
759 */\r
760 static struct v4l2_querymenu sensor_menus[] =\r
761 {\r
762 };\r
763 /*\r
764 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl\r
765 */\r
766 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =\r
767 {\r
768 };\r
769 \r
770 //MUST define the current used format as the first item   \r
771 static struct rk_sensor_datafmt sensor_colour_fmts[] = {\r
772         {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG} \r
773 };\r
774 static struct soc_camera_ops sensor_ops;\r
775 \r
776 \r
777 /*\r
778 **********************************************************\r
779 * Following is local code:\r
780\r
781 * Please codeing your program here \r
782 **********************************************************\r
783 */\r
784 /*\r
785 **********************************************************\r
786 * Following is callback\r
787 * If necessary, you could coding these callback\r
788 **********************************************************\r
789 */\r
790 /*\r
791 * the function is called in open sensor  \r
792 */\r
793 static int sensor_activate_cb(struct i2c_client *client)\r
794 {\r
795         \r
796         return 0;\r
797 }\r
798 /*\r
799 * the function is called in close sensor\r
800 */\r
801 static int sensor_deactivate_cb(struct i2c_client *client)\r
802 {\r
803         \r
804         return 0;\r
805 }\r
806 /*\r
807 * the function is called before sensor register setting in VIDIOC_S_FMT  \r
808 */\r
809 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
810 {\r
811 \r
812         return 0;\r
813 }\r
814 /*\r
815 * the function is called after sensor register setting finished in VIDIOC_S_FMT  \r
816 */\r
817 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
818 {\r
819         return 0;\r
820 }\r
821 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)\r
822 {\r
823         return 0;\r
824 }\r
825 \r
826 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
827 {\r
828         \r
829         return 0;\r
830 }\r
831 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
832 {\r
833         return 0;\r
834 }\r
835 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
836 {\r
837         //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
838                 \r
839         if (pm_msg.event == PM_EVENT_SUSPEND) {\r
840                 SENSOR_DG("Suspend");\r
841                 \r
842         } else {\r
843                 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);\r
844                 return -EINVAL;\r
845         }\r
846         return 0;\r
847 }\r
848 \r
849 static int sensor_resume(struct soc_camera_device *icd)\r
850 {\r
851 \r
852         SENSOR_DG("Resume");\r
853 \r
854         return 0;\r
855 \r
856 }\r
857 static int sensor_mirror_cb (struct i2c_client *client, int mirror)\r
858 {\r
859         char val;\r
860         int err = 0;\r
861         \r
862         SENSOR_DG("mirror: %d",mirror);\r
863         if (mirror) {\r
864                 sensor_write(client, 0xfe, 0);\r
865                 err = sensor_read(client, 0x17, &val);\r
866                 val-=4;\r
867                 if (err == 0) {\r
868                         if((val & 0x1) == 0){\r
869                                 err = sensor_write(client, 0x17, ((val |0x1)+4));\r
870                                 }\r
871                         else \r
872                                 err = sensor_write(client, 0x17, ((val & 0xfe)+4));\r
873                 }\r
874         } else {\r
875                 //do nothing\r
876         }\r
877 \r
878         return err;    \r
879 }\r
880 /*\r
881 * the function is v4l2 control V4L2_CID_HFLIP callback  \r
882 */\r
883 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
884                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
885 {\r
886         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
887 \r
888         if (sensor_mirror_cb(client,ext_ctrl->value) != 0)\r
889                 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);\r
890         \r
891         SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);\r
892         return 0;\r
893 }\r
894 \r
895 static int sensor_flip_cb(struct i2c_client *client, int flip)\r
896 {\r
897         char val;\r
898         int err = 0;    \r
899 \r
900         SENSOR_DG("flip: %d",flip);\r
901         if (flip) {\r
902                 \r
903                 sensor_write(client, 0xfe, 0);\r
904                 err = sensor_read(client, 0x17, &val);\r
905                 val-=4;\r
906                 if (err == 0) {\r
907                         if((val & 0x2) == 0){\r
908                                 err = sensor_write(client, 0x17, ((val |0x2)+4));\r
909                                 }\r
910                         else {\r
911                                 err = sensor_write(client, 0x17, ((val & 0xfc)+4));\r
912                                 }\r
913                 }\r
914         } else {\r
915                 //do nothing\r
916         }\r
917 \r
918         return err;    \r
919 }\r
920 /*\r
921 * the function is v4l2 control V4L2_CID_VFLIP callback  \r
922 */\r
923 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
924                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
925 {\r
926         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
927 \r
928         if (sensor_flip_cb(client,ext_ctrl->value) != 0)\r
929                 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);\r
930         \r
931         SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);\r
932         return 0;\r
933 }\r
934 /*\r
935 * the functions are focus callbacks\r
936 */\r
937 static int sensor_focus_init_usr_cb(struct i2c_client *client){\r
938         return 0;\r
939 }\r
940 \r
941 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){\r
942         return 0;\r
943 }\r
944 \r
945 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){\r
946         return 0;\r
947 }\r
948 \r
949 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){\r
950         return 0;\r
951 }\r
952 \r
953 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos)\r
954 {\r
955         return 0;\r
956 }\r
957 \r
958 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){\r
959         return 0;\r
960 }\r
961 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
962 {
963     return 0;
964 }\r
965 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){\r
966         return 0;\r
967 }\r
968 \r
969 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)\r
970 {\r
971         return 0;\r
972 }\r
973 \r
974 /*\r
975 face defect call back\r
976 */\r
977 static int      sensor_face_detect_usr_cb(struct i2c_client *client,int on){\r
978         return 0;\r
979 }\r
980 \r
981 /*\r
982 *       The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some\r
983 * initialization in the function. \r
984 */\r
985 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)\r
986 {\r
987         return;\r
988 }\r
989 \r
990 /*\r
991 * :::::WARNING:::::\r
992 * It is not allowed to modify the following code\r
993 */\r
994 \r
995 sensor_init_parameters_default_code();\r
996 \r
997 sensor_v4l2_struct_initialization();\r
998 \r
999 sensor_probe_default_code();\r
1000 \r
1001 sensor_remove_default_code();\r
1002 \r
1003 sensor_driver_default_module_code();\r
1004 \r
1005 \r
1006 \r
1007 \r