📄 hwinit.c
字号:
/*------------------------------------------------------------------------------
* Copyright (C) 2005-2006, Freescale Semiconductor, Inc. All Rights Reserved.
* THIS SOURCE CODE IS CONFIDENTIAL AND PROPRIETARY AND MAY NOT
* BE USED OR DISTRIBUTED WITHOUT THE WRITTEN PERMISSION OF
* Freescale Semiconductor, Inc.
*----------------------------------------------------------------------------*/
/*
* 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 "mx31_usb.h"
#include "mx31_usbname.h"
#include "mx31_usbcommon.h"
#ifdef DEBUG
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);
//-----------------------------------------------------------------------------
//
// 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: InitializeOTGMux
//
// This function is to configure the IOMUX for USB OTG Core
//
// Parameters:
// NULL
//
// Returns:
// NULL
//
//-----------------------------------------------------------------------------
static void InitializeOTGMux()
{
//RETAILMSG(1, (TEXT("Configure OTG Mux\r\n")));
//usb_otg_iomux_connection();
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_DATA7, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_DATA6, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_DATA5, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_DATA4, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_DATA3, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_DATA2, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_DATA1, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_DATA0, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_NXT, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_STP, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_DIR, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USBOTG_CLK, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_USB_PWR, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_DATA0, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_DATA1, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_DATA2, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_DATA3, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_DATA4, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_DATA5, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_DATA6, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_DATA7, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_STP, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
// Not sure for last 3
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_NXT, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_DIR, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_USBOTG_CLK, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, DDK_IOMUX_PAD_TRIG_CMOS, DDK_IOMUX_PAD_PULL_NONE);
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: dumpCPLD
//
// This function is to dump the CPLD information
//
// Parameters:
// cpld - Pointer to Mapped CPLD Register
//
// Returns:
// None
//
//-----------------------------------------------------------------------------
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) {
RETAILMSG(1, (TEXT("Problem in CPLD\r\n")));
return;
}
}
else
cpld = org_cpld;
RETAILMSG(1,(L"Dump PBC registers:\r\n"));
RETAILMSG(1,(L"\tVERSION=%x\r\n", INREG16(&cpld->VERSION)));
RETAILMSG(1,(L"\tBSTAT2=%x\r\n", INREG16(&cpld->BSTAT2)));
RETAILMSG(1,(L"\tBCTRL1_SET=%x\r\n", INREG16(&cpld->BCTRL1_SET)));
RETAILMSG(1,(L"\tBCTRL1_CLEAR=%x\r\n", INREG16(&cpld->BCTRL1_CLEAR)));
RETAILMSG(1,(L"\tBCTRL2_SET=%x\r\n", INREG16(&cpld->BCTRL2_SET)));
RETAILMSG(1,(L"\tBCTRL2_CLEAR=%x\r\n", INREG16(&cpld->BCTRL2_CLEAR)));
RETAILMSG(1,(L"\tBCTRL3_SET=%x\r\n", INREG16(&cpld->BCTRL3_SET)));
RETAILMSG(1,(L"\tBCTRL3_CLEAR=%x\r\n", INREG16(&cpld->BCTRL3_CLEAR)));
RETAILMSG(1,(L"\tBCTRL4_SET=%x\r\n", INREG16(&cpld->BCTRL4_SET)));
RETAILMSG(1,(L"\tBCTRL4_CLEAR=%x\r\n", INREG16(&cpld->BCTRL4_CLEAR)));
RETAILMSG(1,(L"\tBSTAT1=%x\r\n", INREG16(&cpld->BSTAT1)));
RETAILMSG(1,(L"\tINT_STATUS=%x\r\n", INREG16(&cpld->INT_STATUS)));
RETAILMSG(1,(L"\tINT_CUR_STATUS=%x\r\n", INREG16(&cpld->INT_CUR_STATUS)));
RETAILMSG(1,(L"\tINT_MASK_SET=%x\r\n", INREG16(&cpld->INT_MASK_SET)));
RETAILMSG(1,(L"\tINT_MASK_CLEAR=%x\r\n", INREG16(&cpld->INT_MASK_CLEAR)));
if (org_cpld == NULL)
MmUnmapIoSpace(cpld, sizeof(CSP_PBC_REGS));
}
//-----------------------------------------------------------------------------
//
// Function: InitializeCPLD
//
// This function is to configure the CPLD to corresponding USB core
//
// Parameters:
// IsHost - TRUE: it is configured as USB Host
// - FALSE: it is configured as USB client
//
// Returns:
// TRUE: Success
// FALSE: Failure
//
//-----------------------------------------------------------------------------
static int InitializeCPLD(BOOL IsHost)
{
return TRUE;
}
extern BOOL Initialize1504Client(CSP_USB_REGS * regs);
extern BOOL Initialize1504Host(CSP_USB_REGS * regs);
//-----------------------------------------------------------------------------
//
// Function: DumpDeviceState
//
// This function is to dump the device status
//
// Parameters:
// state - pointer to PORTSC register
//
// Returns:
// NULL
//
//-----------------------------------------------------------------------------
static void DumpDeviceState( USB_PORTSC_T * state)
{
if (state->CCS)
RETAILMSG(1, (L"\t\tCurrent Connect Status: Attached\r\n"));
if (state->CSC)
RETAILMSG(1, (L"\t\tConnect Status Change: Changed\r\n"));
if (state->PE)
RETAILMSG(1, (L"\t\tPort Enabled\r\n"));
if (state->PEC)
RETAILMSG(1, (L"\t\tPort Enable/Disable Change\r\n"));
if (state->OCA)
RETAILMSG(1, (L"\t\tOver-current Active\r\n"));
if (state->OCC)
RETAILMSG(1, (L"\t\tOver-current Change\r\n"));
if (state->FPR)
RETAILMSG(1, (L"\t\tForce Port Resume\r\n"));
if (state->SUSP)
RETAILMSG(1, (L"\t\tSuspend\r\n"));
if (state->PR)
RETAILMSG(1, (L"\t\tPort Reset\r\n"));
if (state->HSP)
RETAILMSG(1, (L"\t\tHigh-Speed Port \r\n"));
RETAILMSG(1, (L"\t\tLine Status: %x", state->LS));
switch (state->LS) {
case 0:
RETAILMSG(1, (L"\t\t\tSE0\r\n"));
break;
case 1:
RETAILMSG(1, (L"\t\t\tJ-state\r\n"));
break;
case 2:
RETAILMSG(1, (L"\t\t\tK-state\r\n"));
break;
case 3:
default:
RETAILMSG(1, (L"\t\t\tUndefined\r\n"));
break;
}
if (state->PP)
RETAILMSG(1, (L"\t\t??? Should be 0 for device\r\n"));
if (state->PO)
RETAILMSG(1, (L"\t\tPort Owner\r\n"));
if (state->PIC) {
RETAILMSG(1, (L"\t\tPort Indicator Control"));
switch (state->PIC) {
case 1:
RETAILMSG(1, (L"\t\t\tAmber\r\n"));
break;
case 2:
RETAILMSG(1, (L"\t\t\tGreen\r\n"));
break;
case 3:
default:
RETAILMSG(1, (L"\t\t\tUndefined\r\n"));
break;
}
}
if (state->PTC)
RETAILMSG(1, (L"\t\tPort Test Control: %x\r\n", state->PTC));
if (state->WKCN)
RETAILMSG(1, (L"\t\tWake on Connect Enable (WKCNNT_E)\r\n"));
if (state->WKDC)
RETAILMSG(1, (L"\t\tWake on Disconnect Enable (WKDSCNNT_E) \r\n"));
if (state->WKOC)
RETAILMSG(1, (L"\t\tWake on Over-current Enable (WKOC_E) \r\n"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -