camsys_drv : v0.9.0
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / hm2057.c
1 \r
2 #include "generic_sensor.h"\r
3 \r
4 /*
5 *      Driver Version Note\r
6 *v0.0.1: this driver is compatible with generic_sensor\r
7 *v0.1.1:\r
8 *        add sensor_focus_af_const_pause_usr_cb;\r
9 */\r
10 static int version = KERNEL_VERSION(0,1,1);\r
11 module_param(version, int, S_IRUGO);\r
12 \r
13 \r
14 \r
15 static int debug;\r
16 module_param(debug, int, S_IRUGO|S_IWUSR);\r
17 \r
18 \r
19 #define dprintk(level, fmt, arg...) do {                        \\r
20         if (debug > level)                                      \\r
21         printk(KERN_WARNING fmt , ## arg); } while (0)\r
22 \r
23 /* Sensor Driver Configuration Begin */\r
24 #define SENSOR_NAME RK29_CAM_SENSOR_HM2057\r
25 #define SENSOR_V4L2_IDENT V4L2_IDENT_HM2057\r
26 #define SENSOR_ID 0x2056\r
27 #define SENSOR_BUS_PARAM                     (SOCAM_MASTER |\\r
28                                              SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_LOW|\\r
29                                              SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\r
30 #define SENSOR_PREVIEW_W                     800\r
31 #define SENSOR_PREVIEW_H                     600\r
32 #define SENSOR_PREVIEW_FPS                   15000     // 15fps \r
33 #define SENSOR_FULLRES_L_FPS                 7500      // 7.5fps\r
34 #define SENSOR_FULLRES_H_FPS                 7500      // 7.5fps\r
35 #define SENSOR_720P_FPS                      0\r
36 #define SENSOR_1080P_FPS                     0\r
37 \r
38 #define SENSOR_REGISTER_LEN                  2         // sensor register address bytes\r
39 #define SENSOR_VALUE_LEN                     1         // sensor register value bytes\r
40 \r
41 static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect);\r
42 static unsigned int SensorChipID[] = {SENSOR_ID,0x2057};\r
43 \r
44 /* Sensor Driver Configuration End */\r
45 \r
46 \r
47 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
48 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
49 \r
50 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)\r
51 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
52 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
53 #define sensor_write_array generic_sensor_write_array\r
54 \r
55 #define SENSOR_PLL_ENABLE 1\r
56 //ͬÑùµÄÖ¡ÂÊ bypass PLLµÄÆعâʱ¼äÊÇEnalble PLLµÄ2±¶\r
57 //Enable PLL: 0x0025=0x00 \r
58 //bypass PLL: 0x0025=0x80\r
59 \r
60 \r
61 #define SENSOR_FAST_MODE 1\r
62 //¿ìËÙģʽ£¬Ö¡ÂÊÔ½¿ì£¬Ôëµã»áÔ½´ó£¬ÇåÎú¶È»áÔ½²î\r
63 //ËٶȺÍÇåÎú¶ÈÁ½Õß²»ÄܼæµÃ\r
64 \r
65 struct specific_sensor{\r
66         struct generic_sensor common_sensor;\r
67         //define user data below\r
68         \r
69 \r
70 };\r
71 \r
72 /*\r
73 * Local define\r
74 */\r
75 \r
76 \r
77 /*\r
78 *  The follow setting need been filled.\r
79 *  \r
80 *  Must Filled:\r
81 *  sensor_init_data :               Sensor initial setting;\r
82 *  sensor_fullres_lowfps_data :     Sensor full resolution setting with best auality, recommand for video;\r
83 *  sensor_preview_data :            Sensor preview resolution setting, recommand it is vga or svga;\r
84 *  sensor_softreset_data :          Sensor software reset register;\r
85 *  sensor_check_id_data :           Sensir chip id register;\r
86 *\r
87 *  Optional filled:\r
88 *  sensor_fullres_highfps_data:     Sensor full resolution setting with high framerate, recommand for video;\r
89 *  sensor_720p:                     Sensor 720p setting, it is for video;\r
90 *  sensor_1080p:                    Sensor 1080p setting, it is for video;\r
91 *\r
92 *  :::::WARNING:::::\r
93 *  The SensorEnd which is the setting end flag must be filled int the last of each setting;\r
94 */\r
95 \r
96 /* Sensor initial setting */\r
97 static struct rk_sensor_reg sensor_init_data[] = {\r
98 {0x0022,0x00},\r
99 {0x0004,0x10},\r
100 {0x0006,0x00},\r
101 {0x000D,0x11},\r
102 {0x000E,0x11},\r
103 {0x000F,0x10},//00\r
104 {0x0011,0x02},\r
105 {0x0012,0x1C},\r
106 {0x0013,0x01},\r
107 {0x0015,0x02},\r
108 {0x0016,0x80},\r
109 {0x0018,0x00},\r
110 {0x001D,0x40},\r
111 {0x0020,0x40},\r
112 \r
113 #if SENSOR_PLL_ENABLE\r
114     {0x0025,0x00},\r
115 #else\r
116     {0x0025,0x80},\r
117 #endif\r
118 \r
119 {0x0026,0x87},\r
120 {0x0027,0x10},//0x30},\r
121 {0x0040,0x20},\r
122 {0x0053,0x0A},\r
123 {0x0044,0x06},\r
124 {0x0046,0xD8},\r
125 {0x004A,0x0A},\r
126 {0x004B,0x72},\r
127 {0x0075,0x01},\r
128 {0x002A,0x1F},\r
129 {0x0070,0x5F},\r
130 {0x0071,0xFF},\r
131 {0x0072,0x55},\r
132 {0x0073,0x50},\r
133 {0x0080,0xC8},\r
134 {0x0082,0xA2},\r
135 {0x0083,0xF0},\r
136 {0x0085,0x11},//0x12 <lpz 2012.10.24>HMAX Ô­³§½¨Òé ADC POWER ÒÔÇ°ÊÇ75%µÄÏÖÔÚÒªÉ趨³É100%\r
137 {0x0086,0x02},\r
138 {0x0087,0x80},\r
139 {0x0088,0x6C},\r
140 {0x0089,0x2E},\r
141 {0x008A,0x7D},\r
142 {0x008D,0x20},\r
143 {0x0090,0x00},\r
144 {0x0091,0x10},\r
145 {0x0092,0x11},\r
146 {0x0093,0x12},\r
147 {0x0094,0x16},\r
148 {0x0095,0x08},\r
149 {0x0096,0x00},\r
150 {0x0097,0x10},\r
151 {0x0098,0x11},\r
152 {0x0099,0x12},\r
153 {0x009A,0x06},\r
154 {0x009B,0x34},\r
155 {0x00A0,0x00},\r
156 {0x00A1,0x04},\r
157 {0x011F,0xF7},\r
158 {0x0120,0x36},\r
159 {0x0121,0x83},\r
160 {0x0122,0x7B},\r
161 {0x0123,0xC2},\r
162 {0x0124,0xDE},\r
163 {0x0125,0xDF},\r
164 {0x0126,0x70},\r
165 {0x0128,0x1F},\r
166 {0x0132,0x10},\r
167 {0x0131,0xBD},\r
168 {0x0140,0x14},\r
169 {0x0141,0x0A},\r
170 {0x0142,0x14},\r
171 {0x0143,0x0A},\r
172 {0x0144,0x04},\r
173 {0x0145,0x00},\r
174 {0x0146,0x20},\r
175 {0x0147,0x0A},\r
176 {0x0148,0x10},\r
177 {0x0149,0x0C},\r
178 {0x014A,0x80},\r
179 {0x014B,0x80},\r
180 {0x014C,0x2E},\r
181 {0x014D,0x2E},\r
182 {0x014E,0x05},\r
183 {0x014F,0x05},\r
184 {0x0150,0x0D},\r
185 {0x0155,0x00},\r
186 {0x0156,0x10},\r
187 {0x0157,0x0A},\r
188 {0x0158,0x0A},\r
189 {0x0159,0x0A},\r
190 {0x015A,0x05},\r
191 {0x015B,0x05},\r
192 {0x015C,0x05},\r
193 {0x015D,0x05},\r
194 {0x015E,0x08},\r
195 {0x015F,0xFF},\r
196 {0x0160,0x50},\r
197 {0x0161,0x20},\r
198 {0x0162,0x14},\r
199 {0x0163,0x0A},\r
200 {0x0164,0x10},\r
201 {0x0165,0x0A},\r
202 {0x0166,0x0A},\r
203 {0x018C,0x24},\r
204 {0x018D,0x04},\r
205 {0x018E,0x00},\r
206 {0x018F,0x11},\r
207 {0x0190,0x80},\r
208 {0x0191,0x47},\r
209 {0x0192,0x48},\r
210 {0x0193,0x64},\r
211 {0x0194,0x32},\r
212 {0x0195,0xc8},\r
213 {0x0196,0x96},\r
214 {0x0197,0x64},\r
215 {0x0198,0x32},\r
216 {0x0199,0x14},\r
217 {0x019A,0x20},\r
218 {0x019B,0x14},\r
219 {0x01B0,0x55},\r
220 {0x01B1,0x0C},\r
221 {0x01B2,0x0A},\r
222 {0x01B3,0x10},\r
223 {0x01B4,0x0E},\r
224 {0x01BA,0x10},\r
225 {0x01BB,0x04},\r
226 {0x01D8,0x40},\r
227 {0x01DE,0x60},\r
228 {0x01E4,0x10},\r
229 {0x01E5,0x10},\r
230 {0x01F2,0x0C},\r
231 {0x01F3,0x14},\r
232 {0x01F8,0x04},\r
233 {0x01F9,0x0C},\r
234 {0x01FE,0x02},\r
235 {0x01FF,0x04},\r
236 {0x0220,0x00},\r
237 {0x0221,0xB0},\r
238 {0x0222,0x00},\r
239 {0x0223,0x80},\r
240 {0x0224,0x8E},\r
241 {0x0225,0x00},\r
242 {0x0226,0x88},\r
243 {0x022A,0x88},\r
244 {0x022B,0x00},\r
245 {0x022C,0x8C},\r
246 {0x022D,0x13},\r
247 {0x022E,0x0B},\r
248 {0x022F,0x13},\r
249 {0x0230,0x0B},\r
250 {0x0233,0x13},\r
251 {0x0234,0x0B},\r
252 {0x0235,0x28},\r
253 {0x0236,0x03},\r
254 {0x0237,0x28},\r
255 {0x0238,0x03},\r
256 {0x023B,0x28},\r
257 {0x023C,0x03},\r
258 {0x023D,0x5C},\r
259 {0x023E,0x02},\r
260 {0x023F,0x5C},\r
261 {0x0240,0x02},\r
262 {0x0243,0x5C},\r
263 {0x0244,0x02},\r
264 {0x0251,0x0E},\r
265 {0x0252,0x00},\r
266 {0x0280,0x0A},\r
267 {0x0282,0x14},\r
268 {0x0284,0x2A},\r
269 {0x0286,0x50},\r
270 {0x0288,0x60},\r
271 {0x028A,0x6D},\r
272 {0x028C,0x79},\r
273 {0x028E,0x82},\r
274 {0x0290,0x8A},\r
275 {0x0292,0x91},\r
276 {0x0294,0x9C},\r
277 {0x0296,0xA7},\r
278 {0x0298,0xBA},\r
279 {0x029A,0xCD},\r
280 {0x029C,0xE0},\r
281 {0x029E,0x2D},\r
282 {0x02A0,0x06},\r
283 {0x02E0,0x04},\r
284 {0x02C0,0x8F},\r
285 {0x02C1,0x01},\r
286 {0x02C2,0x8F},\r
287 {0x02C3,0x07},\r
288 {0x02C4,0xE3},\r
289 {0x02C5,0x07},\r
290 {0x02C6,0xC1},\r
291 {0x02C7,0x07},\r
292 {0x02C8,0x70},\r
293 {0x02C9,0x01},\r
294 {0x02CA,0xD0},\r
295 {0x02CB,0x07},\r
296 {0x02CC,0xF7},\r
297 {0x02CD,0x07},\r
298 {0x02CE,0x5A},\r
299 {0x02CF,0x07},\r
300 {0x02D0,0xB0},\r
301 {0x02D1,0x01},\r
302 {0x0302,0x00},\r
303 {0x0303,0x00},\r
304 {0x0304,0x00},\r
305 {0x02F0,0x80},\r
306 {0x02F1,0x07},\r
307 {0x02F2,0x8E},\r
308 {0x02F3,0x00},\r
309 {0x02F4,0xF2},\r
310 {0x02F5,0x07},\r
311 {0x02F6,0xCC},\r
312 {0x02F7,0x07},\r
313 {0x02F8,0x16},\r
314 {0x02F9,0x00},\r
315 {0x02FA,0x1E},\r
316 {0x02FB,0x00},\r
317 {0x02FC,0x9D},\r
318 {0x02FD,0x07},\r
319 {0x02FE,0xA6},\r
320 {0x02FF,0x07},\r
321 {0x0300,0xBD},\r
322 {0x0301,0x00},\r
323 {0x0305,0x00},\r
324 {0x0306,0x00},\r
325 {0x0307,0x00},\r
326 {0x032D,0x00},\r
327 {0x032E,0x01},\r
328 {0x032F,0x00},\r
329 {0x0330,0x01},\r
330 {0x0331,0x00},\r
331 {0x0332,0x01},\r
332 {0x0333,0x82},\r
333 {0x0334,0x00},\r
334 {0x0335,0x84},\r
335 {0x0336,0x00},\r
336 {0x0337,0x01},\r
337 {0x0338,0x00},\r
338 {0x0339,0x01},\r
339 {0x033A,0x00},\r
340 {0x033B,0x01},\r
341 {0x033E,0x04},\r
342 {0x033F,0x86},\r
343 {0x0340,0x30},\r
344 {0x0341,0x44},\r
345 {0x0342,0x4A},\r
346 {0x0343,0x42},\r
347 {0x0344,0x74},\r
348 {0x0345,0x4F},\r
349 {0x0346,0x67},\r
350 {0x0347,0x5C},\r
351 {0x0348,0x59},\r
352 {0x0349,0x67},\r
353 {0x034A,0x4D},\r
354 {0x034B,0x6E},\r
355 {0x034C,0x44},\r
356 {0x0350,0x80},\r
357 {0x0351,0x80},\r
358 {0x0352,0x18},\r
359 {0x0353,0x18},\r
360 {0x0354,0x6E},\r
361 {0x0355,0x4A},\r
362 {0x0356,0x73},\r
363 {0x0357,0xC0},\r
364 {0x0358,0x06},\r
365 {0x035A,0x06},\r
366 {0x035B,0xA0},\r
367 {0x035C,0x73},\r
368 {0x035D,0x50},\r
369 {0x035E,0xC0},\r
370 {0x035F,0xA0},\r
371 {0x0360,0x02},\r
372 {0x0361,0x18},\r
373 {0x0362,0x80},\r
374 {0x0363,0x6C},\r
375 {0x0364,0x00},\r
376 {0x0365,0xF0},\r
377 {0x0366,0x20},\r
378 {0x0367,0x0C},\r
379 {0x0369,0x00},\r
380 {0x036A,0x10},\r
381 {0x036B,0x10},\r
382 {0x036E,0x20},\r
383 {0x036F,0x00},\r
384 {0x0370,0x10},\r
385 {0x0371,0x18},\r
386 {0x0372,0x0C},\r
387 {0x0373,0x38},\r
388 {0x0374,0x3A},\r
389 {0x0375,0x13},\r
390 {0x0376,0x22},\r
391 {0x0380,0xFF},\r
392 {0x0381,0x4c},\r
393 {0x0382,0x3c},\r
394 {0x038A,0x40},\r
395 {0x038B,0x08},\r
396 {0x038C,0xC1},\r
397 {0x038E,0x44},\r
398 \r
399 #if SENSOR_PLL_ENABLE\r
400     //10 fps\r
401     {0x038F,0x07},\r
402     {0x0390,0x5c},\r
403 #else\r
404     #if SENSOR_FAST_MODE\r
405        //10 fps\r
406        {0x038F,0x03},\r
407        {0x0390,0xae},\r
408     #else \r
409         //7.5 fps\r
410        {0x038F,0x04}, //09\r
411        {0x0390,0xE8}, //18\r
412    #endif\r
413 #endif\r
414 \r
415 {0x0391,0x05},\r
416 {0x0393,0x80},\r
417 {0x0395,0x21},\r
418 {0x0398,0x02},\r
419 {0x0399,0x84},\r
420 {0x039A,0x03},\r
421 {0x039B,0x25},\r
422 {0x039C,0x03},\r
423 {0x039D,0xC6},\r
424 {0x039E,0x05},\r
425 {0x039F,0x08},\r
426 {0x03A0,0x06},\r
427 {0x03A1,0x4A},\r
428 {0x03A2,0x07},\r
429 {0x03A3,0x8C},\r
430 {0x03A4,0x0A},\r
431 {0x03A5,0x10},\r
432 {0x03A6,0x0C},\r
433 {0x03A7,0x0E},\r
434 {0x03A8,0x10},\r
435 {0x03A9,0x18},\r
436 {0x03AA,0x20},\r
437 {0x03AB,0x28},\r
438 {0x03AC,0x1E},\r
439 {0x03AD,0x1A},\r
440 {0x03AE,0x13},\r
441 {0x03AF,0x0C},\r
442 {0x03B0,0x0B},\r
443 {0x03B1,0x09},\r
444 {0x03B3,0x10},\r
445 {0x03B4,0x00},\r
446 {0x03B5,0x10},\r
447 {0x03B6,0x00},\r
448 {0x03B7,0xEA},\r
449 {0x03B8,0x00},\r
450 {0x03B9,0x3A},\r
451 {0x03BA,0x01},\r
452 {0x03BB,0x9F},\r
453 {0x03BC,0xCF},\r
454 {0x03BD,0xE7},\r
455 {0x03BE,0xF3},\r
456 {0x03BF,0x01},\r
457 {0x03D0,0xF8},\r
458 {0x03E0,0x04},\r
459 {0x03E1,0x01},\r
460 {0x03E2,0x04},\r
461 {0x03E4,0x10},\r
462 {0x03E5,0x12},\r
463 {0x03E6,0x00},\r
464 {0x03E8,0x21},\r
465 {0x03E9,0x23},\r
466 {0x03EA,0x01},\r
467 {0x03EC,0x21},\r
468 {0x03ED,0x23},\r
469 {0x03EE,0x01},\r
470 {0x03F0,0x20},\r
471 {0x03F1,0x22},\r
472 {0x03F2,0x00},\r
473 {0x0420,0x84},\r
474 {0x0421,0x00},\r
475 {0x0422,0x00},\r
476 {0x0423,0x83},\r
477 {0x0430,0x08},\r
478 {0x0431,0x28},\r
479 {0x0432,0x10},\r
480 {0x0433,0x08},\r
481 {0x0435,0x0C},\r
482 {0x0450,0xFF},\r
483 {0x0451,0xE8},\r
484 {0x0452,0xC4},\r
485 {0x0453,0x88},\r
486 {0x0454,0x00},\r
487 {0x0458,0x70},\r
488 {0x0459,0x03},\r
489 {0x045A,0x00},\r
490 {0x045B,0x30},\r
491 {0x045C,0x00},\r
492 {0x045D,0x70},\r
493 {0x0466,0x14},\r
494 {0x047A,0x00},\r
495 {0x047B,0x00},\r
496 {0x0480,0x58},\r
497 {0x0481,0x06},\r
498 {0x0482,0x0C},\r
499 {0x04B0,0x50},\r
500 {0x04B6,0x30},\r
501 {0x04B9,0x10},\r
502 {0x04B3,0x10},\r
503 {0x04B1,0x8E},\r
504 {0x04B4,0x20},\r
505 {0x0540,0x00},\r
506 {0x0541,0x60},//9D\r
507 {0x0542,0x00},\r
508 {0x0543,0x73},//BC\r
509 {0x0580,0x01},\r
510 {0x0581,0x0F},\r
511 {0x0582,0x04},\r
512 {0x0594,0x00},\r
513 {0x0595,0x04},\r
514 {0x05A9,0x03},\r
515 {0x05AA,0x40},\r
516 {0x05AB,0x80},\r
517 {0x05AC,0x0A},\r
518 {0x05AD,0x10},\r
519 {0x05AE,0x0C},\r
520 {0x05AF,0x0C},\r
521 {0x05B0,0x03},\r
522 {0x05B1,0x03},\r
523 {0x05B2,0x1C},\r
524 {0x05B3,0x02},\r
525 {0x05B4,0x00},\r
526 {0x05B5,0x0C},\r
527 {0x05B8,0x80},\r
528 {0x05B9,0x32},\r
529 {0x05BA,0x00},\r
530 {0x05BB,0x80},\r
531 {0x05BC,0x03},\r
532 {0x05BD,0x00},\r
533 {0x05BF,0x05},\r
534 {0x05C0,0x10},\r
535 {0x05C3,0x00},\r
536 {0x05C4,0x0C},\r
537 {0x05C5,0x20},\r
538 {0x05C7,0x01},\r
539 {0x05C8,0x14},\r
540 {0x05C9,0x54},\r
541 {0x05CA,0x14},\r
542 {0x05CB,0xE0},\r
543 {0x05CC,0x20},\r
544 {0x05CD,0x00},\r
545 {0x05CE,0x08},\r
546 {0x05CF,0x60},\r
547 {0x05D0,0x10},\r
548 {0x05D1,0x05},\r
549 {0x05D2,0x03},\r
550 {0x05D4,0x00},\r
551 {0x05D5,0x05},\r
552 {0x05D6,0x05},\r
553 {0x05D7,0x05},\r
554 {0x05D8,0x08},\r
555 {0x05DC,0x0C},\r
556 {0x05D9,0x00},\r
557 {0x05DB,0x00},\r
558 {0x05DD,0x0F},\r
559 {0x05DE,0x00},\r
560 {0x05DF,0x0A},\r
561 {0x05E0,0xA0},\r
562 {0x05E1,0x00},\r
563 {0x05E2,0xA0},\r
564 {0x05E3,0x00},\r
565 {0x05E4,0x05},\r
566 {0x05E5,0x00},\r
567 {0x05E6,0x24},\r
568 {0x05E7,0x03},\r
569 {0x05E8,0x07},\r
570 {0x05E9,0x00},\r
571 {0x05EA,0x5E},\r
572 {0x05EB,0x02},\r
573 {0x0660,0x04},\r
574 {0x0661,0x16},\r
575 {0x0662,0x04},\r
576 {0x0663,0x28},\r
577 {0x0664,0x04},\r
578 {0x0665,0x18},\r
579 {0x0666,0x04},\r
580 {0x0667,0x21},\r
581 {0x0668,0x04},\r
582 {0x0669,0x0C},\r
583 {0x066A,0x04},\r
584 {0x066B,0x25},\r
585 {0x066C,0x00},\r
586 {0x066D,0x12},\r
587 {0x066E,0x00},\r
588 {0x066F,0x80},\r
589 {0x0670,0x00},\r
590 {0x0671,0x0A},\r
591 {0x0672,0x04},\r
592 {0x0673,0x1D},\r
593 {0x0674,0x04},\r
594 {0x0675,0x1D},\r
595 {0x0676,0x00},\r
596 {0x0677,0x7E},\r
597 {0x0678,0x01},\r
598 {0x0679,0x47},\r
599 {0x067A,0x00},\r
600 {0x067B,0x73},\r
601 {0x067C,0x04},\r
602 {0x067D,0x14},\r
603 {0x067E,0x04},\r
604 {0x067F,0x28},\r
605 {0x0680,0x00},\r
606 {0x0681,0x22},\r
607 {0x0682,0x00},\r
608 {0x0683,0xA5},\r
609 {0x0684,0x00},\r
610 {0x0685,0x1E},\r
611 {0x0686,0x04},\r
612 {0x0687,0x1D},\r
613 {0x0688,0x04},\r
614 {0x0689,0x19},\r
615 {0x068A,0x04},\r
616 {0x068B,0x21},\r
617 {0x068C,0x04},\r
618 {0x068D,0x0A},\r
619 {0x068E,0x04},\r
620 {0x068F,0x25},\r
621 {0x0690,0x04},\r
622 {0x0691,0x15},\r
623 {0x0698,0x20},\r
624 {0x0699,0x20},\r
625 {0x069A,0x01},\r
626 {0x069C,0x22},\r
627 {0x069D,0x10},\r
628 {0x069E,0x10},\r
629 {0x069F,0x08},\r
630 {0x0000,0x01},\r
631 {0x0100,0x01},\r
632 {0x0101,0x01},\r
633 {0x0005,0x01},\r
634 \r
635 SensorEnd\r
636 \r
637 };\r
638 /* Senor full resolution setting: recommand for capture */\r
639 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={\r
640 {0x0380,0xFE},\r
641 {0x000D,0x00},\r
642 {0x000E,0x00},\r
643 {0x011F,0x88},\r
644 {0x0125,0xDF},\r
645 {0x0126,0x70},\r
646 {0x0131,0xAC},\r
647 {0x0366,0x20},\r
648 {0x0433,0x40},\r
649 {0x0435,0x50},\r
650 {0x05E4,0x0A},\r
651 {0x05E5,0x00},\r
652 {0x05E6,0x49},\r
653 {0x05E7,0x06},\r
654 {0x05E8,0x0A},\r
655 {0x05E9,0x00},\r
656 {0x05EA,0xB9},\r
657 {0x05EB,0x04},\r
658 {0x0000,0x01},\r
659 {0x0100,0x01},\r
660 {0x0101,0x01},\r
661 {0x0005,0x01},\r
662 \r
663         SensorEnd\r
664 };\r
665 /* Senor full resolution setting: recommand for video */\r
666 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={\r
667         SensorEnd\r
668 };\r
669 /* Preview resolution setting*/\r
670 static struct rk_sensor_reg sensor_preview_data[] =\r
671 {\r
672 /*¼ÏñÍêºóÔÚ·µ»Øµ½Ô¤ÀÀ£¬Ô¤ÀÀʱÓÐË®²¨ÎƵÄbugÐÞ¸Ä<2012.11.22>*/\r
673  {0x0380,0xFF},\r
674 {0x0006,0x00},\r
675 {0x000D,0x11},\r
676 {0x000E,0x11},\r
677 //{0x0012,0x1C},\r
678 //{0x0013,0x01},\r
679 //{{0x0027,0x18},\r
680 {0x002A,0x1F},\r
681 //{0x0071,0xFF},\r
682 {0x0082,0xA2},\r
683 {0x011F,0x80},\r
684 {0x0125,0xDF},\r
685 {0x0126,0x70},\r
686 {0x0131,0xAD},\r
687 {0x0144,0x04},\r
688 {0x0190,0x80},\r
689 {0x0192,0x48},\r
690 //{0x0541,0x9D},// 0541ºÍ0543ÊDZíʾflicker step \r
691 //{0x0543,0xBC},\r
692 {0x05E0,0xA0},\r
693 {0x05E1,0x00},\r
694 {0x05E2,0xA0},\r
695 {0x05E3,0x00},\r
696 {0x05E4,0x05},\r
697 {0x05E5,0x00},\r
698 {0x05E6,0x24},\r
699 {0x05E7,0x03},\r
700 {0x05E8,0x08},\r
701 {0x05E9,0x00},\r
702 {0x05EA,0x5F},\r
703 {0x05EB,0x02},\r
704 {0x0000,0x01},\r
705 {0x0100,0x01},\r
706 {0x0101,0x01},\r
707 \r
708         SensorEnd\r
709 };\r
710 /* 1280x720 */\r
711 static struct rk_sensor_reg sensor_720p[]={\r
712         SensorEnd\r
713 };\r
714 \r
715 /* 1920x1080 */\r
716 static struct rk_sensor_reg sensor_1080p[]={\r
717         SensorEnd\r
718 };\r
719 \r
720 \r
721 static struct rk_sensor_reg sensor_softreset_data[]={\r
722         SensorEnd\r
723 };\r
724 \r
725 static struct rk_sensor_reg sensor_check_id_data[]={\r
726     SensorRegVal(0x0001,0),\r
727     SensorRegVal(0x0002,0),\r
728         SensorEnd\r
729 };\r
730 /*\r
731 *  The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx\r
732 */\r
733 static struct rk_sensor_reg sensor_WhiteB_Auto[]=\r
734 {    \r
735     {0x0380, 0xFF},  //AWB auto\r
736     {0x0000, 0x01},\r
737     {0x0100, 0x01},\r
738     {0x0101, 0x01},\r
739         SensorEnd\r
740 };\r
741 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
742 static  struct rk_sensor_reg sensor_WhiteB_Cloudy[]=\r
743 {\r
744     {0x0380, 0xFD},\r
745     {0x032D, 0x70},\r
746     {0x032E, 0x01},\r
747     {0x032F, 0x00},\r
748     {0x0330, 0x01},\r
749     {0x0331, 0x08},\r
750     {0x0332, 0x01},\r
751     {0x0101, 0xFF},\r
752         SensorEnd\r
753 };\r
754 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
755 static  struct rk_sensor_reg sensor_WhiteB_ClearDay[]=\r
756 {\r
757     {0x0380, 0xFD},\r
758     {0x032D, 0x60},\r
759     {0x032E, 0x01},\r
760     {0x032F, 0x00},\r
761     {0x0330, 0x01},\r
762     {0x0331, 0x20},\r
763     {0x0332, 0x01},\r
764     {0x0101, 0xFF},\r
765         SensorEnd\r
766 };\r
767 /* Office Colour Temperature : 3500K - 5000K  */\r
768 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=\r
769 {\r
770     {0x0380, 0xFD},\r
771     {0x032D, 0x50},\r
772     {0x032E, 0x01},\r
773     {0x032F, 0x00},\r
774     {0x0330, 0x01},\r
775     {0x0331, 0x30},\r
776     {0x0332, 0x01},\r
777     {0x0101, 0xFF},\r
778         SensorEnd\r
779 \r
780 };\r
781 /* Home Colour Temperature : 2500K - 3500K      */\r
782 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=\r
783 {\r
784     {0x0380, 0xFD},\r
785     {0x032D, 0x10},\r
786     {0x032E, 0x01},\r
787     {0x032F, 0x00},\r
788     {0x0330, 0x01},\r
789     {0x0331, 0xA0},\r
790     {0x0332, 0x01},\r
791     {0x0101, 0xFF},\r
792         SensorEnd\r
793 };\r
794 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
795         sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
796 };\r
797 \r
798 static  struct rk_sensor_reg sensor_Brightness0[]=\r
799 {\r
800         // Brightness -2\r
801         SensorEnd\r
802 };\r
803 \r
804 static  struct rk_sensor_reg sensor_Brightness1[]=\r
805 {\r
806         // Brightness -1\r
807 \r
808         SensorEnd\r
809 };\r
810 \r
811 static  struct rk_sensor_reg sensor_Brightness2[]=\r
812 {\r
813         //      Brightness 0\r
814 \r
815         SensorEnd\r
816 };\r
817 \r
818 static  struct rk_sensor_reg sensor_Brightness3[]=\r
819 {\r
820         // Brightness +1\r
821 \r
822         SensorEnd\r
823 };\r
824 \r
825 static  struct rk_sensor_reg sensor_Brightness4[]=\r
826 {\r
827         //      Brightness +2\r
828 \r
829         SensorEnd\r
830 };\r
831 \r
832 static  struct rk_sensor_reg sensor_Brightness5[]=\r
833 {\r
834         //      Brightness +3\r
835 \r
836         SensorEnd\r
837 };\r
838 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
839         sensor_Brightness4, sensor_Brightness5,NULL,\r
840 };\r
841 \r
842 static  struct rk_sensor_reg sensor_Effect_Normal[] =\r
843 {\r
844     {0x0488, 0x10},\r
845     {0x0486, 0x00},\r
846     {0x0487, 0xFF},\r
847     {0x0101, 0xFF},\r
848         SensorEnd\r
849 };\r
850 \r
851 static  struct rk_sensor_reg sensor_Effect_WandB[] =\r
852 {\r
853     {0x0488, 0x12},\r
854     {0x0486, 0x00},\r
855     {0x0487, 0xFF},\r
856     {0x0101, 0xFF},\r
857         SensorEnd\r
858 };\r
859 \r
860 static  struct rk_sensor_reg sensor_Effect_Sepia[] =\r
861 {\r
862     {0x0488, 0x11},\r
863     {0x0486, 0x40},\r
864     {0x0487, 0x90},\r
865     {0x0101, 0xFF},\r
866         SensorEnd\r
867 };\r
868 \r
869 static  struct rk_sensor_reg sensor_Effect_Negative[] =\r
870 {\r
871     {0x0488, 0x12},\r
872     {0x0486, 0x00},\r
873     {0x0487, 0xFF},\r
874     {0x0101, 0xFF},\r
875         SensorEnd\r
876 };\r
877 static  struct rk_sensor_reg sensor_Effect_Bluish[] =\r
878 {\r
879     {0x0488, 0x11},\r
880     {0x0486, 0xB0},\r
881     {0x0487, 0x80},\r
882     {0x0101, 0xFF},\r
883         SensorEnd\r
884 };\r
885 \r
886 static  struct rk_sensor_reg sensor_Effect_Green[] =\r
887 {\r
888     {0x0488, 0x11},\r
889     {0x0486, 0x60},\r
890     {0x0487, 0x60},\r
891     {0x0101, 0xFF},\r
892         SensorEnd\r
893 };\r
894 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
895         sensor_Effect_Bluish, sensor_Effect_Green,NULL,\r
896 };\r
897 \r
898 static  struct rk_sensor_reg sensor_Exposure0[]=\r
899 {\r
900         SensorEnd\r
901 };\r
902 \r
903 static  struct rk_sensor_reg sensor_Exposure1[]=\r
904 {\r
905         SensorEnd\r
906 };\r
907 \r
908 static  struct rk_sensor_reg sensor_Exposure2[]=\r
909 {\r
910         SensorEnd\r
911 };\r
912 \r
913 static  struct rk_sensor_reg sensor_Exposure3[]=\r
914 {\r
915         SensorEnd\r
916 };\r
917 \r
918 static  struct rk_sensor_reg sensor_Exposure4[]=\r
919 {\r
920         SensorEnd\r
921 };\r
922 \r
923 static  struct rk_sensor_reg sensor_Exposure5[]=\r
924 {\r
925         SensorEnd\r
926 };\r
927 \r
928 static  struct rk_sensor_reg sensor_Exposure6[]=\r
929 {\r
930         SensorEnd\r
931 };\r
932 \r
933 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
934         sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
935 };\r
936 \r
937 static  struct rk_sensor_reg sensor_Saturation0[]=\r
938 {\r
939         SensorEnd\r
940 };\r
941 \r
942 static  struct rk_sensor_reg sensor_Saturation1[]=\r
943 {\r
944         SensorEnd\r
945 };\r
946 \r
947 static  struct rk_sensor_reg sensor_Saturation2[]=\r
948 {\r
949         SensorEnd\r
950 };\r
951 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
952 \r
953 static  struct rk_sensor_reg sensor_Contrast0[]=\r
954 {\r
955         SensorEnd\r
956 };\r
957 \r
958 static  struct rk_sensor_reg sensor_Contrast1[]=\r
959 {\r
960         SensorEnd\r
961 };\r
962 \r
963 static  struct rk_sensor_reg sensor_Contrast2[]=\r
964 {\r
965         SensorEnd\r
966 };\r
967 \r
968 static  struct rk_sensor_reg sensor_Contrast3[]=\r
969 {\r
970         SensorEnd\r
971 };\r
972 \r
973 static  struct rk_sensor_reg sensor_Contrast4[]=\r
974 {\r
975         SensorEnd\r
976 };\r
977 \r
978 \r
979 static  struct rk_sensor_reg sensor_Contrast5[]=\r
980 {\r
981         SensorEnd\r
982 };\r
983 \r
984 static  struct rk_sensor_reg sensor_Contrast6[]=\r
985 {\r
986         SensorEnd\r
987 };\r
988 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
989         sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
990 };\r
991 static  struct rk_sensor_reg sensor_SceneAuto[] =\r
992 {\r
993         SensorEnd\r
994 };\r
995 \r
996 static  struct rk_sensor_reg sensor_SceneNight[] =\r
997 {\r
998         SensorEnd\r
999 };\r
1000 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
1001 \r
1002 static struct rk_sensor_reg sensor_Zoom0[] =\r
1003 {\r
1004         SensorEnd\r
1005 };\r
1006 \r
1007 static struct rk_sensor_reg sensor_Zoom1[] =\r
1008 {\r
1009         SensorEnd\r
1010 };\r
1011 \r
1012 static struct rk_sensor_reg sensor_Zoom2[] =\r
1013 {\r
1014         SensorEnd\r
1015 };\r
1016 \r
1017 \r
1018 static struct rk_sensor_reg sensor_Zoom3[] =\r
1019 {\r
1020         SensorEnd\r
1021 };\r
1022 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
1023 \r
1024 /*\r
1025 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu\r
1026 */\r
1027 static struct v4l2_querymenu sensor_menus[] =\r
1028 {\r
1029 };\r
1030 /*\r
1031 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl\r
1032 */\r
1033 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =\r
1034 {\r
1035 };\r
1036 \r
1037 //MUST define the current used format as the first item   \r
1038 static struct rk_sensor_datafmt sensor_colour_fmts[] = {\r
1039         {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG} \r
1040 };\r
1041 static struct soc_camera_ops sensor_ops;\r
1042 \r
1043 \r
1044 /*\r
1045 **********************************************************\r
1046 * Following is local code:\r
1047\r
1048 * Please codeing your program here \r
1049 **********************************************************\r
1050 */\r
1051 \r
1052 /*\r
1053 **********************************************************\r
1054 * Following is callback\r
1055 * If necessary, you could coding these callback\r
1056 **********************************************************\r
1057 */\r
1058 /*\r
1059 * the function is called in open sensor  \r
1060 */\r
1061 static int sensor_activate_cb(struct i2c_client *client)\r
1062 {\r
1063 \r
1064     SENSOR_DG("%s",__FUNCTION__);       \r
1065 \r
1066         \r
1067         return 0;\r
1068 }\r
1069 /*\r
1070 * the function is called in close sensor\r
1071 */\r
1072 static int sensor_deactivate_cb(struct i2c_client *client)\r
1073 {\r
1074         //struct generic_sensor *sensor = to_generic_sensor(client);\r
1075 \r
1076     SENSOR_DG("%s",__FUNCTION__);\r
1077     \r
1078         return 0;\r
1079 }\r
1080 /*\r
1081 * the function is called before sensor register setting in VIDIOC_S_FMT  \r
1082 */\r
1083 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
1084 {\r
1085     return 0;\r
1086 }\r
1087 /*\r
1088 * the function is called after sensor register setting finished in VIDIOC_S_FMT  \r
1089 */\r
1090 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
1091 {\r
1092     return 0;\r
1093 }\r
1094 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
1095 {\r
1096         \r
1097         return 0;\r
1098 }\r
1099 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
1100 {\r
1101         return 0;\r
1102 }\r
1103 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)
1104 {
1105         return 0;
1106 }
1107
1108 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
1109 {\r
1110         //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1111                 \r
1112         if (pm_msg.event == PM_EVENT_SUSPEND) {\r
1113                 SENSOR_DG("Suspend");\r
1114                 \r
1115         } else {\r
1116                 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);\r
1117                 return -EINVAL;\r
1118         }\r
1119         return 0;\r
1120 }\r
1121 \r
1122 static int sensor_resume(struct soc_camera_device *icd)\r
1123 {\r
1124 \r
1125         SENSOR_DG("Resume");\r
1126 \r
1127         return 0;\r
1128 \r
1129 }\r
1130 static int sensor_mirror_cb (struct i2c_client *client, int mirror)\r
1131 {\r
1132         int err = 0;\r
1133     \r
1134     SENSOR_DG("mirror: %d",mirror);\r
1135         \r
1136 \r
1137         return err;    \r
1138 }\r
1139 /*\r
1140 * the function is v4l2 control V4L2_CID_HFLIP callback  \r
1141 */\r
1142 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1143                                                      struct v4l2_ext_control *ext_ctrl)\r
1144 {\r
1145         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1146 \r
1147     if (sensor_mirror_cb(client,ext_ctrl->value) != 0)\r
1148                 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);\r
1149         \r
1150         SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);\r
1151         return 0;\r
1152 }\r
1153 \r
1154 static int sensor_flip_cb(struct i2c_client *client, int flip)\r
1155 {\r
1156         int err = 0;    \r
1157 \r
1158     SENSOR_DG("flip: %d",flip);\r
1159         \r
1160         return err;    \r
1161 }\r
1162 /*\r
1163 * the function is v4l2 control V4L2_CID_VFLIP callback  \r
1164 */\r
1165 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1166                                                      struct v4l2_ext_control *ext_ctrl)\r
1167 {\r
1168         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1169 \r
1170     if (sensor_flip_cb(client,ext_ctrl->value) != 0)\r
1171                 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);\r
1172         \r
1173         SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);\r
1174         return 0;\r
1175 }\r
1176 /*\r
1177 * the functions are focus callbacks\r
1178 */\r
1179 static int sensor_focus_init_usr_cb(struct i2c_client *client){\r
1180         return 0;\r
1181 }\r
1182 \r
1183 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){\r
1184         return 0;\r
1185 }\r
1186 \r
1187 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){\r
1188         return 0;\r
1189 }\r
1190 \r
1191 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){\r
1192         return 0;\r
1193 }\r
1194 \r
1195 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos) {\r
1196         return 0;\r
1197 }\r
1198 \r
1199 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){\r
1200         return 0;\r
1201 }\r
1202 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1203 {
1204     return 0;
1205 }\r
1206 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){\r
1207         return 0;\r
1208 }\r
1209 \r
1210 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)\r
1211 {\r
1212         return 0;\r
1213 }\r
1214 \r
1215 /*\r
1216 face defect call back\r
1217 */\r
1218 static int      sensor_face_detect_usr_cb(struct i2c_client *client,int on){\r
1219         return 0;\r
1220 }\r
1221 \r
1222 /*\r
1223 *   The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some\r
1224 * initialization in the function. \r
1225 */\r
1226 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)\r
1227 {\r
1228     return;\r
1229 }\r
1230 \r
1231 /*\r
1232 * :::::WARNING:::::\r
1233 * It is not allowed to modify the following code\r
1234 */\r
1235 \r
1236 sensor_init_parameters_default_code();\r
1237 \r
1238 sensor_v4l2_struct_initialization();\r
1239 \r
1240 sensor_probe_default_code();\r
1241 \r
1242 sensor_remove_default_code();\r
1243 \r
1244 sensor_driver_default_module_code();\r
1245 \r
1246 \r
1247 \r
1248 \r