#if !defined(__OV4689_CMOS_H_)
#define __OV4689_CMOS_H_
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "hi_comm_sns.h"
#include "hi_comm_video.h"
#include "hi_sns_ctrl.h"
#include "mpi_isp.h"
#include "mpi_ae.h"
#include "mpi_awb.h"
#include "mpi_af.h"
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* End of #ifdef __cplusplus */
#define OV4689_ID 4689
/****************************************************************************
* global variables *
****************************************************************************/
ISP_SNS_STATE_S g_astov4689[ISP_MAX_DEV_NUM] = {{0}};
static ISP_SNS_STATE_S *g_apstSnsState[ISP_MAX_DEV_NUM] = {&g_astov4689[0], &g_astov4689[1]};
ISP_SNS_COMMBUS_U g_aunOv4689BusInfo[ISP_MAX_DEV_NUM] = {
[0] = { .s8I2cDev = 0},
[1] = { .s8I2cDev = 1}
};
static ISP_FSWDR_MODE_E genFSWDRMode[ISP_MAX_DEV_NUM] = {ISP_FSWDR_NORMAL_MODE,ISP_FSWDR_NORMAL_MODE};
static HI_U32 gu32MaxTimeGetCnt[ISP_MAX_DEV_NUM] = {0,0};
static HI_U32 g_au32InitExposure[ISP_MAX_DEV_NUM] = {0};
static HI_U32 g_au32LinesPer500ms[ISP_MAX_DEV_NUM] = {0};
static HI_U16 g_au16InitWBGain[ISP_MAX_DEV_NUM][3] = {{0}};
static HI_U16 g_au16SampleRgain[ISP_MAX_DEV_NUM] = {0};
static HI_U16 g_au16SampleBgain[ISP_MAX_DEV_NUM] = {0};
extern const unsigned int ov4689_i2c_addr;
extern unsigned int ov4689_addr_byte;
extern unsigned int ov4689_data_byte;
#define OV4689_FULL_LINES_MAX (0x7FFF)
#define OV4689_4M_30FPS_MODE (0)
#define OV4689_4M_60FPS_MODE (1)
#define OV4689_1080P_60FPS_MODE (2)
#define OV4689_VMAX_4M30_WDR (0x640)
#define OV4689_VMAX_4M60_LINEAR (0x640)
#define OV4689_VMAX_4M30_LINEAR (0x640)
#define OV4689_VMAX_1080P60_LINEAR (0x640)
#define OV4689_VMAX_1080P60_WDR (0x466)
extern void ov4689_init(ISP_DEV IspDev);
extern void ov4689_exit(ISP_DEV IspDev);
extern void ov4689_standby(ISP_DEV IspDev);
extern void ov4689_restart(ISP_DEV IspDev);
extern int ov4689_write_register(ISP_DEV IspDev, int addr, int data);
extern int ov4689_read_register(ISP_DEV IspDev, int addr);
static HI_S32 cmos_get_ae_default(ISP_DEV IspDev,AE_SENSOR_DEFAULT_S *pstAeSnsDft)
{
if (HI_NULL == pstAeSnsDft)
{
printf("null pointer when get ae default value!\n");
return -1;
}
//pstAeSnsDft->u32LinesPer500ms = g_apstSnsState[IspDev]->u32FLStd*30/2;
pstAeSnsDft->u32FullLinesStd = g_apstSnsState[IspDev]->u32FLStd;
pstAeSnsDft->u32FlickerFreq = 50*256;
pstAeSnsDft->u32FullLinesMax = OV4689_FULL_LINES_MAX;
pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR;
pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1;
pstAeSnsDft->stIntTimeAccu.f32Offset = 0;
pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE;
pstAeSnsDft->stAgainAccu.f32Accuracy = 0.1;
pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE;
pstAeSnsDft->stDgainAccu.f32Accuracy = 1;
pstAeSnsDft->u32ISPDgainShift = 8;
pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift;
pstAeSnsDft->u32MaxISPDgainTarget = 4 << pstAeSnsDft->u32ISPDgainShift;
pstAeSnsDft->u32MaxIntTime = g_apstSnsState[IspDev]->u32FLStd - 4;
pstAeSnsDft->u32MinIntTime = 2;
pstAeSnsDft->u32MaxIntTimeTarget = 65535;
pstAeSnsDft->u32MinIntTimeTarget = 2;
pstAeSnsDft->u32MaxAgain = 16832;
pstAeSnsDft->u32MinAgain = 1024;
pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain;
pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain;
pstAeSnsDft->u32MaxDgain = 1024;
pstAeSnsDft->u32MinDgain = 1024;
pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgain;
pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain;
pstAeSnsDft->enMaxIrisFNO = ISP_IRIS_F_NO_1_0;
pstAeSnsDft->enMinIrisFNO = ISP_IRIS_F_NO_32_0;
pstAeSnsDft->bAERouteExValid = HI_FALSE;
pstAeSnsDft->stAERouteAttr.u32TotalNum = 0;
pstAeSnsDft->stAERouteAttrEx.u32TotalNum = 0;
switch(g_apstSnsState[IspDev]->enWDRMode)
{
default:
case WDR_MODE_NONE: /*linear mode*/
pstAeSnsDft->au8HistThresh[0] = 0xd;
pstAeSnsDft->au8HistThresh[1] = 0x28;
pstAeSnsDft->au8HistThresh[2] = 0x60;
pstAeSnsDft->au8HistThresh[3] = 0x80;
pstAeSnsDft->u8AeCompensation = 0x38;
break;
case WDR_MODE_2To1_FRAME:
case WDR_MODE_2To1_FRAME_FULL_RATE:
pstAeSnsDft->au8HistThresh[0] = 0xC;
pstAeSnsDft->au8HistThresh[1] = 0x18;
pstAeSnsDft->au8HistThresh[2] = 0x60;
pstAeSnsDft->au8HistThresh[3] = 0x80;
pstAeSnsDft->u8AeCompensation = 0x38;
break;
case WDR_MODE_2To1_LINE:
pstAeSnsDft->au8HistThresh[0] = 0xC;
pstAeSnsDft->au8HistThresh[1] = 0x18;
pstAeSnsDft->au8HistThresh[2] = 0x60;
pstAeSnsDft->au8HistThresh[3] = 0x80;
pstAeSnsDft->u32InitExposure = 10000;
pstAeSnsDft->u32MaxIntTime = g_apstSnsState[IspDev]->u32FLStd - 4;
pstAeSnsDft->u32MinIntTime = 4;
pstAeSnsDft->u32MaxIntTimeTarget = 65535;
pstAeSnsDft->u32MinIntTimeTarget = 4;
pstAeSnsDft->u32LFMaxShortTime = 775;
pstAeSnsDft->u32MaxIntTimeStep = 3000;
if(ISP_FSWDR_LONG_FRAME_MODE == genFSWDRMode[IspDev])
{
pstAeSnsDft->u8AeCompensation = 24;
}
else
{
pstAeSnsDft->u8AeCompensation = 24;
pstAeSnsDft->enAeExpMode = AE_EXP_LOWLIGHT_PRIOR;
pstAeSnsDft->u16ManRatioEnable = HI_FALSE;
pstAeSnsDft->au32Ratio[0] = 0x40;
pstAeSnsDft->au32Ratio[1] = 0x40;
pstAeSnsDft->au32Ratio[2] = 0x40;
}
break;
}
if(g_au32InitExposure[IspDev] == 0)
{
pstAeSnsDft->u32InitExposure = 200000;
}
else
{
pstAeSnsDft->u32InitExposure = g_au32InitExposure[IspDev];
}
if(g_au32LinesPer500ms[IspDev] == 0)
{
switch(g_apstSnsState[IspDev]->u8ImgMode)
{
case OV4689_4M_60FPS_MODE:
pstAeSnsDft->u32LinesPer500ms = g_apstSnsState[IspDev]->u32FLStd*60/2;
break;
case OV4689_4M_30FPS_MODE:
pstAeSnsDft->u32LinesPer500ms = g_apstSnsState[IspDev]->u32FLStd*30/2;
pstAeSnsDft->u32LFMinExposure = 3800000;
break;
case OV4689_1080P_60FPS_MODE:
if(g_apstSnsState[IspDev]->enWDRMode == WDR_MODE_2To1_LINE)
{
pstAeSnsDft->u32LinesPer500ms = g_apstSnsState[IspDev]->u32FLStd*30/2;
}
else
{
pstAeSnsDft->u32LinesPer500ms = g_apstSnsState[IspDev]->u32FLStd*60/2;
}
break;
default:
pstAeSnsDft->u32LinesPer500ms = g_apstSnsState[IspDev]->u32FLStd*30/2;
break;
}
}
else
{
pstAeSnsDft->u32LinesPer500ms = g_au32LinesPer500ms[IspDev];
}
return 0;
}
/* the function of sensor set fps */
static HI_VOID cmos_fps_set(ISP_DEV IspDev,HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft)
{
switch (g_apstSnsState[IspDev]->u8ImgMode)
{
case OV4689_4M_30FPS_MODE:
if(g_apstSnsState[IspDev]->enWDRMode == WDR_MODE_NONE || g_apstSnsState[IspDev]->enWDRMode == WDR_MODE_2To1_FRAME || g_apstSnsState[IspDev]->enWDRMode== WDR_MODE_2To1_FRAME_FULL_RATE)
{
if ((f32Fps <= 30) && (f32Fps >= 1.5))
{
g_apstSnsState[IspDev]->u32FLStd = (OV4689_VMAX_4M30_LINEAR* 30) / f32Fps;
}
else
{
printf("Not support Fps: %f\n", f32Fps);
return;
}
}
else
{
if((f32Fps <= 30) && (f32Fps >= 1.5))
{
g_ap