#if !defined(__IMX185_CMOS_H_)
#define __IMX185_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 IMX185_ID 185
/* To change the mode of config. ifndef INIFILE_CONFIG_MODE, quick config mode.*/
/* else, cmos_cfg.ini file config mode*/
#ifdef INIFILE_CONFIG_MODE
extern AE_SENSOR_DEFAULT_S g_AeDft[];
extern AWB_SENSOR_DEFAULT_S g_AwbDft[];
extern ISP_CMOS_DEFAULT_S g_IspDft[];
extern HI_S32 Cmos_LoadINIPara(const HI_CHAR *pcName);
#else
#endif
/****************************************************************************
* local variables *
****************************************************************************/
/*
#define SHS1_ADDR (0x220)
#define GAIN_ADDR (0x214)
#define VMAX_ADDR (0x218)
#define HMAX_ADDR (0x21B)*/
/* I2C*/
#define SHS1_ADDR (0x3020)
#define GAIN_ADDR (0x3014)
#define VMAX_ADDR (0x3018)
#define HMAX_ADDR (0x301B)
extern const unsigned int sensor_i2c_addr;
extern unsigned int sensor_addr_byte;
extern unsigned int sensor_data_byte;
#define INCREASE_LINES (1) /* make real fps less than stand fps because NVR require*/
#define VMAX_1080P30 (1125+INCREASE_LINES)
#define VMAX_1080P30_WDR (1125+INCREASE_LINES)
#define FULL_LINES_MAX (0xFFFF)
static HI_BOOL bInit = HI_FALSE;
HI_BOOL bSensorInit = HI_FALSE;
static HI_U32 gu32FullLinesStd = VMAX_1080P30;
static HI_U32 gu32FullLines = VMAX_1080P30;
WDR_MODE_E genSensorMode = WDR_MODE_NONE;
ISP_SNS_REGS_INFO_S g_stSnsRegsInfo = {0};
ISP_SNS_REGS_INFO_S g_stPreSnsRegsInfo = {0};
#define PATHLEN_MAX 256
#define CMOS_CFG_INI "imx185_cfg.ini"
static char pcName[PATHLEN_MAX] = "configs/imx185_cfg.ini";
/* AE default parameter and function */
/* Built-in WDR 30fps*/
static ISP_AE_ROUTE_S gstAERouteAttr =
{
3,
{
{5*16, 1024, 1},
{70*16, 1024, 1},
{70*16, 3938, 1}
}
};
#ifdef INIFILE_CONFIG_MODE
static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft)
{
if (HI_NULL == pstAeSnsDft)
{
printf("null pointer when get ae default value!\n");
return -1;
}
pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2;
pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd;
pstAeSnsDft->u32FlickerFreq = 0;
pstAeSnsDft->u32FullLinesMax = FULL_LINES_MAX;
pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR;
pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1;
pstAeSnsDft->stIntTimeAccu.f32Offset = 0.1083; //3.85us
pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE;
pstAeSnsDft->stAgainAccu.f32Accuracy = 0.3;
pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE;
pstAeSnsDft->stDgainAccu.f32Accuracy = 0.3;
switch(genSensorMode)
{
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 = g_AeDft[0].u8AeCompensation;
pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2;
pstAeSnsDft->u32MinIntTime = 2;
pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[0].u32MaxIntTimeTarget;
pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[0].u32MinIntTimeTarget;
pstAeSnsDft->u32MaxAgain = 16229;
pstAeSnsDft->u32MinAgain = 1024;
pstAeSnsDft->u32MaxAgainTarget = g_AeDft[0].u32MaxAgainTarget;
pstAeSnsDft->u32MinAgainTarget = g_AeDft[0].u32MinAgainTarget;
pstAeSnsDft->u32MaxDgain = 16229;
pstAeSnsDft->u32MinDgain = 1024;
pstAeSnsDft->u32MaxDgainTarget = g_AeDft[0].u32MaxDgainTarget;
pstAeSnsDft->u32MinDgainTarget = g_AeDft[0].u32MinDgainTarget;
pstAeSnsDft->u32ISPDgainShift = g_AeDft[0].u32ISPDgainShift;
pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[0].u32MinISPDgainTarget;
pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[0].u32MaxISPDgainTarget;
break;
case WDR_MODE_BUILT_IN:
pstAeSnsDft->au8HistThresh[0] = 0xC;
pstAeSnsDft->au8HistThresh[1] = 0x18;
pstAeSnsDft->au8HistThresh[2] = 0x60;
pstAeSnsDft->au8HistThresh[3] = 0x80;
pstAeSnsDft->u8AeCompensation = g_AeDft[1].u8AeCompensation;
pstAeSnsDft->u32MaxIntTime = 70*16;
pstAeSnsDft->u32MinIntTime = 5*16;
pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[1].u32MaxIntTimeTarget;
pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[1].u32MinIntTimeTarget;
pstAeSnsDft->u32MaxAgain = 1719; /* Built-in WDR Again fix 4.5DB */
//pstAeSnsDft->u32MaxAgain = 8134;
pstAeSnsDft->u32MinAgain = 1719;
pstAeSnsDft->u32MaxAgainTarget = g_AeDft[1].u32MaxAgainTarget;
pstAeSnsDft->u32MinAgainTarget = g_AeDft[1].u32MinAgainTarget;
pstAeSnsDft->u32MaxDgain = 3938;
//pstAeSnsDft->u32MaxDgain = 1024;
pstAeSnsDft->u32MinDgain = 1024;
pstAeSnsDft->u32MaxDgainTarget = g_AeDft[1].u32MaxDgainTarget;
pstAeSnsDft->u32MinDgainTarget = g_AeDft[1].u32MinDgainTarget;
pstAeSnsDft->u32ISPDgainShift = g_AeDft[1].u32ISPDgainShift;
pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[1].u32MinISPDgainTarget;
pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[1].u32MaxISPDgainTarget;
memcpy(&pstAeSnsDft->stAERouteAttr, &gstAERouteAttr, sizeof(ISP_AE_ROUTE_S));
break;
}
return 0;
}
#else
static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft)
{
if (HI_NULL == pstAeSnsDft)
{
printf("null pointer when get ae default value!\n");
return -1;
}
pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2;
pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd;
pstAeSnsDft->u32FlickerFreq = 0;
pstAeSnsDft->u32FullLinesMax = FULL_LINES_MAX;
pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR;
pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1;
pstAeSnsDft->stIntTimeAccu.f32Offset = 0.1083; //3.85us
pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE;
pstAeSnsDft->stAgainAccu.f32Accuracy = 0.3;
pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE;
pstAeSnsDft->stDgainAccu.f32Accuracy = 0.3;
pstAeSnsDft->u32ISPDgainShift = 8;
pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift;
pstAeSnsDft->u32MaxISPDgainTarget = 8 << pstAeSnsDft->u32ISPDgainShift;
switch(genSensorMode)
{
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;
pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 1;
pstAeSnsDft->u32MinIntTime = 2;
pstAeSnsDft->u32MaxIntTimeTarget = 65535;
pstAeSnsDft->u32MinIntTimeTarget = 2;
pstAeSnsDft->u32MaxAgain = 16229;
pstAeSnsDft->u32MinAgain = 1024;
pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain;
pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain;
pstAeSnsDft->u32MaxDgain = 16229;
pstAeSnsDft->u32MinDgain = 1024;
pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgai