/**
@file AR0330M.c
@brief AR0330M
@note Nothing (or anything need to be mentioned).
Copyright Novatek Microelectronics Corp. 2010. All rights reserved.
*/
//----------------------------------------------------------------------------------------------------
#include "pll.h"
#include "Utility.h"
#include "Sensor.h"
#include "SensorI2C.h"
#include "AR0330M_param_Int.h"
#include "csi.h"
#include "sie_lib.h"
#define __MODULE__ AR0330M
#define __DBGLVL__ 1 //ERROR mode, show err, wrn only
#define __DBGFLT__ "*" //*=All
#include "DebugModule.h"
#define SEN_READ_ID 0x21
#define SEN_WRITE_ID 0x20
UINT32 AR0330M_MIPI_LaneNum = 2;
UINT32 AGC_GainBase = AGC_ISO50;
// function prototype
#if 0
#endif
UINT32 AR0330_OTPM = AR0330_V4;
static ER Init_AR0330M(SENSOR_INIT_OBJ *InitObj);
static ER UnInit_AR0330M(void);
static ER PwrOn_AR0330M(void);
static ER PwrOff_AR0330M(void);
static ER Sleep_AR0330M(void);
static ER WakeUp_AR0330M(void);
static ER WriteReg_AR0330M(SENSOR_CMD *Cmd);
static ER ReadReg_AR0330M(SENSOR_CMD *Cmd);
static ER ChgMode_AR0330M(SENSOR_MODE Mode);
static ER GetCurMode_AR0330M(SENSOR_MODE *Mode);
static ER GetStatus_AR0330M(SENSOR_MODE Mode, SENSOR_INFO *Info);
static UINT32 GetModeNum_AR0330M(void);
static UINT32 GetExpoSetting_AR0330M(UINT32 ExpTime, SENSOR_MODE Mode, EXPOSURE_SETTING *ExpTSetting);
//#NT#2013/11/04#Jarkko Chang -begin
//#NT# add iso base setting
static ER SetAGC_ISOBase_AR0330M(BOOL Cal_Status, UINT32 ISOBase);
//#NT#2013/11/04#Jarkko Chang -end
static ER GetGainSetting_AR0330M(UINT32 ISO, GAIN_SETTING *Gain);
static ER SetFrame_AR0330M(UINT32 uiFrame, UINT32 *VTotal, UINT32 *HTotal);
static ER SetLine_AR0330M(UINT32 uiLine);
static ER SetPixel_AR0330M(UINT32 uiStep);
static ER SetGain_AR0330M(GAIN_SETTING *Gain);
static ER Set2GRSmode_AR0330M(void);
static SENSOR_DRVTAB m_pAR0330MDrv =
{
Init_AR0330M,
UnInit_AR0330M,
PwrOn_AR0330M,
PwrOff_AR0330M,
Sleep_AR0330M,
WakeUp_AR0330M,
WriteReg_AR0330M,
ReadReg_AR0330M,
ChgMode_AR0330M,
GetCurMode_AR0330M,
GetStatus_AR0330M,
GetModeNum_AR0330M,
GetExpoSetting_AR0330M,
SetAGC_ISOBase_AR0330M,
GetGainSetting_AR0330M,
SetFrame_AR0330M,
SetLine_AR0330M,
SetPixel_AR0330M,
SetGain_AR0330M,
Set2GRSmode_AR0330M
};
static SENSOR_PCLK_INFO PclkInfo;
static SENSOR_CMD_INFO CmdInfo;
static SENSOR_OPTION SenOption = 0;
static SENSOR_MODE CurMode = SENSOR_MODE_UNKNOWN;
static UINT32 m_uiSEN_WRITE_ID = SEN_WRITE_ID;
static UINT32 m_uiSEN_READ_ID = SEN_READ_ID;
static I2C_SECTION m_uiSEN_I2C_SECTION = I2C_TOTAL_SECTION;
static SENSOR_I2C m_uiSEN_I2C = SENSOR_I2C_MAX_NUM;
#if 0
-intern api
#endif
/**
* Sensor control API
*/
static SENSOR_CMD SetCmdInfo(UINT32 Addr, UINT32 DataLength, UINT32 Data0, UINT32 Data1)
{
SENSOR_CMD Cmd;
Cmd.uiAddr = Addr;
Cmd.uiDataLen = DataLength;
Cmd.uiData[0] = Data0;
Cmd.uiData[1] = Data1;
return Cmd;
}
static ER AR0330RegRead(UINT32 uiAddr, UINT32 *uiData)
{
ER ret = E_OK;
SENSOR_CMD Cmd;
Cmd = SetCmdInfo(uiAddr, 2, 0, 0);
ret = ReadReg_AR0330M(&Cmd);
*uiData = Cmd.uiData[0];
return ret;
}
static ER AR0330RegWrite(UINT32 uiAddr, UINT32 uiData)
{
SENSOR_CMD Cmd;
Cmd = SetCmdInfo(uiAddr, 2, uiData, 0);
return WriteReg_AR0330M(&Cmd);
}
static ER AR0330RegBitField(UINT32 uiAddr, UINT32 Mask, UINT32 uiData)
{
SENSOR_CMD Cmd;
Cmd = SetCmdInfo(uiAddr, 2, uiData, 0);
ReadReg_AR0330M(&Cmd);
Cmd.uiData[0] &= (~Mask);
Cmd.uiData[0] |= uiData;
return WriteReg_AR0330M(&Cmd);
}
static void Init_CmdInterface(SENSOR_CMD_INFO *CmdInfo)
{
if ( CmdInfo->CmdType == SENSOR_CMD_I2C )
{
if ( CmdInfo->INFO.I2C.extSlaveAddrEnable == TRUE )
{
m_uiSEN_READ_ID = CmdInfo->INFO.I2C.extSlaveRAddr;
m_uiSEN_WRITE_ID = CmdInfo->INFO.I2C.extSlaveWAddr;
}
else
{
m_uiSEN_READ_ID = SEN_READ_ID;
m_uiSEN_WRITE_ID = SEN_WRITE_ID;
}
m_uiSEN_I2C = CmdInfo->INFO.I2C.I2c;
}
//DBG_IND("AR0330M_init command interface...not ready\r\n");
}
static void UnInit_CmdInterface(SENSOR_CMD_INFO *CmdInfo)
{
Sensor_I2C_Close(m_uiSEN_I2C, m_uiSEN_I2C_SECTION);
//DBG_IND("AR0330M_uninit command interface...not ready\r\n");
}
static ER Init_AR0330M(SENSOR_INIT_OBJ *InitObj)
{
SENSOR_INFO *SensorInfo;
UINT32 uiData;
CmdInfo = InitObj->CmdInfo;
PclkInfo = InitObj->PclkInfo;
SenOption = InitObj->Option;
DBG_ERR("Init_AR0330M...\r\n");
//while(1);
//initial command interface
Init_CmdInterface(&CmdInfo);
Sensor_I2C_Open(m_uiSEN_I2C, &m_uiSEN_I2C_SECTION);
Sensor_I2C_SetConfig(m_uiSEN_I2C, m_uiSEN_I2C_SECTION);
DBG_IND("SEN_I2C = %d, SEN_I2C_SECTION = %d...\r\n", m_uiSEN_I2C, m_uiSEN_I2C_SECTION);
//initial pixel clock
if (PclkInfo.bSieMClkEn == ENABLE)
{
pll_setClkEn(PLL_CLK_SIEMCLK, FALSE);
pll_selectClkSrc(PLL_CLK_SIEMCLK, PLL_CLKSRC_480);
pll_setClkFreq(PLL_CLK_SIEMCLK, PclkInfo.uiMClkFreq);
pll_setClkEn(PLL_CLK_SIEMCLK, TRUE);
}
CHKPNT;
CHKPNT;
// Open CSI Controller
if(!csi_isOpened())
{
csi_open();
}
CHKPNT;
csi_setConfig(CSI_CONFIG_ID_A_FORCE_CLK_HS, ENABLE);
CHKPNT;
Delay_DelayMs(100);
AR0330RegRead(0x3072, &uiData);
CHKPNT;
if ( uiData == 0x0008 )
{
DBG_ERR("^GOTPM v5\r\n");
AR0330_OTPM = AR0330_V5;
}
else if ( uiData == 0x0007 )
{
DBG_ERR("^GOTPM v4\r\n");
AR0330_OTPM = AR0330_V4;
}
else if ( uiData == 0x0006 )
{
DBG_ERR("^GOTPM v3\r\n");
AR0330_OTPM = AR0330_V3;
}
else
{
AR0330RegRead(0x30F0, &uiData);
if ( uiData == 0x1200 )
{
DBG_ERR("^GOTPM v1\r\n");
AR0330_OTPM = AR0330_V1;
}
else if ( uiData == 0x1208 )
{
DBG_ERR("^GOTPM V2\r\n");
AR0330_OTPM = AR0330_V2;
}
else
{
DBG_ERR("^GUnknow version\r\n");
}
}
CHKPNT;
AR0330RegRead(0x3000, &uiData);
DBG_ERR("^GChip version is 0x%04x\r\n", uiData);
CHKPNT;
// Initial status
CurMode = SENSOR_MODE_UNKNOWN;
SensorInfo = GetSensorInfo();
SensorInfo->Mode = GetModeInfo(CurMode);
return E_OK;
}
static ER UnInit_AR0330M(void)
{
SENSOR_INFO *SensorInfo;
DBG_IND("AR0330M_uninit...\r\n");
sie_closeClock();
csi_waitInterrupt(CSI_INTERRUPT_FRAME_END);
csi_setEnable(FALSE);
csi_waitInterrupt(CSI_INTERRUPT_FRAME_END);
csi_close();
//uninitial pixel clock
if (PclkInfo.bSieMClkEn == ENABLE)
{
pll_setClkEn(PLL_CLK_SIEMCLK, FALSE);
}
//pll_disableClock(SIE_PXCLK);
//uninitial command interface
UnInit_CmdInterface(&CmdInfo);
// uninitial status
CurMode = SENSOR_MODE_UNKNOWN;
SensorInfo = GetSensorInfo();
SensorInfo->Mode = NULL;
return E_OK;
}
static ER PwrOn_AR0330M(void)
{
return E_OK;
}
static ER PwrOff_AR0330M(void)
{
return E_OK;
}
static ER Sleep_AR0330M(void)
{
return E_OK;
}
static ER WakeUp_AR0330M(void)
{
return E_OK;
}
static ER WriteReg_AR0330M(SENSOR_CMD *Cmd)
{
UINT32 erReturn;
UINT32 ulWriteAddr, ulReg1, ulReg2, ulData1, ulData2;
ulWriteAddr = m_uiSEN_WRITE_ID;
ulReg1 = ((Cmd->uiAddr)>>8);
ulReg2 = ((Cmd->uiAddr)&(0x000000ff));
ulData1 = ((Cmd->uiData[0])>>8);
ulData2 = ((Cmd->uiData[0])&(0x000000ff));
Sensor_I2C_Lock(m_uiSEN_I2C,
AR0330 驱动代码 MIPI DVP
需积分: 50 93 浏览量
2018-05-10
16:45:38
上传
评论 2
收藏 49KB RAR 举报
qq_28355171
- 粉丝: 0
- 资源: 3