📄 isp_flashlight.c
字号:
fake_sub_flash_frame_flag = KAL_TRUE;
sensor_config_data.enable_flashlight_tansfer = KAL_FALSE;
flashlight_operation_state = FLASHLIGHT_STANDBY_STATE;
}
}
/*************************************************************************
* FUNCTION
* flashlight_post_process
*
* DESCRIPTION
* Flash light post control for capture timing switch
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_post_process(void)
{
kal_uint32 event_group;
if(fake_sub_flash_frame_flag == KAL_FALSE)
{ /* when sensor change shutter line number for capture timing, check if need compensate gain for it */
flashlight_sensor_gain = sensor_pregain;
flashlight_isp_gain = isp_pregain;
if( sensor_config_data.enable_flashlight_tansfer==KAL_TRUE )
{
if( sensor_config_data.flashlight_duty>0 )
{
if(sensor_config_data.flashlight_shut_factor!=BASEGAIN)
{
flashlight_sensor_gain = (sensor_pregain*BASEGAIN)/sensor_config_data.flashlight_shut_factor;
if(flashlight_sensor_gain >= device_support_info.ae.sensor_basegain)
image_sensor_func->set_sensor_gain(flashlight_sensor_gain);
else
{
flashlight_sensor_gain = device_support_info.ae.sensor_basegain;
image_sensor_func->set_sensor_gain(flashlight_sensor_gain);
if(flashlight_isp_gain>BASEGAIN)
{
flashlight_isp_gain = ((isp_pregain*sensor_pregain)<<6)/
(flashlight_sensor_gain*sensor_config_data.flashlight_shut_factor);
if(flashlight_isp_gain < BASEGAIN)
flashlight_isp_gain = BASEGAIN;
isp_pregain=flashlight_isp_gain;
ae_set_isp_pregain();
}
}
}
}
else
{ /* Turn off Main strobe */
AE_INDEX -= flashlight_main_idx;
AE_INDEX += flashlight_idx;
sensor_config_data.enable_flashlight_tansfer=KAL_FALSE;
fake_main_flash_frame_flag = KAL_TRUE;
/* update flash light gain to cover index shift */
sensor_pregain=AE_LUT[AE_INDEX].sensorgain;
isp_pregain = (AE_LUT[AE_INDEX].ispgain)*(AE_LUT[AE_INDEX].shutter)/eShutter ;
pregain=(sensor_pregain*isp_pregain)>>7;
image_sensor_func->set_sensor_gain(sensor_pregain);
ae_set_isp_pregain();
}
}
/* cal AWB and Wait 1 frame for AWB and AE stable */
DISABLE_VIEW_FINDER_MODE;
awb_proc();
awb_set_gain();
kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
ENABLE_VIEW_FINDER_MODE;
kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_IDLE_EVENT,KAL_OR_CONSUME,
&event_group,KAL_SUSPEND);
}
awb_fast_method(KAL_FALSE);
}
/*************************************************************************
* FUNCTION
* flashlight_trigger_process
*
* DESCRIPTION
* Flash light trigger process.
* This function should right before open image data base.
* From trigger process to enable capture should < 1 frame time.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_trigger_process(void)
{
kal_uint32 event_group;
/* FlashLight Trigger & Enable Pin Config */
if((dsc_support_info.dsccomp.flashlight==KAL_TRUE)&&(dsc_status.ae.flash!=CAM_FLASH_OFF))
{
if(fake_sub_flash_frame_flag == KAL_TRUE)
{ /* turn off sub flash light */
if(image_sensor_func->set_flashlight!=0)
image_sensor_func->set_flashlight(KAL_FALSE);
}
else
{ /* turn on main flash light */
if( (fake_main_flash_frame_flag==KAL_FALSE)&&
(sensor_config_data.enable_flashlight_tansfer == KAL_TRUE))
{
DISABLE_VIEW_FINDER_MODE;
flashlight_operation_state = FLASHLIGHT_TRIGGER_STATE;
kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
ENABLE_VIEW_FINDER_MODE;
kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_IDLE_EVENT,KAL_OR_CONSUME,
&event_group,KAL_SUSPEND);
}
flashlight_operation_state = FLASHLIGHT_MAIN_STROBE_STATE;
}
}
}
/*************************************************************************
* FUNCTION
* flashlight_stop_process
*
* DESCRIPTION
* Flash light stop process.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_stop_process(void)
{
if(flashlight_operation_state != FLASHLIGHT_STANDBY_STATE)
{
SET_CAMERA_FRAME_RATE(0);
DISABLE_FLASH_LIGHT;
if(image_sensor_func->set_flashlight!=0)
image_sensor_func->set_flashlight(KAL_FALSE);
set_isp_interrupt_trigger_delay_lines(isp_tg_delay_lines);
if(fake_sub_flash_frame_flag==KAL_FALSE)
{
/* store AE/AWB setting */
AWB_Rgain = AWB_Rgain_Backup;
AWB_GRgain = AWB_GRgain_Backup;
AWB_Bgain = AWB_Bgain_Backup;
AWB_GBgain = AWB_GBgain_Backup;
AE_INDEX = AE_INDEX_Backup;
}
flashlight_operation_state = FLASHLIGHT_STANDBY_STATE;
}
}
/*************************************************************************
* FUNCTION
* flashlight_hisr
*
* DESCRIPTION
* Entry function of Flash light HISR
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_hisr(void)
{
if(flashlight_operation_state == FLASHLIGHT_TRIGGER_STATE)
{
flash_config(sensor_config_data.flashlight_offset, sensor_config_data.flashlight_duty);
SET_CAMERA_FRAME_RATE(1)
DISABLE_CAMERA_VD_DONE_INT;
ENABLE_FLASH_LIGHT;
flashlight_operation_state = FLASHLIGHT_TRIGGER_DONE_STATE;
}
else
{
kal_uint32 i, j;
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227))
if(ae_counting_flag==KAL_TRUE) //Avoid ae get accumulation frame
#else // MT6228||MT6229
if(AE_FRAME_COUNT==1) //Avoid ae get accumulation frame
#endif
{ /* get valid ae/awb data */
flashlight_lum = 0;
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227))
for(i=0;i<9;i++)
flashlight_lum += (lum[i]>>8)/(window_pixel_num<<4);
flashlight_lum = (flashlight_lum*21)/9; /* Check Factor : 21/16 */
#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
for(i=0;i<7;i++)
for(j=0;j<8;j++) /* total 9, use 8 windows */
flashlight_lum += (ae_result[i][j]/window_pixel_num);
flashlight_lum = ((flashlight_lum*21)>>4)/56;
#endif
/* Cal pre strobe lum */
if((avglum>expo_level)&&(flashlight_lum>avglum))
flashlight_lum -= (avglum-expo_level);
for(i=FLASHLIGHT_CENTER_AE_NUM; i<=FLASHLIGHT_MAX_AE_NUM; i++)
{
if(flashlight_lum <= ((EVSTEP_FLASH_01[i]*expo_level)>>7))
{
flashlight_idx += (i-FLASHLIGHT_CENTER_AE_NUM);
fake_sub_flash_frame_flag = KAL_FALSE;
break;
}
}
/* if avglum < normal lum when flash off, check over sat */
if( avglum<((EVSTEP_FLASH_01[FLASHLIGHT_CENTER_AE_NUM-1]*expo_level)>>7) )
{ /* When over brightness */
if((flashlight_lum > ((EVSTEP_FLASH_01[FLASHLIGHT_MAX_AE_NUM]*expo_level)>>7))&&(AE_INDEX==0))
{
for(i=FLASHLIGHT_MIN_AE_NUM; i<=FLASHLIGHT_CENTER_AE_NUM; i++)
{
if(avglum <= ((EVSTEP_FLASH_01[i]*expo_level)>>7))
{
flashlight_idx += (FLASHLIGHT_CENTER_AE_NUM-i);
fake_sub_flash_frame_flag = KAL_FALSE;
break;
}
}
/* env is much darker */
if((i==FLASHLIGHT_MIN_AE_NUM)&&(flashlight_lum>((EVSTEP_FLASH_01[FLASHLIGHT_MAX_AE_RANGE]*expo_level)>>7)))
flashlight_idx += (FLASHLIGHT_MAX_AE_RANGE-FLASHLIGHT_CENTER_AE_NUM);
}
else if(flashlight_idx>0)
{ /* Need more brightness */
flashlight_idx--;
}
}
/* check if main strobe needed, and then update shutter/gain */
if(fake_sub_flash_frame_flag==KAL_FALSE)
{
/* Cal Peak Strobe */
if(camera_oper_data.flashlight_mode==FLASHLIGHT_LED_PEAK)
{
if(flashlight_lum>avglum)
flashlight_main_lum = ((camera_oper_data.flashlight_delta_main_lum*(flashlight_lum-avglum))>>6) + avglum;
else
flashlight_main_lum = flashlight_lum;
for(i=FLASHLIGHT_CENTER_AE_NUM; i<=FLASHLIGHT_MAX_AE_NUM; i++)
{
if(flashlight_main_lum <= ((EVSTEP_FLASH_01[i]*expo_level)>>7))
{
flashlight_main_idx = i-FLASHLIGHT_CENTER_AE_NUM;
if( ((AE_INDEX+flashlight_main_idx)<=device_support_info.autoflash.lutidx)&&
((AE_LUT[AE_INDEX+flashlight_main_idx].shutter)>=sensor_config_data.flashlight_offset) )
{
fake_main_flash_frame_flag = KAL_FALSE;
}
break;
}
}
}
/* update shutter/gain by compensate flashlight on lum */
if((flashlight_idx+AE_INDEX)<=(device_support_info.ae.lutsize-1))
{
if((fake_main_flash_frame_flag == KAL_FALSE)&&(flashlight_idx<flashlight_main_idx))
AE_INDEX += flashlight_main_idx;
else
AE_INDEX += flashlight_idx;
}
else
AE_INDEX = (device_support_info.ae.lutsize-1);
eShutter=AE_LUT[AE_INDEX].shutter;
sensor_pregain=AE_LUT[AE_INDEX].sensorgain;
isp_pregain=AE_LUT[AE_INDEX].ispgain;
pregain=(sensor_pregain*isp_pregain)>>7;
/* update flash light shutter/gain */
image_sensor_func->set_sensor_eshutter((kal_uint16)eShutter);
ae_set_isp_pregain();
} // fake_sub_flash_frame_flag==KAL_FALSE
flashlight_operation_state = FLASHLIGHT_PRE_STROBE_DONE_STATE;
} // AE_FRAME_COUNT = 1
} // FLASHLIGHT_PRE_STROBE_STATE
}
#endif /* MT6228||MT6226||MT6227||MT6229 && ISP_SUPPORT*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -