📄 csiclass.cpp
字号:
IPU_CSI_SENS_CONF_SENS_DATA_FORMAT,
IPU_CSI_SENS_CONF_SENS_DATA_FORMAT_YUV444);
// Set timing and data protocol to Progressive CCIR mode.
INSREG32BF(&m_pIPU->CSI_SENS_CONF, IPU_CSI_SENS_CONF_SENS_PRTCL,
IPU_CSI_SENS_CONF_SENS_PRTCL_CCIR_PROGRESSIVE_MODE);
// Set up CCIR code registers
INSREG32BF(&m_pIPU->CSI_CCIR_CODE_3,
IPU_CSI_CCIR_CODE_3_CCIR_PRECOM, 0xFF0000);
INSREG32BF(&m_pIPU->CSI_CCIR_CODE_1,
IPU_CSI_CCIR_CODE_1_STRT_FLD0_BLNK_1ST, 6);
INSREG32BF(&m_pIPU->CSI_CCIR_CODE_1,
IPU_CSI_CCIR_CODE_1_END_FLD0_ACTV, 4);
INSREG32BF(&m_pIPU->CSI_CCIR_CODE_1,
IPU_CSI_CCIR_CODE_1_STRT_FLD0_ACTV, 0);
INSREG32BF(&m_pIPU->CSI_OUT_FRM_CTRL,
IPU_CSI_OUT_FRM_CTRL_HSC, 9);
INSREG32BF(&m_pIPU->CSI_OUT_FRM_CTRL,
IPU_CSI_OUT_FRM_CTRL_VSC, 0x64);
break;
case csiSensorOutputFormat_RGB:
// Set data format from the sensor.
INSREG32BF(&m_pIPU->CSI_SENS_CONF,
IPU_CSI_SENS_CONF_SENS_DATA_FORMAT,
IPU_CSI_SENS_CONF_SENS_DATA_FORMAT_RGB);
// Set timing and data protocol to non-CCIR non-gated mode.
INSREG32BF(&m_pIPU->CSI_SENS_CONF, IPU_CSI_SENS_CONF_SENS_PRTCL,
IPU_CSI_SENS_CONF_SENS_PRTCL_NONGATED_CLOCK_MODE);
// IPU_CSI_SENS_CONF_SENS_PRTCL_GATED_CLOCK_MODE);
break;
case csiSensorOutputFormat_Bayer:
// Set data format from the sensor.
INSREG32BF(&m_pIPU->CSI_SENS_CONF,
IPU_CSI_SENS_CONF_SENS_DATA_FORMAT,
IPU_CSI_SENS_CONF_SENS_DATA_FORMAT_BAYER);
// Set timing and data protocol to non-CCIR non-gated mode.
INSREG32BF(&m_pIPU->CSI_SENS_CONF, IPU_CSI_SENS_CONF_SENS_PRTCL,
IPU_CSI_SENS_CONF_SENS_PRTCL_GATED_CLOCK_MODE);
break;
}
// Data width should be 8 bits per color, regardless of the format
INSREG32BF(&m_pIPU->CSI_SENS_CONF, IPU_CSI_SENS_CONF_DATA_WIDTH,
// IPU_CSI_SENS_CONF_DATA_WIDTH_4BIT);
IPU_CSI_SENS_CONF_DATA_WIDTH_8BIT);
// Set up IC width and height configuration parameters and
// CSI sensor and actual frame size from the output resolution.
// Note: Subtract one from frame height and width values
// before writing to CSI registers.
switch (outResolution)
{
case csiSensorOutputResolution_SXGA:
// Set up CSI sensor frame and actual frame for SXGA resolution.
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 1279);
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 959);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 1279);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 959);
break;
case csiSensorOutputResolution_VGA:
// Set up CSI sensor frame and actual frame for VGA resolution
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 639);
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 479);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 639);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 479);
break;
case csiSensorOutputResolution_QVGA:
// Set up CSI sensor frame and actual frame for QVGA resolution
INSREG32(&m_pIPU->CSI_SENS_FRM_SIZE,
CSP_BITFMASK(IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH),
CSP_BITFVAL(IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 239));
INSREG32(&m_pIPU->CSI_SENS_FRM_SIZE,
CSP_BITFMASK(IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT),
CSP_BITFVAL(IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 319));
INSREG32(&m_pIPU->CSI_ACT_FRM_SIZE,
CSP_BITFMASK(IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH),
CSP_BITFVAL(IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 239));
INSREG32(&m_pIPU->CSI_ACT_FRM_SIZE,
CSP_BITFMASK(IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT),
CSP_BITFVAL(IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 319));
break;
case csiSensorOutputResolution_CIF:
// Set up CSI sensor frame and actual frame for CIF resolution
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 351);
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 287);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 351);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 287);
break;
case csiSensorOutputResolution_QCIF:
// Set up CSI sensor frame and actual frame for QCIF resolution
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 175);
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 143);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 175);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 143);
break;
case csiSensorOutputResolution_QQVGA:
// Set up CSI sensor frame and actual frame for QQVGA resolution
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_WIDTH, 159);
INSREG32BF(&m_pIPU->CSI_SENS_FRM_SIZE,
IPU_CSI_SENS_FRM_SIZE_SENS_FRM_HEIGHT, 119);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_WIDTH, 159);
INSREG32BF(&m_pIPU->CSI_ACT_FRM_SIZE,
IPU_CSI_ACT_FRM_SIZE_ACT_FRM_HEIGHT, 119);
break;
default:
break;
}
CSI_FUNCTION_EXIT();
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Function: CsiZoom
//
// This function sets the camera zoom value.
//
// Parameters:
// zoomVal
// [in] zoom value.
// If 2, zoom by 2x. If 1, zoom by 1x.
// All other values are invalid.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
void CsiClass::CsiZoom(DWORD zoomVal)
{
CSI_FUNCTION_ENTRY();
if (zoomVal == 2)
BSPSetDigitalZoom(TRUE);
else if (zoomVal == 1)
BSPSetDigitalZoom(FALSE);
else
DEBUGMSG(ZONE_ERROR, (_T("%s: Invalid zoom value. Must be 1 or 2.\r\n"), __WFUNCTION__));
CSI_FUNCTION_EXIT();
}
//-----------------------------------------------------------------------------
//
// Function: CsiEnable
//
// Enable the Camera Sensor Interface.
//
// Parameters:
// None.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
void CsiClass::CsiEnable(void)
{
UINT32 oldVal, newVal, iMask, iBitval;
CSI_FUNCTION_ENTRY();
// Protect access to IPU_CONF register.
// Set the bit to enable the CSI.
// Compute bitmask and shifted bit value for IPU_CONF register
iMask = CSP_BITFMASK(IPU_IPU_CONF_CSI_EN);
iBitval = CSP_BITFVAL(IPU_IPU_CONF_CSI_EN, IPU_IPU_CONF_CSI_EN_ENABLE);
// Use interlocked function to enable CSI.
do
{
oldVal = INREG32(&m_pIPU->IPU_CONF);
newVal = (oldVal & (~iMask)) | iBitval;
} while (InterlockedTestExchange((LPLONG)&m_pIPU->IPU_CONF,
oldVal, newVal) != oldVal);
CSI_FUNCTION_EXIT();
}
//-----------------------------------------------------------------------------
//
// Function: CsiDisable
//
// Disable the Camera Sensor Interface.
//
// Parameters:
// None.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
void CsiClass::CsiDisable(void)
{
UINT32 oldVal, newVal, iMask, iBitval;
CSI_FUNCTION_ENTRY();
// Protect access to IPU_CONF register.
// Set the bit to disable the CSI.
// Compute bitmask and shifted bit value for IPU_CONF register
iMask = CSP_BITFMASK(IPU_IPU_CONF_CSI_EN);
iBitval = CSP_BITFVAL(IPU_IPU_CONF_CSI_EN, IPU_IPU_CONF_CSI_EN_DISABLE);
// Use interlocked function to disable CSI.
do
{
oldVal = INREG32(&m_pIPU->IPU_CONF);
newVal = (oldVal & (~iMask)) | iBitval;
} while (InterlockedTestExchange((LPLONG)&m_pIPU->IPU_CONF,
oldVal, newVal) != oldVal);
CSI_FUNCTION_EXIT();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -