📄 bspcsi.cpp
字号:
//
// Function: BSPGetSensorResolution
//
// This function returns the sensor data format.
//
// Parameters:
// pSensorFormat
// [out] Pointer to DWORD to hold return value of sensor resolution.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void BSPGetSensorResolution(DWORD *pSensorResolution)
{
BSP_CSI_FUNCTION_ENTRY();
switch (gSensorInUse)
{
case csiSensorId_Magna521DA:
*pSensorResolution = csiSensorOutputResolution_VGA; //Currently only support XGA,VGA
break;
case csiSensorId_Imagic8803:
case csiSensorId_Imagic8201:
default:
*pSensorResolution = csiSensorOutputResolution_VGA; //640*480 for imagic sensor
break;
}
BSP_CSI_FUNCTION_EXIT();
}
//------------------------------------------------------------------------------
//
// Function: BSPSetDigitalZoom
//
// This function sets the zoom value on the camera sensor.
//
// Parameters:
// zoom
// [in] If 2, zoom set to 2x; if 1, zoom set to 1x
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void BSPSetDigitalZoom (DWORD zoom)
{
BSP_CSI_FUNCTION_ENTRY();
// csiSensorOutputResolution sensorOutputResolution;
// DWORD sensorResolution;
// BSPGetSensorResolution(&sensorResolution);
// sensorOutputResolution = (csiSensorOutputResolution) sensorResolution;
switch (gSensorInUse)
{
case csiSensorId_Magna521DA:
//Currently,we don't support this feature. jacky reserved it.
// CameraMagnaSetDigitalZoom(sensorOutputResolution,zoom);
break;
case csiSensorId_Imagic8803:
case csiSensorId_Imagic8201:
default:
// Call Imagic method to set zoom
CameraImagicSetDigitalZoom(zoom);
break;
}
BSP_CSI_FUNCTION_EXIT();
}
//------------------------------------------------------------------------------
//
// Function: BSPCameraSetOutputResolution
//
// This function sets the output resolution on the camera sensor.
//
// Parameters:
// outputMode
// [in] Resolution type.
//
// Returns:
// TRUE if success
// FALSE if failure
//
//------------------------------------------------------------------------------
BOOL BSPCameraSetOutputResolution(csiSensorOutputResolution outputResolution)
{
BSP_CSI_FUNCTION_ENTRY();
switch (gSensorInUse)
{
case csiSensorId_Magna521DA:
CameraMagnaSetOutputResolution(outputResolution);
break;
case csiSensorId_Imagic8803:
case csiSensorId_Imagic8201:
default:
// Call Imagic method to set output mode
CameraImagicSetOutputResolution(outputResolution);
break;
}
BSP_CSI_FUNCTION_EXIT();
return TRUE;
}
//------------------------------------------------------------------------------
//
// Function: BSPCameraSetOutputFormat
//
// This function sets the output format on the camera sensor.
//
// Parameters:
// outputFormat
// [in] Format specified to output sensor data.
//
// Returns:
// TRUE if success
// FALSE if failure
//
//------------------------------------------------------------------------------
BOOL BSPCameraSetOutputFormat(csiSensorOutputFormat outputFormat)
{
cameraOutputFormat cameraOutputFormat;
BSP_CSI_FUNCTION_ENTRY();
switch (outputFormat)
{
case csiSensorOutputFormat_Bayer:
return FALSE;
case csiSensorOutputFormat_YUV422:
cameraOutputFormat = cameraOutputFormat_CCIR656;
break;
case csiSensorOutputFormat_YUV444:
return FALSE;
case csiSensorOutputFormat_RGB:
cameraOutputFormat = cameraOutputFormat_RGB565;
break;
default:
cameraOutputFormat = cameraOutputFormat_RGB565;
break;
}
switch (gSensorInUse)
{
case csiSensorId_Magna521DA:
CameraMagnaSetOutputFormat(cameraOutputFormat);
break;
case csiSensorId_Imagic8803:
case csiSensorId_Imagic8201:
default:
// Call Imagic method to set output format
CameraImagicSetOutputFormat(cameraOutputFormat);
break;
}
BSP_CSI_FUNCTION_EXIT();
return TRUE;
}
//------------------------------------------------------------------------------
//
// Function: BSPSensorSetClockGatingMode
//
// This function calls to the CRM module to
// set the clock gating mode, turning on or off
// clocks to the Camera Sesnor.
//
// Parameters:
// startClocks
// [in] If TRUE, turn clocks to GPT on.
// If FALSE, turn clocks to GPT off
//
// Returns:
// TRUE if success.
// FALSE if failure.
//
//------------------------------------------------------------------------------
BOOL BSPSensorSetClockGatingMode(BOOL startClocks)
{
BSP_CSI_FUNCTION_ENTRY();
if (startClocks)
{
// Turn CSI and sensor clocks on
if (!DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_CSI,
DDK_CLOCK_GATE_MODE_ENABLED_ALL))
{
DEBUGMSG(ZONE_ERROR, (TEXT("%s: Failed to set clock gating mode!\r\n"), __WFUNCTION__));
return FALSE;
}
}
else
{
// Turn CSI and sensor clocks off
if (!DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_CSI,
DDK_CLOCK_GATE_MODE_DISABLED))
{
DEBUGMSG(ZONE_ERROR, (TEXT("%s: Failed to set clock gating mode!\r\n"), __WFUNCTION__));
return FALSE;
}
}
BSP_CSI_FUNCTION_EXIT();
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Function: I2CWriteOneByte
//
// This function writes a single byte byData to the register stated in byReg.
//
// Parameters:
// hI2C
// [in] File handle to I2C Bus Interface.
//
// byAddr
// [in] I2C Slave device address.
//
// byReg
// [in] Register Index.
//
// byData
// [in] Data to write to byReg.
//
// lpiResult
// [in] Pointer of the result. The I2C Bus will store the
// result of the operation in location pointed to by
// lpiResult.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
VOID I2CWriteOneByte(HANDLE hI2C, BYTE byAddr, BYTE byReg, BYTE byData, LPINT lpiResult)
{
I2C_TRANSFER_BLOCK I2CXferBlock;
I2C_PACKET I2CPacket;
BYTE byOutData[2];
BSP_CSI_FUNCTION_ENTRY();
byOutData[0] = byReg;
byOutData[1] = byData;
I2CPacket.wLen = sizeof(byOutData);
I2CPacket.pbyBuf = (PBYTE) &byOutData;
I2CPacket.byRW = I2C_RW_WRITE;
I2CPacket.byAddr = byAddr;
I2CPacket.lpiResult = lpiResult;
I2CXferBlock.pI2CPackets = &I2CPacket;
I2CXferBlock.iNumPackets = 1;
I2C_MACRO_TRANSFER(hI2C, &I2CXferBlock);
BSP_CSI_FUNCTION_EXIT();
}
//-----------------------------------------------------------------------------
//
// Function: I2CReadOneByte
//
// This function read a single byte data from the register stated in byReg.
//
// Parameters:
// hI2C
// [in] File handle to I2C Bus Interface.
//
// byAddr
// [in] I2C Slave device address.
//
// byReg
// [in] Register Index.
//
// lpiResult
// [in] Pointer of the result. The I2C Bus will store the
// result of the operation in location pointed to by
// lpiResult.
//
// Returns:
// The single byte content stored in byReg.
//
//-----------------------------------------------------------------------------
BYTE I2CReadOneByte(HANDLE hI2C, BYTE byAddr, BYTE byReg, LPINT lpiResult)
{
I2C_TRANSFER_BLOCK I2CXferBlock;
I2C_PACKET I2CPacket[2];
BYTE byOutData;
BYTE byInData;
BSP_CSI_FUNCTION_ENTRY();
byOutData = byReg;
I2CPacket[0].pbyBuf = (PBYTE) &byOutData;
I2CPacket[0].wLen = sizeof(byOutData);
I2CPacket[0].byRW = I2C_RW_WRITE;
I2CPacket[0].byAddr = byAddr;
I2CPacket[0].lpiResult = lpiResult;
I2CPacket[1].pbyBuf = (PBYTE) &byInData;
I2CPacket[1].wLen = sizeof(byInData);
I2CPacket[1].byRW = I2C_RW_READ;
I2CPacket[1].byAddr = byAddr;
I2CPacket[1].lpiResult = lpiResult;
I2CXferBlock.pI2CPackets = I2CPacket;
I2CXferBlock.iNumPackets = 2;
I2C_MACRO_TRANSFER(hI2C, &I2CXferBlock);
BSP_CSI_FUNCTION_EXIT();
return byInData;
}
//-----------------------------------------------------------------------------
//
// Function: I2CWriteTwoBytes
//
// This function writes a two byte data to the register stated in byReg. The
// function will write byData1 first, followed by byData2. If byData1 is not
// written properly, the entire function will terminate without attempting to
// write byData2.
//
// Parameters:
// hI2C
// [in] File handle to I2C Bus Interface.
//
// byAddr
// [in] I2C Slave device address.
//
// byReg
// [in] Register Index.
//
// byData1
// [in] 1st Data to write to byReg.
//
// byData2
// [in] 2nd Data to write to byReg
//
// lpiResult
// [in] Pointer of the result. The I2C Bus will store the
// result of the operation in location pointed to by
// lpiResult.
//
// Returns:
// None.
//
//-----------------------------------------------------------------------------
VOID I2CWriteTwoBytes(HANDLE hI2C, BYTE byAddr, BYTE byReg, BYTE byData1, BYTE byData2, LPINT lpiResult)
{
I2C_TRANSFER_BLOCK I2CXferBlock;
I2C_PACKET I2CPacket;
BYTE byOutData[3];
BSP_CSI_FUNCTION_ENTRY();
byOutData[0] = byReg;
byOutData[1] = byData1;
byOutData[2] = byData2;
I2CPacket.wLen = sizeof(byOutData);
I2CPacket.pbyBuf = (PBYTE) &byOutData;
I2CPacket.byRW = I2C_RW_WRITE;
I2CPacket.byAddr = byAddr;
I2CPacket.lpiResult = lpiResult;
I2CXferBlock.pI2CPackets = &I2CPacket;
I2CXferBlock.iNumPackets = 1;
I2C_MACRO_TRANSFER(hI2C, &I2CXferBlock);
BSP_CSI_FUNCTION_EXIT();
}
//-----------------------------------------------------------------------------
//
// Function: I2CReadTwoBytes
//
// This function reads two bytes of data from the register stated in byReg.
//
// Parameters:
// hI2C
// [in] File handle to I2C Bus Interface.
//
// byAddr
// [in] I2C Slave device address.
//
// byReg
// [in] Register Index.
//
// lpiResult
// [in] Pointer of the result. The I2C Bus will store the
// result of the operation in location pointed to by
// lpiResult.
//
// Returns:
// The two byte content stored in byReg.
//
//-----------------------------------------------------------------------------
WORD I2CReadTwoBytes(HANDLE hI2C, BYTE byAddr, BYTE byReg, LPINT lpiResult)
{
I2C_TRANSFER_BLOCK I2CXferBlock;
I2C_PACKET I2CPacket[2];
BYTE byOutData;
BYTE byInData[2];
BSP_CSI_FUNCTION_ENTRY();
byOutData = byReg;
I2CPacket[0].pbyBuf = (PBYTE) &byOutData;
I2CPacket[0].wLen = sizeof(byOutData);
I2CPacket[0].byRW = I2C_RW_WRITE;
I2CPacket[0].byAddr = byAddr;
I2CPacket[0].lpiResult = lpiResult;
I2CPacket[1].pbyBuf = (PBYTE) &byInData;
I2CPacket[1].wLen = sizeof(byInData);
I2CPacket[1].byRW = I2C_RW_READ;
I2CPacket[1].byAddr = byAddr;
I2CPacket[1].lpiResult = lpiResult;
I2CXferBlock.pI2CPackets = I2CPacket;
I2CXferBlock.iNumPackets = 2;
I2C_MACRO_TRANSFER(hI2C, &I2CXferBlock);
BSP_CSI_FUNCTION_EXIT();
return ((0xFF & byInData[1]) | (((WORD) byInData[0]) << 8));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -