/************************************************************************************************* * Function : otp_lenc_update * Description : Update lens correction * Return : [bool] 0 : OTP data fail 1 : otp_lenc update success **************************************************************************************************/ bool otp_lenc_update() { BYTE lsc_flag; int i, j; BYTE temp1, temp2; BYTE lsc_data[64 * 8] ={0}; lsc_flag = get_lsc_flag(); if(lsc_flag == 0xC0 || lsc_flag == 0x80) { LOG_INF("OTP lsc data invalid\n"); return 0; } else if(lsc_flag == 0x00) { LOG_INF("OTP no lsc data\n"); return 0; } for(i=0;i<8;i++) { if(!start_read_otp(0x04+i)) { LOG_INF("OTP Start read Page %d Fail!\n", 0x04+i); return 0; } for(j=0;j<64;j++) lsc_data[i*64+j] = read_cmos_sensor(0x3B04+j); } #ifdef DEBUG_IMX135_OTP for (i=0;i<504;i++) { LOG_INF("%0x ",lsc_data[i]); if((i+1)%64==0) LOG_INF("\n"); } #endif write_cmos_sensor_8(0x0104, 0x01); for(i=0;i<504;i++) //LSC SIZE is 504 BYTES write_cmos_sensor(0x4800+i, lsc_data[i]); write_cmos_sensor_8(0x0104, 0x00); //Enable LSC temp1 = read_cmos_sensor(0x0700); temp2 = read_cmos_sensor(0x3A63); temp1 = temp1 | 0x01; temp2 = temp2 | 0x01; write_cmos_sensor_8(0x0104, 0x00); write_cmos_sensor(0x0700, temp1); write_cmos_sensor(0x3A63, temp2); write_cmos_sensor_8(0x0104, 0x00); LOG_INF("OTP Update lsc finished\n"); return 1; }
static void set_dummy() { LOG_INF("dummyline = %d, dummypixels = %d \n", imgsensor.dummy_line, imgsensor.dummy_pixel); /* you can set dummy by imgsensor.dummy_line and imgsensor.dummy_pixel, or you can set dummy by imgsensor.frame_length and imgsensor.line_length */ /* Add dummy pixels: */ /* 0x380c [0:4], 0x380d defines the PCLKs in one line of OV2680 */ /* Add dummy lines:*/ /* 0x380e [0:1], 0x380f defines total lines in one frame of OV2680 */ write_cmos_sensor(0x380e, imgsensor.frame_length >> 8); write_cmos_sensor(0x380f, imgsensor.frame_length & 0xFF); write_cmos_sensor(0x380c, imgsensor.line_length >> 8); write_cmos_sensor(0x380d, imgsensor.line_length & 0xFF); } /* set_dummy */
/************************************************************************************************* * Function : start_read_otp * Description : before read otp , set the reading block setting * Parameters : [BYTE] zone : OTP PAGE index , 0x00~0x0f * Return : 0, reading block setting err 1, reading block setting ok **************************************************************************************************/ bool start_read_otp(BYTE zone) { BYTE val = 0; int i; write_cmos_sensor_8(0x0104, 0x01); write_cmos_sensor(0x3B02, zone); //PAGE write_cmos_sensor(0x3B00, 0x01); write_cmos_sensor_8(0x0104, 0x00); Sleep(5); for(i=0; i<100; i++) { val = read_cmos_sensor(0x3B01); if((val & 0x01) == 0x01) break; Sleep(2); } if(i == 100) { CAM_CALERR("Read Page %d Err!\n", zone); // print log return 0; } return 1; }
static void set_shutter(kal_uint16 shutter) { unsigned long flags; kal_uint16 realtime_fps = 0; kal_uint32 frame_length = 0; spin_lock_irqsave(&imgsensor_drv_lock, flags); imgsensor.shutter = shutter; spin_unlock_irqrestore(&imgsensor_drv_lock, flags); /* 0x3500, 0x3501, 0x3502 will increase VBLANK to get exposure larger than frame exposure */ /* AE doesn't update sensor gain at capture mode, thus extra exposure lines must be updated here. */ /* OV Recommend Solution * if shutter bigger than frame_length, should extend frame length first */ if(!shutter) shutter = 1; /*avoid 0*/ spin_lock(&imgsensor_drv_lock); if (shutter > imgsensor.min_frame_length - imgsensor_info.margin) imgsensor.frame_length = shutter + imgsensor_info.margin; else imgsensor.frame_length = imgsensor.min_frame_length; if (imgsensor.frame_length > imgsensor_info.max_frame_length) imgsensor.frame_length = imgsensor_info.max_frame_length; spin_unlock(&imgsensor_drv_lock); //if (shutter < imgsensor_info.min_shutter) shutter = imgsensor_info.min_shutter; shutter = (shutter < imgsensor_info.min_shutter) ? imgsensor_info.min_shutter : shutter; shutter = (shutter > (imgsensor_info.max_frame_length - imgsensor_info.margin)) ? (imgsensor_info.max_frame_length - imgsensor_info.margin) : shutter; if (imgsensor.autoflicker_en) { realtime_fps = imgsensor.pclk / imgsensor.line_length * 10 / imgsensor.frame_length; if(realtime_fps >= 297 && realtime_fps <= 305) set_max_framerate(296,0); else if(realtime_fps >= 147 && realtime_fps <= 150) set_max_framerate(146,0); else { // Extend frame length write_cmos_sensor(0x380e, imgsensor.frame_length >> 8); write_cmos_sensor(0x380f, imgsensor.frame_length & 0xFF); } } else {