ARM64: DTS: Add rk3399-firefly uart4 device, node as /dev/ttyS1
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / gc0309.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_GC0309\r
23 #define SENSOR_V4L2_IDENT V4L2_IDENT_GC0309\r
24 #define SENSOR_ID 0xa0\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_HIGH|\\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 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 \r
69 };\r
70 \r
71 /*\r
72 *  The follow setting need been filled.\r
73 *  \r
74 *  Must Filled:\r
75 *  sensor_init_data :                           Sensor initial setting;\r
76 *  sensor_fullres_lowfps_data :         Sensor full resolution setting with best auality, recommand for video;\r
77 *  sensor_preview_data :                        Sensor preview resolution setting, recommand it is vga or svga;\r
78 *  sensor_softreset_data :                      Sensor software reset register;\r
79 *  sensor_check_id_data :                       Sensir chip id register;\r
80 *\r
81 *  Optional filled:\r
82 *  sensor_fullres_highfps_data:         Sensor full resolution setting with high framerate, recommand for video;\r
83 *  sensor_720p:                                         Sensor 720p setting, it is for video;\r
84 *  sensor_1080p:                                        Sensor 1080p setting, it is for video;\r
85 *\r
86 *  :::::WARNING:::::\r
87 *  The SensorEnd which is the setting end flag must be filled int the last of each setting;\r
88 */\r
89 \r
90 /* Sensor initial setting */\r
91 static struct rk_sensor_reg sensor_init_data[] ={\r
92                   /*init registers code.*/\r
93 #if 1\r
94                 {0xfe,0x80},   // soft reset    \r
95                 {0x1a,0x16},    \r
96                 {0xd2,0x10},   // close AEC\r
97                 {0x22,0x55},   // close AWB\r
98         \r
99                 {0x5a,0x56}, \r
100                 {0x5b,0x40},\r
101                 {0x5c,0x4a},                    \r
102         \r
103                 {0x22,0x57}, \r
104                         \r
105                 {0x01,0xfa}, \r
106                 {0x02,0x70}, \r
107                 {0x0f,0x01}, \r
108         \r
109                 {0xe2,0x00}, \r
110                 {0xe3,0x64}, \r
111         \r
112                 {0x03,0x01}, \r
113                 {0x04,0x2c}, \r
114         \r
115                 {0x05,0x00},\r
116                 {0x06,0x00},\r
117                 {0x07,0x00}, \r
118                 {0x08,0x00}, \r
119                 {0x09,0x01}, \r
120                 {0x0a,0xe8}, \r
121                 {0x0b,0x02}, \r
122                 {0x0c,0x88}, \r
123                 {0x0d,0x02}, \r
124                 {0x0e,0x02}, \r
125                 {0x10,0x22}, \r
126                 {0x11,0x0d}, \r
127                 {0x12,0x2a}, \r
128                 {0x13,0x00}, \r
129                 {0x14,0x13},\r
130                 {0x15,0x0a}, \r
131                 {0x16,0x05}, \r
132                 {0x17,0x01}, \r
133         \r
134                 {0x1b,0x03}, \r
135                 {0x1c,0xc1}, \r
136                 {0x1d,0x08}, \r
137                 {0x1e,0x20},\r
138                 {0x1f,0x16}, \r
139         \r
140                 {0x20,0xff}, \r
141                 {0x21,0xf8}, \r
142                 {0x24,0xa2}, \r
143                 {0x25,0x0f},\r
144                 //output sync_mode\r
145                 {0x26,0x03}, \r
146                 {0x2f,0x01}, \r
147                 /////////////////////////////////////////////////////////////////////\r
148                 /////////////////////////// grab_t ////////////////////////////////\r
149                 /////////////////////////////////////////////////////////////////////\r
150                 {0x30,0xf7}, \r
151                 {0x31,0x40},\r
152                 {0x32,0x00}, \r
153                 {0x39,0x04}, \r
154                 {0x3a,0x20}, \r
155                 {0x3b,0x20}, \r
156                 {0x3c,0x02}, \r
157                 {0x3d,0x02}, \r
158                 {0x3e,0x02},\r
159                 {0x3f,0x02}, \r
160                 \r
161                 //gain\r
162                 {0x50,0x24}, \r
163                 \r
164                 {0x53,0x82}, \r
165                 {0x54,0x80}, \r
166                 {0x55,0x80}, \r
167                 {0x56,0x82}, \r
168                 \r
169                 /////////////////////////////////////////////////////////////////////\r
170                 /////////////////////////// LSC_t  ////////////////////////////////\r
171                 /////////////////////////////////////////////////////////////////////\r
172                 {0x8b,0x20}, \r
173                 {0x8c,0x20}, \r
174                 {0x8d,0x20}, \r
175                 {0x8e,0x10}, \r
176                 {0x8f,0x10}, \r
177                 {0x90,0x10}, \r
178                 {0x91,0x3c}, \r
179                 {0x92,0x50}, \r
180                 {0x5d,0x12}, \r
181                 {0x5e,0x1a}, \r
182                 {0x5f,0x24}, \r
183                 /////////////////////////////////////////////////////////////////////\r
184                 /////////////////////////// DNDD_t      ///////////////////////////////\r
185                 /////////////////////////////////////////////////////////////////////\r
186                 {0x60,0x07}, \r
187                 {0x61,0x0e}, \r
188                 {0x62,0x0c}, \r
189                 {0x64,0x03}, \r
190                 {0x66,0xe8}, \r
191                 {0x67,0x86}, \r
192                 {0x68,0xa2}, \r
193                 \r
194                 /////////////////////////////////////////////////////////////////////\r
195                 /////////////////////////// asde_t ///////////////////////////////\r
196                 /////////////////////////////////////////////////////////////////////\r
197                 {0x69,0x20}, \r
198                 {0x6a,0x0f}, \r
199                 {0x6b,0x00}, \r
200                 {0x6c,0x53}, \r
201                 {0x6d,0x83}, \r
202                 {0x6e,0xac}, \r
203                 {0x6f,0xac}, \r
204                 {0x70,0x15}, \r
205                 {0x71,0x33}, \r
206                 /////////////////////////////////////////////////////////////////////\r
207                 /////////////////////////// eeintp_t///////////////////////////////\r
208                 /////////////////////////////////////////////////////////////////////\r
209                 {0x72,0xdc},  \r
210                 {0x73,0x80},  \r
211                 //for high resolution in light scene\r
212                 {0x74,0x02}, \r
213                 {0x75,0x3f}, \r
214                 {0x76,0x02}, \r
215                 {0x77,0x54}, \r
216                 {0x78,0x88}, \r
217                 {0x79,0x81}, \r
218                 {0x7a,0x81}, \r
219                 {0x7b,0x22}, \r
220                 {0x7c,0xff},\r
221                 \r
222                 \r
223                 /////////////////////////////////////////////////////////////////////\r
224                 ///////////////////////////CC_t///////////////////////////////\r
225                 /////////////////////////////////////////////////////////////////////\r
226                 {0x93,0x45}, \r
227                 {0x94,0x00}, \r
228                 {0x95,0x00}, \r
229                 {0x96,0x00}, \r
230                 {0x97,0x45}, \r
231                 {0x98,0xf0}, \r
232                 {0x9c,0x00}, \r
233                 {0x9d,0x03}, \r
234                 {0x9e,0x00}, \r
235         \r
236                 \r
237                 \r
238                 /////////////////////////////////////////////////////////////////////\r
239                 ///////////////////////////YCP_t///////////////////////////////\r
240                 /////////////////////////////////////////////////////////////////////\r
241                 {0xb1,0x40}, \r
242                 {0xb2,0x40}, \r
243                 {0xb8,0x20}, \r
244                 {0xbe,0x36}, \r
245                 {0xbf,0x00}, \r
246                 /////////////////////////////////////////////////////////////////////\r
247                 ///////////////////////////AEC_t///////////////////////////////\r
248                 /////////////////////////////////////////////////////////////////////\r
249                 {0xd0,0xc9},  \r
250                 {0xd1,0x10},  \r
251         //      {0xd2,0x90},  \r
252                 {0xd3,0x80},  \r
253                 {0xd5,0xf2}, \r
254                 {0xd6,0x16},  \r
255                 {0xdb,0x92}, \r
256                 {0xdc,0xa5},  \r
257                 {0xdf,0x23},   \r
258                 {0xd9,0x00},  \r
259                 {0xda,0x00},  \r
260                 {0xe0,0x09},\r
261         \r
262                 {0xec,0x20},  \r
263                 {0xed,0x04},  \r
264                 {0xee,0xa0},  \r
265                 {0xef,0x40},  \r
266         \r
267                 //Y_gamma\r
268                 {0xc0,0x00},\r
269                 {0xc1,0x0B},\r
270                 {0xc2,0x15},\r
271                 {0xc3,0x27},\r
272                 {0xc4,0x39},\r
273                 {0xc5,0x49},\r
274                 {0xc6,0x5A},\r
275                 {0xc7,0x6A},\r
276                 {0xc8,0x89},\r
277                 {0xc9,0xA8},\r
278                 {0xca,0xC6},\r
279                 {0xcb,0xE3},\r
280                 {0xcc,0xFF},\r
281         \r
282                 /////////////////////////////////////////////////////////////////\r
283                 /////////////////////////// ABS_t ///////////////////////////////\r
284                 /////////////////////////////////////////////////////////////////\r
285                 {0xf0,0x02},\r
286                 {0xf1,0x01},\r
287                 {0xf2,0x00}, \r
288                 {0xf3,0x30}, \r
289                 \r
290                 /////////////////////////////////////////////////////////////////\r
291                 /////////////////////////// Measure Window ///////////////////////\r
292                 /////////////////////////////////////////////////////////////////\r
293                 {0xf7,0x04}, \r
294                 {0xf8,0x02}, \r
295                 {0xf9,0x9f},\r
296                 {0xfa,0x78},\r
297         \r
298 #else\r
299                 {0xfe,0x80},   // soft reset    \r
300                 \r
301                 {0x1a,0x16},    \r
302                 {0xd2,0x10},   // close AEC\r
303                 {0x22,0x55},   // close AWB\r
304         \r
305                 {0x5a,0x56}, \r
306                 {0x5b,0x40},\r
307                 {0x5c,0x4a},                    \r
308         \r
309                 {0x22,0x57}, \r
310                         \r
311                 {0x01,0xfa}, \r
312                 {0x02,0x70}, \r
313                 {0x0f,0x01}, \r
314         \r
315                 {0xe2,0x00}, \r
316                 {0xe3,0x64}, \r
317         \r
318                 {0x03,0x01}, \r
319                 {0x04,0x2c}, \r
320         \r
321         \r
322                 {0x05,0x00},\r
323                 {0x06,0x00},\r
324                 {0x07,0x00}, \r
325                 {0x08,0x00}, \r
326                 {0x09,0x01}, \r
327                 {0x0a,0xe8}, \r
328                 {0x0b,0x02}, \r
329                 {0x0c,0x88}, \r
330                 {0x0d,0x02}, \r
331                 {0x0e,0x02}, \r
332                 {0x10,0x22}, \r
333                 {0x11,0x0d}, \r
334                 {0x12,0x2a}, \r
335                 {0x13,0x00}, \r
336                 \r
337                 {0x15,0x0a}, \r
338                 {0x16,0x05}, \r
339                 {0x17,0x01}, \r
340         \r
341                 {0x1b,0x03}, \r
342                 {0x1c,0xc1}, \r
343                 {0x1d,0x08}, \r
344                 {0x1e,0x20},\r
345                 {0x1f,0x16}, \r
346         \r
347                 {0x20,0xff}, \r
348                 {0x21,0xf8}, \r
349                 {0x24,0xa2}, \r
350                 {0x25,0x0f},\r
351                 //output sync_mode\r
352                 {0x26,0x03}, \r
353                 {0x2f,0x01}, \r
354                 /////////////////////////////////////////////////////////////////////\r
355                 /////////////////////////// grab_t ////////////////////////////////\r
356                 /////////////////////////////////////////////////////////////////////\r
357                 {0x30,0xf7}, \r
358                 {0x31,0x40},\r
359                 {0x32,0x00}, \r
360                 {0x39,0x04}, \r
361                 {0x3a,0x20}, \r
362                 {0x3b,0x20}, \r
363                 {0x3c,0x02}, \r
364                 {0x3d,0x02}, \r
365                 {0x3e,0x02},\r
366                 {0x3f,0x02}, \r
367                 \r
368                 //gain\r
369                 {0x50,0x24}, \r
370                         \r
371                 {0x53,0x82}, \r
372                 {0x54,0x80}, \r
373                 {0x55,0x80}, \r
374                 {0x56,0x82}, \r
375                 \r
376                 /////////////////////////////////////////////////////////////////////\r
377                 /////////////////////////// LSC_t  ////////////////////////////////\r
378                 /////////////////////////////////////////////////////////////////////\r
379                 {0x8b,0x20}, \r
380                 {0x8c,0x20}, \r
381                 {0x8d,0x20}, \r
382                 {0x8e,0x10}, \r
383                 {0x8f,0x10}, \r
384                 {0x90,0x10}, \r
385                 {0x91,0x3c}, \r
386                 {0x92,0x50}, \r
387                 {0x5d,0x12}, \r
388                 {0x5e,0x1a}, \r
389                 {0x5f,0x24}, \r
390                 /////////////////////////////////////////////////////////////////////\r
391                 /////////////////////////// DNDD_t      ///////////////////////////////\r
392                 /////////////////////////////////////////////////////////////////////\r
393                 {0x60,0x07}, \r
394                 {0x61,0x0e}, \r
395                 {0x62,0x0c}, \r
396                 {0x64,0x03}, \r
397                 {0x66,0xe8}, \r
398                 {0x67,0x86}, \r
399                 {0x68,0xa2}, \r
400                 \r
401                 /////////////////////////////////////////////////////////////////////\r
402                 /////////////////////////// asde_t ///////////////////////////////\r
403                 /////////////////////////////////////////////////////////////////////\r
404                 {0x69,0x20}, \r
405                 {0x6a,0x0f}, \r
406                 {0x6b,0x00}, \r
407                 {0x6c,0x53}, \r
408                 {0x6d,0x83}, \r
409                 {0x6e,0xac}, \r
410                 {0x6f,0xac}, \r
411                 {0x70,0x15}, \r
412                 {0x71,0x33}, \r
413                 /////////////////////////////////////////////////////////////////////\r
414                 /////////////////////////// eeintp_t///////////////////////////////\r
415 #endif\r
416                 {0x23,0x00},\r
417                 {0x2d,0x0a}, // 0x08\r
418                 {0x20,0xff},\r
419                 {0xd2,0x90},\r
420                 {0x73,0x00},\r
421                 {0x77,0x54},\r
422                                 \r
423                 {0xb3,0x40},\r
424                 {0xb4,0x80},\r
425                 {0xba,0x00},\r
426                 {0xbb,0x00},\r
427         SensorEnd\r
428 };\r
429 /* Senor full resolution setting: recommand for capture */\r
430 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={\r
431         SensorEnd\r
432 \r
433 };\r
434 /* Senor full resolution setting: recommand for video */\r
435 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={\r
436         SensorEnd\r
437 };\r
438 /* Preview resolution setting*/\r
439 static struct rk_sensor_reg sensor_preview_data[] =\r
440 {\r
441         SensorEnd\r
442 };\r
443 /* 1280x720 */\r
444 static struct rk_sensor_reg sensor_720p[]={\r
445         SensorEnd\r
446 };\r
447 \r
448 /* 1920x1080 */\r
449 static struct rk_sensor_reg sensor_1080p[]={\r
450         SensorEnd\r
451 };\r
452 \r
453 \r
454 static struct rk_sensor_reg sensor_softreset_data[]={\r
455         SensorRegVal(0xfe,80),\r
456         SensorWaitMs(5),\r
457         SensorEnd\r
458 };\r
459 \r
460 static struct rk_sensor_reg sensor_check_id_data[]={\r
461         SensorRegVal(0x00,0),\r
462         SensorEnd\r
463 };\r
464 /*\r
465 *  The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx\r
466 */\r
467 static struct rk_sensor_reg sensor_WhiteB_Auto[]=\r
468 {\r
469         {0x5a,0x56}, //for AWB can adjust back\r
470         {0x5b,0x40},\r
471         {0x5c,0x4a},                    \r
472         {0x22,0x57},     // Enable AWB\r
473         SensorEnd\r
474 };\r
475 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
476 static  struct rk_sensor_reg sensor_WhiteB_Cloudy[]=\r
477 {\r
478         {0x22,0x55},   // Disable AWB \r
479         {0x5a,0x8c}, //WB_manual_gain \r
480         {0x5b,0x50},\r
481         {0x5c,0x40},\r
482         SensorEnd\r
483 };\r
484 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
485 static  struct rk_sensor_reg sensor_WhiteB_ClearDay[]=\r
486 {\r
487         //Sunny\r
488         {0x22,0x55},   \r
489         {0x5a,0x74}, \r
490         {0x5b,0x52},\r
491         {0x5c,0x40},    \r
492         SensorEnd\r
493 };\r
494 /* Office Colour Temperature : 3500K - 5000K  */\r
495 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=\r
496 {\r
497           //Incandescent\r
498         {0x22,0x55}, \r
499           {0x5a,0x48},\r
500           {0x5b,0x40},\r
501           {0x5c,0x5c},\r
502         SensorEnd\r
503 \r
504 };\r
505 /* Home Colour Temperature : 2500K - 3500K      */\r
506 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=\r
507 {\r
508         //fluorescent\r
509         {0x22,0x55},   \r
510         {0x5a,0x40},\r
511         {0x5b,0x42},\r
512         {0x5c,0x50},\r
513         SensorEnd\r
514 };\r
515 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
516         sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
517 };\r
518 \r
519 static  struct rk_sensor_reg sensor_Brightness0[]=\r
520 {\r
521         // Brightness -2\r
522         SensorEnd\r
523 };\r
524 \r
525 static  struct rk_sensor_reg sensor_Brightness1[]=\r
526 {\r
527         // Brightness -1\r
528 \r
529         SensorEnd\r
530 };\r
531 \r
532 static  struct rk_sensor_reg sensor_Brightness2[]=\r
533 {\r
534         //      Brightness 0\r
535 \r
536         SensorEnd\r
537 };\r
538 \r
539 static  struct rk_sensor_reg sensor_Brightness3[]=\r
540 {\r
541         // Brightness +1\r
542 \r
543         SensorEnd\r
544 };\r
545 \r
546 static  struct rk_sensor_reg sensor_Brightness4[]=\r
547 {\r
548         //      Brightness +2\r
549 \r
550         SensorEnd\r
551 };\r
552 \r
553 static  struct rk_sensor_reg sensor_Brightness5[]=\r
554 {\r
555         //      Brightness +3\r
556 \r
557         SensorEnd\r
558 };\r
559 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
560         sensor_Brightness4, sensor_Brightness5,NULL,\r
561 };\r
562 \r
563 static  struct rk_sensor_reg sensor_Effect_Normal[] =\r
564 {\r
565         {0x23,0x00},\r
566         {0x2d,0x0a}, // 0x08\r
567         {0x20,0xff},\r
568         {0xd2,0x90},\r
569         {0x73,0x00},\r
570         {0x77,0x54},\r
571                         \r
572         {0xb3,0x40},\r
573         {0xb4,0x80},\r
574         {0xba,0x00},\r
575         {0xbb,0x00},\r
576         SensorEnd\r
577 };\r
578 \r
579 static  struct rk_sensor_reg sensor_Effect_WandB[] =\r
580 {\r
581         {0x23,0x02},            \r
582         {0x2d,0x0a},\r
583         {0x20,0xbf},\r
584         {0xd2,0x10},\r
585         {0x73,0x01},\r
586         \r
587         {0x51,0x40},\r
588         {0x52,0x40},\r
589         {0xb3,0x60},\r
590         {0xb4,0x40},\r
591         {0xba,0x00},\r
592         {0xbb,0x00},\r
593         SensorEnd\r
594 };\r
595 \r
596 static  struct rk_sensor_reg sensor_Effect_Sepia[] =\r
597 {\r
598         {0x23,0x02},            \r
599         {0x2d,0x0a},\r
600         {0x20,0xff},\r
601         {0xd2,0x90},\r
602         {0x73,0x00},\r
603         \r
604         {0xb3,0x40},\r
605         {0xb4,0x80},\r
606         {0xba,0xd0},\r
607         {0xbb,0x28},    \r
608         SensorEnd\r
609 };\r
610 \r
611 static  struct rk_sensor_reg sensor_Effect_Negative[] =\r
612 {\r
613         //Negative\r
614         {0x23,0x03},    \r
615         {0x2d,0x0a},\r
616         {0x20,0xff},\r
617         {0xd2,0x90},\r
618         {0x73,0x00},\r
619         \r
620         {0xb3,0x40},\r
621         {0xb4,0x80},\r
622         {0xba,0x00},\r
623         {0xbb,0x00},\r
624         SensorEnd\r
625 };\r
626 static  struct rk_sensor_reg sensor_Effect_Bluish[] =\r
627 {\r
628         //Bluish\r
629         {0x23,0x02},    \r
630         {0x2d,0x0a},\r
631         {0x20,0xff},\r
632         {0xd2,0x90},\r
633         {0x73,0x00},\r
634         \r
635         {0xb3,0x40},\r
636         {0xb4,0x80},\r
637         {0xba,0x50},\r
638         {0xbb,0xe0},\r
639         SensorEnd\r
640 };\r
641 \r
642 static  struct rk_sensor_reg sensor_Effect_Green[] =\r
643 {\r
644         //Greenish\r
645         {0x23,0x02},    \r
646         {0x2d,0x0a},\r
647         {0x20,0xff},\r
648         {0xd2,0x90},\r
649         {0x77,0x88},\r
650         \r
651         {0xb3,0x40},\r
652         {0xb4,0x80},\r
653         {0xba,0xc0},\r
654         {0xbb,0xc0},\r
655         SensorEnd\r
656 };\r
657 #if 0\r
658 static struct rk_sensor_reg sensor_Effect_Grayscale[]=\r
659 {\r
660         {0x23,0x02},    \r
661         {0x2d,0x0a},\r
662         {0x20,0xff},\r
663         {0xd2,0x90},\r
664         {0x73,0x00},\r
665 \r
666         {0xb3,0x40},\r
667         {0xb4,0x80},\r
668         {0xba,0x00},\r
669         {0xbb,0x00},\r
670         {0x00,0x00},\r
671         SensorEnd\r
672     \r
673 };\r
674 #endif\r
675 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
676         sensor_Effect_Bluish, sensor_Effect_Green,NULL,\r
677 };\r
678 \r
679 static  struct rk_sensor_reg sensor_Exposure0[]=\r
680 {\r
681         //-3\r
682         {0xb5, 0xe8},\r
683                 {0xd3, 0x38},\r
684 \r
685         SensorEnd\r
686 };\r
687 \r
688 static  struct rk_sensor_reg sensor_Exposure1[]=\r
689 {\r
690         //-2\r
691                 {0xb5, 0xf0},\r
692                 {0xd3, 0x40},\r
693         SensorEnd\r
694 };\r
695 \r
696 static  struct rk_sensor_reg sensor_Exposure2[]=\r
697 {\r
698         //-1\r
699                 {0xb5, 0xf8},\r
700                 {0xd3, 0x48},\r
701         SensorEnd\r
702 };\r
703 \r
704 static  struct rk_sensor_reg sensor_Exposure3[]=\r
705 {\r
706         //default\r
707                 {0xb5, 0x00},\r
708                 {0xd3, 0x50},\r
709         SensorEnd\r
710 };\r
711 \r
712 static  struct rk_sensor_reg sensor_Exposure4[]=\r
713 {\r
714         // 1\r
715                 {0xb5, 0x08},\r
716                 {0xd3, 0x58},\r
717         SensorEnd\r
718 };\r
719 \r
720 static  struct rk_sensor_reg sensor_Exposure5[]=\r
721 {\r
722         // 2\r
723                 {0xb5, 0x10},\r
724                 {0xd3, 0x60},\r
725 \r
726         SensorEnd\r
727 };\r
728 \r
729 static  struct rk_sensor_reg sensor_Exposure6[]=\r
730 {\r
731         // 3\r
732                 {0xb5, 0x18},\r
733                 {0xd3, 0x68},\r
734         SensorEnd\r
735 };\r
736 \r
737 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
738         sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
739 };\r
740 \r
741 static  struct rk_sensor_reg sensor_Saturation0[]=\r
742 {\r
743         SensorEnd\r
744 };\r
745 \r
746 static  struct rk_sensor_reg sensor_Saturation1[]=\r
747 {\r
748         SensorEnd\r
749 };\r
750 \r
751 static  struct rk_sensor_reg sensor_Saturation2[]=\r
752 {\r
753         SensorEnd\r
754 };\r
755 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
756 \r
757 static  struct rk_sensor_reg sensor_Contrast0[]=\r
758 {\r
759 \r
760         SensorEnd\r
761 };\r
762 \r
763 static  struct rk_sensor_reg sensor_Contrast1[]=\r
764 {\r
765 \r
766         SensorEnd\r
767 };\r
768 \r
769 static  struct rk_sensor_reg sensor_Contrast2[]=\r
770 {\r
771 \r
772         SensorEnd\r
773 };\r
774 \r
775 static  struct rk_sensor_reg sensor_Contrast3[]=\r
776 {\r
777 \r
778         SensorEnd\r
779 };\r
780 \r
781 static  struct rk_sensor_reg sensor_Contrast4[]=\r
782 {\r
783 \r
784         SensorEnd\r
785 };\r
786 \r
787 \r
788 static  struct rk_sensor_reg sensor_Contrast5[]=\r
789 {\r
790 \r
791         SensorEnd\r
792 };\r
793 \r
794 static  struct rk_sensor_reg sensor_Contrast6[]=\r
795 {\r
796 \r
797         SensorEnd\r
798 };\r
799 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
800         sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
801 };\r
802 static  struct rk_sensor_reg sensor_SceneAuto[] =\r
803 {\r
804         {0xec, 0x20},\r
805         {0x20, 0x7f},  // close cc\r
806         {0x3c, 0x02},\r
807         {0x3d, 0x02},\r
808         {0x3e, 0x02},\r
809         {0x3f, 0x02},\r
810         SensorEnd\r
811 };\r
812 \r
813 static  struct rk_sensor_reg sensor_SceneNight[] =\r
814 {\r
815         //30fps ~ 5fps night mode for 60/50Hz light environment, 24Mhz clock input,36Mzh pclk\r
816           {0xec, 0x30},\r
817           {0x20, 0x5f},  // close cc\r
818           {0x3c, 0x08},\r
819           {0x3d, 0x08},\r
820           {0x3e, 0x08},\r
821           {0x3f, 0x08},\r
822         SensorEnd\r
823 };\r
824 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
825 \r
826 static struct rk_sensor_reg sensor_Zoom0[] =\r
827 {\r
828         SensorEnd\r
829 };\r
830 \r
831 static struct rk_sensor_reg sensor_Zoom1[] =\r
832 {\r
833         SensorEnd\r
834 };\r
835 \r
836 static struct rk_sensor_reg sensor_Zoom2[] =\r
837 {\r
838         SensorEnd\r
839 };\r
840 \r
841 \r
842 static struct rk_sensor_reg sensor_Zoom3[] =\r
843 {\r
844         SensorEnd\r
845 };\r
846 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
847 \r
848 /*\r
849 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu\r
850 */\r
851 static struct v4l2_querymenu sensor_menus[] =\r
852 {\r
853 };\r
854 /*\r
855 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl\r
856 */\r
857 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =\r
858 {\r
859 };\r
860 \r
861 //MUST define the current used format as the first item   \r
862 static struct rk_sensor_datafmt sensor_colour_fmts[] = {\r
863         {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG} \r
864 };\r
865 /*static struct soc_camera_ops sensor_ops;*/\r
866 \r
867 \r
868 /*\r
869 **********************************************************\r
870 * Following is local code:\r
871\r
872 * Please codeing your program here \r
873 **********************************************************\r
874 */\r
875 /*\r
876 **********************************************************\r
877 * Following is callback\r
878 * If necessary, you could coding these callback\r
879 **********************************************************\r
880 */\r
881 /*\r
882 * the function is called in open sensor  \r
883 */\r
884 static int sensor_activate_cb(struct i2c_client *client)\r
885 {\r
886         \r
887         return 0;\r
888 }\r
889 /*\r
890 * the function is called in close sensor\r
891 */\r
892 static int sensor_deactivate_cb(struct i2c_client *client)\r
893 {\r
894         \r
895         return 0;\r
896 }\r
897 /*\r
898 * the function is called before sensor register setting in VIDIOC_S_FMT  \r
899 */\r
900 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
901 {\r
902 \r
903         return 0;\r
904 }\r
905 /*\r
906 * the function is called after sensor register setting finished in VIDIOC_S_FMT  \r
907 */\r
908 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
909 {\r
910         return 0;\r
911 }\r
912 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)\r
913 {\r
914         return 0;\r
915 }\r
916 \r
917 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
918 {\r
919         \r
920         return 0;\r
921 }\r
922 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
923 {\r
924         return 0;\r
925 }\r
926 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
927 {\r
928         //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
929                 \r
930         if (pm_msg.event == PM_EVENT_SUSPEND) {\r
931                 SENSOR_DG("Suspend");\r
932                 \r
933         } else {\r
934                 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);\r
935                 return -EINVAL;\r
936         }\r
937         return 0;\r
938 }\r
939 \r
940 static int sensor_resume(struct soc_camera_device *icd)\r
941 {\r
942 \r
943         SENSOR_DG("Resume");\r
944 \r
945         return 0;\r
946 \r
947 }\r
948 static int sensor_mirror_cb (struct i2c_client *client, int mirror)\r
949 {\r
950         char val;\r
951         int err = 0;\r
952         SENSOR_DG("mirror: %d",mirror);\r
953         if (mirror) {\r
954                         sensor_write(client, 0xfe, 0);\r
955                         err = sensor_read(client, 0x14, &val);\r
956                         if (err == 0) {\r
957                                 if((val & 0x1) == 0)\r
958                                         err = sensor_write(client, 0x14, (val |0x1));\r
959                                 else \r
960                                         err = sensor_write(client, 0x14, (val & 0xfe));\r
961                         }\r
962                 } else {\r
963                         //do nothing\r
964                 }\r
965 \r
966         return err;    \r
967 }\r
968 /*\r
969 * the function is v4l2 control V4L2_CID_HFLIP callback  \r
970 */\r
971 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
972                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
973 {\r
974         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
975 \r
976         if (sensor_mirror_cb(client,ext_ctrl->value) != 0)\r
977                 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);\r
978         \r
979         SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);\r
980         return 0;\r
981 }\r
982 \r
983 static int sensor_flip_cb(struct i2c_client *client, int flip)\r
984 {\r
985         char val;\r
986         int err = 0;    \r
987         SENSOR_DG("flip: %d",flip);\r
988         if (flip) {\r
989                 sensor_write(client, 0xfe, 0);\r
990                 err = sensor_read(client, 0x14, &val);\r
991                 if (err == 0) {\r
992                         if((val & 0x2) == 0)\r
993                                 err = sensor_write(client, 0x14, (val |0x2));\r
994                         else \r
995                                 err = sensor_write(client, 0x14, (val & 0xfc));\r
996                 }\r
997         } else {\r
998                 //do nothing\r
999         }\r
1000 \r
1001         return err;    \r
1002 }\r
1003 /*\r
1004 * the function is v4l2 control V4L2_CID_VFLIP callback  \r
1005 */\r
1006 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1007                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
1008 {\r
1009         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1010 \r
1011         if (sensor_flip_cb(client,ext_ctrl->value) != 0)\r
1012                 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);\r
1013         \r
1014         SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);\r
1015         return 0;\r
1016 }\r
1017 /*\r
1018 * the functions are focus callbacks\r
1019 */\r
1020 static int sensor_focus_init_usr_cb(struct i2c_client *client){\r
1021         return 0;\r
1022 }\r
1023 \r
1024 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){\r
1025         return 0;\r
1026 }\r
1027 \r
1028 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){\r
1029         return 0;\r
1030 }\r
1031 \r
1032 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){\r
1033         return 0;\r
1034 }\r
1035 \r
1036 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){\r
1037         return 0;\r
1038 }\r
1039 \r
1040 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){\r
1041         return 0;\r
1042 }\r
1043 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1044 {
1045     return 0;
1046 }\r
1047 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){\r
1048         return 0;\r
1049 }\r
1050 \r
1051 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)\r
1052 {\r
1053         return 0;\r
1054 }\r
1055 \r
1056 /*\r
1057 face defect call back\r
1058 */\r
1059 static int      sensor_face_detect_usr_cb(struct i2c_client *client,int on){\r
1060         return 0;\r
1061 }\r
1062 \r
1063 /*\r
1064 *       The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some\r
1065 * initialization in the function. \r
1066 */\r
1067 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)\r
1068 {\r
1069         return;\r
1070 }\r
1071 \r
1072 /*\r
1073 * :::::WARNING:::::\r
1074 * It is not allowed to modify the following code\r
1075 */\r
1076 \r
1077 sensor_init_parameters_default_code();\r
1078 \r
1079 sensor_v4l2_struct_initialization();\r
1080 \r
1081 sensor_probe_default_code();\r
1082 \r
1083 sensor_remove_default_code();\r
1084 \r
1085 sensor_driver_default_module_code();\r
1086 \r
1087 \r
1088 \r
1089 \r