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