#if !defined(__IMX290_CMOS_H_)
#define __IMX290_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"
#include "imx290_def.h"
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* End of #ifdef __cplusplus */
#define IMX290_ID 290
/****************************************************************************
* local variables *
****************************************************************************/
#define FULL_LINES_MAX (0x3FFFF)
#define SHS1_ADDR (0x220)
#define SHS2_ADDR (0x224)
#define GAIN_ADDR (0x214)
#define HCG_ADDR (0x209)
#define VMAX_ADDR (0x218)
#define HMAX_ADDR (0x21c)
#define RHS1_ADDR (0x230)
#define VMAX_IMX290_1080P30_LINE (1133)
#define VMAX_IMX290_1080P60_LINE (1125)
#define VMAX_IMX290_720P120_LINE (750)
#define VMAX_IMX290_720P60_WDR (750)
#if SENSOR_IMX290_LINE_WDR_12BIT
#define VMAX_IMX290_1080P30_WDR (1125)
#else
#define VMAX_IMX290_1080P30_WDR (1190)
#endif
static HI_U32 gu32BRL = 1109;
static HI_U32 gu32RHS1_Max = (VMAX_IMX290_1080P30_WDR - 1109) * 2 - 21;
static HI_BOOL bInit = HI_FALSE;
HI_BOOL bSensorInit = HI_FALSE;
static HI_U32 gu32FullLinesStd = VMAX_IMX290_1080P30_LINE;
static HI_U32 gu32FullLines = VMAX_IMX290_1080P30_LINE;
static HI_U32 gu32PreFullLines = VMAX_IMX290_1080P30_LINE;
WDR_MODE_E genSensorMode = WDR_MODE_NONE;
HI_U8 gu8SensorImageMode = SENSOR_IMX290_1080P_30FPS_MODE;
static HI_U8 gu8HCGReg = 0x01;
static HI_BOOL gbFPSUp = HI_FALSE;
static HI_BOOL gbVMAXDelay = HI_FALSE;
ISP_SNS_REGS_INFO_S g_stSnsRegsInfo = {0};
ISP_SNS_REGS_INFO_S g_stPreSnsRegsInfo = {0};
static HI_U32 au32WDRIntTime[2] = {0};
#define PATHLEN_MAX 256
#define CMOS_CFG_INI "imx290_cfg.ini"
static char pcName[PATHLEN_MAX] = "configs/imx290_cfg.ini";
/* 2to1 WDR*/
static ISP_AE_ROUTE_EX_S gstAERouteExAttr =
{
14,
{
{2, 1024, 1024, 1024, 0},
{9, 1024, 1024, 1024, 0}, //for ghost
{9, 3584, 1024, 1024, 0},
{43, 3584, 1024, 1024, 0}, //for flicker
{43, 5120, 1024, 1024, 0},
{65536, 5120, 1024, 1024, 0}, //for noise
{65536, 5120, 1024, 4096, 0},
{65536, 10240, 1024, 4096, 0}, //balance sensor input and isp gain
{65536, 10240, 1024, 8192, 0},
{65536, 14336, 1024, 8192, 0},
{65536, 14336, 1024, 10240, 0},
{65536, 32768, 1024, 10240, 0},
{65536, 32768, 1024, 16384, 0},
{65536, 8153234, 1024, 16384, 0}
}
};
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;
pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE;
pstAeSnsDft->stAgainAccu.f32Accuracy = 1;
pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_LINEAR;
pstAeSnsDft->stDgainAccu.f32Accuracy = 1;
pstAeSnsDft->u32ISPDgainShift = 8;
pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift;
pstAeSnsDft->u32MaxISPDgainTarget = 16 << pstAeSnsDft->u32ISPDgainShift;
pstAeSnsDft->u32MaxAgain = 8153234;
pstAeSnsDft->u32MinAgain = 1024;
pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain;
pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain;
pstAeSnsDft->u32MaxDgain = 1;
pstAeSnsDft->u32MinDgain = 1;
pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgain;
pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain;
pstAeSnsDft->bAERouteExValid = HI_TRUE;
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 - 2;
pstAeSnsDft->u32MinIntTime = 1;
pstAeSnsDft->u32MaxIntTimeTarget = 65535;
pstAeSnsDft->u32MinIntTimeTarget = 1;
break;
case WDR_MODE_2To1_LINE:
pstAeSnsDft->au8HistThresh[0] = 0xC;
pstAeSnsDft->au8HistThresh[1] = 0x18;
pstAeSnsDft->au8HistThresh[2] = 0x60;
pstAeSnsDft->au8HistThresh[3] = 0x80;
#if SENSOR_IMX290_LINE_WDR_12BIT
pstAeSnsDft->u32MaxIntTime = 8;
pstAeSnsDft->u32MinIntTime = 1;
#else
pstAeSnsDft->u32MaxIntTime = 138;
pstAeSnsDft->u32MinIntTime = 1;
#endif
pstAeSnsDft->u32MaxIntTimeTarget = 65535;
pstAeSnsDft->u32MinIntTimeTarget = pstAeSnsDft->u32MinIntTime;
pstAeSnsDft->u32MaxAgain = 8153234;
pstAeSnsDft->u32MinAgain = 1024;
pstAeSnsDft->u32MaxAgainTarget = 8153234;
pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain;
pstAeSnsDft->u8AeCompensation = 40;
pstAeSnsDft->u16ManRatioEnable = HI_TRUE;
pstAeSnsDft->u32Ratio = 0x400;
memcpy(&pstAeSnsDft->stAERouteAttrEx, &gstAERouteExAttr, sizeof(ISP_AE_ROUTE_EX_S));
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->u32MaxIntTime = gu32FullLinesStd - 2;
pstAeSnsDft->u32MinIntTime = 1;
pstAeSnsDft->u32MaxIntTimeTarget = 65535;
pstAeSnsDft->u32MinIntTimeTarget = pstAeSnsDft->u32MinIntTime;
pstAeSnsDft->u8AeCompensation = 0x38;
break;
}
return 0;
}
/* the function of sensor set fps */
static HI_VOID cmos_fps_set(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft)
{
HI_U32 u32VMAX = VMAX_IMX290_1080P30_LINE;
switch (gu8SensorImageMode)
{
case SENSOR_IMX290_1080P_30FPS_MODE:
if ((f32Fps <= 30) && (f32Fps >= 0.5))
{
if (WDR_MODE_2To1_LINE == genSensorMode)
{
u32VMAX = VMAX_IMX290_1080P30_WDR * 30 / f32Fps;
}
else
{
u32VMAX = VMAX_IMX290_1080P30_LINE * 30 / f32Fps;
}
}
else
{
printf("Not support Fps: %f\n", f32Fps);
return;
}
break;
case SENSOR_IMX290_1080P_60FPS_MODE:
if ((f32Fps <= 60) && (f32Fps >= 0.5))
{
u32VMAX = VMAX_IMX290_1080P60_LINE * 60 / f32Fps;
}
else
{
printf("Not support Fps: %f\n", f32Fps);
return;
}
break;
case SENSOR_IMX290_720P_60FPS_MODE:
if ((f32Fps <= 60) && (f32Fps >= 0.5))
{
if (WDR_MODE_2To1_LINE == genSensorMode)
{
u32VMAX = VMAX_IMX290_720P60_WDR * 60 / f32Fps;
}
else
{
}
}
else
{
printf("Not support Fps: %f\n", f32Fps);
return;
}
break;
case SENSOR_IMX290_720P_120FPS_MODE:
if ((f32Fps <= 120) && (f32Fps >= 0.5))
{
sony IMX290 driver (SPI)
1星 需积分: 40 29 浏览量
2017-12-16
16:33:28
上传
评论 2
收藏 17KB RAR 举报
xiaozhiwise
- 粉丝: 261
- 资源: 24