📄 ae_awb.c
字号:
fstAwbInitFlag = 0;
awb_fast_method(KAL_FALSE);
}
/* Suggest put this function in HISR */
void ae_awb_main(void)
{
if(ae_enable_flag == ISP_ON)
{
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
//Avoid ae get accumulation frame
#if (defined(WEBCAM_SUPPORT))
if((AE_FRAME_COUNT==1)||(usbvideo_cam_operation_state==USBVIDEO_CAM_PREVIEW_CHECK_STATE))
#else
if(AE_FRAME_COUNT==1)
#endif
#endif
#if (defined(WEBCAM_SUPPORT))
if((ae_hw_frame_count_backup[1]!=0)||(usbvideo_cam_operation_state==USBVIDEO_CAM_PREVIEW_CHECK_STATE))
#else
if(ae_hw_frame_count_backup[1]!=0)
#endif
ae_proc();
#if (!defined(MT6219))
if(ae_bypass_enable_flag==KAL_TRUE)
{
/* Replace AE Index */
AE_INDEX = AE_BYPASS_INDEX;
/* Get Shutter */
eShutter=AE_LUT[AE_BYPASS_INDEX].shutter;
/* Get Gain */
sensor_pregain=AE_LUT[AE_BYPASS_INDEX].sensorgain;
isp_pregain=AE_LUT[AE_BYPASS_INDEX].ispgain;
pregain=sensor_pregain*isp_pregain/BASEGAIN;
}
#endif
}
if(awb_enable_flag == ISP_ON)
{
awb_proc();
}
IRQMask(IRQ_CAMERA_CODE);
ae_awb_cal_complete=1;
IRQUnmask(IRQ_CAMERA_CODE);
}
extern kal_bool awb_enable_flag_backup;
extern kal_bool ae_enable_flag_backup;
void ae_on_off(kal_bool flag)
{
ae_enable_flag=flag;
ae_enable_flag_backup=flag;
}
void ae_select_band(kal_uint8 band)
{
switch(band)
{
case CAM_BANDING_60HZ :
light_band = CAM_BANDING_60HZ;
break;
case CAM_BANDING_50HZ :
light_band = CAM_BANDING_50HZ;
break;
default :
light_band = CAM_BANDING_60HZ;
break;
}
#if (!defined(MT6219))
lut_info.band=light_band;
AE_LUT=get_ae_lut(lut_info);
#endif
}
void awb_on_off(kal_bool flag)
{
awb_enable_flag=flag;
awb_enable_flag_backup=awb_enable_flag;
if ( flag && (fstAwbInitFlag==0) ) {
awbEntryCnt = 0;
fstAwbInitFlag = 1;
}
}
void awb_fast_method(kal_bool flag)
{
awbFastFlag = flag;
}
void awb_reset(void)
{
#if (defined(MT6219))
AWB_Rgain=128;
AWB_Ggain=128;
AWB_Bgain=128;
#else
AWB_Rgain=128;
AWB_GRgain=128;
AWB_Bgain=128;
AWB_GBgain=128;
#endif
}
/* This function must put in LISR */
void get_ae_awb_info(void)
{
/* Luminance for AE */
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
lum[0]=REG_ISP_AE_WINDOW1_RESULT;
lum[1]=REG_ISP_AE_WINDOW2_RESULT;
lum[2]=REG_ISP_AE_WINDOW3_RESULT;
lum[3]=REG_ISP_AE_WINDOW4_RESULT;
lum[4]=REG_ISP_AE_WINDOW5_RESULT;
lum[5]=REG_ISP_AE_WINDOW6_RESULT;
lum[6]=REG_ISP_AE_WINDOW7_RESULT;
lum[7]=REG_ISP_AE_WINDOW8_RESULT;
lum[8]=REG_ISP_AE_WINDOW9_RESULT;
#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
/* No Need to Copy Register Value to AE Result */
#endif
/* Accumulation for AWB */
// Acc_R=REG_ISP_OPD_Y_RESULT;
// Acc_G=REG_ISP_OPD_MG_RESULT;
// Acc_B=REG_ISP_OPD_RB_RESULT;
}
void init_histogram_setting (void)
{
SET_HISTOGRAM_BOUNDARY1(histogram_b1);
SET_HISTOGRAM_BOUNDARY2(histogram_b2);
SET_HISTOGRAM_BOUNDARY3(histogram_b3);
SET_HISTOGRAM_BOUNDARY4(histogram_b4);
SET_HISTOGRAM_BOUNDARY5(histogram_b5);
DISABLE_HISTOGRAM_RLEN;
SET_AE_GID_POLARITY_LOW;
SET_AE_PID_POLARITY_HIGH;
}
void get_histogram_info(kal_uint8 color)
{
kal_uint8 i;
switch(color)
{
case 0:
for(i=0;i<5;i++)
Rhist[i]=histogram[i];
break;
case 1:
for(i=0;i<5;i++)
Ghist[i]=histogram[i];
break;
case 2:
for(i=0;i<5;i++)
Bhist[i]=histogram[i];
break;
}
/* Set Next Histogram Color */
if(hist_idx==0) //Set G
{
ENABLE_HISTOGRAM_RLEN;
}
else if(hist_idx==1) //Set B
{
DISABLE_HISTOGRAM_RLEN;
SET_AE_GID_POLARITY_HIGH;
SET_AE_PID_POLARITY_LOW;
}
else if(hist_idx==2) //Set R
{
DISABLE_HISTOGRAM_RLEN;
SET_AE_GID_POLARITY_LOW;
SET_AE_PID_POLARITY_HIGH;
}
}
/****************************************************************************
* Auto Exposure *
****************************************************************************/
void ae_config(kal_uint16 Hsize,kal_uint16 Vsize)
{
kal_uint16 windowH, windowV, startH, startV;
#if (defined(MT6219))
/* offset (1,1) is to avoid hardware bug */
if(Hsize<64)
Hsize=64;
if(Vsize<64)
Vsize=64;
/* offset (1,1) is to avoid hardware bug */
windowH = ((Hsize>>4)-1)/3;
windowV = ((Vsize>>4)-1)/3;
startH = exposure_window.exposure_window_width/32-((windowH*3)>>1)+exposure_window.grab_start_x/16;
startV = exposure_window.exposure_window_height/32-((windowV*3)>>1)+exposure_window.grab_start_y/16;
/* window setting is (No., left, top, right, bottom) */
SET_AE_WINDOW(1, startH, startV, startH+windowH, startV+windowV);
SET_AE_WINDOW(2, startH+windowH, startV, startH+windowH*2, startV+windowV);
SET_AE_WINDOW(3, startH+windowH*2, startV, startH+windowH*3, startV+windowV);
SET_AE_WINDOW(4, startH, startV+windowV, startH+windowH, startV+windowV*2);
SET_AE_WINDOW(5, startH+windowH, startV+windowV, startH+windowH*2, startV+windowV*2);
SET_AE_WINDOW(6, startH+windowH*2, startV+windowV, startH+windowH*3, startV+windowV*2);
SET_AE_WINDOW(7, startH, startV+windowV*2, startH+windowH, startV+windowV*3);
SET_AE_WINDOW(8, startH+windowH, startV+windowV*2, startH+windowH*2, startV+windowV*3);
SET_AE_WINDOW(9, startH+windowH*2, startV+windowV*2, startH+windowH*3, startV+windowV*3);
#elif (defined(MT6226)||defined(MT6226M)||defined(MT6227))
/* offset (1,1) is to avoid hardware bug */
if(Hsize<64)
Hsize=64;
if(Vsize<64)
Vsize=64;
/* offset (1,1) is to avoid hardware bug */
windowH = ((Hsize>>4)-1)/3;
windowV = ((Vsize>>4)-1)/3;
startH = 0;
startV = 0;
/* window setting is (No., left, top, right, bottom) */
SET_AE_WINDOW(1, startH, startV, startH+windowH, startV+windowV);
SET_AE_WINDOW(2, startH+windowH, startV, startH+windowH*2, startV+windowV);
SET_AE_WINDOW(3, startH+windowH*2, startV, startH+windowH*3, startV+windowV);
SET_AE_WINDOW(4, startH, startV+windowV, startH+windowH, startV+windowV*2);
SET_AE_WINDOW(5, startH+windowH, startV+windowV, startH+windowH*2, startV+windowV*2);
SET_AE_WINDOW(6, startH+windowH*2, startV+windowV, startH+windowH*3, startV+windowV*2);
SET_AE_WINDOW(7, startH, startV+windowV*2, startH+windowH, startV+windowV*3);
SET_AE_WINDOW(8, startH+windowH, startV+windowV*2, startH+windowH*2, startV+windowV*3);
SET_AE_WINDOW(9, startH+windowH*2, startV+windowV*2, startH+windowH*3, startV+windowV*3);
SET_AE_FRAME_INTERVAL(camera_oper_data.ae_awb_cal_period-1);
#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
/* use 8x7 window, total 9X7 window */
windowH=(Hsize-8)/8;
windowV=(Vsize/7)+1;
startH=0;
startV=0;
SET_AE_WINDOW_HSIZE(windowH);
SET_AE_WINDOW_VSIZE(windowV);
SET_AE_H_OFFSET(startH);
SET_AE_V_OFFSET(startV);
REG_ISP_AE_ADDRESS=(kal_uint32)ae_result;
SET_AE_FRAME_INTERVAL(camera_oper_data.ae_awb_cal_period-1);
#endif
}
void ae_set_pregain(kal_uint16 pre_gain)
{
switch(camera_oper_data.pregain_mode)
{
case ISP_ONLY:
if(pre_gain>=camera_oper_data.isp_pregain_max)
isp_pregain=camera_oper_data.isp_pregain_max;
else if(pre_gain<PREGAIN_MIN_LIMIT)
isp_pregain=PREGAIN_MIN_LIMIT;
else
isp_pregain=pre_gain;
ae_set_isp_pregain();
break;
case SENSOR_ONLY:
if(pre_gain>=camera_oper_data.sensor_pregain_max)
sensor_pregain=camera_oper_data.sensor_pregain_max;
else if(pre_gain<camera_oper_data.sensor_pregain_min)
sensor_pregain=camera_oper_data.sensor_pregain_min;
else
sensor_pregain=pre_gain;
image_sensor_func->set_sensor_gain(sensor_pregain);
break;
case ISP_SENSOR_BOTH:
if(camera_oper_data.gain_priority==ISP_GAIN_PRIORITY)
{
if(pre_gain>=camera_oper_data.isp_pregain_max)
{
isp_pregain=camera_oper_data.isp_pregain_max;
sensor_pregain=(pre_gain<<6)/camera_oper_data.isp_pregain_max;
if(sensor_pregain>=camera_oper_data.sensor_pregain_max)
sensor_pregain=camera_oper_data.sensor_pregain_max;
else if(sensor_pregain<camera_oper_data.sensor_pregain_min)
sensor_pregain=camera_oper_data.sensor_pregain_min;
}
else if(pre_gain<camera_oper_data.isp_pregain_min)
{
isp_pregain=camera_oper_data.isp_pregain_min;
sensor_pregain=0x40;
}
else
{
isp_pregain=pre_gain;
sensor_pregain=0x40;
}
ae_set_isp_pregain();
image_sensor_func->set_sensor_gain(sensor_pregain);
}
else if(camera_oper_data.gain_priority==SENSOR_GAIN_PRIORITY)
{
if(pre_gain>camera_oper_data.sensor_pregain_max)
{
sensor_pregain = image_sensor_func->set_sensor_gain(camera_oper_data.sensor_pregain_max);
if(sensor_pregain<BASEGAIN)
sensor_pregain = BASEGAIN;
isp_pregain=(pre_gain<<6)/sensor_pregain;
if(isp_pregain>=camera_oper_data.isp_pregain_max)
isp_pregain=camera_oper_data.isp_pregain_max;
else if(isp_pregain<camera_oper_data.isp_pregain_min)
isp_pregain=camera_oper_data.isp_pregain_min;
ae_set_isp_pregain();
}
else if(pre_gain<camera_oper_data.sensor_pregain_min)
{
sensor_pregain=image_sensor_func->set_sensor_gain(camera_oper_data.sensor_pregain_min);
isp_pregain=0x40;
ae_set_isp_pregain();
}
else
{
sensor_pregain=image_sensor_func->set_sensor_gain(pre_gain);
if(sensor_pregain<BASEGAIN)
sensor_pregain = BASEGAIN;
isp_pregain=(pre_gain<<6)/sensor_pregain;
ae_set_isp_pregain();
}
}
else
ASSERT(0);
break;
}
}
void ae_set_lut_gain(void)
{
#if (!defined(MT6219))
switch(camera_oper_data.pregain_mode)
{
case ISP_ONLY:
ae_set_isp_pregain();
break;
case SENSOR_ONLY:
image_sensor_func->set_sensor_gain(sensor_pregain);
break;
case ISP_SENSOR_BOTH:
image_sensor_func->set_sensor_gain(sensor_pregain);
ae_set_isp_pregain();
break;
}
#endif
}
void ae_set_isp_pregain(void)
{
SET_PRE_GAIN_INTEGER_PART(isp_pregain>>6);
SET_PRE_GAIN_FRAC_PART((0xFC & (isp_pregain << 2))); /* LSB is not used bit */
}
void ae_set_ini_shutter(kal_uint16 shutter)
{
if(ae_enable_flag == ISP_OFF)
{
camera_para.AE.iniShutter=shutter;
eShutter=camera_para.AE.iniShutter;
image_sensor_func->set_sensor_eshutter((kal_uint16)eShutter);
}
}
kal_uint16 ae_get_ini_shutter(void)
{
return camera_para.AE.iniShutter;
}
void ae_select_stepperev(kal_uint8 step)
{
switch(step)
{
case ONE_STEP:
camera_para.AE.StepperEV=step;
/* -3EV ~ +3EV */
totalevstep=7;
break;
case TWO_STEP:
camera_para.AE.StepperEV=step;
/* -2EV ~ +2EV */
totalevstep=9;
break;
case THREE_STEP:
camera_para.AE.StepperEV=step;
/* -2EV ~ +2EV */
totalevstep=13;
break;
case FOUR_STEP:
camera_para.AE.StepperEV=step;
/* -1EV ~ +1EV */
totalevstep=9;
break;
default:
camera_para.AE.StepperEV=TWO_STEP;
/* -2EV ~ +2EV */
totalevstep=9;
break;
}
}
kal_uint8 ae_get_totalevlevel(void)
{
return totalevstep;
}
kal_uint8 ae_get_stepperev(void)
{
return camera_para.AE.StepperEV;
}
kal_uint8 ae_set_ev(kal_int8 level)
{
kal_uint8 ampstep;
kal_int16 expovalue=(kal_int16)(camera_para.AE.TargetLum);
ampstep=(totalevstep-1)>>1;
if((level>ampstep)||(level<-ampstep))
{
return KAL_FALSE;
}
else
{
ev_level=level;
switch(ev_level)
{
case 4:
expovalue=(kal_int16)(camera_para.AE.TargetLum*2.07);
break;
case 3:
#if(defined(AF_Debug_Function))
expovalue=(kal_int16)(camera_para.AE.TargetLum);
AF_Debug_Flag_Update(AF_Debug_Flag_Normal);
#else
expovalue=(kal_int16)(camera_para.AE.TargetLum*1.73);
#endif
break;
case 2:
#if(defined(AF_Debug_Function))
expovalue=(kal_int16)(camera_para.AE.TargetLum);
AF_Debug_Flag_Update(AF_Debug_Flag_Continue);
#else
expovalue=(kal_int16)(camera_para.AE.TargetLum*1.44);
#endif
break;
case 1:
#if(defined(AF_Debug_Function))
expovalue=(kal_int16)(camera_para.AE.TargetLum);
AF_Debug_Flag_Update(AF_Debug_Flag_FullScan);
#else
expovalue=(kal_int16)(camera_para.AE.TargetLum*1.2);
#endif
break;
case 0:
#if(defined(AF_Debug_Function))
expovalue=(kal_int16)(camera_para.AE.TargetLum);
AF_Debug_Flag_Update(AF_Debug_Flag_Normal);
#else
expovalue=(kal_int16)(camera_para.AE.TargetLum);
#endif
break;
case -1:
expovalue=(kal_int16)(camera_para.AE.TargetLum/1.2);
break;
case -2:
expovalue=(kal_int16)(camera_para.AE.TargetLum/1.44);
break;
case -3:
expovalue=(kal_int16)(camera_para.AE.TargetLum/1.73);
break;
case -4:
expovalue=(kal_int16)(camera_para.AE.TargetLum/2.07);
break;
default:
ASSERT(0);
break;
}
if(expovalue>255)
{
expovalue=255;
}
if(expovalue<0)
{
expovalue=0;
}
expo_level = expovalue;
high_expo_level=expovalue*(100+ae_range)/100;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -