📄 af.c
字号:
/* 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 + -