import PULS_20180308
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / imgsensor / src / mt8127 / ov5670_mipi_raw / ov5670mipi_Sensor.c
CommitLineData
6fa3eb70
S
1/*****************************************************************************
2 *
3 * Filename:
4 * ---------
5 * OV5670mipi_Sensor.c
6 *
7 * Project:
8 * --------
9 * ALPS
10 *
11 * Description:
12 * ------------
13 * Source code of Sensor driver
14 *
15 *
16 *------------------------------------------------------------------------------
17 * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!!
18 *============================================================================
19 ****************************************************************************/
20
21#include <linux/videodev2.h>
22#include <linux/i2c.h>
23#include <linux/platform_device.h>
24#include <linux/delay.h>
25#include <linux/cdev.h>
26#include <linux/uaccess.h>
27#include <linux/fs.h>
28#include <asm/atomic.h>
6fa3eb70 29#include <linux/xlog.h>
4b9e9796 30#include <asm/system.h>
6fa3eb70
S
31
32#include "kd_camera_hw.h"
33#include "kd_imgsensor.h"
34#include "kd_imgsensor_define.h"
35#include "kd_imgsensor_errcode.h"
36
37#include "ov5670mipi_Sensor.h"
38
4b9e9796
S
39#include "ov5670mipiraw_Camera_Sensor_para.h"
40#include "ov5670mipiraw_CameraCustomized.h"
41static DEFINE_SPINLOCK(ov5670mipiraw_drv_lock);
42static int module_id = 0;
6fa3eb70 43
4b9e9796
S
44#define OV5670_DEBUG
45#ifdef OV5670_DEBUG
46 #define OV5670DB(fmt, arg...) xlog_printk(ANDROID_LOG_DEBUG, "[OV5670Raw] ", fmt, ##arg)
47#else
48 #define OV5670DB(fmt, arg...)
49#endif
6fa3eb70 50
6fa3eb70 51
4b9e9796
S
52kal_uint32 OV5670_FeatureControl_PERIOD_PixelNum=OV5670_PV_PERIOD_PIXEL_NUMS;
53kal_uint32 OV5670_FeatureControl_PERIOD_LineNum=OV5670_PV_PERIOD_LINE_NUMS;
54
55UINT16 OV5670_VIDEO_MODE_TARGET_FPS = 30;
56
57MSDK_SCENARIO_ID_ENUM OV5670CurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW;
58MSDK_SENSOR_CONFIG_STRUCT OV5670SensorConfigData;
59static OV5670_PARA_STRUCT OV5670;
60kal_uint32 OV5670_FAC_SENSOR_REG;
61
62
63SENSOR_REG_STRUCT OV5670SensorCCT[]=CAMERA_SENSOR_CCT_DEFAULT_VALUE;
64SENSOR_REG_STRUCT OV5670SensorReg[ENGINEER_END]=CAMERA_SENSOR_REG_DEFAULT_VALUE;
65
66
67#define OV5670_TEST_PATTERN_CHECKSUM 0xca3667da //0x5d8082f0 //0x75bef806 //0xa2230d9f //0xf5e2f1ce
68kal_bool OV5670_During_testpattern = KAL_FALSE;
69
70extern int iReadReg(u16 a_u2Addr , u8 * a_puBuff , u16 i2cId);
71extern int iWriteReg(u16 a_u2Addr , u32 a_u4Data , u32 a_u4Bytes , u16 i2cId);
72
73#define OV5670_write_cmos_sensor(addr, para) iWriteReg((u16) addr , (u32) para , 1, OV5670MIPI_WRITE_ID)
6fa3eb70 74
4b9e9796
S
75kal_uint16 OV5670_read_cmos_sensor(kal_uint32 addr)
76{
77kal_uint16 get_byte=0;
78 iReadReg((u16) addr ,(u8*)&get_byte,OV5670MIPI_WRITE_ID);
79 return get_byte;
80}
81
82
83void OV5670_Init_Para(void)
84{
85
86 spin_lock(&ov5670mipiraw_drv_lock);
87 OV5670.sensorMode = SENSOR_MODE_INIT;
88 OV5670.OV5670AutoFlickerMode = KAL_FALSE;
89 OV5670.OV5670VideoMode = KAL_FALSE;
90 OV5670.DummyLines= 0;
91 OV5670.DummyPixels= 0;
92 OV5670.pvPclk = (10285);
93 OV5670.videoPclk = (10285);
94 OV5670.capPclk = (10285);
95
96 OV5670.shutter = 0x4C00;
97 OV5670.ispBaseGain = BASEGAIN;
98 OV5670.sensorGlobalGain = 0x0200;
99 spin_unlock(&ov5670mipiraw_drv_lock);
100}
101
102#define RG_Ratio_Typical 0x264
103#define BG_Ratio_Typical 0x236
104
105struct otp_struct {
106 int flag; // bit[7]: info, bit[6]:wb
107 int module_integrator_id;
108 int lens_id;
109 int production_year;
110 int production_month;
111 int production_day;
112 int rg_ratio;
113 int bg_ratio;
114 int g_gain;
115 int ob_data;
116 int golden_RG;
117 int golden_BG;
118 int golden_G;
6fa3eb70
S
119};
120
121
4b9e9796
S
122static void otp_i2c_write( uint32_t addr, kal_uint16 data)
123{
124 OV5670_write_cmos_sensor(addr, data);
125}
126
127static kal_uint16 otp_i2c_read(uint32_t addr)
6fa3eb70 128
6fa3eb70 129{
4b9e9796
S
130 return OV5670_read_cmos_sensor(addr);
131}
6fa3eb70 132
6fa3eb70 133
4b9e9796
S
134// return value:
135// bit[7]: 0 no otp info, 1 valid otp info
136// bit[6]: 0 no otp wb, 1 valib otp wb
137static int read_otp(struct otp_struct *otp_ptr)
138{
139 int otp_flag, addr, temp, i;
140 //set 0x5002[3] to “0”
141 int temp1;
142
143 temp1 = otp_i2c_read(0x5002);
144 otp_i2c_write(0x5002, (0x00 & 0x08) | (temp1 & (~0x08)));
145
146 // read OTP into buffer
147 otp_i2c_write(0x3d84, 0xC0);
148 otp_i2c_write(0x3d88, 0x70); // OTP start address
149 otp_i2c_write(0x3d89, 0x10);
150 otp_i2c_write(0x3d8A, 0x70); // OTP end address
151 otp_i2c_write(0x3d8B, 0x29);
152 otp_i2c_write(0x3d81, 0x01); // load otp into buffer
153 mdelay(5);
154
155 // OTP into
156 otp_flag = otp_i2c_read(0x7010);
157 addr = 0;
158
159 if((otp_flag & 0xc0) == 0x40) {
160 addr = 0x7011; // base address of info group 1
161 } else if((otp_flag & 0x30) == 0x10) {
162 addr = 0x7018; // base address of info group 2
163 }else if((otp_flag & 0x0c) == 0x04) {
164 addr = 0x701f; // base address of info group 3
165 }
166
167 if(addr != 0) {
168 (*otp_ptr).flag = 0x80; // valid base info in OTP
169 (*otp_ptr).module_integrator_id = otp_i2c_read( addr );
170 (*otp_ptr).lens_id = otp_i2c_read( addr + 1);
171 (*otp_ptr).production_year = otp_i2c_read( addr + 4);
172 (*otp_ptr).production_month = otp_i2c_read( addr + 5);
173 (*otp_ptr).production_day = otp_i2c_read( addr + 6);
174 } else {
175 (*otp_ptr).flag = 0x00; // not info in OTP
176 (*otp_ptr).module_integrator_id = 0;
177 (*otp_ptr).lens_id = 0;
178 (*otp_ptr).production_year = 0;
179 (*otp_ptr).production_month = 0;
180 (*otp_ptr).production_day = 0;
181 }
182
183 module_id = (*otp_ptr).module_integrator_id;
184 // OTP WB Calibration
185 otp_flag = otp_i2c_read(0x7026);
186 addr = 0;
187
188 if((otp_flag & 0xc0) == 0x40) {
189 addr = 0x7028; // base address of WB Calibration group 1
190 }else if((otp_flag & 0x30) == 0x10) {
191 addr = 0x7031; // base address of WB Calibration group 2
192 }else if((otp_flag & 0x0c) == 0x04) {
193 addr = 0x703a; // base address of WB Calibration group 3
194 }
195
196 if(addr != 0) {
197 (*otp_ptr).flag |= 0x40;
198 (*otp_ptr).ob_data = otp_i2c_read(addr-1);
199
200 temp = otp_i2c_read( addr + 3);
201 (*otp_ptr).rg_ratio = (otp_i2c_read(addr)<<2) + ((temp>>6) & 0x03);
202 (*otp_ptr).bg_ratio = (otp_i2c_read( addr + 1)<<2) + ((temp>>4) & 0x03);
203
204 temp = otp_i2c_read(addr + 7);
205 (*otp_ptr).golden_RG = (otp_i2c_read(addr + 4) << 2) + ((temp >> 6) & 0x03);
206 (*otp_ptr).golden_BG = (otp_i2c_read(addr + 5) << 2) + ((temp >> 4) & 0x03);
207 (*otp_ptr).golden_G = otp_i2c_read(addr + 6);
208
209 OV5670DB("ob_data=%d rg_ratio=%d bg_ratio=%d golden_RG=%d golden_BG=%d golden_G=%d\n",
210 (*otp_ptr).ob_data, (*otp_ptr).rg_ratio, (*otp_ptr).bg_ratio, (*otp_ptr).golden_RG, (*otp_ptr).golden_BG, (*otp_ptr).golden_G);
211
212 }else {
213 (*otp_ptr).rg_ratio = 0;
214 (*otp_ptr).bg_ratio = 0;
215 }
216
217 for(i=0x7010;i<=0x7041;i++) {
218 otp_i2c_write(i,0); // clear OTP buffer, recommended use continuous write to accelarate
219 }
220
221 //set 0x5002[3] to “1”
222 temp1 = otp_i2c_read(0x5002);
223 otp_i2c_write(0x5002, (0x02 & 0x08) | (temp1 & (~0x08)));
224 return (*otp_ptr).flag ;
6fa3eb70
S
225}
226
4b9e9796 227static int apply_otp(struct otp_struct *otp_ptr)
6fa3eb70 228{
4b9e9796
S
229 int rg, bg, R_gain, G_gain, B_gain, Base_gain;
230
231 // apply OTP WB Calibration
232 if ((*otp_ptr).flag & 0x40) {
233 rg = (*otp_ptr). rg_ratio;
234 bg = (*otp_ptr).bg_ratio;
235 //calculate G gain
236 R_gain = (RG_Ratio_Typical*1000) / rg;
237 B_gain = (BG_Ratio_Typical*1000) / bg;
238 G_gain = 1000;
239 OV5670DB("before calibration R_gain=%d B_gain=%d G_gain=%d rg=%d bg=%d\n", R_gain, B_gain, G_gain, rg, bg);
240 if (R_gain < 1000 || B_gain < 1000)
241 {
242 if (R_gain < B_gain)
243 Base_gain = R_gain;
244 else
245 Base_gain = B_gain;
246 }
247 else
248 {
249 Base_gain = G_gain;
250 }
251
252 R_gain = 0x400 * R_gain / (Base_gain);
253 B_gain = 0x400 * B_gain / (Base_gain);
254 G_gain = 0x400 * G_gain / (Base_gain);
255 OV5670DB("after calibration R_gain=%d B_gain=%d G_gain=%d \n", R_gain, B_gain, G_gain);
256
257 // update sensor WB gain
258 if (R_gain>0x400) {
259 otp_i2c_write(0x5032, R_gain>>8);
260 otp_i2c_write(0x5033, R_gain & 0x00ff);
261 }
262 if (G_gain>0x400) {
263 otp_i2c_write(0x5034, G_gain>>8);
264 otp_i2c_write(0x5035, G_gain & 0x00ff);
265 }
266 if (B_gain>0x400) {
267 otp_i2c_write(0x5036, B_gain>>8);
268 otp_i2c_write(0x5037, B_gain & 0x00ff);
269 }
270 }
271 return (*otp_ptr).flag ;
6fa3eb70
S
272}
273
4b9e9796
S
274void ov5670_otp_config()
275{
276 struct otp_struct otp_info ;
277
278 read_otp(&otp_info);
279 apply_otp(&otp_info) ;
280}
281kal_uint32 GetOV5670LineLength(void)
6fa3eb70 282{
4b9e9796
S
283 kal_uint32 OV5670_line_length = 0;
284 if ( SENSOR_MODE_PREVIEW == OV5670.sensorMode )
285 {
286 OV5670_line_length = OV5670_PV_PERIOD_PIXEL_NUMS + OV5670.DummyPixels;
287 }
288 else if( SENSOR_MODE_VIDEO == OV5670.sensorMode )
289 {
290 OV5670_line_length = OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels;
291 }
292 else
293 {
294 OV5670_line_length = OV5670_FULL_PERIOD_PIXEL_NUMS + OV5670.DummyPixels;
295 }
6fa3eb70 296
4b9e9796 297 return OV5670_line_length;
6fa3eb70 298
4b9e9796
S
299}
300
301
302kal_uint32 GetOV5670FrameLength(void)
6fa3eb70 303{
4b9e9796 304 kal_uint32 OV5670_frame_length = 0;
6fa3eb70 305
4b9e9796
S
306 if ( SENSOR_MODE_PREVIEW == OV5670.sensorMode )
307 {
308 OV5670_frame_length = OV5670_PV_PERIOD_LINE_NUMS + OV5670.DummyLines ;
309 }
310 else if( SENSOR_MODE_VIDEO == OV5670.sensorMode )
311 {
312 OV5670_frame_length = OV5670_VIDEO_PERIOD_LINE_NUMS + OV5670.DummyLines ;
313 }
314 else
6fa3eb70 315 {
4b9e9796 316 OV5670_frame_length = OV5670_FULL_PERIOD_LINE_NUMS + OV5670.DummyLines ;
6fa3eb70 317 }
4b9e9796
S
318
319 return OV5670_frame_length;
320}
6fa3eb70
S
321
322
4b9e9796 323kal_uint32 OV5670_CalcExtra_For_ShutterMargin(kal_uint32 shutter_value,kal_uint32 shutterLimitation)
6fa3eb70 324{
4b9e9796 325 kal_uint32 extra_lines = 0;
6fa3eb70 326
6fa3eb70 327
4b9e9796
S
328 if (shutter_value <4 ){
329 shutter_value = 4;
330 }
331
6fa3eb70 332
4b9e9796
S
333 if (shutter_value > shutterLimitation)
334 {
335 extra_lines = shutter_value - shutterLimitation;
336 }
337 else
338 extra_lines = 0;
339
340 return extra_lines;
341
342}
343
344
345kal_uint32 OV5670_CalcFrameLength_For_AutoFlicker(void)
346{
347
348 kal_uint32 AutoFlicker_min_framelength = 0;
349
350 switch(OV5670CurrentScenarioId)
351 {
352 case MSDK_SCENARIO_ID_CAMERA_ZSD:
353 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:
354 AutoFlicker_min_framelength = (OV5670.capPclk*10000) /(OV5670_FULL_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/OV5670_AUTOFLICKER_OFFSET_25*10 ;
355 break;
356 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:
357 if(OV5670_VIDEO_MODE_TARGET_FPS==30)
358 {
359 AutoFlicker_min_framelength = (OV5670.videoPclk*10000) /(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/OV5670_AUTOFLICKER_OFFSET_30*10 ;
360 }
361 else if(OV5670_VIDEO_MODE_TARGET_FPS==15)
362 {
363 AutoFlicker_min_framelength = (OV5670.videoPclk*10000) /(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/OV5670_AUTOFLICKER_OFFSET_15*10 ;
364 }
365 else
366 {
367 AutoFlicker_min_framelength = OV5670_VIDEO_PERIOD_LINE_NUMS + OV5670.DummyLines;
368 }
369 break;
370
371 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:
372 default:
373 AutoFlicker_min_framelength = (OV5670.pvPclk*10000) /(OV5670_PV_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/OV5670_AUTOFLICKER_OFFSET_30*10 ;
374 break;
6fa3eb70
S
375 }
376
4b9e9796 377 OV5670DB("AutoFlicker_min_framelength =%d,OV5670CurrentScenarioId =%d\n", AutoFlicker_min_framelength,OV5670CurrentScenarioId);
6fa3eb70 378
4b9e9796 379 return AutoFlicker_min_framelength;
6fa3eb70 380
4b9e9796 381}
6fa3eb70
S
382
383
4b9e9796 384void OV5670_write_shutter(kal_uint32 shutter)
6fa3eb70 385{
4b9e9796
S
386 kal_uint32 min_framelength = OV5670_PV_PERIOD_PIXEL_NUMS, max_shutter=0;
387 kal_uint32 line_length = 0;
388 kal_uint32 frame_length = 0;
6fa3eb70 389 unsigned long flags;
4b9e9796
S
390
391 //for test
392 //shutter = 0x7fc; //issue
393
6fa3eb70 394
4b9e9796
S
395 line_length = GetOV5670LineLength();
396 frame_length = GetOV5670FrameLength();
397
398 max_shutter = frame_length-OV5670_SHUTTER_MARGIN;
6fa3eb70 399
4b9e9796
S
400 frame_length = frame_length + OV5670_CalcExtra_For_ShutterMargin(shutter,max_shutter);
401
6fa3eb70
S
402
403
4b9e9796
S
404 if(OV5670.OV5670AutoFlickerMode == KAL_TRUE)
405 {
406 min_framelength = OV5670_CalcFrameLength_For_AutoFlicker();
407
408 if(frame_length < min_framelength)
409 frame_length = min_framelength;
410 }
6fa3eb70 411
4b9e9796
S
412
413 spin_lock_irqsave(&ov5670mipiraw_drv_lock,flags);
414 OV5670_FeatureControl_PERIOD_PixelNum = line_length;
415 OV5670_FeatureControl_PERIOD_LineNum = frame_length;
416 spin_unlock_irqrestore(&ov5670mipiraw_drv_lock,flags);
417
418 //Set total frame length //VTS
419 OV5670_write_cmos_sensor(0x380e, (frame_length >> 8) & 0xFF);
420 OV5670_write_cmos_sensor(0x380f, frame_length & 0xFF);
421
422 //Set shutter
423 OV5670_write_cmos_sensor(0x3500, (shutter>>12) & 0x0F);
424 OV5670_write_cmos_sensor(0x3501, (shutter>>4) & 0xFF);
425 OV5670_write_cmos_sensor(0x3502, (shutter<<4) & 0xF0); /* Don't use the fraction part. */
426
427 OV5670DB("ov5670 write shutter=%x, line_length=%x, frame_length=%x\n", shutter, line_length, frame_length);
428
6fa3eb70
S
429}
430
4b9e9796
S
431
432static kal_uint16 OV5670Reg2Gain(const kal_uint16 iReg)
6fa3eb70 433{
4b9e9796
S
434 kal_uint16 iGain =0;
435
436 iGain = iReg*BASEGAIN/OV5670_GAIN_BASE;
437 return iGain;
6fa3eb70 438
4b9e9796 439}
6fa3eb70 440
4b9e9796
S
441static kal_uint16 OV5670Gain2Reg(const kal_uint16 Gain)
442{
443 kal_uint32 iReg = 0x0000;
444 kal_uint32 TempGain = BASEGAIN;
6fa3eb70
S
445
446
4b9e9796
S
447 TempGain = Gain;
448 if(TempGain < BASEGAIN){
449 TempGain = BASEGAIN;
450 //OV5670DB("###ov5670 write gain underflow### Gain =%x\n", Gain);
451 }
452 if(TempGain > 16*BASEGAIN){
453 TempGain = 16*BASEGAIN;
454 //OV5670DB("###ov5670 write gain overflow### Gain =%x\n", Gain);
455 }
6fa3eb70 456
4b9e9796 457 iReg = (TempGain*OV5670_GAIN_BASE)/BASEGAIN;
6fa3eb70 458
4b9e9796
S
459 //iReg = ((TempGain /BASEGAIN)<<7)+((TempGain % BASEGAIN)<<7/BASEGAIN);
460 iReg = iReg & 0xFFFF;
461
462 //OV5670DB("###ov5670 write Reg ### iReg =%x\n", iReg);
463
464 return iReg;
465
466}
467
468void write_OV5670_gain(kal_uint16 gain)
469{
470 kal_uint16 iGain =1;
471 kal_uint8 ChangeFlag=0x01;
472
473 kal_uint16 read_gain;
474
475 iGain=(gain / OV5670_GAIN_BASE);
476
477 if(iGain<2){
478 ChangeFlag= 0x00;
479 }
480 else if(iGain<4){
481 ChangeFlag= 0x01;
482 }
483 else if(iGain<8){
484 ChangeFlag= 0x03;
485 }
486 else{
487 ChangeFlag= 0x07;
488 }
489
490 //ChangeFlag= 0x07;
491
492 OV5670_write_cmos_sensor(0x301d, 0xf0);
493 OV5670_write_cmos_sensor(0x3209, 0x00);
494 OV5670_write_cmos_sensor(0x320a, 0x01);
6fa3eb70
S
495
496 //group write hold
4b9e9796
S
497 //group 0:delay 0x366a for one frame,then active with gain
498 OV5670_write_cmos_sensor(0x3208, 0x00);
499 OV5670_write_cmos_sensor(0x366a, ChangeFlag);
500 OV5670_write_cmos_sensor(0x3208, 0x10);
6fa3eb70
S
501
502 //group 1:all other registers( gain)
4b9e9796
S
503 OV5670_write_cmos_sensor(0x3208, 0x01);
504 OV5670_write_cmos_sensor(0x3508,(gain>>8));
505 OV5670_write_cmos_sensor(0x3509,(gain&0xff));
506
507 OV5670_write_cmos_sensor(0x3208, 0x11);
6fa3eb70
S
508
509 //group lanch
4b9e9796
S
510 OV5670_write_cmos_sensor(0x320B, 0x15);
511 OV5670_write_cmos_sensor(0x3208, 0xA1);
512
513 //read_gain=(((OV5670_read_cmos_sensor(0x3508)&0x1F) << 8) | OV5670_read_cmos_sensor(0x3509));
514 //OV5670DB("[OV5670_SetGain]0x3508|0x3509=0x%x \n",read_gain);
515 //OV5670DB("[OV5670_SetGain]0x366a=%d \n",(OV5670_read_cmos_sensor(0x366a)));
516
517 return;
518
519}
520
521void OV5670_SetGain(UINT16 iGain)
522{
523 unsigned long flags;
524 spin_lock_irqsave(&ov5670mipiraw_drv_lock,flags);
525
526 OV5670DB("OV5670_SetGain iGain = %d :\n ",iGain);
6fa3eb70 527
4b9e9796
S
528 OV5670.realGain = iGain;
529 OV5670.sensorGlobalGain = OV5670Gain2Reg(iGain);
530 spin_unlock_irqrestore(&ov5670mipiraw_drv_lock,flags);
6fa3eb70 531
4b9e9796
S
532 write_OV5670_gain(OV5670.sensorGlobalGain);
533 OV5670DB(" [OV5670_SetGain]OV5670.sensorGlobalGain=0x%x,OV5670.realGain =%d",OV5670.sensorGlobalGain,
534 OV5670.realGain);
6fa3eb70 535
4b9e9796
S
536 //temperature test
537 //OV5670_write_cmos_sensor(0x4d12,0x01);
538 //OV5670DB("Temperature read_reg 0x4d13 =%x \n",OV5670_read_cmos_sensor(0x4d13));
539}
6fa3eb70 540
4b9e9796
S
541kal_uint16 read_OV5670_gain(void)
542{
543 kal_uint16 read_gain=0;
544
545 read_gain=(((OV5670_read_cmos_sensor(0x3508)&0x1F) << 8) | OV5670_read_cmos_sensor(0x3509));
546
547 spin_lock(&ov5670mipiraw_drv_lock);
548 OV5670.sensorGlobalGain = read_gain;
549 OV5670.realGain = OV5670Reg2Gain(OV5670.sensorGlobalGain);
550 spin_unlock(&ov5670mipiraw_drv_lock);
551
552 OV5670DB("OV5670.sensorGlobalGain=0x%x,OV5670.realGain=%d\n",OV5670.sensorGlobalGain,OV5670.realGain);
6fa3eb70 553
4b9e9796
S
554 return OV5670.sensorGlobalGain;
555}
6fa3eb70 556
4b9e9796
S
557
558#if 1
559void OV5670_camera_para_to_sensor(void)
6fa3eb70 560{
4b9e9796
S
561 kal_uint32 i;
562 for(i=0; 0xFFFFFFFF!=OV5670SensorReg[i].Addr; i++)
563 {
564 OV5670_write_cmos_sensor(OV5670SensorReg[i].Addr, OV5670SensorReg[i].Para);
565 }
566 for(i=ENGINEER_START_ADDR; 0xFFFFFFFF!=OV5670SensorReg[i].Addr; i++)
567 {
568 OV5670_write_cmos_sensor(OV5670SensorReg[i].Addr, OV5670SensorReg[i].Para);
569 }
570 for(i=FACTORY_START_ADDR; i<FACTORY_END_ADDR; i++)
571 {
572 OV5670_write_cmos_sensor(OV5670SensorCCT[i].Addr, OV5670SensorCCT[i].Para);
573 }
574}
6fa3eb70 575
4b9e9796
S
576void OV5670_sensor_to_camera_para(void)
577{
578 kal_uint32 i, temp_data;
579 for(i=0; 0xFFFFFFFF!=OV5670SensorReg[i].Addr; i++)
580 {
581 temp_data = OV5670_read_cmos_sensor(OV5670SensorReg[i].Addr);
582 spin_lock(&ov5670mipiraw_drv_lock);
583 OV5670SensorReg[i].Para =temp_data;
584 spin_unlock(&ov5670mipiraw_drv_lock);
585 }
586 for(i=ENGINEER_START_ADDR; 0xFFFFFFFF!=OV5670SensorReg[i].Addr; i++)
587 {
588 temp_data = OV5670_read_cmos_sensor(OV5670SensorReg[i].Addr);
589 spin_lock(&ov5670mipiraw_drv_lock);
590 OV5670SensorReg[i].Para = temp_data;
591 spin_unlock(&ov5670mipiraw_drv_lock);
592 }
6fa3eb70
S
593}
594
4b9e9796 595kal_int32 OV5670_get_sensor_group_count(void)
6fa3eb70 596{
4b9e9796
S
597 return GROUP_TOTAL_NUMS;
598}
6fa3eb70 599
4b9e9796 600void OV5670_get_sensor_group_info(kal_uint16 group_idx, kal_int8* group_name_ptr, kal_int32* item_count_ptr)
6fa3eb70 601{
4b9e9796
S
602 switch (group_idx)
603 {
604 case PRE_GAIN:
605 sprintf((char *)group_name_ptr, "CCT");
606 *item_count_ptr = 2;
607 break;
608 case CMMCLK_CURRENT:
609 sprintf((char *)group_name_ptr, "CMMCLK Current");
610 *item_count_ptr = 1;
611 break;
612 case FRAME_RATE_LIMITATION:
613 sprintf((char *)group_name_ptr, "Frame Rate Limitation");
614 *item_count_ptr = 2;
615 break;
616 case REGISTER_EDITOR:
617 sprintf((char *)group_name_ptr, "Register Editor");
618 *item_count_ptr = 2;
619 break;
620 default:
621 ASSERT(0);
622}
623}
624
625void OV5670_get_sensor_item_info(kal_uint16 group_idx,kal_uint16 item_idx, MSDK_SENSOR_ITEM_INFO_STRUCT* info_ptr)
626{
627 kal_int16 temp_reg=0;
628 kal_uint16 temp_gain=0, temp_addr=0, temp_para=0;
629
630 switch (group_idx)
631 {
632 case PRE_GAIN:
633 switch (item_idx)
634 {
635 case 0:
636 sprintf((char *)info_ptr->ItemNamePtr,"Pregain-R");
637 temp_addr = PRE_GAIN_R_INDEX;
638 break;
639 case 1:
640 sprintf((char *)info_ptr->ItemNamePtr,"Pregain-Gr");
641 temp_addr = PRE_GAIN_Gr_INDEX;
642 break;
643 case 2:
644 sprintf((char *)info_ptr->ItemNamePtr,"Pregain-Gb");
645 temp_addr = PRE_GAIN_Gb_INDEX;
646 break;
647 case 3:
648 sprintf((char *)info_ptr->ItemNamePtr,"Pregain-B");
649 temp_addr = PRE_GAIN_B_INDEX;
650 break;
651 case 4:
652 sprintf((char *)info_ptr->ItemNamePtr,"SENSOR_BASEGAIN");
653 temp_addr = SENSOR_BASEGAIN;
654 break;
655 default:
656 ASSERT(0);
657 }
658
659 temp_para= OV5670SensorCCT[temp_addr].Para;
660 //temp_gain= (temp_para/OV5670.sensorBaseGain) * 1000;
661
662 info_ptr->ItemValue=temp_gain;
663 info_ptr->IsTrueFalse=KAL_FALSE;
664 info_ptr->IsReadOnly=KAL_FALSE;
665 info_ptr->IsNeedRestart=KAL_FALSE;
666 info_ptr->Min= OV5670_MIN_ANALOG_GAIN * 1000;
667 info_ptr->Max= OV5670_MAX_ANALOG_GAIN * 1000;
668 break;
669 case CMMCLK_CURRENT:
670 switch (item_idx)
671 {
672 case 0:
673 sprintf((char *)info_ptr->ItemNamePtr,"Drv Cur[2,4,6,8]mA");
674
675 //temp_reg=MT9P017SensorReg[CMMCLK_CURRENT_INDEX].Para;
676 temp_reg = ISP_DRIVING_2MA;
677 if(temp_reg==ISP_DRIVING_2MA)
678 {
679 info_ptr->ItemValue=2;
680 }
681 else if(temp_reg==ISP_DRIVING_4MA)
682 {
683 info_ptr->ItemValue=4;
684 }
685 else if(temp_reg==ISP_DRIVING_6MA)
686 {
687 info_ptr->ItemValue=6;
688 }
689 else if(temp_reg==ISP_DRIVING_8MA)
690 {
691 info_ptr->ItemValue=8;
692 }
693
694 info_ptr->IsTrueFalse=KAL_FALSE;
695 info_ptr->IsReadOnly=KAL_FALSE;
696 info_ptr->IsNeedRestart=KAL_TRUE;
697 info_ptr->Min=2;
698 info_ptr->Max=8;
699 break;
700 default:
701 ASSERT(0);
702 }
703 break;
704 case FRAME_RATE_LIMITATION:
705 switch (item_idx)
706 {
707 case 0:
708 sprintf((char *)info_ptr->ItemNamePtr,"Max Exposure Lines");
709 info_ptr->ItemValue= 111;
710 info_ptr->IsTrueFalse=KAL_FALSE;
711 info_ptr->IsReadOnly=KAL_TRUE;
712 info_ptr->IsNeedRestart=KAL_FALSE;
713 info_ptr->Min=0;
714 info_ptr->Max=0;
715 break;
716 case 1:
717 sprintf((char *)info_ptr->ItemNamePtr,"Min Frame Rate");
718 info_ptr->ItemValue=12;
719 info_ptr->IsTrueFalse=KAL_FALSE;
720 info_ptr->IsReadOnly=KAL_TRUE;
721 info_ptr->IsNeedRestart=KAL_FALSE;
722 info_ptr->Min=0;
723 info_ptr->Max=0;
724 break;
725 default:
726 ASSERT(0);
727 }
728 break;
729 case REGISTER_EDITOR:
730 switch (item_idx)
731 {
732 case 0:
733 sprintf((char *)info_ptr->ItemNamePtr,"REG Addr.");
734 info_ptr->ItemValue=0;
735 info_ptr->IsTrueFalse=KAL_FALSE;
736 info_ptr->IsReadOnly=KAL_FALSE;
737 info_ptr->IsNeedRestart=KAL_FALSE;
738 info_ptr->Min=0;
739 info_ptr->Max=0xFFFF;
740 break;
741 case 1:
742 sprintf((char *)info_ptr->ItemNamePtr,"REG Value");
743 info_ptr->ItemValue=0;
744 info_ptr->IsTrueFalse=KAL_FALSE;
745 info_ptr->IsReadOnly=KAL_FALSE;
746 info_ptr->IsNeedRestart=KAL_FALSE;
747 info_ptr->Min=0;
748 info_ptr->Max=0xFFFF;
749 break;
750 default:
751 ASSERT(0);
752 }
753 break;
754 default:
755 ASSERT(0);
756 }
757}
758
759
760
761kal_bool OV5670_set_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_int32 ItemValue)
762{
763 kal_uint16 temp_gain=0,temp_addr=0, temp_para=0;
764
765 switch (group_idx)
766 {
767 case PRE_GAIN:
768 switch (item_idx)
769 {
770 case 0:
771 temp_addr = PRE_GAIN_R_INDEX;
772 break;
773 case 1:
774 temp_addr = PRE_GAIN_Gr_INDEX;
775 break;
776 case 2:
777 temp_addr = PRE_GAIN_Gb_INDEX;
778 break;
779 case 3:
780 temp_addr = PRE_GAIN_B_INDEX;
781 break;
782 case 4:
783 temp_addr = SENSOR_BASEGAIN;
784 break;
785 default:
786 ASSERT(0);
787 }
788
789 temp_gain=((ItemValue*BASEGAIN+500)/1000); //+500:get closed integer value
790
791 if(temp_gain>=1*BASEGAIN && temp_gain<=16*BASEGAIN)
792 {
793// temp_para=(temp_gain * OV5670.sensorBaseGain + BASEGAIN/2)/BASEGAIN;
794 }
795 else
796 ASSERT(0);
797
798 spin_lock(&ov5670mipiraw_drv_lock);
799 OV5670SensorCCT[temp_addr].Para = temp_para;
800 spin_unlock(&ov5670mipiraw_drv_lock);
801 OV5670_write_cmos_sensor(OV5670SensorCCT[temp_addr].Addr,temp_para);
802
803 break;
804 case CMMCLK_CURRENT:
805 switch (item_idx)
806 {
807 case 0:
808 //no need to apply this item for driving current
809 break;
810 default:
811 ASSERT(0);
812 }
813 break;
814 case FRAME_RATE_LIMITATION:
815 ASSERT(0);
816 break;
817 case REGISTER_EDITOR:
818 switch (item_idx)
819 {
820 case 0:
821 spin_lock(&ov5670mipiraw_drv_lock);
822 OV5670_FAC_SENSOR_REG=ItemValue;
823 spin_unlock(&ov5670mipiraw_drv_lock);
824 break;
825 case 1:
826 OV5670_write_cmos_sensor(OV5670_FAC_SENSOR_REG,ItemValue);
827 break;
828 default:
829 ASSERT(0);
830 }
831 break;
832 default:
833 ASSERT(0);
834 }
835 return KAL_TRUE;
836}
837#endif
838
839
840static void OV5670_SetDummy( const kal_uint32 iPixels, const kal_uint32 iLines )
841{
842 kal_uint32 line_length = 0;
843 kal_uint32 frame_length = 0;
844
845 if ( SENSOR_MODE_PREVIEW == OV5670.sensorMode )
846 {
847 line_length = OV5670_PV_PERIOD_PIXEL_NUMS + iPixels;
848 frame_length = OV5670_PV_PERIOD_LINE_NUMS + iLines;
849 }
850 else if( SENSOR_MODE_VIDEO== OV5670.sensorMode )
851 {
852 line_length = OV5670_VIDEO_PERIOD_PIXEL_NUMS + iPixels;
853 frame_length = OV5670_VIDEO_PERIOD_LINE_NUMS + iLines;
854 }
855 else
856 {
857 line_length = OV5670_FULL_PERIOD_PIXEL_NUMS + iPixels;
858 frame_length = OV5670_FULL_PERIOD_LINE_NUMS + iLines;
859 }
6fa3eb70 860
4b9e9796
S
861 spin_lock(&ov5670mipiraw_drv_lock);
862 OV5670_FeatureControl_PERIOD_PixelNum = line_length;
863 OV5670_FeatureControl_PERIOD_LineNum = frame_length;
864 spin_unlock(&ov5670mipiraw_drv_lock);
6fa3eb70 865
4b9e9796
S
866 //Set total frame length
867 OV5670_write_cmos_sensor(0x380e, (frame_length >> 8) & 0xFF);
868 OV5670_write_cmos_sensor(0x380f, frame_length & 0xFF);
869 //Set total line length
870 OV5670_write_cmos_sensor(0x380c, (line_length >> 8) & 0xFF);
871 OV5670_write_cmos_sensor(0x380d, line_length & 0xFF);
6fa3eb70 872
4b9e9796 873}
6fa3eb70
S
874
875
4b9e9796 876void OV5670PreviewSetting(void)
6fa3eb70 877{
4b9e9796
S
878 OV5670DB(" OV5670PreviewSetting_2lane enter\n");
879
880 /* //
881
882 //@@PV_Quarter_size_30fps_800Mbps/lane
883 //99 1296 960
884 //;;102 3601 157c
885 //;;PCLK=HTS*VTS*fps=0x68c*0x7fd*30=1676*2045*30=102.85M
886
887 OV5670_write_cmos_sensor(0x0100, 0x00); //
888
889 OV5670_write_cmos_sensor(0x3501, 0x3d); //
890 OV5670_write_cmos_sensor(0x366e, 0x08); //
891 OV5670_write_cmos_sensor(0x370b, 0x1b); //
892 OV5670_write_cmos_sensor(0x3808, 0x05); //
893 OV5670_write_cmos_sensor(0x3809, 0x10); //
894 OV5670_write_cmos_sensor(0x380a, 0x03); //
895 OV5670_write_cmos_sensor(0x380b, 0xc0); //
896 OV5670_write_cmos_sensor(0x380c, 0x06); //
897 OV5670_write_cmos_sensor(0x380d, 0x8c); //
898 OV5670_write_cmos_sensor(0x380e, 0x07); //;03
899 OV5670_write_cmos_sensor(0x380f, 0xfd); //;e0
900 OV5670_write_cmos_sensor(0x3814, 0x03); //
901 OV5670_write_cmos_sensor(0x3820, 0x90); //
902 OV5670_write_cmos_sensor(0x3821, 0x47); //
903 OV5670_write_cmos_sensor(0x382a, 0x03); //
904 OV5670_write_cmos_sensor(0x4009, 0x05); //
905 OV5670_write_cmos_sensor(0x4502, 0x48); //
906 OV5670_write_cmos_sensor(0x4508, 0x55); //
907 OV5670_write_cmos_sensor(0x4509, 0x55); //
908 OV5670_write_cmos_sensor(0x4600, 0x00); //
909 OV5670_write_cmos_sensor(0x4601, 0x81); //
910 OV5670_write_cmos_sensor(0x4017, 0x10); //; threshold = 4LSB for Binning sum format.
911 OV5670_write_cmos_sensor(0x400a, 0x02); //;
912 OV5670_write_cmos_sensor(0x400b, 0x00); //;
913
914 OV5670_write_cmos_sensor(0x0100, 0x01); //
915*/
6fa3eb70
S
916
917 //@@PV_Quarter_size_30fps_800Mbps/lane_1296x972
918 //99 1296 972
919 //;;102 3601 157c
920 //;;PCLK=HTS*VTS*fps=0x68c*0x7fd*30=1676*2045*30=102.85M
921
4b9e9796
S
922 OV5670_write_cmos_sensor(0x0100, 0x00); //
923
924 OV5670_write_cmos_sensor(0x3501, 0x73); //
925 OV5670_write_cmos_sensor(0x3502, 0x00); //
926 OV5670_write_cmos_sensor(0x3508, 0x01); //
927 OV5670_write_cmos_sensor(0x3509, 0x80); //
928 OV5670_write_cmos_sensor(0x366e, 0x08); //
929 OV5670_write_cmos_sensor(0x370b, 0x1b); //
930 OV5670_write_cmos_sensor(0x3808, 0x05); //
931 OV5670_write_cmos_sensor(0x3809, 0x10); //
932 OV5670_write_cmos_sensor(0x380a, 0x03); //
933 OV5670_write_cmos_sensor(0x380b, 0xcc); //;c0
934 OV5670_write_cmos_sensor(0x380c, 0x06); //
935 OV5670_write_cmos_sensor(0x380d, 0x8c); //
936 OV5670_write_cmos_sensor(0x380e, 0x07); //;03
937 OV5670_write_cmos_sensor(0x380f, 0xfd); //;e0
938 OV5670_write_cmos_sensor(0x3814, 0x03); //
939 OV5670_write_cmos_sensor(0x3820, 0x90); //
940 OV5670_write_cmos_sensor(0x3821, 0x47); //
941 OV5670_write_cmos_sensor(0x382a, 0x03); //
942 OV5670_write_cmos_sensor(0x3845, 0x02); //
943 OV5670_write_cmos_sensor(0x4009, 0x05); //
944 OV5670_write_cmos_sensor(0x4502, 0x48); //
945 OV5670_write_cmos_sensor(0x4508, 0x55); //
946 OV5670_write_cmos_sensor(0x4509, 0x55); //
947 OV5670_write_cmos_sensor(0x4600, 0x00); //
948 OV5670_write_cmos_sensor(0x4601, 0x81); //
949 OV5670_write_cmos_sensor(0x4017, 0x10); //; threshold = 4LSB for Binning
950 OV5670_write_cmos_sensor(0x400a, 0x02); //;
951 OV5670_write_cmos_sensor(0x400b, 0x00); //;
6fa3eb70 952
4b9e9796
S
953 OV5670_write_cmos_sensor(0x0100, 0x01); //
954}
6fa3eb70
S
955
956
4b9e9796
S
957void OV5670VideoSetting(void)
958{
959 OV5670DB(" OV5670videoSetting_2lane enter:video/preview sync\n");
960
961 OV5670PreviewSetting();
962}
6fa3eb70 963
6fa3eb70 964
6fa3eb70 965
4b9e9796 966void OV5670CaptureSetting(void)
6fa3eb70 967{
4b9e9796 968 OV5670DB("OV5670CaptureSetting_2lane enter\n");
6fa3eb70 969
4b9e9796
S
970 OV5670_write_cmos_sensor(0x0100, 0x00);
971
972 OV5670_write_cmos_sensor(0x3501, 0x5f); //long exposure
973 OV5670_write_cmos_sensor(0x3502, 0xd0); //long exposure
974
975 OV5670_write_cmos_sensor(0x3508, 0x03); //gain
976 OV5670_write_cmos_sensor(0x3509, 0x00); //gain
977
978 OV5670_write_cmos_sensor(0x366e, 0x10);
979 OV5670_write_cmos_sensor(0x370b, 0x1b);
980 OV5670_write_cmos_sensor(0x3808, 0x0a);
981 OV5670_write_cmos_sensor(0x3809, 0x20);
982 OV5670_write_cmos_sensor(0x380a, 0x07);
983 OV5670_write_cmos_sensor(0x380b, 0x98);
984 OV5670_write_cmos_sensor(0x380c, 0x07); //;06
985 OV5670_write_cmos_sensor(0x380d, 0xdc); //;8c
986 OV5670_write_cmos_sensor(0x380e, 0x07);
987 OV5670_write_cmos_sensor(0x380f, 0xfd);
988 OV5670_write_cmos_sensor(0x3814, 0x01);
989 OV5670_write_cmos_sensor(0x3820, 0x80);
990 OV5670_write_cmos_sensor(0x3821, 0x46);
991 OV5670_write_cmos_sensor(0x382a, 0x01);
992
993 OV5670_write_cmos_sensor(0x3845, 0x00); //v_offset for auto size mode
994
995 OV5670_write_cmos_sensor(0x4009, 0x0d);
996 OV5670_write_cmos_sensor(0x4502, 0x40);
997 OV5670_write_cmos_sensor(0x4508, 0xaa);
998 OV5670_write_cmos_sensor(0x4509, 0xaa);
999 OV5670_write_cmos_sensor(0x4600, 0x01);
1000 OV5670_write_cmos_sensor(0x4601, 0x03);
1001 OV5670_write_cmos_sensor(0x4017, 0x08); //threshold= 2LSB for full size
1002 OV5670_write_cmos_sensor(0x400a, 0x02); //
1003 OV5670_write_cmos_sensor(0x400b, 0x00); //
1004
1005 OV5670_write_cmos_sensor(0x0100, 0x01);
6fa3eb70 1006
6fa3eb70
S
1007}
1008
4b9e9796
S
1009
1010static void OV5670_Sensor_Init(void)
6fa3eb70 1011{
4b9e9796 1012 OV5670DB("OV5670_Sensor_Init_2lane enter\n");
6fa3eb70 1013
4b9e9796
S
1014 OV5670_write_cmos_sensor(0x0103,0x01);// ; software reset
1015 mdelay(10);
1016 OV5670_write_cmos_sensor(0x0100, 0x00);// ; software standby
1017 OV5670_write_cmos_sensor(0x0100, 0x00);
1018 OV5670_write_cmos_sensor(0x0300, 0x04);
1019 OV5670_write_cmos_sensor(0x0301, 0x00);
1020 OV5670_write_cmos_sensor(0x0302, 0x64); //;78
1021 OV5670_write_cmos_sensor(0x0303, 0x00);
1022 OV5670_write_cmos_sensor(0x0304, 0x03);
1023 OV5670_write_cmos_sensor(0x0305, 0x01);
1024 OV5670_write_cmos_sensor(0x0306, 0x01);
1025 OV5670_write_cmos_sensor(0x030a, 0x00);
1026 OV5670_write_cmos_sensor(0x030b, 0x00);
1027 OV5670_write_cmos_sensor(0x030c, 0x00);
1028 OV5670_write_cmos_sensor(0x030d, 0x1e);
1029 OV5670_write_cmos_sensor(0x030e, 0x00);
1030 OV5670_write_cmos_sensor(0x030f, 0x06);
1031 OV5670_write_cmos_sensor(0x0312, 0x01);
1032 OV5670_write_cmos_sensor(0x3000, 0x00);
1033 OV5670_write_cmos_sensor(0x3002, 0x21);
1034 OV5670_write_cmos_sensor(0x3005, 0xf0);
1035 OV5670_write_cmos_sensor(0x3007, 0x00);
1036 OV5670_write_cmos_sensor(0x3015, 0x0f);
1037 OV5670_write_cmos_sensor(0x3018, 0x32);
1038 OV5670_write_cmos_sensor(0x301a, 0xf0);
1039 OV5670_write_cmos_sensor(0x301b, 0xf0);
1040 OV5670_write_cmos_sensor(0x301c, 0xf0);
1041 OV5670_write_cmos_sensor(0x301d, 0xf0);
1042 OV5670_write_cmos_sensor(0x301e, 0xf0);
1043 OV5670_write_cmos_sensor(0x3030, 0x00);
1044 OV5670_write_cmos_sensor(0x3031, 0x0a);
1045 OV5670_write_cmos_sensor(0x303c, 0xff);
1046 OV5670_write_cmos_sensor(0x303e, 0xff);
1047 OV5670_write_cmos_sensor(0x3040, 0xf0);
1048 OV5670_write_cmos_sensor(0x3041, 0x00);
1049 OV5670_write_cmos_sensor(0x3042, 0xf0);
1050 OV5670_write_cmos_sensor(0x3106, 0x11);
1051 OV5670_write_cmos_sensor(0x3500, 0x00);
1052 OV5670_write_cmos_sensor(0x3501, 0x7b);
1053 OV5670_write_cmos_sensor(0x3502, 0x00);
1054 OV5670_write_cmos_sensor(0x3503, 0x04);
1055 OV5670_write_cmos_sensor(0x3504, 0x03);
1056 OV5670_write_cmos_sensor(0x3505, 0x83);
1057 OV5670_write_cmos_sensor(0x3508, 0x07);
1058 OV5670_write_cmos_sensor(0x3509, 0x80);
1059 OV5670_write_cmos_sensor(0x350e, 0x04);
1060 OV5670_write_cmos_sensor(0x350f, 0x00);
1061 OV5670_write_cmos_sensor(0x3510, 0x00);
1062 OV5670_write_cmos_sensor(0x3511, 0x02);
1063 OV5670_write_cmos_sensor(0x3512, 0x00);
1064 OV5670_write_cmos_sensor(0x3601, 0xc8);
1065 OV5670_write_cmos_sensor(0x3610, 0x88);
1066 OV5670_write_cmos_sensor(0x3612, 0x48);
1067 OV5670_write_cmos_sensor(0x3614, 0x5b);
1068 OV5670_write_cmos_sensor(0x3615, 0x96);
1069 OV5670_write_cmos_sensor(0x3621, 0xd0);
1070 OV5670_write_cmos_sensor(0x3622, 0x00);
1071 OV5670_write_cmos_sensor(0x3623, 0x00);
1072 OV5670_write_cmos_sensor(0x3633, 0x13);
1073 OV5670_write_cmos_sensor(0x3634, 0x13);
1074 OV5670_write_cmos_sensor(0x3635, 0x13);
1075 OV5670_write_cmos_sensor(0x3636, 0x13);
1076 OV5670_write_cmos_sensor(0x3645, 0x13);
1077 OV5670_write_cmos_sensor(0x3646, 0x82);
1078 OV5670_write_cmos_sensor(0x3650, 0x00);
1079 OV5670_write_cmos_sensor(0x3652, 0xff);
1080 OV5670_write_cmos_sensor(0x3655, 0x20);
1081 OV5670_write_cmos_sensor(0x3656, 0xff);
1082 OV5670_write_cmos_sensor(0x365a, 0xff);
1083 OV5670_write_cmos_sensor(0x365e, 0xff);
1084 OV5670_write_cmos_sensor(0x3668, 0x00);
1085 OV5670_write_cmos_sensor(0x366a, 0x07);
1086 OV5670_write_cmos_sensor(0x366e, 0x10);
1087 OV5670_write_cmos_sensor(0x366d, 0x00);
1088 OV5670_write_cmos_sensor(0x366f, 0x80);
1089 OV5670_write_cmos_sensor(0x3700, 0x28);
1090 OV5670_write_cmos_sensor(0x3701, 0x10);
1091 OV5670_write_cmos_sensor(0x3702, 0x3a);
1092 OV5670_write_cmos_sensor(0x3703, 0x19);
1093 OV5670_write_cmos_sensor(0x3704, 0x10);
1094 OV5670_write_cmos_sensor(0x3705, 0x00);
1095 OV5670_write_cmos_sensor(0x3706, 0x66);
1096 OV5670_write_cmos_sensor(0x3707, 0x08);
1097 OV5670_write_cmos_sensor(0x3708, 0x34);
1098 OV5670_write_cmos_sensor(0x3709, 0x40);
1099 OV5670_write_cmos_sensor(0x370a, 0x01);
1100 OV5670_write_cmos_sensor(0x370b, 0x1b);
1101 OV5670_write_cmos_sensor(0x3714, 0x24);
1102 OV5670_write_cmos_sensor(0x371a, 0x3e);
1103 OV5670_write_cmos_sensor(0x3733, 0x00);
1104 OV5670_write_cmos_sensor(0x3734, 0x00);
1105 OV5670_write_cmos_sensor(0x373a, 0x05);
1106 OV5670_write_cmos_sensor(0x373b, 0x06);
1107 OV5670_write_cmos_sensor(0x373c, 0x0a);
1108 OV5670_write_cmos_sensor(0x373f, 0xa0);
1109 OV5670_write_cmos_sensor(0x3755, 0x00);
1110 OV5670_write_cmos_sensor(0x3758, 0x00);
1111 OV5670_write_cmos_sensor(0x375b, 0x0e);
1112 OV5670_write_cmos_sensor(0x3766, 0x5f);
1113 OV5670_write_cmos_sensor(0x3768, 0x00);
1114 OV5670_write_cmos_sensor(0x3769, 0x22);
1115 OV5670_write_cmos_sensor(0x3773, 0x08);
1116 OV5670_write_cmos_sensor(0x3774, 0x1f);
1117 OV5670_write_cmos_sensor(0x3776, 0x06);
1118 OV5670_write_cmos_sensor(0x37a0, 0x88);
1119 OV5670_write_cmos_sensor(0x37a1, 0x5c);
1120 OV5670_write_cmos_sensor(0x37a7, 0x88);
1121 OV5670_write_cmos_sensor(0x37a8, 0x70);
1122 OV5670_write_cmos_sensor(0x37aa, 0x88);
1123 OV5670_write_cmos_sensor(0x37ab, 0x48);
1124 OV5670_write_cmos_sensor(0x37b3, 0x66);
1125 OV5670_write_cmos_sensor(0x37c2, 0x04);
1126 OV5670_write_cmos_sensor(0x37c5, 0x00);
1127 OV5670_write_cmos_sensor(0x37c8, 0x00);
1128 OV5670_write_cmos_sensor(0x3800, 0x00);
1129 OV5670_write_cmos_sensor(0x3801, 0x0c);
1130 OV5670_write_cmos_sensor(0x3802, 0x00);
1131 OV5670_write_cmos_sensor(0x3803, 0x04);
1132 OV5670_write_cmos_sensor(0x3804, 0x0a);
1133 OV5670_write_cmos_sensor(0x3805, 0x33);
1134 OV5670_write_cmos_sensor(0x3806, 0x07);
1135 OV5670_write_cmos_sensor(0x3807, 0xa3);
1136 OV5670_write_cmos_sensor(0x3808, 0x0a);
1137 OV5670_write_cmos_sensor(0x3809, 0x20);
1138 OV5670_write_cmos_sensor(0x380a, 0x07);
1139 OV5670_write_cmos_sensor(0x380b, 0x98);
1140 OV5670_write_cmos_sensor(0x380c, 0x07); // ;06
1141 OV5670_write_cmos_sensor(0x380d, 0xdc); // ;8c
1142 OV5670_write_cmos_sensor(0x380e, 0x07);
1143 OV5670_write_cmos_sensor(0x380f, 0xb8);
1144 OV5670_write_cmos_sensor(0x3811, 0x04);
1145 OV5670_write_cmos_sensor(0x3813, 0x02);
1146 OV5670_write_cmos_sensor(0x3814, 0x01);
1147 OV5670_write_cmos_sensor(0x3815, 0x01);
1148 OV5670_write_cmos_sensor(0x3816, 0x00);
1149 OV5670_write_cmos_sensor(0x3817, 0x00);
1150 OV5670_write_cmos_sensor(0x3818, 0x00);
1151 OV5670_write_cmos_sensor(0x3819, 0x00);
1152 OV5670_write_cmos_sensor(0x3820, 0x80);
1153 OV5670_write_cmos_sensor(0x3821, 0x46);
1154 OV5670_write_cmos_sensor(0x3822, 0x48);
1155 OV5670_write_cmos_sensor(0x3826, 0x00);
1156 OV5670_write_cmos_sensor(0x3827, 0x08);
1157 OV5670_write_cmos_sensor(0x382a, 0x01);
1158 OV5670_write_cmos_sensor(0x382b, 0x01);
1159 OV5670_write_cmos_sensor(0x3830, 0x08);
1160 OV5670_write_cmos_sensor(0x3836, 0x02);
1161 OV5670_write_cmos_sensor(0x3837, 0x00);
1162 OV5670_write_cmos_sensor(0x3838, 0x10);
1163 OV5670_write_cmos_sensor(0x3841, 0xff);
1164 OV5670_write_cmos_sensor(0x3846, 0x48);
1165 OV5670_write_cmos_sensor(0x3861, 0x00);
1166 OV5670_write_cmos_sensor(0x3862, 0x04);//x00);
1167 OV5670_write_cmos_sensor(0x3863, 0x06);//0x18);
1168 OV5670_write_cmos_sensor(0x3a11, 0x01);
1169 OV5670_write_cmos_sensor(0x3a12, 0x78);
1170 OV5670_write_cmos_sensor(0x3b00, 0x00);
1171 OV5670_write_cmos_sensor(0x3b02, 0x00);
1172 OV5670_write_cmos_sensor(0x3b03, 0x00);
1173 OV5670_write_cmos_sensor(0x3b04, 0x00);
1174 OV5670_write_cmos_sensor(0x3b05, 0x00);
1175 OV5670_write_cmos_sensor(0x3c00, 0x89);
1176 OV5670_write_cmos_sensor(0x3c01, 0xab);
1177 OV5670_write_cmos_sensor(0x3c02, 0x01);
1178 OV5670_write_cmos_sensor(0x3c03, 0x00);
1179 OV5670_write_cmos_sensor(0x3c04, 0x00);
1180 OV5670_write_cmos_sensor(0x3c05, 0x03);
1181 OV5670_write_cmos_sensor(0x3c06, 0x00);
1182 OV5670_write_cmos_sensor(0x3c07, 0x05);
1183 OV5670_write_cmos_sensor(0x3c0c, 0x00);
1184 OV5670_write_cmos_sensor(0x3c0d, 0x00);
1185 OV5670_write_cmos_sensor(0x3c0e, 0x00);
1186 OV5670_write_cmos_sensor(0x3c0f, 0x00);
1187 OV5670_write_cmos_sensor(0x3c40, 0x00);
1188 OV5670_write_cmos_sensor(0x3c41, 0xa3);
1189 OV5670_write_cmos_sensor(0x3c43, 0x7d);
1190 OV5670_write_cmos_sensor(0x3c45, 0xd7);
1191 OV5670_write_cmos_sensor(0x3c47, 0xfc);
1192 OV5670_write_cmos_sensor(0x3c50, 0x05);
1193 OV5670_write_cmos_sensor(0x3c52, 0xaa);
1194 OV5670_write_cmos_sensor(0x3c54, 0x71);
1195 OV5670_write_cmos_sensor(0x3c56, 0x80);
1196 OV5670_write_cmos_sensor(0x3d85, 0x17);
1197 OV5670_write_cmos_sensor(0x3f03, 0x00);
1198 OV5670_write_cmos_sensor(0x3f0a, 0x00);
1199 OV5670_write_cmos_sensor(0x3f0b, 0x00);
1200 OV5670_write_cmos_sensor(0x4001, 0x60);
1201 OV5670_write_cmos_sensor(0x4009, 0x0d);
1202 OV5670_write_cmos_sensor(0x4020, 0x00);
1203 OV5670_write_cmos_sensor(0x4021, 0x00);
1204 OV5670_write_cmos_sensor(0x4022, 0x00);
1205 OV5670_write_cmos_sensor(0x4023, 0x00);
1206 OV5670_write_cmos_sensor(0x4024, 0x00);
1207 OV5670_write_cmos_sensor(0x4025, 0x00);
1208 OV5670_write_cmos_sensor(0x4026, 0x00);
1209 OV5670_write_cmos_sensor(0x4027, 0x00);
1210 OV5670_write_cmos_sensor(0x4028, 0x00);
1211 OV5670_write_cmos_sensor(0x4029, 0x00);
1212 OV5670_write_cmos_sensor(0x402a, 0x00);
1213 OV5670_write_cmos_sensor(0x402b, 0x00);
1214 OV5670_write_cmos_sensor(0x402c, 0x00);
1215 OV5670_write_cmos_sensor(0x402d, 0x00);
1216 OV5670_write_cmos_sensor(0x402e, 0x00);
1217 OV5670_write_cmos_sensor(0x402f, 0x00);
1218 OV5670_write_cmos_sensor(0x4040, 0x00);
1219 OV5670_write_cmos_sensor(0x4041, 0x03);//0x00);
1220 OV5670_write_cmos_sensor(0x4042, 0x00);
1221 OV5670_write_cmos_sensor(0x4043, 0x7a);//0x80);
1222 OV5670_write_cmos_sensor(0x4044, 0x00);
1223 OV5670_write_cmos_sensor(0x4045, 0x7a);//0x80);
1224 OV5670_write_cmos_sensor(0x4046, 0x00);
1225 OV5670_write_cmos_sensor(0x4047, 0x7a);//0x80);
1226 OV5670_write_cmos_sensor(0x4048, 0x00);
1227 OV5670_write_cmos_sensor(0x4049, 0x7a);//0x80);
1228 OV5670_write_cmos_sensor(0x4303, 0x00);
1229 OV5670_write_cmos_sensor(0x4307, 0x30);
1230 OV5670_write_cmos_sensor(0x4500, 0x58);
1231 OV5670_write_cmos_sensor(0x4501, 0x04);
1232 OV5670_write_cmos_sensor(0x4502, 0x40);
1233 OV5670_write_cmos_sensor(0x4503, 0x10);
1234 OV5670_write_cmos_sensor(0x4508, 0xaa);
1235 OV5670_write_cmos_sensor(0x4509, 0xaa);
1236 OV5670_write_cmos_sensor(0x450a, 0x00);
1237 OV5670_write_cmos_sensor(0x450b, 0x00);
1238 OV5670_write_cmos_sensor(0x4600, 0x01);
1239 OV5670_write_cmos_sensor(0x4601, 0x03);
1240 OV5670_write_cmos_sensor(0x4700, 0xa4);
1241 OV5670_write_cmos_sensor(0x4800, 0x4c);
1242 OV5670_write_cmos_sensor(0x4816, 0x53);
1243 OV5670_write_cmos_sensor(0x481f, 0x40);
1244 OV5670_write_cmos_sensor(0x4837, 0x14); // ;11
1245 OV5670_write_cmos_sensor(0x5000, 0x56);//0x16);
1246 OV5670_write_cmos_sensor(0x5001, 0x01);
1247 OV5670_write_cmos_sensor(0x5002, 0x28);//0xa8);
1248 OV5670_write_cmos_sensor(0x5004, 0x0c);
1249 OV5670_write_cmos_sensor(0x5006, 0x0c);
1250 OV5670_write_cmos_sensor(0x5007, 0xe0);
1251 OV5670_write_cmos_sensor(0x5008, 0x01);
1252 OV5670_write_cmos_sensor(0x5009, 0xb0);
1253 OV5670_write_cmos_sensor(0x5901, 0x00);
1254 OV5670_write_cmos_sensor(0x5a01, 0x00);
1255 OV5670_write_cmos_sensor(0x5a03, 0x00);
1256 OV5670_write_cmos_sensor(0x5a04, 0x0c);
1257 OV5670_write_cmos_sensor(0x5a05, 0xe0);
1258 OV5670_write_cmos_sensor(0x5a06, 0x09);
1259 OV5670_write_cmos_sensor(0x5a07, 0xb0);
1260 OV5670_write_cmos_sensor(0x5a08, 0x06);
1261 OV5670_write_cmos_sensor(0x5e00, 0x00);
1262 //for BLC
1263 OV5670_write_cmos_sensor(0x3734, 0x40);
1264 OV5670_write_cmos_sensor(0x5b00, 0x01);
1265 OV5670_write_cmos_sensor(0x5b01, 0x10);
1266 OV5670_write_cmos_sensor(0x5b02, 0x01);
1267 OV5670_write_cmos_sensor(0x5b03, 0xdb);
1268 OV5670_write_cmos_sensor(0x3d8c, 0x71);
1269 OV5670_write_cmos_sensor(0x3d8d, 0xea);
1270 OV5670_write_cmos_sensor(0x4017, 0x08);
6fa3eb70 1271
4b9e9796
S
1272 OV5670_write_cmos_sensor(0x3618, 0x2a);
1273
1274 //;Ally031414
1275 OV5670_write_cmos_sensor(0x3734, 0x40); // ;; Improve HFPN
1276 OV5670_write_cmos_sensor(0x5b00, 0x01); // ;; [2:0] otp start addr[10:8]
1277 OV5670_write_cmos_sensor(0x5b01, 0x10); // ;; [7:0] otp start addr[7:0]
1278 OV5670_write_cmos_sensor(0x5b02, 0x01); // ;; [2:0] otp end addr[10:8]
1279 OV5670_write_cmos_sensor(0x5b03, 0xDB); // ;; [7:0] otp end addr[7:0]
1280 OV5670_write_cmos_sensor(0x3d8c, 0x71); //; Header address high byte
1281 OV5670_write_cmos_sensor(0x3d8d, 0xEA); //; Header address low byte
1282 OV5670_write_cmos_sensor(0x4017, 0x08); // ; threshold= 2LSB for full size
1283
1284 //;Strong DPC1.53
1285 OV5670_write_cmos_sensor(0x5780, 0x3e);
1286 OV5670_write_cmos_sensor(0x5781, 0x0f);
1287 OV5670_write_cmos_sensor(0x5782, 0x44);
1288 OV5670_write_cmos_sensor(0x5783, 0x02);
1289 OV5670_write_cmos_sensor(0x5784, 0x01);
1290 OV5670_write_cmos_sensor(0x5785, 0x00);
1291 OV5670_write_cmos_sensor(0x5786, 0x00);
1292 OV5670_write_cmos_sensor(0x5787, 0x04);
1293 OV5670_write_cmos_sensor(0x5788, 0x02);
1294 OV5670_write_cmos_sensor(0x5789, 0x0f);
1295 OV5670_write_cmos_sensor(0x578a, 0xfd);
1296 OV5670_write_cmos_sensor(0x578b, 0xf5);
1297 OV5670_write_cmos_sensor(0x578c, 0xf5);
1298 OV5670_write_cmos_sensor(0x578d, 0x03);
1299 OV5670_write_cmos_sensor(0x578e, 0x08);
1300 OV5670_write_cmos_sensor(0x578f, 0x0c);
1301 OV5670_write_cmos_sensor(0x5790, 0x08);
1302 OV5670_write_cmos_sensor(0x5791, 0x04);
1303 OV5670_write_cmos_sensor(0x5792, 0x00);
1304 OV5670_write_cmos_sensor(0x5793, 0x52);
1305 OV5670_write_cmos_sensor(0x5794, 0xa3);
1306 //;Ping
1307 OV5670_write_cmos_sensor(0x380e, 0x07); //; fps fine adjustment
1308 OV5670_write_cmos_sensor(0x380f, 0xfd); //; fps fine adjustment
1309 OV5670_write_cmos_sensor(0x3503, 0x00); //; real gain [2] gain no delay, shutter no delay
1310 //;added
1311 OV5670_write_cmos_sensor(0x3d85, 0x17);
1312 OV5670_write_cmos_sensor(0x3655, 0x20);
1313
1314 OV5670_write_cmos_sensor(0x0100, 0x01); //;01
1315
1316 ov5670_otp_config();
6fa3eb70
S
1317}
1318
6fa3eb70 1319
4b9e9796
S
1320UINT32 OV5670Open(void)
1321{
6fa3eb70 1322
4b9e9796
S
1323 volatile signed int i;
1324 kal_uint16 sensor_id = 0;
6fa3eb70 1325
4b9e9796
S
1326 OV5670DB("OV5670 Open enter :\n ");
1327 OV5670_write_cmos_sensor(0x0103,0x01);// Reset sensor
1328 mdelay(2);
6fa3eb70 1329
4b9e9796
S
1330 for(i=0;i<2;i++)
1331 {
1332 sensor_id = (OV5670_read_cmos_sensor(0x300B)<<8)|OV5670_read_cmos_sensor(0x300C);
1333 OV5670DB("OV5670 READ ID :%x",sensor_id);
1334 if(sensor_id != OV5670MIPI_SENSOR_ID)
1335 {
1336 return ERROR_SENSOR_CONNECT_FAIL;
1337 }else
1338 break;
1339 }
1340
1341 OV5670_Sensor_Init();
1342 OV5670_Init_Para();
1343 OV5670DB("OV5670Open exit :\n ");
6fa3eb70 1344
4b9e9796
S
1345 return ERROR_NONE;
1346}
6fa3eb70 1347
4b9e9796 1348void OV5670GetModuleID(void)
6fa3eb70 1349{
4b9e9796
S
1350 struct otp_struct otp_info ;
1351
1352 OV5670_write_cmos_sensor(0x0100, 0x01); //stream on
1353 read_otp(&otp_info);
1354 OV5670_write_cmos_sensor(0x0100, 0x00); //stream off
1355}
1356
1357UINT32 OV5670GetSensorID(UINT32 *sensorID)
1358{
1359 int retry = 2;
1360
1361 OV5670DB("OV5670GetSensorID enter :\n ");
1362 mdelay(5);
1363
1364 do {
1365 *sensorID = (OV5670_read_cmos_sensor(0x300B)<<8)|OV5670_read_cmos_sensor(0x300C);
1366 if (*sensorID == OV5670MIPI_SENSOR_ID)
1367 {
1368 OV5670DB("Sensor ID = 0x%04x\n", *sensorID);
1369 OV5670GetModuleID();
1370 break;
6fa3eb70 1371 }
4b9e9796
S
1372 OV5670DB("Read Sensor ID Fail = 0x%04x\n", *sensorID);
1373 retry--;
1374 } while (retry > 0);
1375
1376 if (*sensorID != OV5670MIPI_SENSOR_ID) {
1377 OV5670DB("Read Sensor ID Fail = 0x%04x\n", *sensorID);
1378
1379 *sensorID = 0xFFFFFFFF;
6fa3eb70 1380 return ERROR_SENSOR_CONNECT_FAIL;
4b9e9796
S
1381 } else {
1382 OV5670DB("alexadd %s module_id=%d", __func__, module_id);
1383 if (module_id == 0x0c ||module_id != 0x44) return ERROR_NONE;
1384 }
1385
1386 *sensorID = 0xFFFFFFFF;
1387 return ERROR_SENSOR_CONNECT_FAIL;
6fa3eb70
S
1388}
1389
1390
4b9e9796 1391void OV5670_SetShutter(kal_uint32 iShutter)
6fa3eb70 1392{
6fa3eb70 1393
4b9e9796
S
1394 spin_lock(&ov5670mipiraw_drv_lock);
1395 OV5670.shutter= iShutter;
1396 spin_unlock(&ov5670mipiraw_drv_lock);
6fa3eb70 1397
4b9e9796
S
1398 OV5670_write_shutter(iShutter);
1399 return;
1400}
6fa3eb70
S
1401
1402
4b9e9796
S
1403
1404UINT32 OV5670_read_shutter(void)
6fa3eb70 1405{
6fa3eb70 1406
4b9e9796
S
1407 kal_uint16 temp_reg1, temp_reg2 ,temp_reg3;
1408 UINT32 shutter =0;
1409 temp_reg1 = OV5670_read_cmos_sensor(0x3500); // AEC[b19~b16]
1410 temp_reg2 = OV5670_read_cmos_sensor(0x3501); // AEC[b15~b8]
1411 temp_reg3 = OV5670_read_cmos_sensor(0x3502); // AEC[b7~b0]
6fa3eb70 1412
4b9e9796 1413 shutter = (temp_reg1 <<12)| (temp_reg2<<4)|(temp_reg3>>4);
6fa3eb70 1414
4b9e9796
S
1415 return shutter;
1416}
6fa3eb70 1417
4b9e9796 1418void OV5670_NightMode(kal_bool bEnable)
6fa3eb70 1419{
6fa3eb70 1420
4b9e9796
S
1421}
1422
1423UINT32 OV5670Close(void)
6fa3eb70 1424{
4b9e9796
S
1425
1426 return ERROR_NONE;
1427}
1428
1429#if 0
1430void OV5670SetFlipMirror(kal_int32 imgMirror)
6fa3eb70 1431{
4b9e9796
S
1432 kal_int16 mirror=0,flip=0;
1433 mirror= OV5670_read_cmos_sensor(0x3820);
1434 flip = OV5670_read_cmos_sensor(0x3821);
1435
1436 switch (imgMirror)
1437 {
1438 case IMAGE_H_MIRROR://IMAGE_NORMAL:
1439 OV5670_write_cmos_sensor(0x3820, (mirror & (0xF9)));//Set normal
1440 OV5670_write_cmos_sensor(0x3821, (flip & (0xF9))); //Set normal
1441 break;
1442 case IMAGE_NORMAL://IMAGE_V_MIRROR:
1443 OV5670_write_cmos_sensor(0x3820, (mirror & (0xF9)));//Set flip
1444 OV5670_write_cmos_sensor(0x3821, (flip | (0x06))); //Set flip
1445 break;
1446 case IMAGE_HV_MIRROR://IMAGE_H_MIRROR:
1447 OV5670_write_cmos_sensor(0x3820, (mirror |(0x06))); //Set mirror
1448 OV5670_write_cmos_sensor(0x3821, (flip & (0xF9))); //Set mirror
1449 break;
1450 case IMAGE_V_MIRROR://IMAGE_HV_MIRROR:
1451 OV5670_write_cmos_sensor(0x3820, (mirror |(0x06))); //Set mirror & flip
1452 OV5670_write_cmos_sensor(0x3821, (flip |(0x06))); //Set mirror & flip
1453 break;
1454 }
1455}
1456#endif
1457
1458
1459UINT32 OV5670Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window,
1460 MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data)
1461{
1462
1463 OV5670DB("OV5670Preview enter:");
1464
1465 //OV5670PreviewSetting();
1466 OV5670CaptureSetting();
1467 spin_lock(&ov5670mipiraw_drv_lock);
1468 OV5670.sensorMode = SENSOR_MODE_PREVIEW;
1469 OV5670.DummyPixels = 0;
1470 OV5670.DummyLines = 0 ;
1471 OV5670_FeatureControl_PERIOD_PixelNum=OV5670_PV_PERIOD_PIXEL_NUMS+ OV5670.DummyPixels;
1472 OV5670_FeatureControl_PERIOD_LineNum=OV5670_PV_PERIOD_LINE_NUMS+OV5670.DummyLines;
1473 OV5670.imgMirror = sensor_config_data->SensorImageMirror;
1474 spin_unlock(&ov5670mipiraw_drv_lock);
6fa3eb70 1475
4b9e9796 1476 //OV5670SetFlipMirror(sensor_config_data->SensorImageMirror);
6fa3eb70 1477
4b9e9796
S
1478 mdelay(20);//THIS DELAY SHOULD BE NEED BY CTS OR MONKEY
1479 OV5670DB("OV5670Preview exit:\n");
6fa3eb70 1480
4b9e9796
S
1481
1482 return ERROR_NONE;
1483}
6fa3eb70
S
1484
1485
4b9e9796
S
1486UINT32 OV5670Video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window,
1487 MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data)
6fa3eb70 1488{
6fa3eb70 1489
4b9e9796
S
1490 OV5670DB("OV5670Video enter:");
1491
1492 OV5670VideoSetting();
6fa3eb70 1493
4b9e9796
S
1494 spin_lock(&ov5670mipiraw_drv_lock);
1495 OV5670.sensorMode = SENSOR_MODE_VIDEO;
1496 OV5670_FeatureControl_PERIOD_PixelNum=OV5670_VIDEO_PERIOD_PIXEL_NUMS+ OV5670.DummyPixels;
1497 OV5670_FeatureControl_PERIOD_LineNum=OV5670_VIDEO_PERIOD_LINE_NUMS+OV5670.DummyLines;
1498 OV5670.imgMirror = sensor_config_data->SensorImageMirror;
1499 spin_unlock(&ov5670mipiraw_drv_lock);
6fa3eb70 1500
4b9e9796
S
1501 //OV5670SetFlipMirror(sensor_config_data->SensorImageMirror);
1502
1503 mdelay(40);//THIS DELAY SHOULD BE NEED BY CTS OR MONKEY
1504 OV5670DB("OV5670Video exit:\n");
1505 return ERROR_NONE;
1506}
1507
6fa3eb70 1508
4b9e9796
S
1509UINT32 OV5670Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window,
1510 MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data)
6fa3eb70 1511{
6fa3eb70 1512
4b9e9796
S
1513 //kal_uint32 shutter = OV5670.shutter;
1514
1515 if( SENSOR_MODE_CAPTURE== OV5670.sensorMode)
1516 {
1517 OV5670DB("OV5670Capture BusrtShot / ZSD!!!\n");
1518 }
1519 else
1520 {
1521 OV5670DB("OV5670Capture enter:\n");
1522
1523 OV5670CaptureSetting();
1524 mdelay(40);//THIS DELAY SHOULD BE NEED BY CTS OR MONKEY
1525
1526 spin_lock(&ov5670mipiraw_drv_lock);
1527 OV5670.sensorMode = SENSOR_MODE_CAPTURE;
1528 OV5670.imgMirror = sensor_config_data->SensorImageMirror;
1529 OV5670.DummyPixels = 0;
1530 OV5670.DummyLines = 0 ;
1531 OV5670_FeatureControl_PERIOD_PixelNum = OV5670_FULL_PERIOD_PIXEL_NUMS + OV5670.DummyPixels;
1532 OV5670_FeatureControl_PERIOD_LineNum = OV5670_FULL_PERIOD_LINE_NUMS + OV5670.DummyLines;
1533 spin_unlock(&ov5670mipiraw_drv_lock);
1534
1535 //OV5670SetFlipMirror(sensor_config_data->SensorImageMirror);
1536
1537 OV5670DB("OV5670Capture exit:\n");
1538 }
1539
1540 if(OV5670_During_testpattern == KAL_TRUE)
1541 {
1542 OV5670_write_cmos_sensor(0x4303,0x80);
1543 }
1544
1545 return ERROR_NONE;
1546}
1547
1548
1549
1550UINT32 OV5670GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution)
1551{
1552
1553 OV5670DB("OV5670GetResolution!!\n");
1554
1555 pSensorResolution->SensorPreviewWidth = OV5670_IMAGE_SENSOR_FULL_WIDTH;
1556 pSensorResolution->SensorPreviewHeight = OV5670_IMAGE_SENSOR_FULL_HEIGHT;
6fa3eb70 1557
4b9e9796
S
1558 pSensorResolution->SensorFullWidth = OV5670_IMAGE_SENSOR_FULL_WIDTH;
1559 pSensorResolution->SensorFullHeight = OV5670_IMAGE_SENSOR_FULL_HEIGHT;
6fa3eb70 1560
4b9e9796
S
1561 pSensorResolution->SensorVideoWidth = OV5670_IMAGE_SENSOR_VIDEO_WIDTH;
1562 pSensorResolution->SensorVideoHeight = OV5670_IMAGE_SENSOR_VIDEO_HEIGHT;
1563 return ERROR_NONE;
1564}
1565
1566UINT32 OV5670GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId,
1567 MSDK_SENSOR_INFO_STRUCT *pSensorInfo,
1568 MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData)
1569{
6fa3eb70 1570
4b9e9796
S
1571 spin_lock(&ov5670mipiraw_drv_lock);
1572 OV5670.imgMirror = pSensorConfigData->SensorImageMirror ;
1573 spin_unlock(&ov5670mipiraw_drv_lock);
1574
1575 pSensorInfo->SensorOutputDataFormat= SENSOR_OUTPUT_FORMAT_RAW_B;
1576
1577 pSensorInfo->SensorClockPolarity =SENSOR_CLOCK_POLARITY_LOW;
1578 pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW;
1579 pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW;
1580 pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW;
1581
1582 pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_MIPI;
1583
1584 pSensorInfo->CaptureDelayFrame = 2;
1585 pSensorInfo->PreviewDelayFrame = 1;
1586 pSensorInfo->VideoDelayFrame = 2;
1587
1588 pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA;
1589 pSensorInfo->AEShutDelayFrame = 0;
1590 pSensorInfo->AESensorGainDelayFrame = 0;
1591 pSensorInfo->AEISPGainDelayFrame = 2;
1592
1593 switch (ScenarioId)
1594 {
1595 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:
1596 pSensorInfo->SensorClockFreq=24;
1597 pSensorInfo->SensorClockRisingCount= 0;
1598
1599 pSensorInfo->SensorGrabStartX = OV5670_PV_X_START;
1600 pSensorInfo->SensorGrabStartY = OV5670_PV_Y_START;
1601
1602 pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE;
6fa3eb70 1603
4b9e9796
S
1604 pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0;
1605 pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14;
1606 pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0;
1607 pSensorInfo->SensorPacketECCOrder = 1;
1608 break;
1609 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:
1610 pSensorInfo->SensorClockFreq=24;
1611 pSensorInfo->SensorClockRisingCount= 0;
1612
1613 pSensorInfo->SensorGrabStartX = OV5670_VIDEO_X_START;
1614 pSensorInfo->SensorGrabStartY = OV5670_VIDEO_Y_START;
1615
1616 pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE;
6fa3eb70 1617
4b9e9796
S
1618 pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0;
1619 pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14;
1620 pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0;
1621 pSensorInfo->SensorPacketECCOrder = 1;
1622 break;
1623 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:
1624 case MSDK_SCENARIO_ID_CAMERA_ZSD:
1625 pSensorInfo->SensorClockFreq=24;
1626 pSensorInfo->SensorClockRisingCount= 0;
1627
1628 pSensorInfo->SensorGrabStartX = OV5670_FULL_X_START;
1629 pSensorInfo->SensorGrabStartY = OV5670_FULL_Y_START;
1630
1631 pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE;
6fa3eb70 1632
4b9e9796
S
1633 pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0;
1634 pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14;
1635 pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0;
1636 pSensorInfo->SensorPacketECCOrder = 1;
1637 break;
1638 default:
1639 pSensorInfo->SensorClockFreq=24;
1640 pSensorInfo->SensorClockRisingCount= 0;
1641
1642 pSensorInfo->SensorGrabStartX = OV5670_PV_X_START;
1643 pSensorInfo->SensorGrabStartY = OV5670_PV_Y_START;
1644
1645 pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE;
6fa3eb70 1646
4b9e9796
S
1647 pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0;
1648 pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14;
1649 pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0;
1650 pSensorInfo->SensorPacketECCOrder = 1;
1651 break;
1652 }
1653
1654 memcpy(pSensorConfigData, &OV5670SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT));
1655
1656 return ERROR_NONE;
1657} /* OV5670GetInfo() */
1658
6fa3eb70
S
1659
1660
4b9e9796
S
1661UINT32 OV5670Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow,
1662 MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData)
6fa3eb70 1663{
4b9e9796
S
1664 spin_lock(&ov5670mipiraw_drv_lock);
1665 OV5670CurrentScenarioId = ScenarioId;
1666 spin_unlock(&ov5670mipiraw_drv_lock);
1667
1668 OV5670DB("OV5670CurrentScenarioId=%d\n",OV5670CurrentScenarioId);
1669
1670 switch (ScenarioId)
1671 {
1672 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:
1673 OV5670Preview(pImageWindow, pSensorConfigData);
1674 break;
1675 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:
1676 OV5670DB("OV5670 video_preiew sync\n");
1677 OV5670Video(pImageWindow, pSensorConfigData);
6fa3eb70 1678 break;
4b9e9796
S
1679 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:
1680 case MSDK_SCENARIO_ID_CAMERA_ZSD:
1681 OV5670Capture(pImageWindow, pSensorConfigData);
1682 break;
6fa3eb70 1683
4b9e9796
S
1684 default:
1685 return ERROR_INVALID_SCENARIO_ID;
6fa3eb70 1686
4b9e9796
S
1687 }
1688 return ERROR_NONE;
1689} /* OV5670Control() */
6fa3eb70 1690
4b9e9796
S
1691
1692
1693kal_uint32 OV5670_SET_FrameLength_ByVideoMode(UINT16 Video_TargetFps)
6fa3eb70 1694{
4b9e9796
S
1695 UINT32 frameRate = 0;
1696 kal_uint32 MIN_FrameLength=0;
1697
1698 if(OV5670.OV5670AutoFlickerMode == KAL_TRUE)
6fa3eb70 1699 {
4b9e9796
S
1700 if (Video_TargetFps==30)
1701 frameRate= OV5670_AUTOFLICKER_OFFSET_30;
1702 else if(Video_TargetFps==15)
1703 frameRate= OV5670_AUTOFLICKER_OFFSET_15;
1704 else
1705 frameRate=Video_TargetFps*10;
1706
1707 MIN_FrameLength = (OV5670.videoPclk*10000)/(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/frameRate*10;
1708 }
6fa3eb70 1709 else
4b9e9796
S
1710 MIN_FrameLength = (OV5670.videoPclk*10000) /(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/Video_TargetFps;
1711
1712 return MIN_FrameLength;
1713
1714}
1715
1716
1717
1718UINT32 OV5670SetVideoMode(UINT16 u2FrameRate)
1719{
1720
1721 kal_uint32 MIN_Frame_length =0,frameRate=0,extralines=0;
1722 OV5670DB("[OV5670SetVideoMode] frame rate = %d\n", u2FrameRate);
1723
1724 spin_lock(&ov5670mipiraw_drv_lock);
1725 OV5670_VIDEO_MODE_TARGET_FPS=u2FrameRate;
1726 spin_unlock(&ov5670mipiraw_drv_lock);
1727
1728 if(u2FrameRate==0)
6fa3eb70 1729 {
4b9e9796
S
1730 OV5670DB("Disable Video Mode or dynimac fps\n");
1731 return KAL_TRUE;
6fa3eb70 1732 }
4b9e9796
S
1733 if(u2FrameRate >30 || u2FrameRate <5)
1734 OV5670DB("abmornal frame rate seting,pay attention~\n");
6fa3eb70 1735
4b9e9796
S
1736 if(OV5670.sensorMode == SENSOR_MODE_VIDEO)//video ScenarioId recording
1737 {
1738
1739 MIN_Frame_length = OV5670_SET_FrameLength_ByVideoMode(u2FrameRate);
1740
1741 if((MIN_Frame_length <=OV5670_VIDEO_PERIOD_LINE_NUMS))
1742 {
1743 MIN_Frame_length = OV5670_VIDEO_PERIOD_LINE_NUMS;
1744 OV5670DB("[OV5670SetVideoMode]current fps = %d\n", (OV5670.videoPclk*10000) /(OV5670_VIDEO_PERIOD_PIXEL_NUMS)/OV5670_VIDEO_PERIOD_LINE_NUMS);
1745 }
1746 OV5670DB("[OV5670SetVideoMode]current fps (10 base)= %d\n", (OV5670.videoPclk*10000)*10/(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/MIN_Frame_length);
1747 extralines = MIN_Frame_length - OV5670_VIDEO_PERIOD_LINE_NUMS;
1748
1749 spin_lock(&ov5670mipiraw_drv_lock);
1750 OV5670.DummyPixels = 0;//define dummy pixels and lines
1751 OV5670.DummyLines = extralines ;
1752 spin_unlock(&ov5670mipiraw_drv_lock);
1753
1754 OV5670_SetDummy(OV5670.DummyPixels,extralines);
1755 }
1756
1757 OV5670DB("[OV5670SetVideoMode]MIN_Frame_length=%d,OV5670.DummyLines=%d\n",MIN_Frame_length,OV5670.DummyLines);
1758
1759 return KAL_TRUE;
6fa3eb70
S
1760}
1761
4b9e9796
S
1762
1763UINT32 OV5670SetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate)
6fa3eb70 1764{
4b9e9796
S
1765
1766 if(bEnable) {
1767 spin_lock(&ov5670mipiraw_drv_lock);
1768 OV5670.OV5670AutoFlickerMode = KAL_TRUE;
1769 spin_unlock(&ov5670mipiraw_drv_lock);
1770 OV5670DB("OV5670 Enable Auto flicker\n");
1771 } else {
1772 spin_lock(&ov5670mipiraw_drv_lock);
1773 OV5670.OV5670AutoFlickerMode = KAL_FALSE;
1774 spin_unlock(&ov5670mipiraw_drv_lock);
1775 OV5670DB("OV5670 Disable Auto flicker\n");
1776 }
1777
1778 return ERROR_NONE;
6fa3eb70
S
1779}
1780
1781
4b9e9796 1782UINT32 OV5670SetTestPatternMode(kal_bool bEnable)
6fa3eb70 1783{
4b9e9796
S
1784 OV5670DB("[OV5670SetTestPatternMode] Test pattern enable:%d\n", bEnable);
1785 if(bEnable == KAL_TRUE)
1786 {
1787 OV5670_During_testpattern = KAL_TRUE;
6fa3eb70 1788
4b9e9796
S
1789 //OV5670_write_cmos_sensor(0x5000,0x16);// ; LENC off, MWB on, BPC on, WPC on
1790
1791 OV5670_write_cmos_sensor(0x4303,0x08);
1792 }
1793 else
1794 {
1795 OV5670_During_testpattern = KAL_FALSE;
1796 //OV5670_write_cmos_sensor(0x5000,0x96);// ; LENC on, MWB on, BPC on, WPC on
1797 OV5670_write_cmos_sensor(0x4303,0x00);
1798 }
1799
1800 return ERROR_NONE;
1801}
1802
1803
1804/*************************************************************************
1805*
1806* DESCRIPTION:
1807* INTERFACE FUNCTION, FOR USER TO SET MAX FRAMERATE;
1808*
1809*************************************************************************/
1810UINT32 OV5670MIPISetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 frameRate) {
1811 kal_uint32 pclk;
1812 kal_int16 dummyLine;
1813 kal_uint16 lineLength,frameHeight;
1814
1815 OV5670DB("OV5670MIPISetMaxFramerateByScenario: scenarioId = %d, frame rate = %d\n",scenarioId,frameRate);
1816 switch (scenarioId) {
6fa3eb70 1817 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:
4b9e9796
S
1818 pclk = OV5670_PREVIEW_PCLK;
1819 lineLength = OV5670_PV_PERIOD_PIXEL_NUMS;
1820 frameHeight = (10 * pclk)/frameRate/lineLength;
1821 dummyLine = frameHeight - OV5670_PV_PERIOD_LINE_NUMS;
1822 if(dummyLine<0)
1823 dummyLine = 0;
1824 spin_lock(&ov5670mipiraw_drv_lock);
1825 OV5670.sensorMode = SENSOR_MODE_PREVIEW;
1826 spin_unlock(&ov5670mipiraw_drv_lock);
1827 OV5670_SetDummy(0, dummyLine);
6fa3eb70
S
1828 break;
1829 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:
4b9e9796
S
1830 pclk = OV5670_VIDEO_PCLK;
1831 lineLength = OV5670_VIDEO_PERIOD_PIXEL_NUMS;
1832 frameHeight = (10 * pclk)/frameRate/lineLength;
1833 dummyLine = frameHeight - OV5670_VIDEO_PERIOD_LINE_NUMS;
1834 if(dummyLine<0)
1835 dummyLine = 0;
1836 spin_lock(&ov5670mipiraw_drv_lock);
1837 OV5670.sensorMode = SENSOR_MODE_VIDEO;
1838 spin_unlock(&ov5670mipiraw_drv_lock);
1839 OV5670_SetDummy(0, dummyLine);
1840 break;
1841 break;
1842 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:
1843 case MSDK_SCENARIO_ID_CAMERA_ZSD:
1844 pclk = OV5670_CAPTURE_PCLK;
1845 lineLength = OV5670_FULL_PERIOD_PIXEL_NUMS;
1846 frameHeight = (10 * pclk)/frameRate/lineLength;
1847 dummyLine = frameHeight - OV5670_FULL_PERIOD_LINE_NUMS;
1848 if(dummyLine<0)
1849 dummyLine = 0;
1850 spin_lock(&ov5670mipiraw_drv_lock);
1851 OV5670.sensorMode = SENSOR_MODE_CAPTURE;
1852 spin_unlock(&ov5670mipiraw_drv_lock);
1853 OV5670_SetDummy(0, dummyLine);
1854 break;
1855 case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW:
1856 break;
1857 case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO:
6fa3eb70 1858 break;
4b9e9796 1859 case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE:
6fa3eb70 1860 break;
4b9e9796 1861 default:
6fa3eb70
S
1862 break;
1863 }
1864 return ERROR_NONE;
1865}
1866
1867
4b9e9796 1868UINT32 OV5670MIPIGetDefaultFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 *pframeRate)
6fa3eb70 1869{
6fa3eb70 1870
4b9e9796 1871 switch (scenarioId) {
6fa3eb70 1872 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:
6fa3eb70 1873 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:
4b9e9796
S
1874 *pframeRate = OV5670_MAX_FPS_PREVIEW;
1875 break;
6fa3eb70 1876 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:
4b9e9796
S
1877 case MSDK_SCENARIO_ID_CAMERA_ZSD:
1878 *pframeRate = OV5670_MAX_FPS_CAPTURE;
1879 break;
1880 case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added
1881 case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO:
1882 case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added
1883 *pframeRate = OV5670_MAX_FPS_CAPTURE;
1884 break;
6fa3eb70
S
1885 default:
1886 break;
1887 }
1888
1889 return ERROR_NONE;
1890}
1891
4b9e9796
S
1892/* Sensor output window information */
1893
1894/* SZ TCT xuejian.zhong add for CTS test*/
1895
1896static void OV5670GetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32)
1897{
1898 *pFeatureReturnPara32 = 0;
1899 // SENSORDB("OV5670GetAFMaxNumFocusAreas *pFeatureReturnPara32 = %d¥n", *pFeatureReturnPara32);
1900}
1901
1902static void OV5670GetAEMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32)
1903{
1904 *pFeatureReturnPara32 = 0;
1905 // SENSORDB("OV5670GetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %d¥n", *pFeatureReturnPara32);
1906}
1907
1908static void OV5670GetExifInfo(UINT32 exifAddr)
6fa3eb70 1909{
4b9e9796
S
1910 SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr;
1911 pExifInfo->FNumber = 28;
1912 pExifInfo->AEISOSpeed = AE_ISO_100;
1913 pExifInfo->AWBMode = AWB_MODE_AUTO;
1914 pExifInfo->CapExposureTime = 0;
1915 pExifInfo->FlashLightTimeus = 0;
1916 pExifInfo->RealISOValue = AE_ISO_100;
6fa3eb70
S
1917}
1918
4b9e9796
S
1919/* SZ TCT xuejian.zhong end */
1920
1921
1922UINT32 OV5670FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId,
1923 UINT8 *pFeaturePara,UINT32 *pFeatureParaLen)
6fa3eb70 1924{
4b9e9796
S
1925 UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara;
1926 UINT16 *pFeatureData16=(UINT16 *) pFeaturePara;
1927 UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara;
1928 UINT32 *pFeatureData32=(UINT32 *) pFeaturePara;
1929 UINT32 SensorRegNumber;
1930 UINT32 i;
1931 PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara;
1932 MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara;
1933 MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara;
1934 MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara;
1935 MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara;
1936 MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara;
1937
1938 switch (FeatureId)
1939 {
1940 case SENSOR_FEATURE_GET_RESOLUTION:
1941 *pFeatureReturnPara16++= OV5670_IMAGE_SENSOR_FULL_WIDTH;
1942 *pFeatureReturnPara16= OV5670_IMAGE_SENSOR_FULL_HEIGHT;
1943 *pFeatureParaLen=4;
1944 break;
1945 case SENSOR_FEATURE_GET_PERIOD:
1946 *pFeatureReturnPara16++= OV5670_FeatureControl_PERIOD_PixelNum;
1947 *pFeatureReturnPara16= OV5670_FeatureControl_PERIOD_LineNum;
1948 *pFeatureParaLen=4;
1949 break;
1950 case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ:
1951 switch(OV5670CurrentScenarioId)
1952 {
1953 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:
1954 *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK;
1955 *pFeatureParaLen=4;
1956 break;
1957 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:
1958 *pFeatureReturnPara32 = OV5670_VIDEO_PCLK;
1959 *pFeatureParaLen=4;
1960 break;
1961 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:
1962 case MSDK_SCENARIO_ID_CAMERA_ZSD:
1963 *pFeatureReturnPara32 = OV5670_CAPTURE_PCLK;
1964 *pFeatureParaLen=4;
1965 break;
1966 default:
1967 *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK;
1968 *pFeatureParaLen=4;
1969 break;
1970 }
1971 break;
1972
1973 case SENSOR_FEATURE_SET_ESHUTTER:
1974 OV5670_SetShutter(*pFeatureData16);
1975 break;
1976 case SENSOR_FEATURE_SET_NIGHTMODE:
1977 OV5670_NightMode((BOOL) *pFeatureData16);
1978 break;
1979 case SENSOR_FEATURE_SET_GAIN:
1980 OV5670_SetGain((UINT16) *pFeatureData16);
1981 break;
1982 case SENSOR_FEATURE_SET_FLASHLIGHT:
1983 break;
1984 case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ:
1985 //OV5670_isp_master_clock=*pFeatureData32;
1986 break;
1987 case SENSOR_FEATURE_SET_REGISTER:
1988 OV5670_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData);
1989 break;
1990 case SENSOR_FEATURE_GET_REGISTER:
1991 pSensorRegData->RegData = OV5670_read_cmos_sensor(pSensorRegData->RegAddr);
1992 break;
1993 case SENSOR_FEATURE_SET_CCT_REGISTER:
1994 SensorRegNumber=FACTORY_END_ADDR;
1995 for (i=0;i<SensorRegNumber;i++)
1996 {
1997 spin_lock(&ov5670mipiraw_drv_lock);
1998 OV5670SensorCCT[i].Addr=*pFeatureData32++;
1999 OV5670SensorCCT[i].Para=*pFeatureData32++;
2000 spin_unlock(&ov5670mipiraw_drv_lock);
2001 }
2002 break;
2003 case SENSOR_FEATURE_GET_CCT_REGISTER:
2004 SensorRegNumber=FACTORY_END_ADDR;
2005 if (*pFeatureParaLen<(SensorRegNumber*sizeof(SENSOR_REG_STRUCT)+4))
2006 return FALSE;
2007 *pFeatureData32++=SensorRegNumber;
2008 for (i=0;i<SensorRegNumber;i++)
2009 {
2010 *pFeatureData32++=OV5670SensorCCT[i].Addr;
2011 *pFeatureData32++=OV5670SensorCCT[i].Para;
2012 }
2013 break;
2014 case SENSOR_FEATURE_SET_ENG_REGISTER:
2015 SensorRegNumber=ENGINEER_END;
2016 for (i=0;i<SensorRegNumber;i++)
2017 {
2018 spin_lock(&ov5670mipiraw_drv_lock);
2019 OV5670SensorReg[i].Addr=*pFeatureData32++;
2020 OV5670SensorReg[i].Para=*pFeatureData32++;
2021 spin_unlock(&ov5670mipiraw_drv_lock);
2022 }
2023 break;
2024 case SENSOR_FEATURE_GET_ENG_REGISTER:
2025 SensorRegNumber=ENGINEER_END;
2026 if (*pFeatureParaLen<(SensorRegNumber*sizeof(SENSOR_REG_STRUCT)+4))
2027 return FALSE;
2028 *pFeatureData32++=SensorRegNumber;
2029 for (i=0;i<SensorRegNumber;i++)
2030 {
2031 *pFeatureData32++=OV5670SensorReg[i].Addr;
2032 *pFeatureData32++=OV5670SensorReg[i].Para;
2033 }
2034 break;
2035 case SENSOR_FEATURE_GET_REGISTER_DEFAULT:
2036 if (*pFeatureParaLen>=sizeof(NVRAM_SENSOR_DATA_STRUCT))
2037 {
2038 pSensorDefaultData->Version=NVRAM_CAMERA_SENSOR_FILE_VERSION;
2039 pSensorDefaultData->SensorId=OV5670MIPI_SENSOR_ID;
2040 memcpy(pSensorDefaultData->SensorEngReg, OV5670SensorReg, sizeof(SENSOR_REG_STRUCT)*ENGINEER_END);
2041 memcpy(pSensorDefaultData->SensorCCTReg, OV5670SensorCCT, sizeof(SENSOR_REG_STRUCT)*FACTORY_END_ADDR);
2042 }
2043 else
2044 return FALSE;
2045 *pFeatureParaLen=sizeof(NVRAM_SENSOR_DATA_STRUCT);
2046 break;
2047 case SENSOR_FEATURE_GET_CONFIG_PARA:
2048 memcpy(pSensorConfigData, &OV5670SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT));
2049 *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT);
2050 break;
2051 case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR:
2052 OV5670_camera_para_to_sensor();
2053 break;
2054
2055 case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA:
2056 OV5670_sensor_to_camera_para();
2057 break;
2058 case SENSOR_FEATURE_GET_GROUP_COUNT:
2059 *pFeatureReturnPara32++=OV5670_get_sensor_group_count();
2060 *pFeatureParaLen=4;
2061 break;
2062 case SENSOR_FEATURE_GET_GROUP_INFO:
2063 OV5670_get_sensor_group_info(pSensorGroupInfo->GroupIdx, pSensorGroupInfo->GroupNamePtr, &pSensorGroupInfo->ItemCount);
2064 *pFeatureParaLen=sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT);
2065 break;
2066 case SENSOR_FEATURE_GET_ITEM_INFO:
2067 OV5670_get_sensor_item_info(pSensorItemInfo->GroupIdx,pSensorItemInfo->ItemIdx, pSensorItemInfo);
2068 *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT);
2069 break;
2070
2071 case SENSOR_FEATURE_SET_ITEM_INFO:
2072 OV5670_set_sensor_item_info(pSensorItemInfo->GroupIdx, pSensorItemInfo->ItemIdx, pSensorItemInfo->ItemValue);
2073 *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT);
2074 break;
2075
2076 case SENSOR_FEATURE_GET_ENG_INFO:
2077 pSensorEngInfo->SensorId = 129;
2078 pSensorEngInfo->SensorType = CMOS_SENSOR;
2079 pSensorEngInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_RAW_B;
2080 *pFeatureParaLen=sizeof(MSDK_SENSOR_ENG_INFO_STRUCT);
2081 break;
2082 case SENSOR_FEATURE_GET_LENS_DRIVER_ID:
2083 // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE
2084 // if EEPROM does not exist in camera module.
2085 *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE;
2086 *pFeatureParaLen=4;
2087 break;
2088
2089 case SENSOR_FEATURE_INITIALIZE_AF:
2090 break;
2091 case SENSOR_FEATURE_CONSTANT_AF:
2092 break;
2093 case SENSOR_FEATURE_MOVE_FOCUS_LENS:
2094 break;
2095 case SENSOR_FEATURE_SET_VIDEO_MODE:
2096 OV5670SetVideoMode(*pFeatureData16);
2097 break;
2098 case SENSOR_FEATURE_CHECK_SENSOR_ID:
2099 OV5670GetSensorID(pFeatureReturnPara32);
2100 break;
2101 case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE:
2102 OV5670SetAutoFlickerMode((BOOL)*pFeatureData16, *(pFeatureData16+1));
2103 break;
6fa3eb70 2104 case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO:
4b9e9796 2105 OV5670MIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1));
6fa3eb70
S
2106 break;
2107 case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO:
4b9e9796 2108 OV5670MIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1)));
6fa3eb70
S
2109 break;
2110 case SENSOR_FEATURE_SET_TEST_PATTERN:
4b9e9796 2111 OV5670SetTestPatternMode((BOOL)*pFeatureData16);
6fa3eb70 2112 break;
4b9e9796
S
2113 case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE://for factory mode auto testing
2114 *pFeatureReturnPara32=OV5670_TEST_PATTERN_CHECKSUM;
2115 *pFeatureParaLen=4;
2116 break;
2117 /*SZ TCT xuejian.zhong add for CTS test */
2118 case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS:
2119 OV5670GetAFMaxNumFocusAreas(pFeatureData32);
2120 *pFeatureParaLen=4;
6fa3eb70 2121 break;
4b9e9796
S
2122
2123 case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS:
2124 OV5670GetAEMaxNumMeteringAreas(pFeatureData32);
2125 *pFeatureParaLen=4;
2126 break;
2127 case SENSOR_FEATURE_GET_EXIF_INFO:
2128 // SENSORDB("SENSOR_FEATURE_GET_EXIF_INFO¥n");
2129 // SENSORDB("EXIF addr = 0x%x¥n",*pFeatureData32);
2130
2131 OV5670GetExifInfo(*pFeatureData32);
2132 break;
2133 /* xuejian.zhong add end */
2134 default:
2135 break;
2136 }
2137 return ERROR_NONE;
2138}
2139
2140
2141SENSOR_FUNCTION_STRUCT SensorFuncOV5670=
2142{
2143 OV5670Open,
2144 OV5670GetInfo,
2145 OV5670GetResolution,
2146 OV5670FeatureControl,
2147 OV5670Control,
2148 OV5670Close
6fa3eb70
S
2149};
2150
2151UINT32 OV5670_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc)
2152{
4b9e9796
S
2153 if (pfFunc!=NULL)
2154 *pfFunc=&SensorFuncOV5670;
2155
2156 return ERROR_NONE;
2157}