camsys_drv : v0.9.0
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / ov2659.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,3);\r
10 module_param(version, int, S_IRUGO);\r
11 \r
12 static int debug;\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_OV2659\r
21 #define SENSOR_V4L2_IDENT V4L2_IDENT_OV2659\r
22 #define SENSOR_ID 0x2656\r
23 #define SENSOR_BUS_PARAM                     (SOCAM_MASTER |\\r
24                                              SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_LOW|\\r
25                                              SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\r
26 #define SENSOR_PREVIEW_W                     800\r
27 #define SENSOR_PREVIEW_H                     600\r
28 #define SENSOR_PREVIEW_FPS                   15000     // 15fps \r
29 #define SENSOR_FULLRES_L_FPS                 7500      // 7.5fps\r
30 #define SENSOR_FULLRES_H_FPS                 7500      // 7.5fps\r
31 #define SENSOR_720P_FPS                      0\r
32 #define SENSOR_1080P_FPS                     0\r
33 \r
34 #define SENSOR_REGISTER_LEN                  2         // sensor register address bytes\r
35 #define SENSOR_VALUE_LEN                     1         // sensor register value bytes\r
36                                     \r
37 static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect|CFG_Scene);\r
38 static unsigned int SensorChipID[] = {SENSOR_ID};\r
39 /* Sensor Driver Configuration End */\r
40 \r
41 \r
42 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
43 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
44 \r
45 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)\r
46 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
47 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
48 #define sensor_write_array generic_sensor_write_array\r
49 \r
50 struct sensor_parameter\r
51 {\r
52         unsigned int PreviewDummyPixels;\r
53         unsigned int CaptureDummyPixels;\r
54         unsigned int preview_exposure;\r
55         unsigned short int preview_line_width;\r
56         unsigned short int preview_gain;\r
57 \r
58         unsigned short int PreviewPclk;\r
59         unsigned short int CapturePclk;\r
60         char awb[6];\r
61 };\r
62 \r
63 struct specific_sensor{\r
64         struct generic_sensor common_sensor;\r
65         //define user data below\r
66         struct sensor_parameter parameter;\r
67 \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         {0x3000, 0x0f},\r
92         {0x3001, 0xff},\r
93         {0x3002, 0xff},\r
94         //{0x0100, 0x01},       //software sleep : Sensor vsync singal may not output if haven't sleep the sensor when transfer the array\r
95         {0x3633, 0x3d},\r
96         {0x3620, 0x02},\r
97         {0x3631, 0x11},\r
98         {0x3612, 0x04},\r
99         {0x3630, 0x20},\r
100         {0x4702, 0x02},\r
101         {0x370c, 0x34},\r
102         {0x3004, 0x10},\r
103         {0x3005, 0x18},\r
104         {0x3800, 0x00},\r
105         {0x3801, 0x00},\r
106         {0x3802, 0x00},\r
107         {0x3803, 0x00},\r
108         {0x3804, 0x06},\r
109         {0x3805, 0x5f},\r
110         {0x3806, 0x04},\r
111         {0x3807, 0xb7},\r
112         {0x3808, 0x03},\r
113         {0x3809, 0x20},\r
114         {0x380a, 0x02},\r
115         {0x380b, 0x58},\r
116         {0x380c, 0x05},\r
117         {0x380d, 0x14},\r
118         {0x380e, 0x02},\r
119         {0x380f, 0x68},\r
120         {0x3811, 0x08},\r
121         {0x3813, 0x02},\r
122         {0x3814, 0x31},\r
123         {0x3815, 0x31},\r
124         {0x3a02, 0x02},\r
125         {0x3a03, 0x68},\r
126         {0x3a08, 0x00},\r
127         {0x3a09, 0x5c},\r
128         {0x3a0a, 0x00},\r
129         {0x3a0b, 0x4d},\r
130         {0x3a0d, 0x08},\r
131         {0x3a0e, 0x06},\r
132         {0x3a14, 0x02},\r
133         {0x3a15, 0x28},\r
134                 {0x4708, 0x01},\r
135         {0x3623, 0x00},\r
136         {0x3634, 0x76},\r
137         {0x3701, 0x44},\r
138         {0x3702, 0x18},\r
139         {0x3703, 0x24},\r
140         {0x3704, 0x24},\r
141         {0x3705, 0x0c},\r
142         {0x3820, 0x81},\r
143         {0x3821, 0x01},\r
144         {0x370a, 0x52},\r
145         {0x4608, 0x00},\r
146         {0x4609, 0x80},\r
147         {0x4300, 0x32},\r
148         {0x5086, 0x02},\r
149         {0x5000, 0xfb},\r
150         {0x5001, 0x1f},\r
151         {0x5002, 0x00},\r
152         {0x5025, 0x0e},\r
153         {0x5026, 0x18},\r
154         {0x5027, 0x34},\r
155         {0x5028, 0x4c},\r
156         {0x5029, 0x62},\r
157         {0x502a, 0x74},\r
158         {0x502b, 0x85},\r
159         {0x502c, 0x92},\r
160         {0x502d, 0x9e},\r
161         {0x502e, 0xb2},\r
162         {0x502f, 0xc0},\r
163         {0x5030, 0xcc},\r
164         {0x5031, 0xe0},\r
165         {0x5032, 0xee},\r
166         {0x5033, 0xf6},\r
167         {0x5034, 0x11},\r
168         {0x5070, 0x1c},\r
169         {0x5071, 0x5b},\r
170         {0x5072, 0x05},\r
171         {0x5073, 0x20},\r
172         {0x5074, 0x94},\r
173         {0x5075, 0xb4},\r
174         {0x5076, 0xb4},\r
175         {0x5077, 0xaf},\r
176         {0x5078, 0x05},\r
177         {0x5079, 0x98},\r
178         {0x507a, 0x21},\r
179         {0x5035, 0x6a},\r
180         {0x5036, 0x11},\r
181         {0x5037, 0x92},\r
182         {0x5038, 0x21},\r
183         \r
184         {0x5039, 0xe1},\r
185         {0x503a, 0x01},\r
186         {0x503c, 0x05},\r
187         {0x503d, 0x08},\r
188         {0x503e, 0x08},\r
189         {0x503f, 0x64},\r
190         {0x5040, 0x58},\r
191         {0x5041, 0x2a},\r
192         {0x5042, 0xc5},\r
193         {0x5043, 0x2e},\r
194         {0x5044, 0x3a},\r
195         {0x5045, 0x3c},\r
196         {0x5046, 0x44},\r
197         {0x5047, 0xf8},\r
198         {0x5048, 0x08},\r
199         {0x5049, 0x70},\r
200         {0x504a, 0xf0},\r
201         {0x504b, 0xf0},\r
202         {0x500c, 0x03},\r
203         {0x500d, 0x20},\r
204         {0x500e, 0x02},\r
205         {0x500f, 0x5c},\r
206         {0x5010, 0x48},\r
207         {0x5011, 0x00},\r
208         {0x5012, 0x66},\r
209         {0x5013, 0x03},\r
210         {0x5014, 0x30},\r
211         {0x5015, 0x02},\r
212         {0x5016, 0x7c},\r
213         {0x5017, 0x40},\r
214         {0x5018, 0x00},\r
215         {0x5019, 0x66},\r
216         {0x501a, 0x03},\r
217         {0x501b, 0x10},\r
218         {0x501c, 0x02},\r
219         {0x501d, 0x7c},\r
220         {0x501e, 0x3a},\r
221         {0x501f, 0x00},\r
222         {0x5020, 0x66},\r
223         {0x506e, 0x44},\r
224         {0x5064, 0x08},\r
225         {0x5065, 0x10},\r
226         {0x5066, 0x12},\r
227         {0x5067, 0x02},\r
228         {0x506c, 0x08},\r
229         {0x506d, 0x10},\r
230         {0x506f, 0xa6},\r
231         {0x5068, 0x08},\r
232         \r
233         \r
234         {0x5069, 0x10},\r
235         {0x506a, 0x04},\r
236         {0x506b, 0x12},\r
237         {0x507e, 0x40},\r
238         {0x507f, 0x20},\r
239         {0x507b, 0x02},\r
240         {0x507a, 0x01},\r
241         {0x5084, 0x0c},\r
242         {0x5085, 0x3e},\r
243         {0x5005, 0x80},\r
244         {0x3a0f, 0x30},\r
245         {0x3a10, 0x28},\r
246         {0x3a1b, 0x32},\r
247         {0x3a1e, 0x26},\r
248         {0x3a11, 0x60},\r
249         {0x3a1f, 0x14},\r
250         {0x5060, 0x69},\r
251         {0x5061, 0x7d},\r
252         {0x5062, 0x7d},\r
253         {0x5063, 0x69},\r
254         {0x3004, 0x20},\r
255         {0x0100, 0x01},\r
256         SensorEnd\r
257 };\r
258 /* Senor full resolution setting: recommand for capture */\r
259 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={\r
260 \r
261         {0x3503,0x03}, \r
262         {0x506e,0x44},  \r
263         {0x5064,0x08},  \r
264         {0x5065,0x10},\r
265         {0x5066,0x18},  // zenghaihui 20110920 16\r
266         {0x5067,0x10},\r
267         {0x506c,0x08},\r
268         {0x506d,0x10},  \r
269         {0x506f,0xa6},  \r
270         {0x5068,0x08},\r
271         {0x5069,0x10},  \r
272         {0x506a,0x08},\r
273         {0x506b,0x28},\r
274         {0x5084,0x14},//0c\r
275         {0x5085,0x3c},//34      \r
276         {0x5005,0x80}, \r
277 \r
278 \r
279 \r
280         {0x5066, 0x3c},                 \r
281         {0x5067, 0x1a}, \r
282         {0x506a, 0x0e},    \r
283         {0x506b, 0x2e},    \r
284 \r
285         {0x3800, 0x00}, \r
286         {0x3801, 0x00}, \r
287         {0x3802, 0x00}, \r
288         {0x3803, 0x00}, \r
289         {0x3804, 0x06}, \r
290         {0x3805, 0x5f}, \r
291         {0x3806, 0x04}, \r
292         {0x3807, 0xbb}, \r
293         {0x3808, 0x06}, \r
294         {0x3809, 0x40}, \r
295         {0x380a, 0x04}, \r
296         {0x380b, 0xb0}, \r
297         {0x3811, 0x10}, \r
298         {0x3813, 0x06}, \r
299         {0x3814, 0x11}, \r
300         {0x3815, 0x11}, \r
301 \r
302         {0x3623, 0x00}, \r
303         {0x3634, 0x44}, \r
304         {0x3701, 0x44}, \r
305         {0x3208, 0xa2}, \r
306         {0x3705, 0x18},          \r
307         {0x3820, 0x80}, \r
308         {0x3821, 0x00}, \r
309 \r
310         {0x3003, 0x80},//10fps \r
311         {0x3004, 0x20}, //10             \r
312         {0x3005, 0x18}, \r
313         {0x3006, 0x0d}, \r
314 \r
315         {0x380c, 0x07}, \r
316         {0x380d, 0x9f}, \r
317         {0x380e, 0x04}, \r
318         {0x380f, 0xd0}, \r
319 \r
320         {0x370a, 0x12}, \r
321         {0x4608, 0x00}, \r
322         {0x4609, 0x80}, \r
323         {0x5002, 0x00}, \r
324 \r
325         {0x3a08, 0x00}, \r
326         {0x3a09, 0x3e},//7b \r
327         {0x3a0e, 0x13},//0a \r
328 \r
329         {0x3a0a, 0x00}, \r
330         {0x3a0b, 0x3e},//7b                             \r
331         {0x3a0d, 0x13},//0a             \r
332 \r
333         {0x4003, 0x88},\r
334         SensorEnd\r
335 };\r
336 /* Senor full resolution setting: recommand for video */\r
337 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={\r
338         SensorEnd\r
339 };\r
340 /* Preview resolution setting*/\r
341 static struct rk_sensor_reg sensor_preview_data[] =\r
342 {\r
343         {0x0100, 0x00},    //software sleep : Sensor vsync singal may not output if haven't sleep the sensor when transfer the array,\r
344         {0x3800, 0x00},\r
345         {0x3801, 0x00},\r
346         {0x3802, 0x00},\r
347         {0x3803, 0x00},\r
348         {0x3804, 0x06},\r
349         {0x3805, 0x5f},\r
350         {0x3806, 0x04},\r
351         {0x3807, 0xb7},\r
352         {0x3808, 0x03},\r
353         {0x3809, 0x20},\r
354         {0x380a, 0x02},\r
355         {0x380b, 0x58},\r
356         {0x380c, 0x05},\r
357         {0x380d, 0x14},\r
358         {0x380e, 0x02},\r
359         {0x380f, 0x68},\r
360         {0x3811, 0x08},\r
361         {0x3813, 0x02},\r
362         {0x3814, 0x31},\r
363         {0x3815, 0x31},\r
364         {0x3a02, 0x02},\r
365         {0x3a03, 0x68},\r
366         {0x3a08, 0x00},\r
367         {0x3a09, 0x5c},\r
368         {0x3a0a, 0x00},\r
369         {0x3a0b, 0x4d},\r
370         {0x3a0d, 0x08},\r
371         {0x3a0e, 0x06},\r
372         {0x3a14, 0x02},\r
373         {0x3a15, 0x28},\r
374         {0x3623, 0x00},\r
375         {0x3634, 0x76},\r
376         {0x3701, 0x44},\r
377         {0x3702, 0x18},\r
378         {0x3703, 0x24},\r
379         {0x3704, 0x24},\r
380         {0x3705, 0x0c},\r
381         {0x3820, 0x81},\r
382         {0x3821, 0x01},\r
383         {0x370a, 0x52},\r
384         {0x4608, 0x00},\r
385         {0x4609, 0x80},\r
386         {0x5002, 0x10},\r
387         {0x3005, 0x18},\r
388         {0x3004, 0x20},\r
389         {0x3503,0x00},\r
390         {0x0100, 0x01},         //software wake\r
391 \r
392         SensorEnd\r
393 };\r
394 /* 1280x720 */\r
395 static struct rk_sensor_reg sensor_720p[]={\r
396         SensorEnd\r
397 };\r
398 \r
399 /* 1920x1080 */\r
400 static struct rk_sensor_reg sensor_1080p[]={\r
401         SensorEnd\r
402 };\r
403 \r
404 \r
405 static struct rk_sensor_reg sensor_softreset_data[]={\r
406     SensorRegVal(0x0103,0x01),\r
407         SensorEnd\r
408 };\r
409 \r
410 static struct rk_sensor_reg sensor_check_id_data[]={\r
411     SensorRegVal(0x300a,0),\r
412     SensorRegVal(0x300b,0),\r
413         SensorEnd\r
414 };\r
415 /*\r
416 *  The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx\r
417 */\r
418 static struct rk_sensor_reg sensor_WhiteB_Auto[]=\r
419 {\r
420         {0x3406, 0x00},  //AWB auto, bit[1]:0,auto\r
421         SensorEnd\r
422 };\r
423 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
424 static  struct rk_sensor_reg sensor_WhiteB_Cloudy[]=\r
425 {\r
426         {0x3406, 0x01},\r
427         {0x3400, 0x07},\r
428         {0x3401, 0x08},\r
429         {0x3402, 0x04},\r
430         {0x3403, 0x00},\r
431         {0x3404, 0x05},\r
432         {0x3405, 0x00},\r
433         SensorEnd\r
434 };\r
435 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
436 static  struct rk_sensor_reg sensor_WhiteB_ClearDay[]=\r
437 {\r
438         //Sunny\r
439         {0x3406, 0x01},\r
440         {0x3400, 0x07},\r
441         {0x3401, 0x02},\r
442         {0x3402, 0x04},\r
443         {0x3403, 0x00},\r
444         {0x3404, 0x05},\r
445         {0x3405, 0x15},\r
446         SensorEnd\r
447 };\r
448 /* Office Colour Temperature : 3500K - 5000K  */\r
449 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=\r
450 {\r
451         //Office\r
452         {0x3406, 0x01},\r
453         {0x3400, 0x06},\r
454         {0x3401, 0x2a},\r
455         {0x3402, 0x04},\r
456         {0x3403, 0x00},\r
457         {0x3404, 0x07},\r
458         {0x3405, 0x24},\r
459         SensorEnd\r
460 \r
461 };\r
462 /* Home Colour Temperature : 2500K - 3500K      */\r
463 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=\r
464 {\r
465         //Home\r
466         {0x3406, 0x01},\r
467         {0x3400, 0x04},\r
468         {0x3401, 0x58},\r
469         {0x3402, 0x04},\r
470         {0x3403, 0x00},\r
471         {0x3404, 0x07},\r
472         {0x3405, 0x24},\r
473         SensorEnd\r
474 };\r
475 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
476         sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
477 };\r
478 \r
479 static  struct rk_sensor_reg sensor_Brightness0[]=\r
480 {\r
481         // Brightness -2\r
482         SensorEnd\r
483 };\r
484 \r
485 static  struct rk_sensor_reg sensor_Brightness1[]=\r
486 {\r
487         // Brightness -1\r
488 \r
489         SensorEnd\r
490 };\r
491 \r
492 static  struct rk_sensor_reg sensor_Brightness2[]=\r
493 {\r
494         //      Brightness 0\r
495 \r
496         SensorEnd\r
497 };\r
498 \r
499 static  struct rk_sensor_reg sensor_Brightness3[]=\r
500 {\r
501         // Brightness +1\r
502 \r
503         SensorEnd\r
504 };\r
505 \r
506 static  struct rk_sensor_reg sensor_Brightness4[]=\r
507 {\r
508         //      Brightness +2\r
509 \r
510         SensorEnd\r
511 };\r
512 \r
513 static  struct rk_sensor_reg sensor_Brightness5[]=\r
514 {\r
515         //      Brightness +3\r
516 \r
517         SensorEnd\r
518 };\r
519 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
520         sensor_Brightness4, sensor_Brightness5,NULL,\r
521 };\r
522 \r
523 static  struct rk_sensor_reg sensor_Effect_Normal[] =\r
524 {\r
525         {0x507b, 0x00},\r
526         SensorEnd\r
527 };\r
528 \r
529 static  struct rk_sensor_reg sensor_Effect_WandB[] =\r
530 {\r
531         {0x507b, 0x20},\r
532         SensorEnd\r
533 };\r
534 \r
535 static  struct rk_sensor_reg sensor_Effect_Sepia[] =\r
536 {\r
537         {0x507b, 0x18},\r
538         {0x507e, 0x40},\r
539         {0x507f, 0xa0},\r
540         SensorEnd\r
541 };\r
542 \r
543 static  struct rk_sensor_reg sensor_Effect_Negative[] =\r
544 {\r
545         //Negative\r
546         {0x507b, 0x40}, //bit[6] negative\r
547         SensorEnd\r
548 };\r
549 static  struct rk_sensor_reg sensor_Effect_Bluish[] =\r
550 {\r
551         // Bluish\r
552         {0x507b, 0x18},\r
553         {0x507e, 0xa0},\r
554         {0x507f, 0x40},\r
555         SensorEnd\r
556 };\r
557 \r
558 static  struct rk_sensor_reg sensor_Effect_Green[] =\r
559 {\r
560         //      Greenish\r
561         {0x507b, 0x18},\r
562         {0x507e, 0x60},\r
563         {0x507f, 0x60},\r
564         SensorEnd\r
565 };\r
566 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
567         sensor_Effect_Bluish, sensor_Effect_Green,NULL,\r
568 };\r
569 \r
570 static  struct rk_sensor_reg sensor_Exposure0[]=\r
571 {\r
572         SensorEnd\r
573 };\r
574 \r
575 static  struct rk_sensor_reg sensor_Exposure1[]=\r
576 {\r
577         SensorEnd\r
578 };\r
579 \r
580 static  struct rk_sensor_reg sensor_Exposure2[]=\r
581 {\r
582         SensorEnd\r
583 };\r
584 \r
585 static  struct rk_sensor_reg sensor_Exposure3[]=\r
586 {\r
587         SensorEnd\r
588 };\r
589 \r
590 static  struct rk_sensor_reg sensor_Exposure4[]=\r
591 {\r
592         SensorEnd\r
593 };\r
594 \r
595 static  struct rk_sensor_reg sensor_Exposure5[]=\r
596 {\r
597         SensorEnd\r
598 };\r
599 \r
600 static  struct rk_sensor_reg sensor_Exposure6[]=\r
601 {\r
602         SensorEnd\r
603 };\r
604 \r
605 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
606         sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
607 };\r
608 \r
609 static  struct rk_sensor_reg sensor_Saturation0[]=\r
610 {\r
611         SensorEnd\r
612 };\r
613 \r
614 static  struct rk_sensor_reg sensor_Saturation1[]=\r
615 {\r
616         SensorEnd\r
617 };\r
618 \r
619 static  struct rk_sensor_reg sensor_Saturation2[]=\r
620 {\r
621         SensorEnd\r
622 };\r
623 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
624 \r
625 static  struct rk_sensor_reg sensor_Contrast0[]=\r
626 {\r
627         SensorEnd\r
628 };\r
629 \r
630 static  struct rk_sensor_reg sensor_Contrast1[]=\r
631 {\r
632         SensorEnd\r
633 };\r
634 \r
635 static  struct rk_sensor_reg sensor_Contrast2[]=\r
636 {\r
637         SensorEnd\r
638 };\r
639 \r
640 static  struct rk_sensor_reg sensor_Contrast3[]=\r
641 {\r
642         SensorEnd\r
643 };\r
644 \r
645 static  struct rk_sensor_reg sensor_Contrast4[]=\r
646 {\r
647         SensorEnd\r
648 };\r
649 \r
650 \r
651 static  struct rk_sensor_reg sensor_Contrast5[]=\r
652 {\r
653         SensorEnd\r
654 };\r
655 \r
656 static  struct rk_sensor_reg sensor_Contrast6[]=\r
657 {\r
658         SensorEnd\r
659 };\r
660 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
661         sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
662 };\r
663 static  struct rk_sensor_reg sensor_SceneAuto[] =\r
664 {\r
665         {0x3a00, 0x78},\r
666         SensorEnd\r
667 };\r
668 \r
669 static  struct rk_sensor_reg sensor_SceneNight[] =\r
670 {\r
671         {0x3003, 0x80},\r
672         {0x3004, 0x20},\r
673         {0x3005, 0x18},\r
674         {0x3006, 0x0d},\r
675         {0x3a00, 0x7c},\r
676         {0x3a02 ,0x07},\r
677         {0x3a03 ,0x38},\r
678         {0x3a14 ,0x07},\r
679         {0x3a15 ,0x38},\r
680         SensorEnd\r
681 };\r
682 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
683 \r
684 static struct rk_sensor_reg sensor_Zoom0[] =\r
685 {\r
686         SensorEnd\r
687 };\r
688 \r
689 static struct rk_sensor_reg sensor_Zoom1[] =\r
690 {\r
691         SensorEnd\r
692 };\r
693 \r
694 static struct rk_sensor_reg sensor_Zoom2[] =\r
695 {\r
696         SensorEnd\r
697 };\r
698 \r
699 \r
700 static struct rk_sensor_reg sensor_Zoom3[] =\r
701 {\r
702         SensorEnd\r
703 };\r
704 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
705 \r
706 /*\r
707 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu\r
708 */\r
709 static struct v4l2_querymenu sensor_menus[] =\r
710 {\r
711 };\r
712 /*\r
713 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl\r
714 */\r
715 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =\r
716 {\r
717 };\r
718 \r
719 //MUST define the current used format as the first item   \r
720 static struct rk_sensor_datafmt sensor_colour_fmts[] = {\r
721         {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},\r
722         {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG} \r
723 };\r
724 static struct soc_camera_ops sensor_ops;\r
725 \r
726 \r
727 /*\r
728 **********************************************************\r
729 * Following is local code:\r
730\r
731 * Please codeing your program here \r
732 **********************************************************\r
733 */\r
734 static int sensor_parameter_record(struct i2c_client *client)\r
735 {\r
736         u8 ret_l,ret_m,ret_h;\r
737         int tp_l,tp_m,tp_h;\r
738         \r
739         struct generic_sensor *sensor = to_generic_sensor(client);\r
740         struct specific_sensor *spsensor = to_specific_sensor(sensor);\r
741 \r
742         sensor_read(client,0x3a00, &ret_l);\r
743         sensor_write(client,0x3a00, ret_l&0xfb);\r
744 \r
745         sensor_write(client,0x3503,0x07);       //stop AE/AG\r
746 \r
747         sensor_read(client,0x3500,&ret_h);\r
748         sensor_read(client,0x3501, &ret_m);\r
749         sensor_read(client,0x3502, &ret_l);\r
750         tp_l = ret_l;\r
751         tp_m = ret_m;\r
752         tp_h = ret_h;\r
753         spsensor->parameter.preview_exposure = ((tp_h<<12) & 0xF000) | ((tp_m<<4) & 0x0FF0) | ((tp_l>>4) & 0x0F);\r
754         \r
755         //Read back AGC Gain for preview\r
756         sensor_read(client,0x350b, &ret_l);\r
757         spsensor->parameter.preview_gain = ret_l;\r
758 \r
759         spsensor->parameter.CapturePclk = 24000;\r
760         spsensor->parameter.PreviewPclk = 24000;\r
761         spsensor->parameter.PreviewDummyPixels = 0;\r
762         spsensor->parameter.CaptureDummyPixels = 0;\r
763         SENSOR_DG("Read 0x350b=0x%02x  PreviewExposure:%d 0x3500=0x%02x  0x3501=0x%02x 0x3502=0x%02x",\r
764                   ret_l,spsensor->parameter.preview_exposure,tp_h, tp_m, tp_l);\r
765         return 0;\r
766 }\r
767 #define OV2659_FULL_PERIOD_PIXEL_NUMS  (1940)  // default pixel#(w/o dummy pixels) in UXGA mode\r
768 #define OV2659_FULL_PERIOD_LINE_NUMS   (1238)  // default line#(w/o dummy lines) in UXGA mode\r
769 #define OV2659_PV_PERIOD_PIXEL_NUMS   (970)  // default pixel#(w/o dummy pixels) in SVGA mode\r
770 #define OV2659_PV_PERIOD_LINE_NUMS        (618)   // default line#(w/o dummy lines) in SVGA mode\r
771 \r
772 /* SENSOR EXPOSURE LINE LIMITATION */\r
773 #define OV2659_FULL_EXPOSURE_LIMITATION   (1236)\r
774 #define OV2659_PV_EXPOSURE_LIMITATION     (618)\r
775 \r
776 // SENSOR UXGA SIZE\r
777 #define OV2659_IMAGE_SENSOR_FULL_WIDTH    (1600)\r
778 #define OV2659_IMAGE_SENSOR_FULL_HEIGHT   (1200)\r
779 \r
780 #define OV2659_FULL_GRAB_WIDTH                          (OV2659_IMAGE_SENSOR_FULL_WIDTH - 16)\r
781 #define OV2659_FULL_GRAB_HEIGHT                         (OV2659_IMAGE_SENSOR_FULL_HEIGHT - 12)\r
782 static void OV2659SetDummy(struct i2c_client *client,unsigned int dummy_pixels, unsigned int dummy_lines)\r
783 {\r
784         unsigned char val;\r
785         unsigned int temp_reg1, temp_reg2;\r
786         unsigned int temp_reg;\r
787         \r
788         if (dummy_pixels > 0)\r
789         {\r
790                 sensor_read(client,0x380D,&val);        // HTS[b7~b0]\r
791                 temp_reg1 = val;\r
792                 sensor_read(client,0x380C,&val);        // HTS[b15~b8]\r
793                 temp_reg2 = val;\r
794                 temp_reg = (temp_reg1 & 0xFF) | (temp_reg2 << 8);\r
795         \r
796                 temp_reg += dummy_pixels;\r
797         \r
798                 sensor_write(client,0x380D,(temp_reg&0xFF));             //HTS[7:0]\r
799                 sensor_write(client,0x380C,((temp_reg&0xFF00)>>8));  //HTS[15:8]\r
800         }\r
801 \r
802         if (dummy_lines > 0)\r
803         {\r
804                 sensor_read(client,0x380F,&val);        // VTS[b7~b0]\r
805                 temp_reg1 = val;\r
806                 sensor_read(client,0x380E,&val);        // VTS[b15~b8]\r
807                 temp_reg2 = val;\r
808                 temp_reg = (temp_reg1 & 0xFF) | (temp_reg2 << 8);\r
809         \r
810                 temp_reg += dummy_lines;\r
811         \r
812                 sensor_write(client,0x380F,(temp_reg&0xFF));             //VTS[7:0]\r
813                 sensor_write(client,0x380E,((temp_reg&0xFF00)>>8));  //VTS[15:8]\r
814         }\r
815 }        /* OV2659_set_dummy */\r
816 \r
817 static void OV2659WriteShutter(struct i2c_client *client,bool is_preview, unsigned int shutter)\r
818 {\r
819         unsigned int extra_exposure_lines = 0;\r
820 \r
821         if (shutter < 1)\r
822         {\r
823                 shutter = 1;\r
824         }\r
825         \r
826         if (is_preview) \r
827         {\r
828                 if (shutter <= OV2659_PV_EXPOSURE_LIMITATION) \r
829                 {\r
830                         extra_exposure_lines = 0;\r
831                 }\r
832                 else \r
833                 {\r
834                         extra_exposure_lines=shutter - OV2659_PV_EXPOSURE_LIMITATION;\r
835                 }\r
836                 \r
837         }\r
838         else \r
839         {\r
840                 if (shutter <= OV2659_FULL_EXPOSURE_LIMITATION) \r
841                 {\r
842                         extra_exposure_lines = 0;\r
843                 }\r
844                 else \r
845                 {\r
846                         extra_exposure_lines = shutter - OV2659_FULL_EXPOSURE_LIMITATION;\r
847                 }\r
848                 \r
849         }\r
850         \r
851         //AEC PK EXPOSURE\r
852         shutter*=16;\r
853         sensor_write(client,0x3502, (shutter & 0x00FF));                   //AEC[7:0]\r
854         sensor_write(client,0x3501, ((shutter & 0x0FF00) >>8));  //AEC[15:8]\r
855         sensor_write(client,0x3500, ((shutter & 0xFF0000) >> 16));      \r
856         \r
857         if(extra_exposure_lines>0)\r
858         {\r
859                 // set extra exposure line [aec add vts]\r
860                 sensor_write(client,0x3507, extra_exposure_lines & 0xFF);                  // EXVTS[b7~b0]\r
861                 sensor_write(client,0x3506, (extra_exposure_lines & 0xFF00) >> 8); // EXVTS[b15~b8]\r
862         }\r
863         else\r
864         {\r
865                 // set extra exposure line [aec add vts]\r
866                 sensor_write(client,0x3507, 0x00);                      // EXVTS[b7~b0]\r
867                 sensor_write(client,0x3506, 0x00); // EXVTS[b15~b8]\r
868         }\r
869         \r
870 }        /* OV2659_write_shutter */\r
871 static int sensor_ae_transfer(struct i2c_client *client)\r
872 {\r
873         unsigned int prev_line_len,cap_line_len,shutter;\r
874         struct generic_sensor *sensor = to_generic_sensor(client);\r
875         struct specific_sensor *spsensor = to_specific_sensor(sensor);\r
876 \r
877         mdelay(100);\r
878         shutter = spsensor->parameter.preview_exposure;\r
879 \r
880         OV2659SetDummy(client,600,0);   \r
881         \r
882         prev_line_len = OV2659_PV_PERIOD_PIXEL_NUMS + spsensor->parameter.PreviewDummyPixels;\r
883         cap_line_len = OV2659_FULL_PERIOD_PIXEL_NUMS + spsensor->parameter.CaptureDummyPixels;\r
884         shutter = (shutter * spsensor->parameter.CapturePclk) / spsensor->parameter.PreviewPclk;\r
885         shutter = (shutter * prev_line_len) / cap_line_len;\r
886         shutter*=2;\r
887 \r
888         OV2659WriteShutter(client,0,shutter);\r
889         \r
890         \r
891         return 0;\r
892 }\r
893 /*\r
894 **********************************************************\r
895 * Following is callback\r
896 * If necessary, you could coding these callback\r
897 **********************************************************\r
898 */\r
899 /*\r
900 * the function is called in open sensor  \r
901 */\r
902 static int sensor_activate_cb(struct i2c_client *client)\r
903 {\r
904     u8 reg_val;\r
905 \r
906     SENSOR_DG("%s",__FUNCTION__);\r
907         \r
908         sensor_read(client,0x3000,&reg_val);\r
909         sensor_write(client, 0x3000, reg_val|0x03);\r
910         sensor_write(client, 0x3001, 0xff);\r
911         sensor_read(client,0x3002,&reg_val);\r
912         sensor_write(client, 0x3002, reg_val|0xe0);\r
913         \r
914         return 0;\r
915 }\r
916 /*\r
917 * the function is called in close sensor\r
918 */\r
919 static int sensor_deactivate_cb(struct i2c_client *client)\r
920 {\r
921         u8 reg_val;\r
922         struct generic_sensor *sensor = to_generic_sensor(client);\r
923 \r
924     SENSOR_DG("%s",__FUNCTION__);\r
925     \r
926         /* ddl@rock-chips.com : all sensor output pin must switch into Hi-Z */\r
927         if (sensor->info_priv.funmodule_state & SENSOR_INIT_IS_OK) {\r
928                 sensor_read(client,0x3000,&reg_val);\r
929                 sensor_write(client, 0x3000, reg_val&0xfc);\r
930                 sensor_write(client, 0x3001, 0x00);\r
931                 sensor_read(client,0x3002,&reg_val);\r
932                 sensor_write(client, 0x3002, reg_val&0x1f);\r
933         }\r
934         \r
935         return 0;\r
936 }\r
937 /*\r
938 * the function is called before sensor register setting in VIDIOC_S_FMT  \r
939 */\r
940 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
941 {\r
942     if (capture) {\r
943         sensor_parameter_record(client);\r
944     }\r
945 \r
946     return 0;\r
947 }\r
948 /*\r
949 * the function is called after sensor register setting finished in VIDIOC_S_FMT  \r
950 */\r
951 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
952 {\r
953     if (capture) {\r
954         sensor_ae_transfer(client);\r
955     }\r
956     return 0;\r
957 }\r
958 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)\r
959 {\r
960         return 0;\r
961 }\r
962 \r
963 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
964 {\r
965         \r
966         return 0;\r
967 }\r
968 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
969 {\r
970         return 0;\r
971 }\r
972 \r
973 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
974 {\r
975         //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
976                 \r
977         if (pm_msg.event == PM_EVENT_SUSPEND) {\r
978                 SENSOR_DG("Suspend");\r
979                 \r
980         } else {\r
981                 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);\r
982                 return -EINVAL;\r
983         }\r
984         return 0;\r
985 }\r
986 \r
987 static int sensor_resume(struct soc_camera_device *icd)\r
988 {\r
989 \r
990         SENSOR_DG("Resume");\r
991 \r
992         return 0;\r
993 \r
994 }\r
995 static int sensor_mirror_cb (struct i2c_client *client, int mirror)\r
996 {\r
997         char val;\r
998         int err = 0;\r
999     \r
1000     SENSOR_DG("mirror: %d",mirror);\r
1001         if (mirror) {\r
1002                 err = sensor_read(client, 0x3821, &val);\r
1003                 if (err == 0) {\r
1004                         val |= 0x06;\r
1005                         err = sensor_write(client, 0x3821, val);\r
1006                 }\r
1007         } else {\r
1008                 err = sensor_read(client, 0x3821, &val);\r
1009                 if (err == 0) {\r
1010                         val &= 0xf9;\r
1011                         err = sensor_write(client, 0x3821, val);\r
1012                 }\r
1013         }\r
1014 \r
1015         return err;    \r
1016 }\r
1017 /*\r
1018 * the function is v4l2 control V4L2_CID_HFLIP callback  \r
1019 */\r
1020 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1021                                                      struct v4l2_ext_control *ext_ctrl)\r
1022 {\r
1023         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1024 \r
1025     if (sensor_mirror_cb(client,ext_ctrl->value) != 0)\r
1026                 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);\r
1027         \r
1028         SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);\r
1029         return 0;\r
1030 }\r
1031 \r
1032 static int sensor_flip_cb(struct i2c_client *client, int flip)\r
1033 {\r
1034         char val;\r
1035         int err = 0;    \r
1036 \r
1037     SENSOR_DG("flip: %d",flip);\r
1038         if (flip) {\r
1039                 err = sensor_read(client, 0x3820, &val);\r
1040                 if (err == 0) {\r
1041                         val |= 0x06;\r
1042                         err = sensor_write(client, 0x3820, val);\r
1043                 }\r
1044         } else {\r
1045                 err = sensor_read(client, 0x3820, &val);\r
1046                 if (err == 0) {\r
1047                         val &= 0xf9;\r
1048                         err = sensor_write(client, 0x3820, val);\r
1049                 }\r
1050         }\r
1051 \r
1052         return err;    \r
1053 }\r
1054 /*\r
1055 * the function is v4l2 control V4L2_CID_VFLIP callback  \r
1056 */\r
1057 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1058                                                      struct v4l2_ext_control *ext_ctrl)\r
1059 {\r
1060         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1061 \r
1062     if (sensor_flip_cb(client,ext_ctrl->value) != 0)\r
1063                 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);\r
1064         \r
1065         SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);\r
1066         return 0;\r
1067 }\r
1068 /*\r
1069 * the functions are focus callbacks\r
1070 */\r
1071 static int sensor_focus_init_usr_cb(struct i2c_client *client){\r
1072         return 0;\r
1073 }\r
1074 \r
1075 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){\r
1076         return 0;\r
1077 }\r
1078 \r
1079 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){\r
1080         return 0;\r
1081 }\r
1082 \r
1083 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){\r
1084         return 0;\r
1085 }\r
1086 \r
1087 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){\r
1088         return 0;\r
1089 }\r
1090 \r
1091 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){\r
1092         return 0;\r
1093 }\r
1094 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1095 {
1096     return 0;
1097 }\r
1098 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){\r
1099         return 0;\r
1100 }\r
1101 \r
1102 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)\r
1103 {\r
1104     return 0;\r
1105 }\r
1106 \r
1107 /*\r
1108 face defect call back\r
1109 */\r
1110 static int      sensor_face_detect_usr_cb(struct i2c_client *client,int on){\r
1111         return 0;\r
1112 }\r
1113 \r
1114 /*\r
1115 *   The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some\r
1116 * initialization in the function. \r
1117 */\r
1118 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)\r
1119 {\r
1120     return;\r
1121 }\r
1122 \r
1123 /*\r
1124 * :::::WARNING:::::\r
1125 * It is not allowed to modify the following code\r
1126 */\r
1127 \r
1128 sensor_init_parameters_default_code();\r
1129 \r
1130 sensor_v4l2_struct_initialization();\r
1131 \r
1132 sensor_probe_default_code();\r
1133 \r
1134 sensor_remove_default_code();\r
1135 \r
1136 sensor_driver_default_module_code();\r
1137 \r