camera:cif support rk3188M
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / nt99252_3way.c
1 \r
2 #include "generic_sensor.h"\r
3 /*\r
4 *      Driver Version Note\r
5 *v0.0.1: this driver is compatible with generic_sensor\r
6 *v0.1.1:\r
7 *        add sensor_focus_af_const_pause_usr_cb;\r
8 *v0.1.2:\r
9           crop for rk3188m\r
10 */\r
11 static int version = KERNEL_VERSION(0,1,2);\r
12 module_param(version, int, S_IRUGO);\r
13 \r
14 static int debug =1;\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_NT99252\r
23 #define SENSOR_V4L2_IDENT V4L2_IDENT_NT99252\r
24 #define SENSOR_ID 0x2520\r
25 #define SENSOR_BUS_PARAM                     (SOCAM_MASTER |\\r
26                                              SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_HIGH|\\r
27                                              SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\r
28 #if defined(CONFIG_SOC_RK3188M)\r
29 #define SENSOR_PREVIEW_W                     (800 - 20)\r
30 #define SENSOR_PREVIEW_H                     (600 - 20)\r
31 #else\r
32 #define SENSOR_PREVIEW_W                                         (800)\r
33 #define SENSOR_PREVIEW_H                                         (600)\r
34 #endif\r
35 #define SENSOR_PREVIEW_FPS                   15000     // 15fps \r
36 #define SENSOR_FULLRES_L_FPS                 5000      // 7.5fps\r
37 #define SENSOR_FULLRES_H_FPS                 10000      // 7.5fps\r
38 #define SENSOR_720P_FPS                      1\r
39 #define SENSOR_1080P_FPS                     0\r
40 \r
41 #define SENSOR_REGISTER_LEN                  2         // sensor register address bytes\r
42 #define SENSOR_VALUE_LEN                     1         // sensor register value bytes\r
43                                     \r
44 static unsigned int SensorConfiguration = 0;\r
45 static unsigned int SensorChipID[] = {SENSOR_ID};\r
46 /* Sensor Driver Configuration End */\r
47 \r
48 \r
49 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
50 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
51 \r
52 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)\r
53 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
54 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
55 #define sensor_write_array generic_sensor_write_array\r
56 \r
57 struct sensor_parameter\r
58 {\r
59         unsigned int PreviewDummyPixels;\r
60         unsigned int CaptureDummyPixels;\r
61         unsigned int preview_exposure;\r
62         unsigned short int preview_line_width;\r
63         unsigned short int preview_gain;\r
64 \r
65         unsigned short int PreviewPclk;\r
66         unsigned short int CapturePclk;\r
67         char awb[6];\r
68 };\r
69 \r
70 struct specific_sensor{\r
71         struct generic_sensor common_sensor;\r
72         //define user data below\r
73         struct sensor_parameter parameter;\r
74 \r
75 };\r
76 \r
77 /*\r
78 *  The follow setting need been filled.\r
79 *  \r
80 *  Must Filled:\r
81 *  sensor_init_data :               Sensor initial setting;\r
82 *  sensor_fullres_lowfps_data :     Sensor full resolution setting with best auality, recommand for video;\r
83 *  sensor_preview_data :            Sensor preview resolution setting, recommand it is vga or svga;\r
84 *  sensor_softreset_data :          Sensor software reset register;\r
85 *  sensor_check_id_data :           Sensir chip id register;\r
86 *\r
87 *  Optional filled:\r
88 *  sensor_fullres_highfps_data:     Sensor full resolution setting with high framerate, recommand for video;\r
89 *  sensor_720p:                     Sensor 720p setting, it is for video;\r
90 *  sensor_1080p:                    Sensor 1080p setting, it is for video;\r
91 *\r
92 *  :::::WARNING:::::\r
93 *  The SensorEnd which is the setting end flag must be filled int the last of each setting;\r
94 */\r
95 \r
96 /* Sensor initial setting */\r
97 static struct rk_sensor_reg sensor_init_data[] ={\r
98         {0x302A, 0x00},\r
99         {0x301F, 0x80},\r
100         {0x303f, 0x0e},\r
101         {0x3051, 0xE8},\r
102         {0x320A, 0x00},\r
103         {0x302E, 0x01},\r
104         {0x3069, 0x04},\r
105         {0x306a, 0x04},\r
106         {0x3101, 0x80},\r
107         {0x3104, 0x03},\r
108         {0x3105, 0x03},\r
109         {0x3106, 0x0D},\r
110         {0x310A, 0x62},\r
111         {0x310D, 0x60},\r
112         {0x3111, 0x5B},\r
113         {0x3131, 0x58},\r
114         {0x3127, 0x01},\r
115         {0x3210, 0x1E},\r
116         {0x3211, 0x1E},\r
117         {0x3212, 0x1E},\r
118         {0x3213, 0x1E},\r
119         {0x3214, 0x17},\r
120         {0x3215, 0x17},\r
121         {0x3216, 0x17},\r
122         {0x3217, 0x17},\r
123         {0x3218, 0x17},\r
124         {0x3219, 0x17},\r
125         {0x321A, 0x17},\r
126         {0x321B, 0x17},\r
127         {0x321C, 0x0F},\r
128         {0x321D, 0x10},\r
129         {0x321E, 0x0F},\r
130         {0x321F, 0x0F},\r
131         {0x3230, 0x00},\r
132         {0x3231, 0x00},\r
133         {0x3232, 0x00},\r
134         {0x3233, 0x00},\r
135         {0x3234, 0x00},\r
136         {0x3235, 0x00},\r
137         {0x3236, 0x00},\r
138         {0x3237, 0x08},\r
139         {0x3238, 0x20},\r
140         {0x3239, 0x20},\r
141         {0x323A, 0x20},\r
142         {0x3243, 0xC3},\r
143         {0x3244, 0x00},\r
144         {0x3245, 0x00},\r
145         {0x3302, 0x00},\r
146         {0x3303, 0x54},\r
147         {0x3304, 0x00},\r
148         {0x3305, 0x91},\r
149         {0x3306, 0x00},\r
150         {0x3307, 0x1A},\r
151         {0x3308, 0x07},\r
152         {0x3309, 0xCD},\r
153         {0x330A, 0x07},\r
154         {0x330B, 0x51},\r
155         {0x330C, 0x00},\r
156         {0x330D, 0xE3},\r
157         {0x330E, 0x00},\r
158         {0x330F, 0xC6},\r
159         {0x3310, 0x07},\r
160         {0x3311, 0x4A},\r
161         {0x3312, 0x07},\r
162         {0x3313, 0xF1},\r
163         {0x3270, 0x00},\r
164         {0x3271, 0x0B},\r
165         {0x3272, 0x16},\r
166         {0x3273, 0x2B},\r
167         {0x3274, 0x3F},\r
168         {0x3275, 0x51},\r
169         {0x3276, 0x72},\r
170         {0x3277, 0x8F},\r
171         {0x3278, 0xA7},\r
172         {0x3279, 0xBC},\r
173         {0x327A, 0xDC},\r
174         {0x327B, 0xF0},\r
175         {0x327C, 0xFA},\r
176         {0x327D, 0xFE},\r
177         {0x327E, 0xFF},\r
178         {0x3327, 0x00},\r
179         {0x3326, 0x1F},\r
180         {0x3360, 0x08},\r
181         {0x3361, 0x0E},\r
182         {0x3362, 0x14},\r
183         {0x3363, 0xB3},\r
184         {0x3331, 0x0C},\r
185         {0x3332, 0x60},\r
186         {0x3365, 0x10},\r
187         {0x3366, 0x10},\r
188         {0x3368, 0x08},\r
189         {0x3369, 0x08},\r
190         {0x336A, 0x06},\r
191         {0x336B, 0x00},\r
192         {0x336d, 0x14},\r
193         {0x336e, 0x14},\r
194         {0x336f, 0x00},\r
195         {0x3370, 0x00},\r
196         {0x3379, 0x0A},\r
197         {0x337A, 0x0A},\r
198         {0x337B, 0x0A},\r
199         {0x337C, 0x0A},\r
200         {0x3371, 0x38},\r
201         {0x3372, 0x38},\r
202         {0x3373, 0x3F},\r
203         {0x3374, 0x3F},\r
204         {0x33A2, 0x00},\r
205         {0x33A3, 0x30},\r
206         {0x33A4, 0x01},\r
207         {0x33c0, 0x03},\r
208         {0x33c9, 0xCF},\r
209         {0x33ca, 0x36},\r
210         SensorEnd\r
211 };\r
212 /* Senor full resolution setting: recommand for capture */\r
213 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={\r
214         {0x32BF, 0x60},\r
215         {0x32C0, 0x84},\r
216         {0x32C1, 0x84},\r
217         {0x32C2, 0x84},\r
218         {0x32C3, 0x00},\r
219         {0x32C4, 0x20},\r
220         {0x32C5, 0x10},\r
221         {0x32C6, 0x18},\r
222         {0x32C7, 0x00},\r
223         {0x32C8, 0x7E},\r
224         {0x32C9, 0x84},\r
225         {0x32CA, 0x94},\r
226         {0x32CB, 0x94},\r
227         {0x32CC, 0x9C},\r
228         {0x32CD, 0x9C},\r
229         {0x32DB, 0x6F},\r
230         {0x3241, 0x89},\r
231         {0x33A0, 0xAF},\r
232         {0x33A1, 0x64},\r
233         {0x3200, 0x3E},\r
234         {0x3201, 0x3F},\r
235         {0x302A, 0x00},\r
236         {0x302C, 0x0C},\r
237         {0x302C, 0x0B},\r
238         {0x302D, 0x02},\r
239         {0x3022, 0x24},\r
240         {0x3023, 0x24},\r
241         {0x3002, 0x00},\r
242         {0x3003, 0x04},\r
243         {0x3004, 0x00},\r
244         {0x3005, 0x04},\r
245         {0x3006, 0x06},\r
246         {0x3007, 0x43},\r
247         {0x3008, 0x04},\r
248         {0x3009, 0xCC},\r
249         {0x300A, 0x07},\r
250         {0x300B, 0x6C},\r
251         {0x300C, 0x09},\r
252         {0x300D, 0xDE},\r
253         {0x300E, 0x06},\r
254         {0x300F, 0x40},\r
255         {0x3010, 0x04},\r
256         {0x3011, 0xB0},\r
257         {0x32BB, 0x87},\r
258         {0x32B8, 0x36},\r
259         {0x32B9, 0x2A},\r
260         {0x32BC, 0x30},\r
261         {0x32BD, 0x33},\r
262         {0x32BE, 0x2D},\r
263         {0x325C, 0x03},\r
264         {0x320A, 0x00},\r
265         {0x3021, 0x06},\r
266         {0x334A, 0x34},\r
267         {0x334B, 0x14},\r
268         {0x334C, 0x10},\r
269         {0x3060, 0x01},\r
270         SensorEnd\r
271 };\r
272 /* Senor full resolution setting: recommand for video */\r
273 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={\r
274         {0x32BF, 0x60},\r
275         {0x32C0, 0x74},\r
276         {0x32C1, 0x74},\r
277         {0x32C2, 0x74},\r
278         {0x32C3, 0x00},\r
279         {0x32C4, 0x20},\r
280         {0x32C5, 0x10},\r
281         {0x32C6, 0x18},\r
282         {0x32C7, 0x00},\r
283         {0x32C8, 0x7E},\r
284         {0x32C9, 0x74},\r
285         {0x32CA, 0x84},\r
286         {0x32CB, 0x84},\r
287         {0x32CC, 0x8C},\r
288         {0x32CD, 0x8C},\r
289         {0x32DB, 0x6F},\r
290         {0x3241, 0x81},\r
291         {0x33A0, 0xAF},\r
292         {0x33A1, 0x54},\r
293         {0x3200, 0x3E},\r
294         {0x3201, 0x3F},\r
295         {0x302A, 0x00},\r
296         {0x302C, 0x0C},\r
297         {0x302C, 0x0B},\r
298         {0x302D, 0x02},\r
299         {0x3022, 0x24},\r
300         {0x3023, 0x24},\r
301         {0x3002, 0x00},\r
302         {0x3003, 0x04},\r
303         {0x3004, 0x00},\r
304         {0x3005, 0x04},\r
305         {0x3006, 0x06},\r
306         {0x3007, 0x43},\r
307         {0x3008, 0x04},\r
308         {0x3009, 0xCC},\r
309         {0x300A, 0x07},\r
310         {0x300B, 0x6C},\r
311         {0x300C, 0x04},\r
312         {0x300D, 0xEF},\r
313         {0x300E, 0x06},\r
314         {0x300F, 0x40},\r
315         {0x3010, 0x04},\r
316         {0x3011, 0xB0},\r
317         {0x32BB, 0x87},\r
318         {0x32B8, 0x36},\r
319         {0x32B9, 0x2A},\r
320         {0x32BC, 0x30},\r
321         {0x32BD, 0x33},\r
322         {0x32BE, 0x2D},\r
323         {0x325C, 0x03},\r
324         {0x320A, 0x00},\r
325         {0x3021, 0x06},\r
326         {0x334A, 0x34},\r
327         {0x334B, 0x14},\r
328         {0x334C, 0x10},\r
329         {0x3060, 0x01},\r
330         SensorEnd\r
331 };\r
332 /* Preview resolution setting*/\r
333 static struct rk_sensor_reg sensor_preview_data[] ={\r
334         {0x32BF, 0x60},\r
335         {0x32C0, 0x6A},\r
336         {0x32C1, 0x6A},\r
337         {0x32C2, 0x6A},\r
338         {0x32C3, 0x00},\r
339         {0x32C4, 0x20},\r
340         {0x32C5, 0x20},\r
341         {0x32C6, 0x20},\r
342         {0x32C7, 0x00},\r
343         {0x32C8, 0xB9},\r
344         {0x32C9, 0x6A},\r
345         {0x32CA, 0x8A},\r
346         {0x32CB, 0x8A},\r
347         {0x32CC, 0x8A},\r
348         {0x32CD, 0x8A},\r
349         {0x32DB, 0x77},\r
350         {0x3241, 0x80},\r
351         {0x33A0, 0xB7},\r
352         {0x33A1, 0x4A},\r
353         {0x32E0, 0x03},\r
354         {0x32E1, 0x20},\r
355         {0x32E2, 0x02},\r
356         {0x32E3, 0x58},\r
357         {0x32E4, 0x00},\r
358         {0x32E5, 0x00},\r
359         {0x32E6, 0x00},\r
360         {0x32E7, 0x00},\r
361         {0x3200, 0x3E},\r
362         {0x3201, 0x7F},\r
363         {0x302A, 0x00},\r
364         {0x302C, 0x0C},\r
365         {0x302C, 0x0B},\r
366         {0x302D, 0x02},\r
367         {0x3022, 0x24},\r
368         {0x3023, 0x6E},\r
369         {0x3002, 0x00},\r
370         {0x3003, 0x04},//x_start=4\r
371         {0x3004, 0x00},\r
372         {0x3005, 0x04},//y_start=4\r
373         {0x3006, 0x06},\r
374         {0x3007, 0x43},//x_end=1603\r
375         {0x3008, 0x04},\r
376         {0x3009, 0xCC},//y_end=1228\r
377         {0x300A, 0x05},\r
378         {0x300B, 0x14},//pixel=1300\r
379         {0x300C, 0x02},\r
380         {0x300D, 0x67},//line=615\r
381         {0x300E, 0x03},\r
382         {0x300F, 0x20},//x_width=800\r
383         {0x3010, 0x02},\r
384         {0x3011, 0x58},//y_width=600\r
385         {0x32BB, 0x87},\r
386         {0x32B8, 0x36},\r
387         {0x32B9, 0x2A},\r
388         {0x32BC, 0x30},\r
389         {0x32BD, 0x33},\r
390         {0x32BE, 0x2D},\r
391         {0x325C, 0x02},\r
392         {0x320A, 0x00},\r
393         {0x3021, 0x06},\r
394         {0x334A, 0x00},\r
395         {0x334B, 0x7F},\r
396         {0x334C, 0x1F},\r
397         {0x3060, 0x01},\r
398         SensorEnd\r
399 };\r
400 /* 1280x720 */\r
401 static struct rk_sensor_reg sensor_720p[]={\r
402         {0x32BF, 0x60},\r
403         {0x32C0, 0x6A},  \r
404         {0x32C1, 0x6A},\r
405         {0x32C2, 0x6A},\r
406         {0x32C3, 0x00},\r
407         {0x32C4, 0x20},\r
408         {0x32C5, 0x20},\r
409         {0x32C6, 0x20},\r
410         {0x32C7, 0x00},\r
411         {0x32C8, 0x98},\r
412         {0x32C9, 0x6A},\r
413         {0x32CA, 0x8A},\r
414         {0x32CB, 0x8A},\r
415         {0x32CC, 0x8A},\r
416         {0x32CD, 0x8A},\r
417         {0x32DB, 0x73},\r
418         {0x3241, 0x7E},\r
419         {0x33A0, 0xB3},\r
420         {0x33A1, 0x4A},\r
421         {0x3200, 0x3E},\r
422         {0x3201, 0x3F},\r
423         {0x302A, 0x00},\r
424         {0x302C, 0x0C},\r
425         {0x302C, 0x0B},\r
426         {0x302D, 0x02},\r
427         {0x3022, 0x24},\r
428         {0x3023, 0x24},\r
429         {0x3002, 0x00},\r
430         {0x3003, 0xA4},\r
431         {0x3004, 0x00},\r
432         {0x3005, 0xF4},\r
433         {0x3006, 0x05},\r
434         {0x3007, 0xA3},\r
435         {0x3008, 0x04},\r
436         {0x3009, 0xCC},\r
437         {0x300A, 0x06},\r
438         {0x300B, 0x2C},\r
439         {0x300C, 0x02},\r
440         {0x300D, 0xDC},\r
441         {0x300E, 0x05},\r
442         {0x300F, 0x00},\r
443         {0x3010, 0x02},\r
444         {0x3011, 0xD0},\r
445         {0x32BB, 0x87},\r
446         {0x32B8, 0x36},\r
447         {0x32B9, 0x2A},\r
448         {0x32BC, 0x30},\r
449         {0x32BD, 0x33},\r
450         {0x32BE, 0x2D},\r
451         {0x325C, 0x03},\r
452         {0x320A, 0x00},\r
453         {0x3021, 0x06},\r
454         {0x334A, 0x00},\r
455         {0x334B, 0x7F},\r
456         {0x334C, 0x1F},\r
457         {0x3060, 0x01},\r
458         SensorEnd\r
459 };\r
460 \r
461 /* 1920x1080 */\r
462 static struct rk_sensor_reg sensor_1080p[]={\r
463         SensorEnd\r
464 };\r
465 \r
466 \r
467 static struct rk_sensor_reg sensor_softreset_data[]={\r
468     SensorRegVal(0x3021,0x61),\r
469         SensorEnd\r
470 };\r
471 \r
472 static struct rk_sensor_reg sensor_check_id_data[]={\r
473     SensorRegVal(0x3000,0),\r
474     SensorRegVal(0x3001,0),\r
475         SensorEnd\r
476 };\r
477 /*\r
478 *  The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx\r
479 */\r
480 static struct rk_sensor_reg sensor_WhiteB_Auto[]=\r
481 {\r
482         //[WB-AUTO]\r
483         {0x3201, 0x7F},  //AWB auto, bit[4]:1,auto\r
484         SensorEnd\r
485 };\r
486 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
487 static  struct rk_sensor_reg sensor_WhiteB_Cloudy[]=\r
488 {\r
489         //[WB-CLOUDY]\r
490         {0x3201, 0x6F},\r
491         {0x3290, 0x01},\r
492         {0x3291, 0x51},\r
493         {0x3296, 0x01},\r
494         {0x3297, 0x00},\r
495         SensorEnd\r
496 };\r
497 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
498 static  struct rk_sensor_reg sensor_WhiteB_ClearDay[]=\r
499 {\r
500         //[WB-DAYLIGHT]\r
501         {0x3201, 0x6F},\r
502         {0x3290, 0x01},\r
503         {0x3291, 0x38},\r
504         {0x3296, 0x01},\r
505         {0x3297, 0x68}, \r
506         SensorEnd\r
507 };\r
508 /* Office Colour Temperature : 3500K - 5000K  */\r
509 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=\r
510 {\r
511         //[WB-INCANDESCENCE]\r
512         {0x3201, 0x6F},\r
513         {0x3290, 0x01},\r
514         {0x3291, 0x30},\r
515         {0x3296, 0x01},\r
516         {0x3297, 0xCB},\r
517         SensorEnd\r
518 \r
519 };\r
520 /* Home Colour Temperature : 2500K - 3500K      */\r
521 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=\r
522 {\r
523         //[WB-FLUORESCENT]\r
524         {0x3201, 0x6F},\r
525         {0x3290, 0x01},\r
526         {0x3291, 0x70},\r
527         {0x3296, 0x01},\r
528         {0x3297, 0xFF},\r
529         SensorEnd\r
530 };\r
531 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp3[]=\r
532 {\r
533         //[WB-TUNGSTEN]\r
534         {0x3201, 0x6F},\r
535         {0x3290, 0x01},\r
536         {0x3291, 0x00},\r
537         {0x3296, 0x02},\r
538         {0x3297, 0x30}, \r
539         SensorEnd\r
540 };\r
541 \r
542 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
543         sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy, sensor_WhiteB_TungstenLamp3, NULL,\r
544 };\r
545 \r
546 static  struct rk_sensor_reg sensor_Brightness0[]=\r
547 {\r
548         // Brightness -2\r
549         SensorEnd\r
550 };\r
551 \r
552 static  struct rk_sensor_reg sensor_Brightness1[]=\r
553 {\r
554         // Brightness -1\r
555 \r
556         SensorEnd\r
557 };\r
558 \r
559 static  struct rk_sensor_reg sensor_Brightness2[]=\r
560 {\r
561         //      Brightness 0\r
562 \r
563         SensorEnd\r
564 };\r
565 \r
566 static  struct rk_sensor_reg sensor_Brightness3[]=\r
567 {\r
568         // Brightness +1\r
569 \r
570         SensorEnd\r
571 };\r
572 \r
573 static  struct rk_sensor_reg sensor_Brightness4[]=\r
574 {\r
575         //      Brightness +2\r
576 \r
577         SensorEnd\r
578 };\r
579 \r
580 static  struct rk_sensor_reg sensor_Brightness5[]=\r
581 {\r
582         //      Brightness +3\r
583 \r
584         SensorEnd\r
585 };\r
586 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
587         sensor_Brightness4, sensor_Brightness5,NULL,\r
588 };\r
589 \r
590 static  struct rk_sensor_reg sensor_Effect_Normal[] =\r
591 {\r
592         {0x32f1, 0x00},\r
593         {0x32f8, 0x01},\r
594         SensorEnd\r
595 };\r
596 \r
597 static  struct rk_sensor_reg sensor_Effect_WandB[] =\r
598 {\r
599         //[SE-GrayScale]\r
600         {0x32f1, 0x01},\r
601         {0x32f8, 0x01},\r
602         SensorEnd\r
603 };\r
604 \r
605 static  struct rk_sensor_reg sensor_Effect_Sepia[] =\r
606 {\r
607         //[SE-SEPIA]\r
608         {0x32f1, 0x02},\r
609         {0x32f8, 0x01},\r
610         SensorEnd\r
611 };\r
612 \r
613 static  struct rk_sensor_reg sensor_Effect_Negative[] =\r
614 {\r
615         //[SE-Inverse] \r
616         {0x32f1, 0x03},\r
617         {0x32f8, 0x01},\r
618         SensorEnd\r
619 };\r
620 static  struct rk_sensor_reg sensor_Effect_Bluish[] =\r
621 {\r
622         //[SE-SEPIABlue]\r
623         {0x32f1, 0x05},\r
624         {0x32f4, 0xf0},\r
625         {0x32f5, 0x80},\r
626         {0x32f8, 0x01}, \r
627         SensorEnd\r
628 };\r
629 \r
630 static  struct rk_sensor_reg sensor_Effect_Green[] =\r
631 {\r
632         //[SE-SEPIAGreen]\r
633         {0x32f1, 0x05},\r
634         {0x32f4, 0x60},\r
635         {0x32f5, 0x20},\r
636         {0x32f8, 0x01},\r
637         SensorEnd\r
638 };\r
639 \r
640 static  struct rk_sensor_reg sensor_Effect_Solarization[] =\r
641 {\r
642         //[SE-Solarization]\r
643         {0x32f1, 0x04},\r
644         {0x32f8, 0x01},\r
645         SensorEnd\r
646 };\r
647 \r
648 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
649         sensor_Effect_Bluish, sensor_Effect_Green, sensor_Effect_Solarization, NULL,\r
650 };\r
651 \r
652 static  struct rk_sensor_reg sensor_Exposure04[]=\r
653 {\r
654         //[EV-4]                                \r
655         {0x32F2, 0x40},\r
656         {0x32F8, 0x01},\r
657         SensorEnd\r
658 };\r
659 \r
660 static  struct rk_sensor_reg sensor_Exposure03[]=\r
661 {\r
662         //[EV-3]                                \r
663         {0x32F2, 0x50},\r
664         {0x32F8, 0x01},\r
665         SensorEnd\r
666 };\r
667 \r
668 static  struct rk_sensor_reg sensor_Exposure02[]=\r
669 {\r
670         //[EV-2]              \r
671         {0x32F2, 0x60},\r
672         {0x32F8, 0x01},\r
673         SensorEnd\r
674 };\r
675 \r
676 static  struct rk_sensor_reg sensor_Exposure01[]=\r
677 {\r
678         //[EV-1]                                \r
679         {0x32F2, 0x70},\r
680         {0x32F8, 0x01},\r
681         SensorEnd\r
682 };\r
683 \r
684 static  struct rk_sensor_reg sensor_Exposure00[]=\r
685 {\r
686         //[EV+0]                                \r
687         {0x32F2, 0x80},\r
688         {0x32F8, 0x01},\r
689         SensorEnd\r
690 };\r
691 \r
692 static  struct rk_sensor_reg sensor_Exposure11[]=\r
693 {\r
694         //[EV+1]              \r
695         {0x32F2, 0x90},\r
696         {0x32F8, 0x01},\r
697         SensorEnd\r
698 };\r
699 \r
700 static  struct rk_sensor_reg sensor_Exposure12[]=\r
701 {\r
702         //[EV+2]                                \r
703         {0x32F2, 0xA0},\r
704         {0x32F8, 0x01},\r
705         SensorEnd\r
706 };\r
707 \r
708 static  struct rk_sensor_reg sensor_Exposure13[]=\r
709 {\r
710         //[EV+3]              \r
711         {0x32F2, 0xB0},\r
712         {0x32F8, 0x01},\r
713         SensorEnd\r
714 };\r
715 \r
716 static  struct rk_sensor_reg sensor_Exposure14[]=\r
717 {\r
718         //[EV+4]                                \r
719         {0x32F2, 0xC0},\r
720         {0x32F8, 0x01},\r
721         SensorEnd\r
722 };\r
723 \r
724 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {/*sensor_Exposure04,*/sensor_Exposure03, sensor_Exposure02, sensor_Exposure01, sensor_Exposure00,\r
725         sensor_Exposure11, sensor_Exposure12,sensor_Exposure13,/*sensor_Exposure14,*/NULL,\r
726 };\r
727 \r
728 \r
729 static  struct rk_sensor_reg sensor_Saturation0[]=\r
730 {\r
731         SensorEnd\r
732 };\r
733 \r
734 static  struct rk_sensor_reg sensor_Saturation1[]=\r
735 {\r
736         SensorEnd\r
737 };\r
738 \r
739 static  struct rk_sensor_reg sensor_Saturation2[]=\r
740 {\r
741         SensorEnd\r
742 };\r
743 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
744 \r
745 static  struct rk_sensor_reg sensor_Contrast04[]=\r
746 {\r
747         //[Contrast : -4]        \r
748         {0x32FC, 0x40},\r
749         {0x32F2, 0x40},\r
750         {0x32f8, 0x01},\r
751         SensorEnd\r
752 };\r
753 \r
754 static  struct rk_sensor_reg sensor_Contrast03[]=\r
755 {\r
756         //[Contrast : -3]            \r
757         {0x32FC, 0x30},\r
758         {0x32F2, 0x50},\r
759         {0x32f8, 0x01},\r
760         SensorEnd\r
761 };\r
762 \r
763 static  struct rk_sensor_reg sensor_Contrast02[]=\r
764 {\r
765         //[Contrast : -2]            \r
766         {0x32FC, 0x20},\r
767         {0x32F2, 0x60},\r
768         {0x32f8, 0x01},\r
769         SensorEnd\r
770 };\r
771 \r
772 static  struct rk_sensor_reg sensor_Contrast01[]=\r
773 {\r
774         //[Contrast : -1]      \r
775         {0x32FC, 0x10},\r
776         {0x32F2, 0x70},\r
777         {0x32f8, 0x01},\r
778         SensorEnd\r
779 };\r
780 \r
781 static  struct rk_sensor_reg sensor_Contrast00[]=\r
782 {\r
783         //[Contrast : 0]             \r
784         {0x32FC, 0x00},\r
785         {0x32F2, 0x80},\r
786         {0x32f8, 0x01},\r
787         SensorEnd\r
788 };\r
789 \r
790 static  struct rk_sensor_reg sensor_Contrast11[]=\r
791 {\r
792         //[Contrast : +1]            \r
793         {0x32FC, 0xF0},\r
794         {0x32F2, 0x90},\r
795         {0x32f8, 0x01},\r
796         SensorEnd\r
797 };\r
798 \r
799 \r
800 static  struct rk_sensor_reg sensor_Contrast12[]=\r
801 {\r
802         //[Contrast : +2]            \r
803         {0x32FC, 0xE0},\r
804         {0x32F2, 0xA0},\r
805         {0x32f8, 0x01},\r
806         SensorEnd\r
807 };\r
808 \r
809 static  struct rk_sensor_reg sensor_Contrast13[]=\r
810 {\r
811         //[Contrast : +3]            \r
812         {0x32FC, 0xD0},\r
813         {0x32F2, 0xB0},\r
814         {0x32f8, 0x01},\r
815         SensorEnd\r
816 };\r
817 \r
818 static  struct rk_sensor_reg sensor_Contrast14[]=\r
819 {\r
820         //[Contrast : +4]        \r
821         {0x32FC, 0xC0},\r
822         {0x32F2, 0xC0},\r
823         {0x32f8, 0x01},\r
824         SensorEnd\r
825 };\r
826 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast04, sensor_Contrast03, sensor_Contrast02, sensor_Contrast01,\r
827         sensor_Contrast00, sensor_Contrast11, sensor_Contrast12, sensor_Contrast13, sensor_Contrast14,NULL,\r
828 };\r
829 \r
830 static  struct rk_sensor_reg sensor_SceneAuto[] =\r
831 {\r
832         SensorEnd\r
833 };\r
834 \r
835 static  struct rk_sensor_reg sensor_SceneNight[] =\r
836 {\r
837         SensorEnd\r
838 };\r
839 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
840 \r
841 static struct rk_sensor_reg sensor_Zoom0[] =\r
842 {\r
843         SensorEnd\r
844 };\r
845 \r
846 static struct rk_sensor_reg sensor_Zoom1[] =\r
847 {\r
848         SensorEnd\r
849 };\r
850 \r
851 static struct rk_sensor_reg sensor_Zoom2[] =\r
852 {\r
853         SensorEnd\r
854 };\r
855 \r
856 \r
857 static struct rk_sensor_reg sensor_Zoom3[] =\r
858 {\r
859         SensorEnd\r
860 };\r
861 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
862 \r
863 /*\r
864 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu\r
865 */\r
866 static struct v4l2_querymenu sensor_menus[] =\r
867 {\r
868         //white balance\r
869         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,0,"auto",0),\r
870         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,1,"incandescent",0),\r
871         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,2,"fluorescent",0),\r
872         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,3,"daylight",0),\r
873         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,4,"cloudy-daylight",0),\r
874         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,5,"tungsten",0),\r
875 \r
876         //speical effect\r
877         new_usr_v4l2menu(V4L2_CID_EFFECT,0,"none",0),\r
878         new_usr_v4l2menu(V4L2_CID_EFFECT,1,"mono",0),\r
879         new_usr_v4l2menu(V4L2_CID_EFFECT,2,"negative",0),\r
880         new_usr_v4l2menu(V4L2_CID_EFFECT,3,"sepia",0),\r
881         new_usr_v4l2menu(V4L2_CID_EFFECT,4,"posterize",0),\r
882         new_usr_v4l2menu(V4L2_CID_EFFECT,5,"aqua",0),\r
883         new_usr_v4l2menu(V4L2_CID_EFFECT,6,"solarize",0),\r
884 \r
885 };\r
886 /*\r
887 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl\r
888 */\r
889 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =\r
890 {\r
891         new_user_v4l2ctrl(V4L2_CID_DO_WHITE_BALANCE,V4L2_CTRL_TYPE_MENU,"White Balance Control", 0, 5, 1, 0,sensor_v4l2ctrl_default_cb, sensor_WhiteBalanceSeqe),\r
892         new_user_v4l2ctrl(V4L2_CID_EXPOSURE,V4L2_CTRL_TYPE_INTEGER,"Exposure Control", -3, 3, 1, 0,sensor_v4l2ctrl_default_cb, sensor_ExposureSeqe),\r
893         new_user_v4l2ctrl(V4L2_CID_EFFECT,V4L2_CTRL_TYPE_MENU,"Effect Control", 0, 6, 1, 0,sensor_v4l2ctrl_default_cb, sensor_EffectSeqe),\r
894         new_user_v4l2ctrl(V4L2_CID_CONTRAST,V4L2_CTRL_TYPE_INTEGER,"Contrast Control", -4, 4, 1, 0,sensor_v4l2ctrl_default_cb, sensor_ContrastSeqe),\r
895 };\r
896 \r
897 //MUST define the current used format as the first item   \r
898 static struct rk_sensor_datafmt sensor_colour_fmts[] = {\r
899         {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},\r
900         {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG} \r
901 };\r
902 static struct soc_camera_ops sensor_ops;\r
903 \r
904 \r
905 /*\r
906 **********************************************************\r
907 * Following is local code:\r
908\r
909 * Please codeing your program here \r
910 **********************************************************\r
911 */\r
912 \r
913 /*\r
914 **********************************************************\r
915 * Following is callback\r
916 * If necessary, you could coding these callback\r
917 **********************************************************\r
918 */\r
919 /*\r
920 * the function is called in open sensor  \r
921 */\r
922 static int sensor_activate_cb(struct i2c_client *client)\r
923 {\r
924     SENSOR_DG("%s",__FUNCTION__);       \r
925         return 0;\r
926 }\r
927 /*\r
928 * the function is called in close sensor\r
929 */\r
930 static int sensor_deactivate_cb(struct i2c_client *client)\r
931 {\r
932         struct generic_sensor *sensor = to_generic_sensor(client);\r
933 \r
934     SENSOR_DG("%s",__FUNCTION__);\r
935     \r
936         /* ddl@rock-chips.com : all sensor output pin must switch into Hi-Z */\r
937         if (sensor->info_priv.funmodule_state & SENSOR_INIT_IS_OK) {\r
938                 //generic_sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
939                  sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
940         }\r
941         return 0;\r
942 }\r
943 /*\r
944 * the function is called before sensor register setting in VIDIOC_S_FMT  \r
945 */\r
946 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
947 {\r
948     if (capture) {\r
949         //sensor_parameter_record(client);\r
950     }\r
951 \r
952     return 0;\r
953 }\r
954 /*\r
955 * the function is called after sensor register setting finished in VIDIOC_S_FMT  \r
956 */\r
957 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
958 {\r
959     if (capture) {\r
960         //sensor_ae_transfer(client);\r
961     }\r
962 #if defined(CONFIG_SOC_RK3188M)\r
963         mf->width-=20;\r
964         mf->height-=20;\r
965         msleep(300);\r
966 #endif\r
967     return 0;\r
968 }\r
969 \r
970 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)\r
971 {\r
972         return 0;\r
973 }\r
974 \r
975 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
976 {\r
977         \r
978         return 0;\r
979 }\r
980 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
981 {\r
982         return 0;\r
983 }\r
984 \r
985 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
986 {\r
987         //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
988                 \r
989         if (pm_msg.event == PM_EVENT_SUSPEND) {\r
990                 SENSOR_DG("Suspend");\r
991                 \r
992         } else {\r
993                 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);\r
994                 return -EINVAL;\r
995         }\r
996         return 0;\r
997 }\r
998 \r
999 static int sensor_resume(struct soc_camera_device *icd)\r
1000 {\r
1001 \r
1002         SENSOR_DG("Resume");\r
1003 \r
1004         return 0;\r
1005 \r
1006 }\r
1007 static int sensor_mirror_cb (struct i2c_client *client, int mirror)\r
1008 {\r
1009         char val;\r
1010         int err = 0;\r
1011     \r
1012     SENSOR_DG("mirror: %d",mirror);\r
1013         if (mirror) {\r
1014                 err = sensor_read(client, 0x3022, &val);\r
1015                 if (err == 0) {\r
1016                         val |= 0x02;\r
1017                         err = sensor_write(client, 0x3022, val);\r
1018                 }\r
1019         } else {\r
1020                 err = sensor_read(client, 0x3022, &val);\r
1021                 if (err == 0) {\r
1022                         val &= 0xfd;\r
1023                         err = sensor_write(client, 0x3022, val);\r
1024                 }\r
1025         }\r
1026 \r
1027         return err;    \r
1028 }\r
1029 /*\r
1030 * the function is v4l2 control V4L2_CID_HFLIP callback  \r
1031 */\r
1032 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1033                                                      struct v4l2_ext_control *ext_ctrl)\r
1034 {\r
1035         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1036 \r
1037     if (sensor_mirror_cb(client,ext_ctrl->value) != 0)\r
1038                 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);\r
1039         \r
1040         SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);\r
1041         return 0;\r
1042 }\r
1043 \r
1044 static int sensor_flip_cb(struct i2c_client *client, int flip)\r
1045 {\r
1046         char val;\r
1047         int err = 0;    \r
1048 \r
1049     SENSOR_DG("flip: %d",flip);\r
1050         if (flip) {\r
1051                 err = sensor_read(client, 0x3022, &val);\r
1052                 if (err == 0) {\r
1053                         val |= 0x01;\r
1054                         err = sensor_write(client, 0x3022, val);\r
1055                 }\r
1056         } else {\r
1057                 err = sensor_read(client, 0x3022, &val);\r
1058                 if (err == 0) {\r
1059                         val &= 0xfe;\r
1060                         err = sensor_write(client, 0x3022, val);\r
1061                 }\r
1062         }\r
1063 \r
1064         return err;    \r
1065 }\r
1066 /*\r
1067 * the function is v4l2 control V4L2_CID_VFLIP callback  \r
1068 */\r
1069 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1070                                                      struct v4l2_ext_control *ext_ctrl)\r
1071 {\r
1072         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1073 \r
1074     if (sensor_flip_cb(client,ext_ctrl->value) != 0)\r
1075                 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);\r
1076         \r
1077         SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);\r
1078         return 0;\r
1079 }\r
1080 static int sensor_focus_init_usr_cb(struct i2c_client *client){\r
1081         return 0;\r
1082 }\r
1083 \r
1084 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){\r
1085         return 0;\r
1086 }\r
1087 \r
1088 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){\r
1089         return 0;\r
1090 }\r
1091 \r
1092 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){\r
1093         return 0;\r
1094 }\r
1095 \r
1096 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){\r
1097         return 0;\r
1098 }\r
1099 \r
1100 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){\r
1101         return 0;\r
1102 }\r
1103 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)\r
1104 {\r
1105     return 0;\r
1106 }\r
1107 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){\r
1108         return 0;\r
1109 }\r
1110 \r
1111 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)\r
1112 {\r
1113         return 0;\r
1114 }\r
1115 \r
1116 /*\r
1117 face defect call back\r
1118 */\r
1119 static int      sensor_face_detect_usr_cb(struct i2c_client *client,int on){\r
1120         return 0;\r
1121 }\r
1122 \r
1123 /*\r
1124 *   The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some\r
1125 * initialization in the function. \r
1126 */\r
1127 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)\r
1128 {\r
1129     return;\r
1130 }\r
1131 \r
1132 /*\r
1133 * :::::WARNING:::::\r
1134 * It is not allowed to modify the following code\r
1135 */\r
1136 \r
1137 sensor_init_parameters_default_code();\r
1138 \r
1139 sensor_v4l2_struct_initialization();\r
1140 \r
1141 sensor_probe_default_code();\r
1142 \r
1143 sensor_remove_default_code();\r
1144 \r
1145 sensor_driver_default_module_code();\r
1146 \r
1147 \r
1148 \r