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