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