📄 hwinit.c
字号:
//------------------------------------------------------------------------------
//
// Copyright (C) 2005-2006, 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: hwinit.c
// Purpose: Platform-specific routines for OTG transceiver/controller initialisation
// and control, including suspend/resume of transceiver. Includes set-up of
// IOMUX, CPLD, and Vbus drivers for OTG port.
// Functions:
// BOOL InitializeOTGTransceiver(PCSP_USB_REGS* regs, BOOL IsHost)
// - various platform-specific functionality is added through callback functions
// which are supplied via generic interface routine:
// void RegisterCallback(BSP_USB_CALLBACK_FNS *pfn)
//
// Those callbacks include:
// pfn->pfnUSBPowerDown - called on system power suspend
// pfn->pfnUSBPowerUp - called on system power restore
// pfn->pfnUSBSetPhyPowerMode - called to set PHY to lower power mode
// (in this implementation phy/usb-clock/vcore is set to lower-power mode whenever
// idle in transceiver mode, so nothing needs to be done on PowerUp/PowerDown)
//------------------------------------------------------------------------------
#include <windows.h>
#include <Winbase.h>
#include <ceddk.h>
#include "bsp.h"
#include "mx27_usb.h"
#include "mx27_usbname.h"
#include "mx27_usbcommon.h"
#ifdef DEBUG
#define ZONE_FUNCTION DEBUGZONE(3)
#define ZONE_ERROR DEBUGZONE(0)
DBGPARAM dpCurSettings = {
_T("USBXVR"),
{
_T("Error"), _T("Warning"), _T("Init"), _T("Function"),
_T("Comments"), _T(""), _T(""), _T(""),
_T(""), _T(""), _T(""), _T(""),
_T(""), _T(""), _T(""), _T("")
},
0x5
};
#endif // DEBUG
//#define USB_HOST_MODE 0 // OTG full speed
//#define USB_HOST_MODE 1 // OTG high speed
//#define USB_HOST_MODE 2 // Host 1 full speed
//#define USB_HOST_MODE 3 // Host 2 full speed
//#define USB_HOST_MODE 4 // Host 2 high speed
// ISP1105: Full Speed Host 1
// ISP1504: High Speed OTG
// ISP1301: Full Speed OTG
// ISP1504: High Speed Host 2
static void BSPUsbXvrSetPhyPowerMode(CSP_USB_REGS *pUSBRegs, BOOL bResume);
extern BOOL Initialize1504Client(CSP_USB_REGS * regs);
extern BOOL Initialize1504Host(CSP_USB_REGS * regs);
//-----------------------------------------------------------------------------
//
// Function: BSPGetUSBControllerType
//
// This function is to return the USB Core Controller type in WORD format.
// This is called by CSP public code when accessing the type of controller it
// is using.
//
// Parameters:
// NULL
//
// Returns:
// USB_SEL_OTG
//
//-----------------------------------------------------------------------------
WORD BSPGetUSBControllerType(void)
{
return USB_SEL_OTG;
}
//-----------------------------------------------------------------------------
//
// Function: BSPUSBOTGConfigGPIO
//
// This function configures the gpio for usbotg
//
// Parameters:
// bEnable - wheather to enable od disable gpio
//
// Returns:
// TRUE for succes and FALSE for failure
//
//-----------------------------------------------------------------------------
BOOL BSPUSBOTGConfigGPIO(BOOL bEnable)
{
BOOL result = FALSE;
DDK_GPIO_CFG cfg;
DDK_GPIO_SET_CONFIG(cfg, USBOTG_E );
DEBUGMSG(ZONE_FUNCTION, (TEXT("cfg.ConfigType 0x%x\r\n"),cfg.ConfigType));
DEBUGMSG(ZONE_FUNCTION, (TEXT("cfg.PriConfig.Port 0x%x\r\n"),cfg.PriConfig.Port ));
DEBUGMSG(ZONE_FUNCTION, (TEXT("cfg.PriConfig.PinMap 0x%x\r\n"),cfg.PriConfig.PinMap ));
DEBUGMSG(ZONE_FUNCTION, (TEXT("cfg.PriConfig.PuenMap 0x%x\r\n"),cfg.PriConfig.PuenMap ));
DDK_GPIO_SET_CONFIG(cfg, USBOTG_C);
DEBUGMSG(ZONE_FUNCTION, (TEXT("cfg.ConfigType 0x%x\r\n"),cfg.ConfigType));
DEBUGMSG(ZONE_FUNCTION, (TEXT("cfg.PriConfig.Port 0x%x\r\n"),cfg.PriConfig.Port ));
DEBUGMSG(ZONE_FUNCTION, (TEXT("cfg.PriConfig.PinMap 0x%x\r\n"),cfg.PriConfig.PinMap ));
DEBUGMSG(ZONE_FUNCTION, (TEXT("cfg.PriConfig.PuenMap 0x%x\r\n"),cfg.PriConfig.PuenMap ));
if (bEnable)
{
if(DDKGpioEnable(&cfg) == FALSE)
{
ERRORMSG(1, (TEXT("Cannot enable UART gpio!\r\n")));
goto CleanUp;
}
}
else
{
if(DDKGpioDisable(&cfg) == FALSE)
{
ERRORMSG (1, (TEXT("Cannot Disable UART gpio!\r\n")));
goto CleanUp;
}
}
result = TRUE;
CleanUp:
return result;
}
//-----------------------------------------------------------------------------
//
// Function: InitializeOTGMux
//
// This function is to configure the IOMUX for USB OTG Core
//
// Parameters:
// NULL
//
// Returns:
// NULL
//
//-----------------------------------------------------------------------------
static void InitializeOTGMux(void)
{
BSPUSBOTGConfigGPIO(TRUE);
return;
}
//-----------------------------------------------------------------------------
//
// Function: InitializeMux
//
// This function is to configure the IOMUX for USB OTG Core,
//
// Parameters:
// NULL
//
// Returns:
// offset of the configured USB Core register.
//
//-----------------------------------------------------------------------------
static DWORD InitializeMux(void)
{
DWORD off=offset(CSP_USB_REGS, OTG)+offset(CSP_USB_REG, CAPLENGTH);
InitializeOTGMux();
off=offset(CSP_USB_REG, CAPLENGTH);
return off;
}
//---------------------------------------------------------------------------------------------
// Function: Reset
// - Resets USB otg
//
// Parameters:
// pRegs - Pointer to USB Registers
//
// Return:
// NULL
//------------------------------------------------------------------------------------------------
void Reset(CSP_USB_REGS *pRegs)
{
USB_USBCMD_T Cmd;
DWORD *temp;
int nAttempts = 0;
temp = (DWORD *)&Cmd;
*temp = INREG32(&pRegs->OTG.USBCMD);
Cmd.RST = USBCMD_RESET;
OUTREG32(&pRegs->OTG.USBCMD, *temp);
while ((INREG32(&pRegs->OTG.USBCMD)& (USBCMD_RESET << USBCMD_RESET_LSH)) && (nAttempts++ < 50))
{
//RETAILMSG(1, (TEXT("USBCMD = 0x%x\r\n"), INREG32(&pRegs->OTG.USBCMD)));
Sleep(10);
}
}
//---------------------------------------------------------------------------------------------
// Function: Stop
// - Stops USB otg
//
// Parameters:
// pRegs - Pointer to USB Registers
//
// Return:
// NULL
//------------------------------------------------------------------------------------------------
void Stop(CSP_USB_REGS *pRegs)
{
USB_USBCMD_T Cmd;
DWORD *temp;
int nAttempts = 0;
temp = (DWORD *)&Cmd;
*temp = INREG32(&pRegs->OTG.USBCMD);
Cmd.RS = RS_STOP;
OUTREG32(&pRegs->OTG.USBCMD, *temp);
while (((INREG32(&pRegs->OTG.USBCMD) & 0x1) == 0x1) && (nAttempts++ < 50) )
{
//RETAILMSG(1, (TEXT("USBCMD= 0x%x\r\n"), (INREG32(&(*regs)->OTG.USBCMD))));
Sleep(10);
}
}
//---------------------------------------------------------------------------------------------
// Function: SetMode
// - Sets otg mode to host or device controller
//
// Parameters:
// pRegs - Pointer to USB Registers
//
// Return:
// NULL
//------------------------------------------------------------------------------------------------
void SetMode(CSP_USB_REGS *pRegs, UINT uCMMode)
{
USB_USBMODE_T Mode;
DWORD *temp;
temp = (DWORD *)&Mode;
*temp = INREG32(&pRegs->OTG.USBMODE);
Mode.CM = uCMMode;
if(uCMMode == CM_DEVICE_CONTROLLER)
{
Mode.SLOM = SLOM_LOCKOUT_OFF; // 2.3 hardware and later
}
OUTREG32(&pRegs->OTG.USBMODE, *temp);
Sleep(10);
if ((INREG32(&pRegs->OTG.USBMODE)& CM_HOST_CONTROLLER) != CM_HOST_CONTROLLER)
{
//RETAILMSG(1, (TEXT("USBMode setting failure\r\n")));
return;
}
}
//-----------------------------------------------------------------------------
//
// Function: dumpCPLD
//
// This function is to dump the CPLD information
//
// Parameters:
// cpld - Pointer to Mapped CPLD Register
//
// Returns:
// None
//
//-----------------------------------------------------------------------------
#ifdef DEBUG
void dumpCPLD(PCSP_PBC_REGS org_cpld)
{
volatile PCSP_PBC_REGS cpld;
PHYSICAL_ADDRESS phyAddr;
phyAddr.QuadPart = BSP_BASE_REG_PA_PBC_BASE;
if (org_cpld == NULL)
{
cpld = (PCSP_PBC_REGS) MmMapIoSpace(phyAddr, sizeof(CSP_PBC_REGS), FALSE);
if (cpld == NULL) {
DEBUGMSG(ZONE_ERROR, (TEXT("Problem in CPLD\r\n")));
return;
}
}
else
cpld = org_cpld;
DEBUGMSG(ZONE_FUNCTION,(L"Dump PBC registers:\r\n"));
DEBUGMSG(ZONE_FUNCTION,(L"\tVERSION=%x\r\n", INREG16(&cpld->VERSION)));
DEBUGMSG(ZONE_FUNCTION,(L"\tBCTRL1_SET=%x\r\n", INREG16(&cpld->BCTRL1_SET)));
DEBUGMSG(ZONE_FUNCTION,(L"\tBCTRL1_CLEAR=%x\r\n", INREG16(&cpld->BCTRL1_CLEAR)));
DEBUGMSG(ZONE_FUNCTION,(L"\tBCTRL2_SET=%x\r\n", INREG16(&cpld->BCTRL2_SET)));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -