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

📄 af.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* AF speed up */
	custom_para->AF_boundary_macro= (kal_int16)camera_lens.INFO.af_me_macro_pos;
	custom_para->AF_boundary_inf = (kal_int16)camera_lens.INFO.af_me_home_pos;
}

void init_af(void)
{
	ENABLE_ATF_EDGE;
	DISABLE_ATF_AREA_ALL;
	AF_init_step_time_lut();
	af_custom_para_first_init(&af_oper_data);
}

void get_af_info(kal_uint8 index)
{
	AF_focus_result[0][index]=AF_Result0;
	AF_focus_result[1][index]=AF_Result1;
	AF_focus_result[2][index]=AF_Result2;
	AF_focus_result[3][index]=AF_Result3;
	AF_focus_result[4][index]=AF_Result4;
}

void get_af_detail_info(kal_uint8 index)
{
	AF_final_result_d[AF_small_check_count][0][index]=AF_Result0;
	AF_final_result_d[AF_small_check_count][1][index]=AF_Result1;
	AF_final_result_d[AF_small_check_count][2][index]=AF_Result2;
	AF_final_result_d[AF_small_check_count][3][index]=AF_Result3;
	AF_final_result_d[AF_small_check_count][4][index]=AF_Result4;
}

void af_window_config(kal_uint8 no,kal_uint16 Hsize,kal_uint16 Vsize,kal_uint16 Hoffset,kal_uint16 Voffset)
{
	kal_uint16	startH, startV;
#if(defined(MT6228))
	kal_uint32	blank_V;
	blank_V = get_vd_blanking_lines();
	if (ISP_MIN_DIGITAL_ZOOM_FACTOR == isp_digital_zoom_factor)
	{
		startH = Hoffset>>4;
		startV = (Voffset+blank_V+exposure_window.grab_start_y)>>4;
	}
	else
	{
		startH = Hoffset>>4;
		startV = (Voffset+blank_V+isp_grab_start_y)>>4;	
	}
#else
	startH = Hoffset>>4;
	startV = Voffset>>4;
#endif
	SET_AF_WINDOW(no, startH, startV, startH+(Hsize>>4), startV+(Vsize>>4));
}

void af_zone_setting(kal_uint8 zone)
{
	kal_int16 offsetX, offsetY;
	
	if((zone==CAM_AF_SINGLE_ZONE)||(zone==CAM_AF_MULTI3_ZONE)||(zone==CAM_AF_MULTI5_ZONE))
	{
		/* Zone 0 */
		offsetX=(isp_preview_config_data.af_zone0_x - isp_preview_config_data.camera_offset_x)* isp_grab_width / isp_preview_config_data.target_width;
		offsetX-=(af_zone_width>>1);
		offsetY=(isp_preview_config_data.af_zone0_y - isp_preview_config_data.camera_offset_y)* isp_grab_height / isp_preview_config_data.target_height;
		offsetY-=(af_zone_height>>1);
		if((offsetX<0)||(offsetY<0)||((offsetX+af_zone_width)>isp_grab_width)||((offsetY+af_zone_height)>isp_grab_height))
		{
			ASSERT(0);
		}
		else
			af_window_config(1,af_zone_width,af_zone_height,(kal_uint16)offsetX,(kal_uint16)offsetY);
	}
	
	if((zone==CAM_AF_MULTI3_ZONE)||(zone==CAM_AF_MULTI5_ZONE))
	{
		/* Zone 1 */
		offsetX=(isp_preview_config_data.af_zone1_x - isp_preview_config_data.camera_offset_x)* isp_grab_width / isp_preview_config_data.target_width;
		offsetX-=(af_zone_width>>1);
		offsetY=(isp_preview_config_data.af_zone1_y - isp_preview_config_data.camera_offset_y)* isp_grab_height / isp_preview_config_data.target_height;
		offsetY-=(af_zone_height>>1);
		if((offsetX<0)||(offsetY<0)||((offsetX+af_zone_width)>isp_grab_width)||((offsetY+af_zone_height)>isp_grab_height))
		{
			ASSERT(0);
		}
		else
			af_window_config(2,af_zone_width,af_zone_height,(kal_uint16)offsetX,(kal_uint16)offsetY);

		/* Zone 2 */
		offsetX=(isp_preview_config_data.af_zone2_x - isp_preview_config_data.camera_offset_x)* isp_grab_width / isp_preview_config_data.target_width;
		offsetX-=(af_zone_width>>1);
		offsetY=(isp_preview_config_data.af_zone2_y - isp_preview_config_data.camera_offset_y)* isp_grab_height / isp_preview_config_data.target_height;
		offsetY-=(af_zone_height>>1);
		if((offsetX<0)||(offsetY<0)||((offsetX+af_zone_width)>isp_grab_width)||((offsetY+af_zone_height)>isp_grab_height))
		{
			ASSERT(0);
		}
		else
			af_window_config(3,af_zone_width,af_zone_height,(kal_uint16)offsetX,(kal_uint16)offsetY);
	}

	if(zone==CAM_AF_MULTI5_ZONE)
	{
		/* Zone 3 */
		offsetX=(isp_preview_config_data.af_zone3_x - isp_preview_config_data.camera_offset_x)* isp_grab_width / isp_preview_config_data.target_width;
		offsetX-=(af_zone_width>>1);
		offsetY=(isp_preview_config_data.af_zone3_y - isp_preview_config_data.camera_offset_y)* isp_grab_height / isp_preview_config_data.target_height;
		offsetY-=(af_zone_height>>1);
		if((offsetX<0)||(offsetY<0)||((offsetX+af_zone_width)>isp_grab_width)||((offsetY+af_zone_height)>isp_grab_height))
		{
			ASSERT(0);
		}
		else
			af_window_config(4,af_zone_width,af_zone_height,(kal_uint16)offsetX,(kal_uint16)offsetY);
	
		/* Zone 4 */
		offsetX=(isp_preview_config_data.af_zone4_x - isp_preview_config_data.camera_offset_x)* isp_grab_width / isp_preview_config_data.target_width;
		offsetX-=(af_zone_width>>1);
		offsetY=(isp_preview_config_data.af_zone4_y - isp_preview_config_data.camera_offset_y)* isp_grab_height / isp_preview_config_data.target_height;
		offsetY-=(af_zone_height>>1);
		if((offsetX<0)||(offsetY<0)||((offsetX+af_zone_width)>isp_grab_width)||((offsetY+af_zone_height)>isp_grab_height))
		{
			ASSERT(0);
		}
		else
			af_window_config(5,af_zone_width,af_zone_height,(kal_uint16)offsetX,(kal_uint16)offsetY);
	}
}

void  AF_Backup_Model_setting(kal_bool flag)
{
	/* only backup auto defect & P_limit */
	if (KAL_TRUE == flag)/* backup */
	{
		af_bacup_p_limit = REG_ISP_PREPROCESS_CTRL1;
		af_backup_autodefect = REG_ISP_AUTO_DEFECT_CTRL1;
		af_backup_edge =REG_ISP_COLOR_PROCESS_STAGE_CTRL2;
		af_backup_LPF = REG_ISP_LPF_CTRL;
	}
	else/* restore */
	{
		af_bacup_p_limit &= REG_PREPROCESS1_PIXEL_LIMIT_MASK;
		REG_ISP_PREPROCESS_CTRL1 &= ~REG_PREPROCESS1_PIXEL_LIMIT_MASK;
		REG_ISP_PREPROCESS_CTRL1 |= af_bacup_p_limit;
		af_backup_autodefect &= 0xF8000000;
		REG_ISP_AUTO_DEFECT_CTRL1 &= ~0xF8000000;
		REG_ISP_AUTO_DEFECT_CTRL1 |= af_backup_autodefect;
		af_backup_edge &= REG_CPS2_RGB_EDGE_ENABLE_BIT;
		REG_ISP_COLOR_PROCESS_STAGE_CTRL2 &= ~REG_CPS2_RGB_EDGE_ENABLE_BIT;
		REG_ISP_COLOR_PROCESS_STAGE_CTRL2 |= af_backup_edge;
		af_backup_LPF &= (REG_LPF_Y_LPF_ENABLE_BIT|REG_LPF_C_LPF_ENABLE_BIT);
		REG_ISP_LPF_CTRL &= ~(REG_LPF_Y_LPF_ENABLE_BIT|REG_LPF_C_LPF_ENABLE_BIT);
		REG_ISP_LPF_CTRL |= af_backup_LPF;
	}
}

