camera: delete compile warning
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / ov5640.c
1  #include "generic_sensor.h"\r
2 \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 \r
13 static int debug;\r
14 module_param(debug, int, S_IRUGO|S_IWUSR);\r
15 \r
16 #define dprintk(level, fmt, arg...) do {                        \\r
17         if (debug >= level)                                     \\r
18         printk(KERN_WARNING fmt , ## arg); } while (0)\r
19 \r
20 /* Sensor Driver Configuration Begin */\r
21 #define SENSOR_NAME RK29_CAM_SENSOR_OV5640\r
22 #define SENSOR_V4L2_IDENT V4L2_IDENT_OV5640\r
23 #define SENSOR_ID 0x5640\r
24 #define SENSOR_BUS_PARAM                                         (SOCAM_MASTER |\\r
25                                                                                          SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_LOW|\\r
26                                                                                          SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\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                             7500      // 7.5fps\r
31 #define SENSOR_FULLRES_H_FPS                             7500      // 7.5fps\r
32 #define SENSOR_720P_FPS                                          30000\r
33 #define SENSOR_1080P_FPS                                         15000\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 = (CFG_WhiteBalance|CFG_Effect\r
39                                            |CFG_Scene|CFG_Focus\r
40                                            |CFG_FocusZone);\r
41 \r
42 static unsigned int SensorChipID[] = {SENSOR_ID};\r
43 /* Sensor Driver Configuration End */\r
44 \r
45 \r
46 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
47 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
48 \r
49 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)\r
50 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
51 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
52 #define sensor_write_array generic_sensor_write_array\r
53 \r
54 #if 1//CONFIG_SENSOR_Focus\r
55 #include "ov5640_af_firmware.c"\r
56 /* ov5640 VCM Command and Status Registers */\r
57 #define CONFIG_SENSOR_FocusCenterInCapture        0\r
58 #define CMD_MAIN_Reg            0x3022\r
59 //#define CMD_TAG_Reg                   0x3023\r
60 #define CMD_ACK_Reg             0x3023\r
61 #define CMD_PARA0_Reg           0x3024\r
62 #define CMD_PARA1_Reg           0x3025\r
63 #define CMD_PARA2_Reg           0x3026\r
64 #define CMD_PARA3_Reg           0x3027\r
65 #define CMD_PARA4_Reg           0x3028\r
66 \r
67 //#define STA_ZONE_Reg                  0x3026\r
68 #define STA_FOCUS_Reg           0x3029\r
69 \r
70 /* ov5640 VCM Command  */\r
71 \r
72 #define ConstFocus_Cmd    0x04\r
73 #define StepMode_Cmd      0x05\r
74 #define PauseFocus_Cmd    0x06\r
75 #define ReturnIdle_Cmd    0x08\r
76 #define SetZone_Cmd       0x10\r
77 #define UpdateZone_Cmd    0x12\r
78 #define SetMotor_Cmd      0x20\r
79 #define SingleFocus_Cmd                         0x03\r
80 #define GetFocusResult_Cmd                      0x07\r
81 #define ReleaseFocus_Cmd                        0x08\r
82 #define ZoneRelaunch_Cmd                        0x12\r
83 #define DefaultZoneConfig_Cmd           0x80\r
84 #define TouchZoneConfig_Cmd             0x81\r
85 #define CustomZoneConfig_Cmd            0x8f\r
86 \r
87 \r
88 /* ov5640 Focus State */\r
89 //#define S_FIRWRE                              0xFF            /*Firmware is downloaded and not run*/\r
90 #define S_STARTUP                       0x7e            /*Firmware is initializing*/\r
91 #define S_ERROR                         0x7f\r
92 #define S_IDLE                          0x70            /*Idle state, focus is released; lens is located at the furthest position.*/\r
93 #define S_FOCUSING                      0x00            /*Auto Focus is running.*/\r
94 #define S_FOCUSED                       0x10            /*Auto Focus is completed.*/\r
95 \r
96 #define S_CAPTURE                       0x12\r
97 #define S_STEP                                  0x20\r
98 \r
99 /* ov5640 Zone State */\r
100 #define Zone_Is_Focused(a, zone_val)    (zone_val&(1<<(a-3)))\r
101 #define Zone_Get_ID(zone_val)                   (zone_val&0x03)\r
102 \r
103 #define Zone_CenterMode   0x01\r
104 #define Zone_5xMode       0x02\r
105 #define Zone_5PlusMode    0x03\r
106 #define Zone_4fMode       0x04\r
107 \r
108 #define ZoneSel_Auto      0x0b\r
109 #define ZoneSel_SemiAuto  0x0c\r
110 #define ZoneSel_Manual    0x0d\r
111 #define ZoneSel_Rotate    0x0e\r
112 \r
113 /* ov5640 Step Focus Commands */\r
114 #define StepFocus_Near_Tag               0x01\r
115 #define StepFocus_Far_Tag                0x02\r
116 #define StepFocus_Furthest_Tag   0x03\r
117 #define StepFocus_Nearest_Tag    0x04\r
118 #define StepFocus_Spec_Tag               0x10\r
119 #endif\r
120 \r
121 struct sensor_parameter\r
122 {\r
123         unsigned int PreviewDummyPixels;\r
124         unsigned int CaptureDummyPixels;\r
125         unsigned int preview_exposure;\r
126         unsigned short int preview_line_width;\r
127         unsigned short int preview_gain;\r
128         unsigned short int preview_maxlines;\r
129 \r
130         unsigned short int PreviewPclk;\r
131         unsigned short int CapturePclk;\r
132         char awb[6];\r
133 };\r
134 \r
135 struct specific_sensor{\r
136         struct generic_sensor common_sensor;\r
137         //define user data below\r
138         struct sensor_parameter parameter;\r
139 \r
140 };\r
141 \r
142 /*\r
143 *  The follow setting need been filled.\r
144 *  \r
145 *  Must Filled:\r
146 *  sensor_init_data :                           Sensor initial setting;\r
147 *  sensor_fullres_lowfps_data :         Sensor full resolution setting with best auality, recommand for video;\r
148 *  sensor_preview_data :                        Sensor preview resolution setting, recommand it is vga or svga;\r
149 *  sensor_softreset_data :                      Sensor software reset register;\r
150 *  sensor_check_id_data :                       Sensir chip id register;\r
151 *\r
152 *  Optional filled:\r
153 *  sensor_fullres_highfps_data:         Sensor full resolution setting with high framerate, recommand for video;\r
154 *  sensor_720p:                                         Sensor 720p setting, it is for video;\r
155 *  sensor_1080p:                                        Sensor 1080p setting, it is for video;\r
156 *\r
157 *  :::::WARNING:::::\r
158 *  The SensorEnd which is the setting end flag must be filled int the last of each setting;\r
159 */\r
160 \r
161 /* Sensor initial setting */\r
162 static struct rk_sensor_reg sensor_init_data[] ={\r
163         {0x3103, 0x11},\r
164         {0x3008, 0x82},\r
165         SensorWaitMs(5),\r
166         {0x3008, 0x42},\r
167         {0x3103, 0x03},\r
168         {0x3017, 0xff},\r
169         {0x3018, 0xff},\r
170         {0x3034, 0x1a},\r
171         {0x3035, 0x21},\r
172         {0x3036, 0x46},\r
173         {0x3037, 0x12},\r
174         {0x3108, 0x01},\r
175         {0x3630, 0x36},\r
176         {0x3631, 0x0e},\r
177         {0x3632, 0xe2},\r
178         {0x3633, 0x12},\r
179         {0x3621, 0xe0},\r
180         {0x3704, 0xa0},\r
181         {0x3703, 0x5a},\r
182         {0x3715, 0x78},\r
183         {0x3717, 0x01},\r
184         {0x370b, 0x60},\r
185         {0x3705, 0x1a},\r
186         {0x3905, 0x02},\r
187         {0x3906, 0x10},\r
188         {0x3901, 0x0a},\r
189         {0x3731, 0x12},\r
190         {0x3600, 0x08},\r
191         {0x3601, 0x33},\r
192         {0x302d, 0x60},\r
193         {0x3620, 0x52},\r
194         {0x371b, 0x20},\r
195         {0x471c, 0x50},\r
196         {0x3a13, 0x43},\r
197         {0x3a18, 0x00},\r
198         {0x3a19, 0xf8},\r
199         {0x3635, 0x13},\r
200         {0x3636, 0x03},\r
201         {0x3634, 0x40},\r
202         {0x3622, 0x01},\r
203         {0x3c01, 0x34},\r
204         {0x3c04, 0x28},\r
205         {0x3c05, 0x98},\r
206         {0x3c06, 0x00},\r
207         {0x3c07, 0x08},\r
208         {0x3c08, 0x00},\r
209         {0x3c09, 0x1c},\r
210         {0x3c0a, 0x9c},\r
211         {0x3c0b, 0x40},\r
212         {0x3820, 0x41},\r
213         {0x3821, 0x07},\r
214         {0x3814, 0x31},\r
215         {0x3815, 0x31},\r
216         {0x3800, 0x00},\r
217         {0x3801, 0x00},\r
218         {0x3802, 0x00},\r
219         {0x3803, 0x04},\r
220         {0x3804, 0x0a},\r
221         {0x3805, 0x3f},\r
222         {0x3806, 0x07},\r
223         {0x3807, 0x9b},\r
224         {0x3808, 0x03},\r
225         {0x3809, 0x20},\r
226         {0x380a, 0x02},\r
227         {0x380b, 0x58},\r
228         {0x380c, 0x07},\r
229         {0x380d, 0x68},\r
230         {0x380e, 0x03},\r
231         {0x380f, 0xd8},\r
232         {0x3810, 0x00},\r
233         {0x3811, 0x10},\r
234         {0x3812, 0x00},\r
235         {0x3813, 0x06},\r
236         {0x3618, 0x00},\r
237         {0x3612, 0x29},\r
238         {0x3708, 0x64},\r
239         {0x3709, 0x52},\r
240         {0x370c, 0x03},\r
241         {0x3a02, 0x03},\r
242         {0x3a03, 0xd8},\r
243         {0x3a08, 0x01},\r
244         {0x3a09, 0x27},\r
245         {0x3a0a, 0x00},\r
246         {0x3a0b, 0xf6},\r
247         {0x3a0e, 0x03},\r
248         {0x3a0d, 0x04},\r
249         {0x3a14, 0x03},\r
250         {0x3a15, 0xd8},\r
251         {0x4001, 0x02},\r
252         {0x4004, 0x02},\r
253         {0x3000, 0x00},\r
254         {0x3002, 0x1c},\r
255         {0x3004, 0xff},\r
256         {0x3006, 0xc3},\r
257         {0x300e, 0x58},\r
258         {0x302e, 0x00},\r
259         {0x4740, 0x20},\r
260         {0x4300, 0x32},//uyvy:0x32,yuyv:0x30\r
261         {0x501f, 0x00},\r
262         {0x4713, 0x03},\r
263         {0x4407, 0x04},\r
264         {0x440e, 0x00},\r
265         {0x460b, 0x35},\r
266         {0x460c, 0x20},\r
267         {0x4837, 0x22},\r
268         {0x3824, 0x02},\r
269         {0x5000, 0xa7},\r
270         {0x5001, 0xa3},\r
271         {0x5180, 0xff},\r
272         {0x5181, 0xf2},\r
273         {0x5182, 0x00},\r
274         {0x5183, 0x14},\r
275         {0x5184, 0x25},\r
276         {0x5185, 0x24},\r
277         {0x5186, 0x09},\r
278         {0x5187, 0x09},\r
279         {0x5188, 0x09},\r
280         {0x5189, 0x75},\r
281         {0x518a, 0x54},\r
282         {0x518b, 0xe0},\r
283         {0x518c, 0xb2},\r
284         {0x518d, 0x42},\r
285         {0x518e, 0x3d},\r
286         {0x518f, 0x56},\r
287         {0x5190, 0x46},\r
288         {0x5191, 0xf8},\r
289         {0x5192, 0x04},\r
290         {0x5193, 0x70},\r
291         {0x5194, 0xf0},\r
292         {0x5195, 0xf0},\r
293         {0x5196, 0x03},\r
294         {0x5197, 0x01},\r
295         {0x5198, 0x04},\r
296         {0x5199, 0x12},\r
297         {0x519a, 0x04},\r
298         {0x519b, 0x00},\r
299         {0x519c, 0x06},\r
300         {0x519d, 0x82},\r
301         {0x519e, 0x38},\r
302         {0x5381, 0x1e},\r
303         {0x5382, 0x5b},\r
304         {0x5383, 0x08},\r
305         {0x5384, 0x0a},\r
306         {0x5385, 0x7e},\r
307         {0x5386, 0x88},\r
308         {0x5387, 0x7c},\r
309         {0x5388, 0x6c},\r
310         {0x5389, 0x10},\r
311         {0x538a, 0x01},\r
312         {0x538b, 0x98},\r
313         {0x5300, 0x08},\r
314         {0x5301, 0x30},\r
315         {0x5302, 0x10},\r
316         {0x5303, 0x00},\r
317         {0x5304, 0x08},\r
318         {0x5305, 0x30},\r
319         {0x5306, 0x08},\r
320         {0x5307, 0x16},\r
321         {0x5309, 0x08},\r
322         {0x530a, 0x30},\r
323         {0x530b, 0x04},\r
324         {0x530c, 0x06},\r
325         {0x5480, 0x01},\r
326         {0x5481, 0x08},\r
327         {0x5482, 0x14},\r
328         {0x5483, 0x28},\r
329         {0x5484, 0x51},\r
330         {0x5485, 0x65},\r
331         {0x5486, 0x71},\r
332         {0x5487, 0x7d},\r
333         {0x5488, 0x87},\r
334         {0x5489, 0x91},\r
335         {0x548a, 0x9a},\r
336         {0x548b, 0xaa},\r
337         {0x548c, 0xb8},\r
338         {0x548d, 0xcd},\r
339         {0x548e, 0xdd},\r
340         {0x548f, 0xea},\r
341         {0x5490, 0x1d},\r
342         {0x5580, 0x02},\r
343         {0x5583, 0x40},\r
344         {0x5584, 0x10},\r
345         {0x5589, 0x10},\r
346         {0x558a, 0x00},\r
347         {0x558b, 0xf8},\r
348         {0x5800, 0x23},\r
349         {0x5801, 0x14},\r
350         {0x5802, 0x0f},\r
351         {0x5803, 0x0f},\r
352         {0x5804, 0x12},\r
353         {0x5805, 0x26},\r
354         {0x5806, 0x0c},\r
355         {0x5807, 0x08},\r
356         {0x5808, 0x05},\r
357         {0x5809, 0x05},\r
358         {0x580a, 0x08},\r
359         {0x580b, 0x0d},\r
360         {0x580c, 0x08},\r
361         {0x580d, 0x03},\r
362         {0x580e, 0x00},\r
363         {0x580f, 0x00},\r
364         {0x5810, 0x03},\r
365         {0x5811, 0x09},\r
366         {0x5812, 0x07},\r
367         {0x5813, 0x03},\r
368         {0x5814, 0x00},\r
369         {0x5815, 0x01},\r
370         {0x5816, 0x03},\r
371         {0x5817, 0x08},\r
372         {0x5818, 0x0d},\r
373         {0x5819, 0x08},\r
374         {0x581a, 0x05},\r
375         {0x581b, 0x06},\r
376         {0x581c, 0x08},\r
377         {0x581d, 0x0e},\r
378         {0x581e, 0x29},\r
379         {0x581f, 0x17},\r
380         {0x5820, 0x11},\r
381         {0x5821, 0x11},\r
382         {0x5822, 0x15},\r
383         {0x5823, 0x28},\r
384         {0x5824, 0x46},\r
385         {0x5825, 0x26},\r
386         {0x5826, 0x08},\r
387         {0x5827, 0x26},\r
388         {0x5828, 0x64},\r
389         {0x5829, 0x26},\r
390         {0x582a, 0x24},\r
391         {0x582b, 0x22},\r
392         {0x582c, 0x24},\r
393         {0x582d, 0x24},\r
394         {0x582e, 0x06},\r
395         {0x582f, 0x22},\r
396         {0x5830, 0x40},\r
397         {0x5831, 0x42},\r
398         {0x5832, 0x24},\r
399         {0x5833, 0x26},\r
400         {0x5834, 0x24},\r
401         {0x5835, 0x22},\r
402         {0x5836, 0x22},\r
403         {0x5837, 0x26},\r
404         {0x5838, 0x44},\r
405         {0x5839, 0x24},\r
406         {0x583a, 0x26},\r
407         {0x583b, 0x28},\r
408         {0x583c, 0x42},\r
409         {0x583d, 0xce},\r
410         {0x5025, 0x00},\r
411         {0x3a0f, 0x30},\r
412         {0x3a10, 0x28},\r
413         {0x3a1b, 0x30},\r
414         {0x3a1e, 0x26},\r
415         {0x3a11, 0x60},\r
416         {0x3a1f, 0x14},\r
417         {0x3008, 0x02},\r
418         {0x302c, 0xc2},\r
419         SensorWaitUs(1000),\r
420         SensorEnd\r
421 };\r
422 /* Senor full resolution setting: recommand for capture */\r
423 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={\r
424 \r
425         {0x3820, 0x40}, \r
426         {0x3821, 0x06}, \r
427         {0x3814, 0x11}, \r
428         {0x3815, 0x11}, \r
429         {0x3803, 0x00}, \r
430         {0x3807, 0x9f}, \r
431         {0x3808, 0x0a}, \r
432         {0x3809, 0x20}, \r
433         {0x380a, 0x07}, \r
434         {0x380b, 0x98}, \r
435         {0x380c, 0x0b}, \r
436         {0x380d, 0x1c}, \r
437         {0x380e, 0x07}, \r
438         {0x380f, 0xb0}, \r
439         {0x3811, 0x10}, //\r
440         {0x3813, 0x04}, \r
441         {0x3618, 0x04}, \r
442         {0x3612, 0x2b}, //4b \r
443         {0x3708, 0x64},\r
444         {0x3709, 0x12}, \r
445         {0x370c, 0x00}, \r
446         {0x3a02, 0x07}, \r
447         {0x3a03, 0xb0}, \r
448         {0x3a0e, 0x06}, \r
449         {0x3a0d, 0x08}, \r
450         {0x3a14, 0x07}, \r
451         {0x3a15, 0xb0}, \r
452         {0x4004, 0x06},\r
453         {0x5000, 0xa7}, \r
454         {0x5001, 0x83},\r
455         {0x519e, 0x38},\r
456         {0x5381, 0x1e},\r
457         {0x5382, 0x5b},\r
458         {0x5383, 0x08},\r
459         {0x460b, 0x37}, \r
460         {0x460c, 0x20}, \r
461         {0x3824, 0x01}, \r
462         {0x4005, 0x1A}, \r
463         SensorEnd\r
464 };\r
465 /* Senor full resolution setting: recommand for video */\r
466 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={\r
467         SensorEnd\r
468 };\r
469 /* Preview resolution setting*/\r
470 static struct rk_sensor_reg sensor_preview_data[] =\r
471 {\r
472         {0x3503, 0x00},\r
473         {0x3c07, 0x08},\r
474         {0x3820, 0x41},\r
475         {0x3821, 0x07},\r
476         {0x3814, 0x31},\r
477         {0x3815, 0x31},\r
478         {0x3803, 0x04},\r
479         {0x3806, 0x07},///\r
480         {0x3807, 0x9b},\r
481         {0x3808, 0x03},\r
482         {0x3809, 0x20},\r
483         {0x380a, 0x02},\r
484         {0x380b, 0x58},\r
485         {0x380c, 0x07},\r
486         {0x380d, 0x68},\r
487         {0x380e, 0x03},\r
488         {0x380f, 0xd8},\r
489         {0x3813, 0x06},\r
490         {0x3618, 0x00},\r
491         {0x3612, 0x29},\r
492         {0x3709, 0x52},\r
493         {0x370c, 0x03},\r
494         {0x3a02, 0x03},\r
495         {0x3a03, 0xd8},\r
496         {0x3a08 ,0x01},///\r
497         {0x3a09, 0x27},///\r
498         {0x3a0a, 0x00},///\r
499         {0x3a0b, 0xf6},///\r
500         {0x3a0e, 0x03},\r
501         {0x3a0d, 0x04},\r
502         {0x3a14, 0x03},\r
503         {0x3a15, 0xd8},\r
504         {0x4004, 0x02},\r
505         {0x3002, 0x1c},////\r
506         {0x4713, 0x03},////\r
507         {0x3035, 0x21},\r
508         {0x3036, 0x46},\r
509         {0x4837, 0x22},\r
510         {0x3824, 0x02},////\r
511         {0x5001, 0xa3},\r
512 \r
513         SensorEnd\r
514 };\r
515 /* 1280x720 */\r
516 static struct rk_sensor_reg sensor_720p[]={\r
517         {0x3503, 0x00},\r
518                 \r
519         {0x3c07,0x07},\r
520         {0x3803,0xfa},\r
521         {0x3806,0x06},////\r
522         {0x3807,0xa9},\r
523         {0x3808,0x05},\r
524         {0x3809,0x00},\r
525         {0x380a,0x02},\r
526         {0x380b,0xd0},\r
527         {0x380c,0x07},\r
528         {0x380d,0x64},\r
529         {0x380e,0x02},\r
530         {0x380f,0xe4},\r
531         {0x3813,0x04},\r
532         {0x3a02,0x02},\r
533         {0x3a03,0xe4},\r
534         {0x3a08,0x01},///\r
535         {0x3a09,0xbc},////\r
536         {0x3a0a,0x01},///\r
537         {0x3a0b,0x72},////\r
538         {0x3a0e,0x01},\r
539         {0x3a0d,0x02},\r
540         {0x3a14,0x02},\r
541         {0x3a15,0xe4},\r
542         \r
543         {0x3820, 0x41}, //ddl@rock-chips.com add start: qsxvga -> 720p isn't stream on \r
544         {0x3821, 0x07},\r
545         {0x3814, 0x31},\r
546         {0x3815, 0x31},\r
547         \r
548         {0x3618, 0x00},\r
549         {0x3612, 0x29},\r
550         {0x3709, 0x52},\r
551         {0x370c, 0x03},\r
552         {0x3a02, 0x03},\r
553         {0x3a03, 0xd8},\r
554         {0x3a08 ,0x01},///\r
555         {0x3a09, 0x27},///\r
556         {0x3a0a, 0x00},///\r
557         {0x3a0b, 0xf6},///\r
558         {0x3a0e, 0x03},\r
559         {0x3a0d, 0x04},\r
560         {0x3a14, 0x03},\r
561         {0x3a15, 0xd8},\r
562         {0x4004, 0x02},\r
563         {0x3002, 0x1c},////\r
564         {0x4713, 0x03},//////ddl@rock-chips.com add end\r
565         \r
566         {0x3002,0x00},///\r
567         {0x4713,0x02},///\r
568         {0x4837,0x16},\r
569         {0x3824,0x04},///\r
570         {0x5001,0x83},\r
571         {0x3035,0x21},\r
572         {0x3036,0x46},\r
573         \r
574         {0x4837, 0x22},\r
575         {0x5001, 0xa3},\r
576         SensorEnd\r
577 };\r
578 \r
579 /* 1920x1080 */\r
580 static struct rk_sensor_reg sensor_1080p[]={\r
581         SensorEnd\r
582 };\r
583 \r
584 \r
585 static struct rk_sensor_reg sensor_softreset_data[]={\r
586         SensorRegVal(0x3008, 0x80),\r
587         SensorWaitMs(5),\r
588         SensorEnd\r
589 };\r
590 \r
591 static struct rk_sensor_reg sensor_check_id_data[]={\r
592         SensorRegVal(0x300a,0),\r
593         SensorRegVal(0x300b,0),\r
594         SensorEnd\r
595 };\r
596 /*\r
597 *  The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx\r
598 */\r
599 static struct rk_sensor_reg sensor_WhiteB_Auto[]=\r
600 {\r
601         {0x3406 ,0x00},\r
602         {0x5192 ,0x04},\r
603         {0x5191 ,0xf8},\r
604         {0x5193 ,0x70},\r
605         {0x5194 ,0xf0},\r
606         {0x5195 ,0xf0},\r
607         {0x518d ,0x3d},\r
608         {0x518f ,0x54},\r
609         {0x518e ,0x3d},\r
610         {0x5190 ,0x54},\r
611         {0x518b ,0xa8},\r
612         {0x518c ,0xa8},\r
613         {0x5187 ,0x18},\r
614         {0x5188 ,0x18},\r
615         {0x5189 ,0x6e},\r
616         {0x518a ,0x68},\r
617         {0x5186 ,0x1c},\r
618         {0x5181 ,0x50},\r
619         {0x5184 ,0x25},\r
620         {0x5182 ,0x11},\r
621         {0x5183 ,0x14},\r
622         {0x5184 ,0x25},\r
623         {0x5185 ,0x24},\r
624         SensorEnd\r
625 };\r
626 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
627 static  struct rk_sensor_reg sensor_WhiteB_Cloudy[]=\r
628 {\r
629         {0x3406 ,0x1 },\r
630         {0x3400 ,0x6 },\r
631         {0x3401 ,0x48},\r
632         {0x3402 ,0x4 },\r
633         {0x3403 ,0x0 },\r
634         {0x3404 ,0x4 },\r
635         {0x3405 ,0xd3 },\r
636         SensorEnd\r
637 };\r
638 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
639 static  struct rk_sensor_reg sensor_WhiteB_ClearDay[]=\r
640 {\r
641         {0x3406 ,0x1 },\r
642         {0x3400 ,0x6 },\r
643         {0x3401 ,0x1c},\r
644         {0x3402 ,0x4 },\r
645         {0x3403 ,0x0 },\r
646         {0x3404 ,0x4 },\r
647         {0x3405 ,0xf3},\r
648         SensorEnd\r
649 };\r
650 /* Office Colour Temperature : 3500K - 5000K  */\r
651 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=\r
652 {\r
653         //Office\r
654         {0x3406 ,0x1 },\r
655         {0x3400 ,0x5 },\r
656         {0x3401 ,0x48},\r
657         {0x3402 ,0x4 },\r
658         {0x3403 ,0x0 },\r
659         {0x3404 ,0x7 },\r
660         {0x3405 ,0xcf},\r
661         SensorEnd\r
662 \r
663 };\r
664 /* Home Colour Temperature : 2500K - 3500K      */\r
665 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=\r
666 {\r
667         //Home\r
668         {0x3406 ,0x1 },\r
669         {0x3400 ,0x4 },\r
670         {0x3401 ,0x10},\r
671         {0x3402 ,0x4 },\r
672         {0x3403 ,0x0 },\r
673         {0x3404 ,0x8 },\r
674         {0x3405 ,0xb6},\r
675         SensorEnd\r
676 };\r
677 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
678         sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
679 };\r
680 \r
681 static  struct rk_sensor_reg sensor_Brightness0[]=\r
682 {\r
683         // Brightness -2\r
684         SensorEnd\r
685 };\r
686 \r
687 static  struct rk_sensor_reg sensor_Brightness1[]=\r
688 {\r
689         // Brightness -1\r
690 \r
691         SensorEnd\r
692 };\r
693 \r
694 static  struct rk_sensor_reg sensor_Brightness2[]=\r
695 {\r
696         //      Brightness 0\r
697 \r
698         SensorEnd\r
699 };\r
700 \r
701 static  struct rk_sensor_reg sensor_Brightness3[]=\r
702 {\r
703         // Brightness +1\r
704 \r
705         SensorEnd\r
706 };\r
707 \r
708 static  struct rk_sensor_reg sensor_Brightness4[]=\r
709 {\r
710         //      Brightness +2\r
711 \r
712         SensorEnd\r
713 };\r
714 \r
715 static  struct rk_sensor_reg sensor_Brightness5[]=\r
716 {\r
717         //      Brightness +3\r
718 \r
719         SensorEnd\r
720 };\r
721 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
722         sensor_Brightness4, sensor_Brightness5,NULL,\r
723 };\r
724 \r
725 static  struct rk_sensor_reg sensor_Effect_Normal[] =\r
726 {\r
727         {0x5001, 0x7f},\r
728         {0x5580, 0x00},\r
729         SensorEnd\r
730 };\r
731 \r
732 static  struct rk_sensor_reg sensor_Effect_WandB[] =\r
733 {\r
734         {0x5001, 0xff},\r
735         {0x5580, 0x18},\r
736         {0x5583, 0x80},\r
737         {0x5584, 0x80},\r
738         SensorEnd\r
739 };\r
740 \r
741 static  struct rk_sensor_reg sensor_Effect_Sepia[] =\r
742 {\r
743         {0x5001, 0xff},\r
744         {0x5580, 0x18},\r
745         {0x5583, 0x40},\r
746         {0x5584, 0xa0},\r
747         SensorEnd\r
748 };\r
749 \r
750 static  struct rk_sensor_reg sensor_Effect_Negative[] =\r
751 {\r
752         //Negative\r
753         {0x5001, 0xff},\r
754         {0x5580, 0x40},\r
755         SensorEnd\r
756 };\r
757 static  struct rk_sensor_reg sensor_Effect_Bluish[] =\r
758 {\r
759         // Bluish\r
760         {0x5001, 0xff},\r
761         {0x5580, 0x18},\r
762         {0x5583, 0xa0},\r
763         {0x5584, 0x40},\r
764         SensorEnd\r
765 };\r
766 \r
767 static  struct rk_sensor_reg sensor_Effect_Green[] =\r
768 {\r
769         //      Greenish\r
770         {0x5001, 0xff},\r
771         {0x5580, 0x18},\r
772         {0x5583, 0x60},\r
773         {0x5584, 0x60},\r
774         SensorEnd\r
775 };\r
776 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
777         sensor_Effect_Bluish, sensor_Effect_Green,NULL,\r
778 };\r
779 \r
780 static  struct rk_sensor_reg sensor_Exposure0[]=\r
781 {\r
782         {0x3a0f, 0x10},\r
783         {0x3a10, 0x08},\r
784         {0x3a1b, 0x10},\r
785         {0x3a1e, 0x08},\r
786         {0x3a11, 0x20},\r
787         {0x3a1f, 0x10},\r
788         SensorEnd\r
789 };\r
790 \r
791 static  struct rk_sensor_reg sensor_Exposure1[]=\r
792 {\r
793         {0x3a0f, 0x20},\r
794         {0x3a10, 0x18},\r
795         {0x3a11, 0x41},\r
796         {0x3a1b, 0x20},\r
797         {0x3a1e, 0x18},\r
798         {0x3a1f, 0x10},\r
799         SensorEnd\r
800 };\r
801 \r
802 static  struct rk_sensor_reg sensor_Exposure2[]=\r
803 {\r
804         {0x3a0f, 0x30},\r
805         {0x3a10, 0x28},\r
806         {0x3a11, 0x61},\r
807         {0x3a1b, 0x30},\r
808         {0x3a1e, 0x28},\r
809         {0x3a1f, 0x10},\r
810         SensorEnd\r
811 };\r
812 \r
813 static  struct rk_sensor_reg sensor_Exposure3[]=\r
814 {\r
815         {0x3a0f, 0x38},\r
816         {0x3a10, 0x30},\r
817         {0x3a11, 0x61},\r
818         {0x3a1b, 0x38},\r
819         {0x3a1e, 0x30},\r
820         {0x3a1f, 0x10},\r
821         SensorEnd\r
822 };\r
823 \r
824 static  struct rk_sensor_reg sensor_Exposure4[]=\r
825 {\r
826         {0x3a0f, 0x40},\r
827         {0x3a10, 0x38},\r
828         {0x3a11, 0x71},\r
829         {0x3a1b, 0x40},\r
830         {0x3a1e, 0x38},\r
831         {0x3a1f, 0x10},\r
832         SensorEnd\r
833 };\r
834 \r
835 static  struct rk_sensor_reg sensor_Exposure5[]=\r
836 {\r
837         {0x3a0f, 0x50},\r
838         {0x3a10, 0x48},\r
839         {0x3a11, 0x90},\r
840         {0x3a1b, 0x50},\r
841         {0x3a1e, 0x48},\r
842         {0x3a1f, 0x20},\r
843         SensorEnd\r
844 };\r
845 \r
846 static  struct rk_sensor_reg sensor_Exposure6[]=\r
847 {\r
848         {0x3a0f, 0x60},\r
849         {0x3a10, 0x58},\r
850         {0x3a11, 0xa0},\r
851         {0x3a1b, 0x60},\r
852         {0x3a1e, 0x58},\r
853         {0x3a1f, 0x20},\r
854         SensorEnd\r
855 };\r
856 \r
857 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
858         sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
859 };\r
860 \r
861 static  struct rk_sensor_reg sensor_Saturation0[]=\r
862 {\r
863         SensorEnd\r
864 };\r
865 \r
866 static  struct rk_sensor_reg sensor_Saturation1[]=\r
867 {\r
868         SensorEnd\r
869 };\r
870 \r
871 static  struct rk_sensor_reg sensor_Saturation2[]=\r
872 {\r
873         SensorEnd\r
874 };\r
875 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
876 \r
877 static  struct rk_sensor_reg sensor_Contrast0[]=\r
878 {\r
879         SensorEnd\r
880 };\r
881 \r
882 static  struct rk_sensor_reg sensor_Contrast1[]=\r
883 {\r
884         SensorEnd\r
885 };\r
886 \r
887 static  struct rk_sensor_reg sensor_Contrast2[]=\r
888 {\r
889         SensorEnd\r
890 };\r
891 \r
892 static  struct rk_sensor_reg sensor_Contrast3[]=\r
893 {\r
894         SensorEnd\r
895 };\r
896 \r
897 static  struct rk_sensor_reg sensor_Contrast4[]=\r
898 {\r
899         SensorEnd\r
900 };\r
901 \r
902 \r
903 static  struct rk_sensor_reg sensor_Contrast5[]=\r
904 {\r
905         SensorEnd\r
906 };\r
907 \r
908 static  struct rk_sensor_reg sensor_Contrast6[]=\r
909 {\r
910         SensorEnd\r
911 };\r
912 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
913         sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
914 };\r
915 static  struct rk_sensor_reg sensor_SceneAuto[] =\r
916 {\r
917         {0x3a00, 0x78},\r
918         SensorEnd\r
919 };\r
920 \r
921 static  struct rk_sensor_reg sensor_SceneNight[] =\r
922 {\r
923         //15fps ~ 3.75fps night mode for 60/50Hz light environment, 24Mhz clock input,24Mzh pclk\r
924         {0x3034 ,0x1a},\r
925         {0x3035 ,0x21},\r
926         {0x3036 ,0x46},\r
927         {0x3037 ,0x13},\r
928         {0x3038 ,0x00},\r
929         {0x3039 ,0x00},\r
930         {0x3a00 ,0x7c},\r
931         {0x3a08 ,0x01},\r
932         {0x3a09 ,0x27},\r
933         {0x3a0a ,0x00},\r
934         {0x3a0b ,0xf6},\r
935         {0x3a0d ,0x04},\r
936         {0x3a0e ,0x04},\r
937         {0x3a02 ,0x0b},\r
938         {0x3a03 ,0x88},\r
939         {0x3a14 ,0x0b},\r
940         {0x3a15 ,0x88},\r
941         SensorEnd\r
942 };\r
943 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
944 \r
945 static struct rk_sensor_reg sensor_Zoom0[] =\r
946 {\r
947         SensorEnd\r
948 };\r
949 \r
950 static struct rk_sensor_reg sensor_Zoom1[] =\r
951 {\r
952         SensorEnd\r
953 };\r
954 \r
955 static struct rk_sensor_reg sensor_Zoom2[] =\r
956 {\r
957         SensorEnd\r
958 };\r
959 \r
960 \r
961 static struct rk_sensor_reg sensor_Zoom3[] =\r
962 {\r
963         SensorEnd\r
964 };\r
965 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
966 \r
967 /*\r
968 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu\r
969 */\r
970 static struct v4l2_querymenu sensor_menus[] =\r
971 {\r
972 };\r
973 /*\r
974 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl\r
975 */\r
976 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =\r
977 {\r
978 };\r
979 \r
980 //MUST define the current used format as the first item   \r
981 static struct rk_sensor_datafmt sensor_colour_fmts[] = {\r
982         {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG} \r
983 };\r
984 static struct soc_camera_ops sensor_ops;\r
985 \r
986 \r
987 /*\r
988 **********************************************************\r
989 * Following is local code:\r
990\r
991 * Please codeing your program here \r
992 **********************************************************\r
993 */\r
994         static int sensor_parameter_record(struct i2c_client *client)\r
995         {\r
996                 u8 ret_l,ret_m,ret_h;\r
997                 int tp_l,tp_m,tp_h;\r
998                 struct generic_sensor*sensor = to_generic_sensor(client);\r
999                 struct specific_sensor *spsensor = to_specific_sensor(sensor);\r
1000                 sensor_read(client,0x3a00, &ret_l);\r
1001                 sensor_write(client,0x3a00, ret_l&0xfb);\r
1002         \r
1003                 sensor_write(client,0x3503,0x07);       //stop AE/AG\r
1004                 sensor_read(client,0x3406, &ret_l);\r
1005                 sensor_write(client,0x3406, ret_l|0x01);\r
1006         \r
1007                 sensor_read(client,0x3500,&ret_h);\r
1008                 sensor_read(client,0x3501, &ret_m);\r
1009                 sensor_read(client,0x3502, &ret_l);\r
1010                 tp_l = ret_l;\r
1011                 tp_m = ret_m;\r
1012                 tp_h = ret_h;\r
1013                 spsensor->parameter.preview_exposure = ((tp_h<<12) & 0xF000) | ((tp_m<<4) & 0x0FF0) | ((tp_l>>4) & 0x0F);\r
1014                 \r
1015                 //Read back AGC Gain for preview\r
1016                 sensor_read(client,0x350b, &ret_l);\r
1017                 spsensor->parameter.preview_gain = ret_l;\r
1018                 \r
1019                 SENSOR_DG(" %s Read 0x350b=0x%02x  PreviewExposure:%d 0x3500=0x%02x  0x3501=0x%02x 0x3502=0x%02x \n",\r
1020                  SENSOR_NAME_STRING(), tp_l,spsensor->parameter.preview_exposure,tp_h, tp_m, tp_l);\r
1021                 return 0;\r
1022         }\r
1023 #define OV5640_FULL_PERIOD_PIXEL_NUMS_HTS                 (2844) \r
1024 #define OV5640_FULL_PERIOD_LINE_NUMS_VTS                  (1968) \r
1025 #define OV5640_PV_PERIOD_PIXEL_NUMS_HTS                   (1896) \r
1026 #define OV5640_PV_PERIOD_LINE_NUMS_VTS                    (984) \r
1027         static int sensor_ae_transfer(struct i2c_client *client)\r
1028         {\r
1029                 u8      ExposureLow;\r
1030                 u8      ExposureMid;\r
1031                 u8      ExposureHigh;\r
1032                 u16 ulCapture_Exposure;\r
1033                 u16 Preview_Maxlines;\r
1034                 u8      Gain;\r
1035                 u16 OV5640_g_iExtra_ExpLines;\r
1036                 struct generic_sensor*sensor = to_generic_sensor(client);\r
1037                 struct specific_sensor *spsensor = to_specific_sensor(sensor);\r
1038                 //Preview_Maxlines = sensor->parameter.preview_line_width;\r
1039                 Preview_Maxlines = spsensor->parameter.preview_maxlines;\r
1040                 Gain = spsensor->parameter.preview_gain;\r
1041                 \r
1042                 \r
1043                 ulCapture_Exposure = (spsensor->parameter.preview_exposure*OV5640_PV_PERIOD_PIXEL_NUMS_HTS)/OV5640_FULL_PERIOD_PIXEL_NUMS_HTS;\r
1044                                                 \r
1045                 SENSOR_DG("cap shutter calutaed = %d, 0x%x\n", ulCapture_Exposure,ulCapture_Exposure);\r
1046                 \r
1047                 // write the gain and exposure to 0x350* registers      \r
1048                 sensor_write(client,0x350b, Gain);      \r
1049         \r
1050                 if (ulCapture_Exposure <= 1940) {\r
1051                         OV5640_g_iExtra_ExpLines = 0;\r
1052                 }else {\r
1053                         OV5640_g_iExtra_ExpLines = ulCapture_Exposure - 1940;\r
1054                 }\r
1055                 SENSOR_DG("Set Extra-line = %d, iExp = %d \n", OV5640_g_iExtra_ExpLines, ulCapture_Exposure);\r
1056         \r
1057                 ExposureLow = (ulCapture_Exposure<<4)&0xff;\r
1058                 ExposureMid = (ulCapture_Exposure>>4)&0xff;\r
1059                 ExposureHigh = (ulCapture_Exposure>>12);\r
1060                 \r
1061                 sensor_write(client,0x350c, (OV5640_g_iExtra_ExpLines&0xff00)>>8);\r
1062                 sensor_write(client,0x350d, OV5640_g_iExtra_ExpLines&0xff);\r
1063                 sensor_write(client,0x3502, ExposureLow);\r
1064                 sensor_write(client,0x3501, ExposureMid);\r
1065                 sensor_write(client,0x3500, ExposureHigh);\r
1066         \r
1067                 //SENSOR_DG(" %s Write 0x350b=0x%02x 0x350c=0x%2x  0x350d=0x%2x 0x3502=0x%02x 0x3501=0x%02x 0x3500=0x%02x\n",SENSOR_NAME_STRING(), Gain, ExposureLow, ExposureMid, ExposureHigh);\r
1068                 mdelay(100);\r
1069                 return 0;\r
1070         }\r
1071 /*\r
1072 **********************************************************\r
1073 * Following is callback\r
1074 * If necessary, you could coding these callback\r
1075 **********************************************************\r
1076 */\r
1077 /*\r
1078 * the function is called in open sensor  \r
1079 */\r
1080 static int sensor_activate_cb(struct i2c_client *client)\r
1081 {\r
1082         SENSOR_DG("%s",__FUNCTION__);\r
1083         return 0;\r
1084 }\r
1085 /*\r
1086 * the function is called in close sensor\r
1087 */\r
1088 static int sensor_deactivate_cb(struct i2c_client *client)\r
1089 {\r
1090 \r
1091         SENSOR_DG("%s",__FUNCTION__);\r
1092         \r
1093         \r
1094         return 0;\r
1095 }\r
1096 /*\r
1097 * the function is called before sensor register setting in VIDIOC_S_FMT  \r
1098 */\r
1099 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
1100 {\r
1101         //struct generic_sensor*sensor = to_generic_sensor(client);\r
1102         \r
1103         if (capture) {\r
1104                 sensor_parameter_record(client);\r
1105         }\r
1106         return 0;\r
1107 }\r
1108 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
1109 {\r
1110         \r
1111         return 0;\r
1112 }\r
1113 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
1114 {\r
1115         return 0;\r
1116 }\r
1117 \r
1118 /*\r
1119 * the function is called after sensor register setting finished in VIDIOC_S_FMT  \r
1120 */\r
1121 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
1122 {\r
1123         //struct generic_sensor*sensor = to_generic_sensor(client);\r
1124         if (capture) {\r
1125                 sensor_ae_transfer(client);\r
1126         }\r
1127         msleep(400);\r
1128         return 0;\r
1129 }\r
1130 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)\r
1131 {\r
1132         return 0;\r
1133 }\r
1134 \r
1135 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
1136 {\r
1137         //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1138                 \r
1139         if (pm_msg.event == PM_EVENT_SUSPEND) {\r
1140                 SENSOR_DG("Suspend");\r
1141                 \r
1142         } else {\r
1143                 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);\r
1144                 return -EINVAL;\r
1145         }\r
1146         return 0;\r
1147 }\r
1148 \r
1149 static int sensor_resume(struct soc_camera_device *icd)\r
1150 {\r
1151 \r
1152         SENSOR_DG("Resume");\r
1153 \r
1154         return 0;\r
1155 \r
1156 }\r
1157 static int sensor_mirror_cb (struct i2c_client *client, int mirror)\r
1158 {\r
1159         \r
1160         SENSOR_DG("mirror: %d",mirror);\r
1161 \r
1162         return 0;    \r
1163 }\r
1164 /*\r
1165 * the function is v4l2 control V4L2_CID_HFLIP callback  \r
1166 */\r
1167 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1168                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
1169 {\r
1170         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1171 \r
1172         if (sensor_mirror_cb(client,ext_ctrl->value) != 0)\r
1173                 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);\r
1174         \r
1175         SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);\r
1176         return 0;\r
1177 }\r
1178 \r
1179 static int sensor_flip_cb(struct i2c_client *client, int flip)\r
1180 {\r
1181         SENSOR_DG("flip: %d",flip);\r
1182 \r
1183         return 0;    \r
1184 }\r
1185 /*\r
1186 * the function is v4l2 control V4L2_CID_VFLIP callback  \r
1187 */\r
1188 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1189                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
1190 {\r
1191         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1192 \r
1193         if (sensor_flip_cb(client,ext_ctrl->value) != 0)\r
1194                 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);\r
1195         \r
1196         SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);\r
1197         return 0;\r
1198 }\r
1199 /*\r
1200 * the functions are focus callbacks\r
1201 */\r
1202 /*\r
1203 for 5640 focus\r
1204 */\r
1205 struct af_cmdinfo\r
1206 {\r
1207         char cmd_tag;\r
1208         char cmd_para[4];\r
1209         char validate_bit;\r
1210 };\r
1211 static int sensor_af_cmdset(struct i2c_client *client, int cmd_main, struct af_cmdinfo *cmdinfo)\r
1212 {\r
1213         int i;\r
1214         char read_tag=0xff,cnt;\r
1215 \r
1216         if (cmdinfo) {\r
1217                 for (i=0; i<4; i++) {\r
1218                         if (cmdinfo->validate_bit & (1<<i)) {\r
1219                                 if (sensor_write(client, CMD_PARA0_Reg+i, cmdinfo->cmd_para[i])) {\r
1220                                         SENSOR_TR("%s write CMD_PARA_Reg(main:0x%x para%d:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main,i,cmdinfo->cmd_para[i]);\r
1221                                         goto sensor_af_cmdset_err;\r
1222                                 }\r
1223                                 SENSOR_DG("%s write CMD_PARA_Reg(main:0x%x para%d:0x%x) success!\n",SENSOR_NAME_STRING(),cmd_main,i,cmdinfo->cmd_para[i]);\r
1224                         }\r
1225                 }\r
1226         \r
1227                 if (cmdinfo->validate_bit & 0x80) {\r
1228                         if (sensor_write(client, CMD_ACK_Reg, cmdinfo->cmd_tag)) {\r
1229                                 SENSOR_TR("%s write CMD_ACK_Reg(main:0x%x tag:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main,cmdinfo->cmd_tag);\r
1230                                 goto sensor_af_cmdset_err;\r
1231                         }\r
1232                         SENSOR_DG("%s write CMD_ACK_Reg(main:0x%x tag:0x%x) success!\n",SENSOR_NAME_STRING(),cmd_main,cmdinfo->cmd_tag);\r
1233                 }\r
1234                 \r
1235         } else {\r
1236                 if (sensor_write(client, CMD_ACK_Reg, 0x01)) {\r
1237                         SENSOR_TR("%s write CMD_ACK_Reg(main:0x%x no tag) error!\n",SENSOR_NAME_STRING(),cmd_main);\r
1238                         goto sensor_af_cmdset_err;\r
1239                 }\r
1240                 SENSOR_DG("%s write CMD_ACK_Reg(main:0x%x no tag) success!\n",SENSOR_NAME_STRING(),cmd_main);\r
1241         }\r
1242 \r
1243         if (sensor_write(client, CMD_MAIN_Reg, cmd_main)) {\r
1244                 SENSOR_TR("%s write CMD_MAIN_Reg(main:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main);\r
1245                 goto sensor_af_cmdset_err;\r
1246         }\r
1247 \r
1248         cnt = 0;\r
1249         do\r
1250         {\r
1251                 msleep(5);\r
1252                 if (sensor_read(client,CMD_ACK_Reg,&read_tag)){\r
1253                    SENSOR_TR("%s[%d] read TAG failed\n",SENSOR_NAME_STRING(),__LINE__);\r
1254                    break;\r
1255                 }\r
1256         } while((read_tag != 0x00)&& (cnt++<100));\r
1257 \r
1258         SENSOR_DG("%s write CMD_MAIN_Reg(main:0x%x read tag:0x%x) success!\n",SENSOR_NAME_STRING(),cmd_main,read_tag);\r
1259         return 0;\r
1260 sensor_af_cmdset_err:\r
1261         return -1;\r
1262 }\r
1263 static int sensor_af_idlechk(struct i2c_client *client)\r
1264 {\r
1265         int ret = 0;\r
1266         char state; \r
1267         struct af_cmdinfo cmdinfo;\r
1268         \r
1269         SENSOR_DG("%s , %d\n",__FUNCTION__,__LINE__);\r
1270         \r
1271         cmdinfo.cmd_tag = 0x01;\r
1272         cmdinfo.validate_bit = 0x80;\r
1273         ret = sensor_af_cmdset(client, ReturnIdle_Cmd, &cmdinfo);\r
1274         if(0 != ret) {\r
1275                 SENSOR_TR("%s[%d] read focus_status failed\n",SENSOR_NAME_STRING(),__LINE__);\r
1276                 ret = -1;\r
1277                 goto sensor_af_idlechk_end;\r
1278         }\r
1279         \r
1280 \r
1281         do{\r
1282                 ret = sensor_read(client, CMD_ACK_Reg, &state);\r
1283                 if (ret != 0){\r
1284                    SENSOR_TR("%s[%d] read focus_status failed\n",SENSOR_NAME_STRING(),__LINE__);\r
1285                    ret = -1;\r
1286                    goto sensor_af_idlechk_end;\r
1287                 }\r
1288         }while(0x00 != state);\r
1289 \r
1290         SENSOR_DG("%s , %d\n",__FUNCTION__,__LINE__);\r
1291 sensor_af_idlechk_end:\r
1292         return ret;\r
1293 }\r
1294 /*for 5640 focus end*/\r
1295 //\r
1296 static int sensor_focus_af_single_usr_cb(struct i2c_client *client);\r
1297 \r
1298 static int sensor_focus_init_usr_cb(struct i2c_client *client)\r
1299 {\r
1300     int ret = 0, cnt;\r
1301     char state;\r
1302 \r
1303     msleep(1);\r
1304     ret = sensor_write_array(client, sensor_af_firmware);\r
1305     if (ret != 0) {\r
1306         SENSOR_TR("%s Download firmware failed\n",SENSOR_NAME_STRING());\r
1307         ret = -1;\r
1308         goto sensor_af_init_end;\r
1309     }\r
1310 \r
1311     cnt = 0;\r
1312     do\r
1313     {\r
1314         msleep(1);\r
1315         if (cnt++ > 500)\r
1316                 break;\r
1317         ret = sensor_read(client, STA_FOCUS_Reg, &state);\r
1318         if (ret != 0){\r
1319            SENSOR_TR("%s[%d] read focus_status failed\n",SENSOR_NAME_STRING(),__LINE__);\r
1320            ret = -1;\r
1321            goto sensor_af_init_end;\r
1322         }\r
1323     } while (state != S_IDLE);\r
1324 \r
1325     if (state != S_IDLE) {\r
1326         SENSOR_TR("%s focus state(0x%x) is error!\n",SENSOR_NAME_STRING(),state);\r
1327         ret = -1;\r
1328         goto sensor_af_init_end;\r
1329     }\r
1330 sensor_af_init_end:\r
1331     SENSOR_DG("%s %s ret:0x%x \n",SENSOR_NAME_STRING(),__FUNCTION__,ret);\r
1332     return ret;\r
1333 }\r
1334 \r
1335 static int sensor_focus_af_single_usr_cb(struct i2c_client *client) \r
1336 {\r
1337         int ret = 0;\r
1338         char state,cnt;\r
1339         struct af_cmdinfo cmdinfo;\r
1340         //char s_zone[5],i;\r
1341         cmdinfo.cmd_tag = 0x01;\r
1342         cmdinfo.validate_bit = 0x80;\r
1343         ret = sensor_af_cmdset(client, SingleFocus_Cmd, &cmdinfo);\r
1344         if(0 != ret) {\r
1345                 SENSOR_TR("%s single focus mode set error!\n",SENSOR_NAME_STRING());\r
1346                 ret = -1;\r
1347                 goto sensor_af_single_end;\r
1348         }\r
1349         \r
1350         cnt = 0;\r
1351         do\r
1352         {\r
1353                 if (cnt != 0) {\r
1354                         msleep(1);\r
1355                 }\r
1356                 cnt++;\r
1357                 ret = sensor_read(client, STA_FOCUS_Reg, &state);\r
1358                 if (ret != 0){\r
1359                    SENSOR_TR("%s[%d] read focus_status failed\n",SENSOR_NAME_STRING(),__LINE__);\r
1360                    ret = -1;\r
1361                    goto sensor_af_single_end;\r
1362                 }\r
1363         }while((state == S_FOCUSING) && (cnt<100));\r
1364 \r
1365         if (state != S_FOCUSED) {\r
1366                 SENSOR_TR("%s[%d] focus state(0x%x) is error!\n",SENSOR_NAME_STRING(),__LINE__,state);\r
1367                 ret = -1;\r
1368                 goto sensor_af_single_end;\r
1369         } else {\r
1370                 SENSOR_DG("%s[%d] single focus mode set success!\n",SENSOR_NAME_STRING(),__LINE__);    \r
1371         }\r
1372 sensor_af_single_end:\r
1373         return ret;\r
1374 }\r
1375 \r
1376 static int sensor_focus_af_near_usr_cb(struct i2c_client *client)\r
1377 {\r
1378         return 0;\r
1379 }\r
1380 \r
1381 static int sensor_focus_af_far_usr_cb(struct i2c_client *client)\r
1382 {\r
1383         \r
1384         return 0;\r
1385 }\r
1386 \r
1387 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos)\r
1388 {\r
1389         struct af_cmdinfo cmdinfo;\r
1390         sensor_af_idlechk(client);\r
1391         return 0;\r
1392         cmdinfo.cmd_tag = StepFocus_Spec_Tag;\r
1393         cmdinfo.cmd_para[0] = pos;\r
1394         cmdinfo.validate_bit = 0x81;\r
1395         return sensor_af_cmdset(client, StepMode_Cmd, &cmdinfo);\r
1396 }\r
1397 \r
1398 static int sensor_focus_af_const_usr_cb(struct i2c_client *client)\r
1399 {\r
1400         int ret = 0;\r
1401         struct af_cmdinfo cmdinfo;\r
1402         cmdinfo.cmd_tag = 0x01;\r
1403         cmdinfo.cmd_para[0] = 0x00;\r
1404         cmdinfo.validate_bit = 0x81;\r
1405         sensor_af_idlechk(client);\r
1406         if (sensor_af_cmdset(client, ConstFocus_Cmd, &cmdinfo)) {\r
1407                 SENSOR_TR("%s[%d] const focus mode set error!\n",SENSOR_NAME_STRING(),__LINE__);\r
1408                 ret = -1;\r
1409                 goto sensor_af_const_end;\r
1410         } else {\r
1411                 SENSOR_DG("%s[%d] const focus mode set success!\n",SENSOR_NAME_STRING(),__LINE__);        \r
1412         }\r
1413 sensor_af_const_end:\r
1414         return ret;\r
1415 }\r
1416 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)\r
1417 {\r
1418     return 0;\r
1419 }\r
1420 static int sensor_focus_af_close_usr_cb(struct i2c_client *client)\r
1421 {\r
1422         int ret = 0; \r
1423         sensor_af_idlechk(client);\r
1424         if (sensor_af_cmdset(client, PauseFocus_Cmd, NULL)) {\r
1425                 SENSOR_TR("%s pause focus mode set error!\n",SENSOR_NAME_STRING());\r
1426                 ret = -1;\r
1427                 goto sensor_af_pause_end;\r
1428         }\r
1429 sensor_af_pause_end:\r
1430         return ret;\r
1431 }\r
1432 \r
1433 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)\r
1434 {\r
1435         int ret = 0;\r
1436         struct af_cmdinfo cmdinfo;\r
1437         //int zone_tm_pos[4];\r
1438         int zone_center_pos[2];\r
1439         //struct generic_sensor*sensor = to_generic_sensor(client);    \r
1440         \r
1441         if (zone_tm_pos) {\r
1442                 zone_tm_pos[0] += 1000;\r
1443                 zone_tm_pos[1] += 1000;\r
1444                 zone_tm_pos[2]+= 1000;\r
1445                 zone_tm_pos[3] += 1000;\r
1446                 zone_center_pos[0] = ((zone_tm_pos[0] + zone_tm_pos[2])>>1)*80/2000;\r
1447                 zone_center_pos[1] = ((zone_tm_pos[1] + zone_tm_pos[3])>>1)*60/2000;\r
1448         } else {\r
1449 #if CONFIG_SENSOR_FocusCenterInCapture\r
1450                 zone_center_pos[0] = 32;\r
1451                 zone_center_pos[1] = 24;\r
1452 #else\r
1453                 zone_center_pos[0] = -1;\r
1454                 zone_center_pos[1] = -1;\r
1455 #endif\r
1456         }\r
1457         if ((zone_center_pos[0] >=0) && (zone_center_pos[1]>=0)){\r
1458                 cmdinfo.cmd_tag = 0x01;\r
1459                 cmdinfo.validate_bit = 0x83;\r
1460                 if (zone_center_pos[0]<=8)\r
1461                         cmdinfo.cmd_para[0] = 0;\r
1462                 else if ((zone_center_pos[0]>8) && (zone_center_pos[0]<72))\r
1463                         cmdinfo.cmd_para[0] = zone_center_pos[0]-8;\r
1464                 else \r
1465                         cmdinfo.cmd_para[0] = 72; \r
1466                 \r
1467                 if (zone_center_pos[1]<=6)\r
1468                         cmdinfo.cmd_para[1] = 0;\r
1469                 else if ((zone_center_pos[1]>6) && (zone_center_pos[1]<54))\r
1470                         cmdinfo.cmd_para[1] = zone_center_pos[1]-6;\r
1471                 else \r
1472                         cmdinfo.cmd_para[1] = 54;\r
1473                 \r
1474                 ret = sensor_af_cmdset(client, TouchZoneConfig_Cmd, &cmdinfo);\r
1475                 if(0 != ret) {\r
1476                         SENSOR_TR("%s touch zone config error!\n",SENSOR_NAME_STRING());\r
1477                         ret = -1;\r
1478                         goto sensor_af_zone_end;\r
1479                 }  \r
1480         }\r
1481 sensor_af_zone_end:\r
1482         return ret;\r
1483 }\r
1484 \r
1485 /*\r
1486 face defect call back\r
1487 */\r
1488 static int      sensor_face_detect_usr_cb(struct i2c_client *client,int on){\r
1489         return 0;\r
1490 }\r
1491 \r
1492 /*\r
1493 *       The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some\r
1494 * initialization in the function. \r
1495 */\r
1496 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)\r
1497 {\r
1498         return;\r
1499 }\r
1500 \r
1501 /*\r
1502 * :::::WARNING:::::\r
1503 * It is not allowed to modify the following code\r
1504 */\r
1505 \r
1506 sensor_init_parameters_default_code();\r
1507 \r
1508 sensor_v4l2_struct_initialization();\r
1509 \r
1510 sensor_probe_default_code();\r
1511 \r
1512 sensor_remove_default_code();\r
1513 \r
1514 sensor_driver_default_module_code();\r
1515 \r
1516  \r
1517 \r