mirror of https://github.com/OpenIPC/firmware.git
537 lines
13 KiB
C
537 lines
13 KiB
C
#include "xm_type.h"
|
|
#include "xm_comm_isp.h"
|
|
#include "xm_comm_sns.h"
|
|
#include "xm_sns_ctrl.h"
|
|
#include "mpi_isp.h"
|
|
#include "mpi_ae.h"
|
|
#include "mpi_awb.h"
|
|
#include "xm_awb_comm.h"
|
|
#include "mpi_phyvi.h"
|
|
#include "xm_print.h"
|
|
#include "XAx_cmos.h"
|
|
|
|
#define STATIC static
|
|
extern GAIN_MODE_DT gstGainModeDt;
|
|
|
|
|
|
STATIC XM_S32 cmos_set_mirror_flip(XM_U8 u8Mirror,XM_U8 u8Flip)
|
|
{
|
|
XM_U32 u32Tmp;
|
|
XM_U16 u16OfstH,u16OfsV;
|
|
u32Tmp = sensor_read_register(0x12);
|
|
u32Tmp = u32Tmp&0xCF;
|
|
if(u8Mirror)
|
|
{
|
|
u32Tmp &= 0xDF;
|
|
u16OfstH = 1;
|
|
}
|
|
else
|
|
{
|
|
u32Tmp |= 0x20;
|
|
u16OfstH = 0;
|
|
}
|
|
|
|
if(u8Flip)
|
|
{
|
|
u32Tmp |= 0x10;
|
|
u16OfsV = 1;
|
|
}
|
|
else
|
|
{
|
|
u32Tmp &= 0xEF;
|
|
u16OfsV = 0;
|
|
}
|
|
sensor_write_register(0x12, u32Tmp);
|
|
VI_WinSet(1, u8Mirror, u8Flip, u16OfstH, u16OfsV);
|
|
return XM_SUCCESS;
|
|
}
|
|
|
|
static XM_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft)
|
|
{
|
|
if (XM_NULL == pstAeSnsDft)
|
|
{
|
|
ERR("null pointer when get ae default value!\n");
|
|
return -1;
|
|
}
|
|
pstAeSnsDft->u8UpdateMode = 1;
|
|
pstAeSnsDft->u32FullLinesStd = HD1080P_LINES;
|
|
pstAeSnsDft->u8AeCompensation = 0x39;
|
|
pstAeSnsDft->u32LinesPer500ms = pstAeSnsDft->u32FullLinesStd*25/2;
|
|
pstAeSnsDft->u32FlickerFreq = 0;
|
|
|
|
pstAeSnsDft->u32MaxIntTime = pstAeSnsDft->u32FullLinesStd-2;
|
|
pstAeSnsDft->u32MinIntTime = 1;
|
|
|
|
pstAeSnsDft->u32MaxAgain = 15872;//15.5X
|
|
pstAeSnsDft->u32MinAgain = 1024;
|
|
|
|
pstAeSnsDft->u32MaxDgain = 1024;
|
|
pstAeSnsDft->u32MinDgain = 1024;
|
|
|
|
pstAeSnsDft->u32ISPDgainShift = 8;
|
|
pstAeSnsDft->u32MaxISPDgain= 8 << pstAeSnsDft->u32ISPDgainShift;
|
|
pstAeSnsDft->u32MinISPDgain= 1 << pstAeSnsDft->u32ISPDgainShift;
|
|
|
|
pstAeSnsDft->bDelayCfg = XM_FALSE;
|
|
return 0;
|
|
}
|
|
|
|
static XM_VOID cmos_again_calc_table(XM_U32 u32InTimes,AE_SENSOR_GAININFO_S *pstAeSnsGainInfo)
|
|
{
|
|
XM_U8 i;
|
|
if(XM_NULL == pstAeSnsGainInfo)
|
|
{
|
|
return;
|
|
}
|
|
pstAeSnsGainInfo->u32GainDb = 0;
|
|
pstAeSnsGainInfo->u32SnsTimes = 1024;
|
|
|
|
u32InTimes = u32InTimes/64;
|
|
u32InTimes = u32InTimes < 16? 16: u32InTimes;
|
|
|
|
if(u32InTimes > 248)// 248
|
|
{
|
|
u32InTimes = 248;
|
|
}
|
|
|
|
for(i = 0; i < 5; i++)
|
|
{
|
|
if(u32InTimes < 32)
|
|
{
|
|
break;
|
|
}
|
|
u32InTimes >>= 1;
|
|
}
|
|
pstAeSnsGainInfo->u32GainDb = (i<<4)+u32InTimes-16;
|
|
u32InTimes = u32InTimes<<i;
|
|
pstAeSnsGainInfo->u32SnsTimes = u32InTimes*64;
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
static XM_VOID cmos_dgain_calc_table(XM_U32 u32InTimes,AE_SENSOR_GAININFO_S *pstAeSnsGainInfo)
|
|
{
|
|
if(XM_NULL == pstAeSnsGainInfo)
|
|
{
|
|
ERR("cmos_dgain_calc_table failed!\n");
|
|
return;
|
|
}
|
|
pstAeSnsGainInfo->u32GainDb = 0;
|
|
pstAeSnsGainInfo->u32SnsTimes = 1024;
|
|
return;
|
|
}
|
|
|
|
STATIC XM_VOID cmos_inttime_update(XM_U32 u32IntTime)
|
|
{
|
|
static XM_U32 su32IntTime = 0xFFFFFFFF;
|
|
if(su32IntTime == u32IntTime)
|
|
return ;
|
|
gu32ShutNow = u32IntTime;
|
|
su32IntTime = u32IntTime;
|
|
sensor_write_register(0x01, u32IntTime&0xFF);
|
|
sensor_write_register(0x02, (u32IntTime>>8)&0xFF);
|
|
return;
|
|
}
|
|
|
|
STATIC XM_VOID cmos_gains_update(XM_U32 u32Again, XM_U32 u32Dgain)
|
|
{
|
|
static XM_U32 su32AGain = 0xFFFFFFF;
|
|
if(su32AGain == u32Again)
|
|
{
|
|
return;
|
|
}
|
|
su32AGain = u32Again;
|
|
sensor_write_register(0x00, u32Again);
|
|
if(u32Again > 0x10)//2X
|
|
{
|
|
sensor_write_register(0x2f, 0x44);
|
|
sensor_write_register(0x0C, 0x00);
|
|
sensor_write_register(0x82, 0x21);
|
|
}
|
|
else
|
|
{
|
|
sensor_write_register(0x2f, 0x64);
|
|
sensor_write_register(0x0C, 0x40);
|
|
sensor_write_register(0x82, 0x23);
|
|
}
|
|
return;
|
|
}
|
|
|
|
/* the function of sensor set fps */
|
|
STATIC XM_VOID cmos_fps_set(XM_U8 u8Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft)
|
|
{
|
|
XM_U32 u32TotalSizeV;
|
|
u32TotalSizeV = HD1080P_LINES;
|
|
switch(u8Fps)
|
|
{
|
|
case 30:
|
|
sensor_write_register(0x20,0x4C);
|
|
sensor_write_register(0x21,0x04);
|
|
sensor_write_register(0x27,0x18);
|
|
//sensor_write_register(0x29,0x07);
|
|
sensor_write_register(0x2a,0x12);
|
|
//sensor_write_register(0x2b,0x17);
|
|
DEBUG("cmos_fps_set F37 2M 30fps\n");
|
|
break;
|
|
case 25:
|
|
default:
|
|
sensor_write_register(0x20,0x28);
|
|
sensor_write_register(0x21,0x05);
|
|
sensor_write_register(0x27,0xF4);
|
|
//sensor_write_register(0x29,0x08);
|
|
sensor_write_register(0x2a,0xEE);
|
|
//sensor_write_register(0x2b,0x18);
|
|
DEBUG("cmos_fps_set F37 2M 25fps\n");
|
|
break;
|
|
}
|
|
if(pstAeSnsDft != NULL)
|
|
{
|
|
pstAeSnsDft->u32FullLinesStd = u32TotalSizeV;
|
|
pstAeSnsDft->u32MaxIntTime = pstAeSnsDft->u32FullLinesStd - gu8MaxShutterOfst;
|
|
pstAeSnsDft->u32LinesPer500ms = pstAeSnsDft->u32FullLinesStd * u8Fps / 2;
|
|
gu16FullLines = u32TotalSizeV;
|
|
}
|
|
return;
|
|
}
|
|
|
|
STATIC XM_VOID cmos_slow_framerate_set(XM_U16 u16FullLines, AE_SENSOR_DEFAULT_S *pstAeSnsDft)
|
|
{
|
|
static XM_U16 preU16FullLine = 0xffff;
|
|
if(preU16FullLine == u16FullLines)
|
|
return;
|
|
|
|
preU16FullLine = u16FullLines;
|
|
u16FullLines = (u16FullLines>=4096)?4000:u16FullLines;
|
|
pstAeSnsDft->u32MaxIntTime = u16FullLines - 2;
|
|
SysDelay_ms(100);
|
|
if(gu32ShutNow>pstAeSnsDft->u32MaxIntTime)
|
|
{
|
|
cmos_inttime_update(pstAeSnsDft->u32MaxIntTime);
|
|
}
|
|
sensor_write_register(0x22, u16FullLines&0xFF);
|
|
sensor_write_register(0x23, (u16FullLines>>8)&0xFF);
|
|
|
|
XM_MPI_MIPI_RefreshFV(0, (XM_U32)u16FullLines);
|
|
}
|
|
|
|
|
|
XM_S32 cmos_init_sensor_exp_function_F37(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc)
|
|
{
|
|
pstSensorExpFunc->pfn_cmos_set_mirror_flip = cmos_set_mirror_flip;
|
|
return 0;
|
|
}
|
|
|
|
XM_S32 cmos_init_ae_exp_function_F37(AE_SENSOR_EXP_FUNC_S *pstExpFuncs)
|
|
{
|
|
pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default;
|
|
pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set;
|
|
pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set;
|
|
pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update;
|
|
pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update;
|
|
pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table;
|
|
pstExpFuncs->pfn_cmos_dgain_calc_table = cmos_dgain_calc_table;
|
|
pstExpFuncs->pfn_cmos_shut_calc_table = NULL;
|
|
return 0;
|
|
}
|
|
|
|
|
|
#if(defined SOC_SYSTEM) || (defined SOC_ALIOS)
|
|
const ISP_CMOS_AGC_TABLE_S g_stIspAgcTable_F37 =
|
|
{
|
|
/* bvalid */
|
|
1,
|
|
/* 100, 200, 400, 800, 1600, 3200, 6400, 12800; 100, 200, 400, 800, 1600, 3200, 6400, 12800 */
|
|
//[0~7]:Normal
|
|
/* sharpen_D H */
|
|
{0x3C,0x3C,0x38,0x36,0x30,0x28,0x20,0x18,0x10,0x04,0x04,0x04,0x04,0x04,0x04,0x04},
|
|
/* (2) sharpen_Ud M */
|
|
{0x30,0x30,0x30,0x30,0x2A,0x24,0x1A,0x12,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04},
|
|
/* (3) sharpen_Kd */
|
|
{0x3C,0x3C,0x3A,0x38,0x34,0x30,0x28,0x18,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08},
|
|
/* (4) snr_thresh 2DNr */
|
|
{0x00,0x01,0x02,0x03,0x04,0x06,0x0E,0x12,0x1C,0x40,0x40,0x40,0x40,0x40,0x40,0x40},
|
|
/* (5) snr_thresh 3DNr Tf */
|
|
{0x02,0x04,0x06,0x08,0x0C,0x10,0x14,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b},
|
|
/* (6) snr_thresh 3DNr Sf */
|
|
{0x00,0x00,0x01,0x02,0x03,0x04,0x08,0x0A,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10},
|
|
/* DyDpc_thresh */
|
|
{0x97,0xA8,0xD0,0xD4,0xD8,0xDC,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0},
|
|
/* saturation_strength */
|
|
{0xC8,0xC8,0xC8,0xBC,0xB4,0xa2,0x96,0x78,0x50,0x30,0x30,0x30,0x30,0x30,0x30,0x30},
|
|
/* Blc */
|
|
{0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42},
|
|
/*Y_Tran gamma*/
|
|
{0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x30,0x30,0x30,0x28,0x28,0x28,0x28,0x28}
|
|
};
|
|
|
|
const ISP_COLORMATRIX_AUTO_S g_stAwbCcm_F37 =
|
|
{
|
|
5000,//0.14
|
|
{
|
|
0x0000, 277, -70, 49,
|
|
0x0000, 10, 258, -12,
|
|
0x0000, 44, -68, 280,
|
|
},
|
|
4000,//0.14
|
|
{
|
|
0x0000, 280, -89, 65,
|
|
0x0000, -6, 251, 11,
|
|
0x0000, 31, -99, 324,
|
|
},
|
|
2800,//0.12
|
|
{
|
|
0x0000, 239, -48, 65,
|
|
0x0000, -42, 274, 24,
|
|
0x0000, -41, -211, 508,
|
|
}
|
|
};
|
|
|
|
const ISP_AWB_CALIBRATION_V2_S gstAwbCal_F37 = {
|
|
{0, 0, 4096, 2953, 3828, 2046, 1051, 4096},
|
|
{4096, 4096, 0, 0, 4096, 2975, 4096, 1412},
|
|
{-744, -4007, -1325, -4096, -3425, -4096, -1873, -2384},
|
|
213,
|
|
0, 1693, 0, 2716,
|
|
{0, 908, 1109, 1430, 1524, 1631, 1848, 1864, 2716, 0, 0, 0, 0, 0, 0, 0},
|
|
{2000, 2150, 2800, 4000, 4150, 5000, 6500, 7500, 12000, 0, 0, 0, 0, 0, 0, 0},
|
|
{1643, 1024, 1821, 0}
|
|
};
|
|
|
|
|
|
// ExtClk:27M
|
|
// 1080P30fps,12Bit,SPI,LVDS 2CH,ADC12Bit
|
|
// Nomal Mode register setting
|
|
static const XM_U8 gau8SnsInit_F37[][2] = {
|
|
#if 1
|
|
{0x12,0x60},
|
|
{0x48,0x86},
|
|
{0x48,0x06},
|
|
{0x0E,0x11},
|
|
{0x0F,0x14},
|
|
{0x10,0x37},
|
|
{0x11,0x80},
|
|
{0x0D,0xF0},
|
|
{0x5F,0x42},
|
|
{0x60,0x2B},
|
|
{0x58,0x12},
|
|
{0x57,0x60},
|
|
{0x9D,0x00},
|
|
{0x20,0x4C},
|
|
{0x21,0x04},
|
|
{0x22,0x65},
|
|
{0x23,0x04},
|
|
{0x24,0xE2},
|
|
{0x25,0x40},
|
|
{0x26,0x41},
|
|
{0x27,0x18},
|
|
{0x28,0x11},
|
|
{0x29,0x04},
|
|
{0x2A,0x12},
|
|
{0x2B,0x14},
|
|
{0x2C,0x00},
|
|
{0x2D,0x01},
|
|
{0x2E,0x15},
|
|
{0x2F,0x44},
|
|
{0x41,0xC7},
|
|
{0x42,0x3B},
|
|
{0x47,0x42},
|
|
{0x76,0x6A},
|
|
{0x77,0x09},
|
|
{0x1D,0x00},
|
|
{0x1E,0x04},
|
|
{0x6C,0x40},
|
|
{0x6E,0x2C},
|
|
{0x70,0xDC},
|
|
{0x71,0xD3},
|
|
{0x72,0xD4},
|
|
{0x73,0x58},
|
|
{0x74,0x02},
|
|
{0x78,0x8B},
|
|
{0x89,0x01},
|
|
{0x6B,0x20},
|
|
{0x86,0x40},
|
|
{0x31,0x06},
|
|
{0x32,0x1C},
|
|
{0x33,0x5C},
|
|
{0x34,0x44},
|
|
{0x35,0x44},
|
|
{0x3A,0xAF},
|
|
{0x3B,0x00},
|
|
{0x3C,0x3C},
|
|
{0x3D,0x4A},
|
|
{0x3E,0xFF},
|
|
{0x3F,0x68},
|
|
{0x40,0xFF},
|
|
{0x56,0xB2},
|
|
{0x59,0x80},
|
|
{0x5A,0x04},
|
|
{0x85,0x40},
|
|
{0x8A,0x04},
|
|
{0x91,0x13},
|
|
{0x9B,0x03},
|
|
{0x9C,0xE1},
|
|
{0xA9,0x78},
|
|
{0x5B,0xB0},
|
|
{0x5C,0x71},
|
|
{0x5D,0xF6},
|
|
{0x5E,0x14},
|
|
{0x62,0x01},
|
|
{0x63,0x0F},
|
|
{0x64,0xC0},
|
|
{0x65,0x02},
|
|
{0x67,0x65},
|
|
{0x66,0x04},
|
|
{0x68,0x00},
|
|
{0x69,0x7C},
|
|
{0x6A,0x12},
|
|
{0x7A,0x80},
|
|
{0x82,0x21},
|
|
{0x8F,0x91},
|
|
{0xAE,0x30},
|
|
{0x13,0x81},
|
|
{0x96,0x04},
|
|
{0x4A,0x05},
|
|
{0x7E,0xCD},
|
|
{0x50,0x02},
|
|
{0x49,0x10},
|
|
{0xAF,0x12},
|
|
{0x80,0x43},
|
|
{0x7B,0x4A},
|
|
{0x7C,0x08},
|
|
{0x7F,0x57},
|
|
{0x90,0x00},
|
|
{0x8C,0xFF},
|
|
{0x8D,0xC7},
|
|
{0x8E,0x00},
|
|
{0x8B,0x01},
|
|
{0x0C,0x00},
|
|
{0x81,0x74},
|
|
{0x19,0x20},
|
|
{0x46,0x00},
|
|
{0x12,0x20},
|
|
{0x48,0x86},
|
|
{0x48,0x06}
|
|
#else
|
|
{0x12,0x60},
|
|
{0x48,0x8A},
|
|
{0x48,0x0A},
|
|
{0x0E,0x11},
|
|
{0x0F,0x14},
|
|
{0x10,0x36},
|
|
{0x11,0x80},
|
|
{0x0D,0xF0},
|
|
{0x5F,0x41},
|
|
{0x60,0x20},
|
|
{0x58,0x12},
|
|
{0x57,0x60},
|
|
{0x9D,0x00},
|
|
{0x20,0x00},
|
|
{0x21,0x09},
|
|
{0x22,0x65},
|
|
{0x23,0x04},
|
|
{0x24,0xC4},
|
|
{0x25,0x40},
|
|
{0x26,0x43},
|
|
{0x27,0x98},
|
|
{0x28,0x11},
|
|
{0x29,0x08},
|
|
{0x2A,0x8C},
|
|
{0x2B,0x18},
|
|
{0x2C,0x00},
|
|
{0x2D,0x00},
|
|
{0x2E,0x14},
|
|
{0x2F,0x44},
|
|
{0x41,0xC7},
|
|
{0x42,0x3B},
|
|
{0x47,0x42},
|
|
{0x76,0x6A},
|
|
{0x77,0x09},
|
|
{0x1D,0x00},
|
|
{0x1E,0x04},
|
|
{0x6C,0x40},
|
|
{0x6E,0x2C},
|
|
{0x70,0xDC},
|
|
{0x71,0xD3},
|
|
{0x72,0xD4},
|
|
{0x73,0x58},
|
|
{0x74,0x02},
|
|
{0x78,0x96},
|
|
{0x89,0x01},
|
|
{0x6B,0x20},
|
|
{0x86,0x40},
|
|
{0x31,0x0C},
|
|
{0x32,0x38},
|
|
{0x33,0x6C},
|
|
{0x34,0x88},
|
|
{0x35,0x88},
|
|
{0x3A,0xAF},
|
|
{0x3B,0x00},
|
|
{0x3C,0x57},
|
|
{0x3D,0x78},
|
|
{0x3E,0xFF},
|
|
{0x3F,0xF8},
|
|
{0x40,0xFF},
|
|
{0x56,0xB2},
|
|
{0x59,0xE8},
|
|
{0x5A,0x04},
|
|
{0x85,0x70},
|
|
{0x8A,0x04},
|
|
{0x91,0x13},
|
|
{0x9B,0x03},
|
|
{0x9C,0xE1},
|
|
{0xA9,0x78},
|
|
{0x5B,0xB0},
|
|
{0x5C,0x71},
|
|
{0x5D,0xF6},
|
|
{0x5E,0x14},
|
|
{0x62,0x01},
|
|
{0x63,0x0F},
|
|
{0x64,0xC0},
|
|
{0x65,0x02},
|
|
{0x67,0x65},
|
|
{0x66,0x04},
|
|
{0x68,0x00},
|
|
{0x69,0x7C},
|
|
{0x6A,0x12},
|
|
{0x7A,0x80},
|
|
{0x82,0x21},
|
|
{0x8F,0x91},
|
|
{0xAE,0x30},
|
|
{0x13,0x81},
|
|
{0x96,0x04},
|
|
{0x4A,0x05},
|
|
{0x7E,0xCD},
|
|
{0x50,0x02},
|
|
{0x49,0x10},
|
|
{0xAF,0x12},
|
|
{0x80,0x41},
|
|
{0x7B,0x4A},
|
|
{0x7C,0x08},
|
|
{0x7F,0x57},
|
|
{0x90,0x00},
|
|
{0x8C,0xFF},
|
|
{0x8D,0xC7},
|
|
{0x8E,0x00},
|
|
{0x8B,0x01},
|
|
{0x0C,0x00},
|
|
{0x81,0x74},
|
|
{0x19,0x20},
|
|
{0x46,0x00},
|
|
{0x12,0x20},
|
|
{0x48,0x8A},
|
|
{0x48,0x0A}
|
|
#endif
|
|
};
|
|
|
|
XM_U32 sensor_getlist_F37(XM_U16 *pu16Num)
|
|
{
|
|
DEBUG("------------- SOIF37 2M 25fps init ok! (@20190909)----------------\n");
|
|
*pu16Num = sizeof(gau8SnsInit_F37)/sizeof(gau8SnsInit_F37[0]);
|
|
return (XM_U32)gau8SnsInit_F37;
|
|
}
|
|
#endif
|
|
|
|
|
|
|