void af_trigger_setting(kal_uint8 trigger)
{
	while(lens_func->get_lens_af_status() == AF_STATUS_OPERATING){};
	
	if(lens_func->get_lens_af_status() == AF_STATUS_READY)
	{
		if((trigger==CAM_AF_ONE_TIME) || (trigger==CAM_AF_CONTINUE))
		{
			AF_Backup_Model_setting(KAL_TRUE);/* backup preview setting */
#if(defined(AF_Debug_Function))
			if (af_debug_flag == 1)
			{
				if (AF_130_all_enable == 0)//scan full
				{
					if (AF_Debug_Step_Dir == 0)//step + 1
					{	
						af_debug_pos=0;//debug 130 full scan
					}
					else//step - 1
					{
						af_debug_pos=AF_Debug_Max_Step;//debug 130 full scan		
					}
					lens_func->lens_af_move_to((kal_int32)af_debug_pos);
					AF_step_move_log((kal_int16)af_debug_pos);
				}
			}
			else
			{
#endif
				lens_func->lens_af_move_to((kal_int32)camera_lens_step.AF[af_table_search_end_idx].pos);
			AF_step_move_log((kal_int16)camera_lens_step.AF[af_table_search_end_idx].pos);
			dsc_status.af.index=af_table_search_end_idx;
#if(defined(AF_Debug_Function))				
			}			
#endif
		}
		else /* CAM_AF_RELEASE */
		{
			dsc_status.af.trigger = CAM_AF_RELEASE;/* set at first to prevent prempty by HISR */
			AF_Backup_Model_setting(KAL_FALSE);/* restore preview setting */
			/* reset to default range */
			if (dsc_status.af.mode==CAM_AF_INFINITE_MODE)
			{
				dsc_status.af.range=AF_INFINITE_RANGE;			
			}
			af_table_search_range_config(dsc_status.af.range);			
			lens_func->lens_af_move_to((kal_int32)camera_lens.INFO.af_hyper_pos);
			AF_step_move_log((kal_int16)camera_lens.INFO.af_hyper_pos);
			dsc_status.af.index=0xFF;
		}
	}
	if (cam_focus_cb==0x0)/* null callback of AF */
	{
		ASSERT(0);
	}
}

kal_uint8 get_af_table_index(kal_uint8 current_idx)
{
	kal_uint8 next_idx;
	if(current_idx < af_table_search_start_idx)
	{
		next_idx = AF_end_of_lut_search(af_table_search_start_idx, af_table_search_end_idx, current_idx);
		if (next_idx == af_table_search_start_idx)
		{
			af_operation_state=AF_SEARCH_STATE;
			next_idx = current_idx;
		}
		else
		{
			next_idx=current_idx+1;
		}
	}
	else if(current_idx==af_table_search_start_idx)
	{
		next_idx=af_table_search_start_idx;
		af_operation_state=AF_SEARCH_STATE;
	}
	else
	{
		next_idx=af_table_search_start_idx;
		ASSERT(0);
	}
	return next_idx;
}

kal_int32 get_af_detail_pos(kal_uint8 index)
{
	kal_uint8 af_id;
	af_id = AF_get_next_final_index(index);
	if (af_id == index)
	{
		af_operation_state=AF_SEARCH_STATE;
	}
	return AF_final_step_d[AF_small_check_count][af_id];
}

void af_table_search_range_config(kal_uint8 type)
{
	switch(type)
	{
		case AF_AUTO_RANGE:
			af_table_search_start_idx = af_oper_data.af_auto_range_start_idx;
			af_table_search_end_idx	= af_oper_data.af_auto_range_end_idx;
		break;
		case AF_NORMAL_RANGE:
			/* consistence between inf & normal range */			
			if (dsc_status.af.mode==CAM_AF_INFINITE_MODE)
			{
				af_table_search_end_idx	= af_oper_data.af_infinite_range_start_idx+1;
			}
			else
			{
				af_table_search_end_idx	= af_oper_data.af_normal_range_end_idx;
			}			
			af_table_search_start_idx = af_oper_data.af_normal_range_start_idx;
		break;
		case AF_MACRO_RANGE:
			af_table_search_start_idx = af_oper_data.af_macro_range_start_idx;
			af_table_search_end_idx	= af_oper_data.af_macro_range_end_idx;
		break;
		case AF_INFINITE_RANGE:
			af_table_search_start_idx = af_oper_data.af_infinite_range_start_idx;
			af_table_search_end_idx	= af_oper_data.af_infinite_range_end_idx;
		break;		
	}
}

void manual_focus_setting(kal_uint8 dir)
{
	if(dsc_status.af.mode==CAM_AF_MANUAL_MODE)
	{
		if(dir == CAM_FOCUS_FORWARD)
			lens_func->lens_af_step_cw(af_oper_data.manual_focus_step);
		else if(dir == CAM_FOCUS_BACKWARD)
			lens_func->lens_af_step_ccw(af_oper_data.manual_focus_step);
	}
	else
	{
		ASSERT(0);
	}
}

#endif /* (YUV_SENSOR_SUPPORT) */
#endif /* AF_SUPPORT && (MT6226||MT6227||MT6228||MT6229) */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -