📄 bspcsi.cpp
字号:
//------------------------------------------------------------------------------
//
// Copyright (C) 2004, Motorola Inc. All Rights Reserved
//
//------------------------------------------------------------------------------
//
// Copyright (C) 2004-2006,2007, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//------------------------------------------------------------------------------
//
// File: bspcsi.c
//
// Provides BSP-specific configuration routines for the CSI peripheral.
//
//------------------------------------------------------------------------------
#include <windows.h>
#include "bsp.h"
#include "bspcsi.h"
#include "ipu.h"
#include "CsiClass.h"
#include "CameraImagic.h"
#include "CameraMagna.h"
#include "i2cbus.h"
#include "cameradbg.h"
//------------------------------------------------------------------------------
// External Functions
//------------------------------------------------------------------------------
// External Variables
//------------------------------------------------------------------------------
// Defines
#define BSP_CSI_FUNCTION_ENTRY() \
DEBUGMSG(ZONE_FUNCTION, (TEXT("++%s\r\n"), __WFUNCTION__))
#define BSP_CSI_FUNCTION_EXIT() \
DEBUGMSG(ZONE_FUNCTION, (TEXT("--%s\r\n"), __WFUNCTION__))
#define CAMERA_SENSOR_MODULE csiSensorId_Imagic8201 // Imagic as default Sensor
//#define CAMERA_SENSOR_MODULE csiSensorId_Imagic8803 // Imagic as default Sensor
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
// Global Variables
// Camera in Used - Default iMagic
csiSensorId gSensorInUse = CAMERA_SENSOR_MODULE;
//------------------------------------------------------------------------------
// Local Variables
//------------------------------------------------------------------------------
// Local Functions
BOOL BSPSensorSetClockGatingMode(BOOL);
//-----------------------------------------------------------------------------
//
// Function: BSPCSIIOMUXConfig
//
// This function makes the DDK call to configure the IOMUX
// pins required for the CSI.
//
// Parameters:
// None.
//
// Returns:
// TRUE if success; FALSE if failure.
//
//-----------------------------------------------------------------------------
BOOL BSPCSIIOMUXConfig()
{
BSP_CSI_FUNCTION_ENTRY();
BOOL retVal = TRUE;
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D15, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D14, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D13, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D12, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D11, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D10, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D9, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D8, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D7, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D6, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D5, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_D4, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_HSYNC, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_MCLK, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_PIXCLK, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
if (!DDKIomuxSetPinMux(DDK_IOMUX_PIN_CSI_VSYNC, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC))
{
retVal = FALSE;
}
BSP_CSI_FUNCTION_EXIT();
return retVal;
}
//------------------------------------------------------------------------------
//
// Function: BSPSetupCamera
//
// This function initializes the camera sensor module.
//
// Parameters:
// None.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void BSPSetupCamera(void)
{
BSP_CSI_FUNCTION_ENTRY();
switch (gSensorInUse)
{
case csiSensorId_Magna521DA:
CameraMagnaInit();
DEBUGMSG(ZONE_INIT,(TEXT("setupCamera: Magna sensor initialization\r\n")));
break;
case csiSensorId_Imagic8201:
case csiSensorId_Imagic8803:
default:
CameraImagicInit();
DEBUGMSG(ZONE_INIT,(TEXT("setupCamera: Imagic sensor initialization\r\n")));
break;
}
BSP_CSI_FUNCTION_EXIT();
return;
}
//------------------------------------------------------------------------------
//
// Function: BSPDeleteCamera
//
// This function deinitializes the camera sensor module.
//
// Parameters:
// None.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void BSPDeleteCamera(void)
{
BSP_CSI_FUNCTION_ENTRY();
switch (gSensorInUse)
{
case csiSensorId_Magna521DA:
CameraMagnaDeinit();
DEBUGMSG(ZONE_INIT,(TEXT("DeleteCamera: Magna sensor deinitialization\r\n")));
break;
case csiSensorId_Imagic8201:
case csiSensorId_Imagic8803:
default:
CameraImagicDeinit();
DEBUGMSG(ZONE_INIT,(TEXT("DeleteCamera: Imagic sensor deinitialization\r\n")));
break;
}
BSP_CSI_FUNCTION_EXIT();
return;
}
//------------------------------------------------------------------------------
//
// Function: BSPEnableCamera
//
// This function deinitializes the camera sensor module.
//
// Parameters:
// None.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void BSPEnableCamera(void)
{
BSP_CSI_FUNCTION_ENTRY();
// TODO: Skip this if we are using HSP_CLK, otherwise uncomment
//DDKClockConfigBaud(DDK_CLOCK_SIGNAL_CSI, DDK_CLOCK_BAUD_SOURCE_USBPLL, 0, );
//BSPSensorSetClockGatingMode(TRUE);
BSP_CSI_FUNCTION_EXIT();
return;
}
//------------------------------------------------------------------------------
//
// Function: BSPDisableCamera
//
// This function deinitializes the camera sensor module.
//
// Parameters:
// None.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void BSPDisableCamera(void)
{
BSP_CSI_FUNCTION_ENTRY();
//BSPSensorSetClockGatingMode(FALSE);
BSP_CSI_FUNCTION_EXIT();
return;
}
//------------------------------------------------------------------------------
//
// Function: BSPResetCamera
//
// This function reset the camera sensor module.
//
// Parameters:
// None.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void BSPResetCamera(void)
{
PHYSICAL_ADDRESS phyAddr;
CSP_PBC_REGS *pPBC;
BSP_CSI_FUNCTION_ENTRY();
phyAddr.QuadPart = BSP_BASE_REG_PA_PBC_BASE;
// Map PBC registers to virtual address space
pPBC = (PCSP_PBC_REGS) MmMapIoSpace(phyAddr, sizeof(CSP_PBC_REGS), FALSE);
if (pPBC == NULL)
{
DEBUGMSG(ZONE_ERROR, (TEXT("%s(): MmMapIoSpace failed!\r\n"), __WFUNCTION__));
return;
}
// Enable CSI in PBC
OUTREG16(&pPBC->BCTRL2_CLEAR, (1 << PBC_BCTRL2_CSI_EN_LSH));
Sleep(10);
switch (gSensorInUse)
{
case csiSensorId_Magna521DA:
// Reset camera
OUTREG16(&pPBC->BCTRL1_SET, 0x300);
Sleep(10);
OUTREG16(&pPBC->BCTRL1_SET, 0x100);
OUTREG16(&pPBC->BCTRL1_CLEAR, 0x200);
Sleep(5);
OUTREG16(&pPBC->BCTRL1_SET, 0x200);
Sleep(50);
DEBUGMSG(ZONE_INIT,(TEXT("setupCamera: Magna sensor initialization\r\n")));
break;
case csiSensorId_Imagic8201:
case csiSensorId_Imagic8803:
default:
// Reset camera
OUTREG16(&pPBC->BCTRL1_SET, 0x600);
DEBUGMSG(ZONE_INIT,(TEXT("setupCamera: Imagic sensor initialization\r\n")));
break;
}
MmUnmapIoSpace(pPBC, sizeof(CSP_PBC_REGS));
BSP_CSI_FUNCTION_EXIT();
return;
}
//------------------------------------------------------------------------------
//
// Function: BSPGetSensorClockRatio
//
// This function calculates the divider value to program into
// the CSI to achieve the required frame rate from the sensor.
//
// Parameters:
// None.
//
// Returns:
// Sensor clock divider value.
//
//------------------------------------------------------------------------------
UINT32 BSPGetSensorClockRatio()
{
UINT32 freq;
BSP_CSI_FUNCTION_ENTRY();
DDKClockGetFreq(DDK_CLOCK_SIGNAL_CSI, &freq);
BSP_CSI_FUNCTION_EXIT();
// TODO: Change this
// For a target frame rate of 30 FPS, we want a sensor clock
// in the 24-27MHz range.
return (freq/24000000 - 1);
}
//------------------------------------------------------------------------------
//
// Function: BSPGetDefaultCameraFromRegistry
//
// This function reads the default camera sensor from the
// registry.
//
// Parameters:
// None.
//
// Returns:
// TRUE if success
// FALSE if failure
//
//------------------------------------------------------------------------------
BOOL BSPGetDefaultCameraFromRegistry(void)
{
UINT32 error;
HKEY hKey;
UINT32 dwSize;
csiSensorId sensorId;
BSP_CSI_FUNCTION_ENTRY();
// Open CSI registry path
error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(CSI_REG_PATH), 0 , 0, &hKey);
if (error != ERROR_SUCCESS) {
DEBUGMSG(ZONE_ERROR,(TEXT("Failed to open camera reg path:%s [Error:0x%x]\r\n"),CSI_REG_PATH,error));
return (FALSE);
}
// Get Default Camera
dwSize = sizeof(csiSensorId);
error = RegQueryValueEx(hKey, TEXT(CSI_REG_CAMERAID_KEYWORD), NULL, NULL,(LPBYTE)&sensorId, (LPDWORD)&dwSize);
if (error == ERROR_SUCCESS)
{
// Make sure it's valid CameraID
if(sensorId >= 0 && sensorId < CSI_SENSOR_NUMBER_SUPPORTED)
{
gSensorInUse = sensorId;
}
else
{
DEBUGMSG(ZONE_ERROR,(TEXT("Invalid Camera ID, set to default:%d\r\n"),CAMERA_SENSOR_MODULE));
}
}
else
{
DEBUGMSG(ZONE_ERROR,(TEXT("Failed to get the default CameraID [Error:0x%x]\r\n"),error));
}
// Close registry key
RegCloseKey(hKey);
BSP_CSI_FUNCTION_EXIT();
return TRUE;
}
//------------------------------------------------------------------------------
//
// Function: BSPGetSensorFormat
//
// This function returns the sensor data format.
//
// Parameters:
// pSensorFormat
// [out] Pointer to DWORD to hold return value of sensor format.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void BSPGetSensorFormat(DWORD *pSensorFormat)
{
BSP_CSI_FUNCTION_ENTRY();
*pSensorFormat = csiSensorOutputFormat_YUV422;
BSP_CSI_FUNCTION_EXIT();
}
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -