📄 isp_flashlight.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* isp_flashlight.c
*
* Project:
* --------
* MT6219,MT6226,MT6227,MT6228,MT6229,MT6230
*
* Description:
* ------------
* flash light control
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#if ((defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))&&defined(ISP_SUPPORT))
#include "drv_comm.h"
#include "IntrCtrl.h"
#include "ae_awb.h"
#include "af.h"
#include "isp_if.h"
#include "image_sensor.h"
#include "sccb.h"
#include "camera_para.h"
#include "med_api.h"
#include "gpio_sw.h"
#include "isp_flashlight.h"
/************** FLASH LIGHT DECLARATION ***************************************/
extern kal_eventgrpid camera_isp_event_id;
extern kal_bool ae_counting_flag;
extern kal_uint32 window_pixel_num;
extern kal_uint32 avgall_lum;
FLASHLIGHT_OPERATION_STATE_ENUM flashlight_operation_state=FLASHLIGHT_STANDBY_STATE;
kal_uint16 AWB_Rgain_Backup,AWB_GRgain_Backup,AWB_Bgain_Backup,AWB_GBgain_Backup;
kal_uint8 AE_INDEX_Backup;
kal_bool fake_main_flash_frame_flag, fake_sub_flash_frame_flag;
kal_int32 flashlight_idx, flashlight_main_idx;
kal_uint32 flashlight_lum, flashlight_main_lum;
kal_uint16 flashlight_sensor_gain, flashlight_isp_gain;
#define FLASHLIGHT_MAX_AE_RANGE 42
#define FLASHLIGHT_MAX_AE_NUM 40
#define FLASHLIGHT_CENTER_AE_NUM 25
#define FLASHLIGHT_MIN_AE_NUM 0
const kal_uint16 EVSTEP_FLASH_01[FLASHLIGHT_MAX_AE_RANGE+1]={
23, 24, 26, 27, 29, 32, 34, 37, 40, 42, 45, 49, 52, 56, 59,
65, 70, 73, 80, 85, 91, 98, 104, 112, 120, 128,
137, 148, 158, 169, 181, 195, 208, 223, 240, 257, 274, 294, 315, 337, 361, 387, 414};
/****************************************************************************
* Flash Light Control *
****************************************************************************/
/*************************************************************************
* FUNCTION
* flash_config
*
* DESCRIPTION
* Config flash light offset and duty
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flash_config(kal_uint16 delay_line,kal_uint16 duty_line)
{
/* Delay time setting since Vsync occured */
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
if( delay_line >= 2048)
delay_line = 2047;
REG_ISP_INT_ENABLE &= ~0xFF0000;
REG_ISP_INT_ENABLE |= ((delay_line>>3)<<16);
#elif (defined(MT6226)||defined(MT6226M)||defined(MT6227))
REG_ISP_INT_ENABLE &= ~0xFFF0000;
REG_ISP_INT_ENABLE |= ((delay_line&0xFFF)<<16);
#endif
/* Flash turn on time setting */
SET_FLASH_LINE_UNIT(duty_line>>8);
SET_FLASH_LINE_NUMBER(duty_line/((duty_line>>8)+1));
}
/*************************************************************************
* FUNCTION
* init_flashlight
*
* DESCRIPTION
* Initial flash light GPIO and state machine
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void init_flashlight(void)
{
flashlight_operation_state = FLASHLIGHT_STANDBY_STATE;
if(dsc_support_info.dsccomp.flashlight==KAL_TRUE)
{
if(camera_oper_data.flashlight_mode == FLASHLIGHT_NONE)
camera_oper_data.flashlight_mode = FLASHLIGHT_LED_PEAK;
if((camera_oper_data.flashlight_mode==FLASHLIGHT_LED_ONOFF) ||
(camera_oper_data.flashlight_mode==FLASHLIGHT_LED_CONSTANT) )
{
DISABLE_FLASH_LIGHT;
}
else if(camera_oper_data.flashlight_mode==FLASHLIGHT_LED_PEAK)
{
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227))
#ifndef __CUST_NEW__
GPIO_ModeSetup(6,3); /* Flash Triger Pin */
#endif /* __CUST_NEW__ */
#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
#ifndef __CUST_NEW__
GPIO_ModeSetup(0,1); /* Flash Triger Pin */
#endif /* __CUST_NEW__ */
#endif
DISABLE_FLASH_LIGHT;
SET_FLASH_STARTPNT_LOW;
SET_FLASH_FRAME_DELAY(1);
flash_config(device_support_info.autoflash.offset,device_support_info.autoflash.duty);
if(device_support_info.autoflash.strobe_pol==1)
{
SET_FLASH_POL_HIGH;
}
else
{
SET_FLASH_POL_LOW;
}
}
}
}
/*************************************************************************
* FUNCTION
* flashlight_prestrobe
*
* DESCRIPTION
* Pre strobe AE/AWB control
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_prestrobe(void)
{
kal_uint32 event_group;
/* Turn on LED */
if(image_sensor_func->set_flashlight!=0)
image_sensor_func->set_flashlight(KAL_TRUE);
/* Wait 1 AE AWB HW CAL Stable */
DISABLE_VIEW_FINDER_MODE;
kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
fake_main_flash_frame_flag = fake_sub_flash_frame_flag = KAL_TRUE;
flashlight_main_lum = flashlight_main_idx = 0;
flashlight_lum = flashlight_idx = 0;
ENABLE_VIEW_FINDER_MODE;
kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_VD_READY_EVENT,KAL_OR_CONSUME,
&event_group,KAL_SUSPEND);
/* Set FLASHLIGHT_PRE_STROBE_STATE to trigger flashlight HISR */
DISABLE_VIEW_FINDER_MODE;
kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
IRQMask(IRQ_CAMERA_CODE);
flashlight_operation_state = FLASHLIGHT_PRE_STROBE_STATE;
IRQUnmask(IRQ_CAMERA_CODE);
ENABLE_VIEW_FINDER_MODE;
kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_VD_READY_EVENT,KAL_OR_CONSUME,
&event_group,KAL_SUSPEND);
DISABLE_VIEW_FINDER_MODE;
/* Check frame end */
kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_IDLE_EVENT,KAL_OR_CONSUME,
&event_group,KAL_SUSPEND);
}
/*************************************************************************
* FUNCTION
* flashlight_pre_process
*
* DESCRIPTION
* Pre strobe Entry point
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_pre_process(void)
{
/* store AWB setting */
AWB_Rgain_Backup = AWB_Rgain;
AWB_GRgain_Backup = AWB_GRgain;
AWB_Bgain_Backup = AWB_Bgain;
AWB_GBgain_Backup = AWB_GBgain;
AE_INDEX_Backup = AE_INDEX;
awb_fast_method(KAL_TRUE);
sensor_config_data.enable_flashlight_tansfer = KAL_FALSE;
/* FlashLight Shutter Config */
if((dsc_support_info.dsccomp.flashlight==KAL_TRUE)&&(dsc_status.ae.flash!=CAM_FLASH_OFF))
{
if( (camera_oper_data.flashlight_mode==FLASHLIGHT_LED_CONSTANT) ||
(camera_oper_data.flashlight_mode==FLASHLIGHT_LED_PEAK) )
{
if( (dsc_status.ae.flash==CAM_FLASH_ON) ||
((dsc_status.ae.flash==CAM_FLASH_AUTO||dsc_status.ae.flash==CAM_FLASH_REDEYE)&&
(AE_INDEX<=device_support_info.autoflash.lutidx)))
{
flashlight_prestrobe();
if(fake_sub_flash_frame_flag==KAL_FALSE)
image_sensor_func->set_sensor_gain(sensor_pregain);
if(fake_main_flash_frame_flag == KAL_FALSE)
sensor_config_data.enable_flashlight_tansfer = KAL_TRUE;
flashlight_operation_state = FLASHLIGHT_MAIN_STROBE_STATE;
}
else
{
sensor_config_data.enable_flashlight_tansfer = KAL_FALSE;
flashlight_operation_state = FLASHLIGHT_STANDBY_STATE;
}
}
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -