⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ae_awb.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -