⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hwinit.c

📁 Freescale ARM11系列CPU MX31的WINCE 5.0下的BSP
💻 C
📖 第 1 页 / 共 3 页
字号:
//------------------------------------------------------------------------------
//
// 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 "mx31_usb.h"
#include "mx31_usbname.h"
#include "mx31_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);
//-----------------------------------------------------------------------------
//
//  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(void)
{

    //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) {
            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"\tBSTAT2=%x\r\n", INREG16(&cpld->BSTAT2)));
    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)));
    DEBUGMSG(ZONE_FUNCTION,(L"\tBCTRL2_CLEAR=%x\r\n", INREG16(&cpld->BCTRL2_CLEAR)));
    DEBUGMSG(ZONE_FUNCTION,(L"\tBCTRL3_SET=%x\r\n", INREG16(&cpld->BCTRL3_SET)));
    DEBUGMSG(ZONE_FUNCTION,(L"\tBCTRL3_CLEAR=%x\r\n", INREG16(&cpld->BCTRL3_CLEAR)));
    DEBUGMSG(ZONE_FUNCTION,(L"\tBCTRL4_SET=%x\r\n", INREG16(&cpld->BCTRL4_SET)));
    DEBUGMSG(ZONE_FUNCTION,(L"\tBCTRL4_CLEAR=%x\r\n", INREG16(&cpld->BCTRL4_CLEAR)));
    DEBUGMSG(ZONE_FUNCTION,(L"\tBSTAT1=%x\r\n", INREG16(&cpld->BSTAT1)));
    DEBUGMSG(ZONE_FUNCTION,(L"\tINT_STATUS=%x\r\n", INREG16(&cpld->INT_STATUS)));
    DEBUGMSG(ZONE_FUNCTION,(L"\tINT_CUR_STATUS=%x\r\n", INREG16(&cpld->INT_CUR_STATUS)));
    DEBUGMSG(ZONE_FUNCTION,(L"\tINT_MASK_SET=%x\r\n", INREG16(&cpld->INT_MASK_SET)));
    DEBUGMSG(ZONE_FUNCTION,(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)
{
    volatile PCSP_PBC_REGS  cpld;
    PHYSICAL_ADDRESS phyAddr;

    phyAddr.QuadPart = BSP_BASE_REG_PA_PBC_BASE;
    cpld = (PCSP_PBC_REGS) MmMapIoSpace(phyAddr, sizeof(CSP_PBC_REGS), FALSE);
    if (cpld == NULL)
    {
        DEBUGMSG(ZONE_ERROR,
                (TEXT("%s(): MmMapIoSpace failed!\r\n"), __WFUNCTION__));
        return FALSE;
    }       

    // OTG port, be sure to turn off the USB function driver.   
    OUTREG16(&cpld->BCTRL3_SET, (1<<PBC_BCTRL3_OTG_FS_EN));      
    OUTREG16(&cpld->BCTRL3_SET,(1<<PBC_BCTRL3_OTG_HS_EN));
    if (IsHost)
        OUTREG16(&cpld->BCTRL3_CLEAR,(1<<PBC_BCTRL3_OTG_VBUS_EN));

    OUTREG16(&cpld->BCTRL3_CLEAR,(1<<PBC_BCTRL3_OTG_HS_EN));
    //DEBUGMSG(ZONE_FUNCTION, (L"High Speed USB Mode\r\n"));
    //dumpCPLD(cpld);   

    //OUTREG16(cpld->BCTRL3_CLEAR, 1<<PBC_BCTRL3_OTG_FS_EN);
    MmUnmapIoSpace(cpld, sizeof(CSP_PBC_REGS));
    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)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tCurrent Connect Status: Attached\r\n"));
    if (state->CSC)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tConnect Status Change: Changed\r\n"));
    if (state->PE)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tPort Enabled\r\n"));
    if (state->PEC)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tPort Enable/Disable Change\r\n"));
    if (state->OCA)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tOver-current Active\r\n"));
    if (state->OCC)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tOver-current Change\r\n"));
    if (state->FPR)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tForce Port Resume\r\n"));
    if (state->SUSP)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tSuspend\r\n"));
    if (state->PR)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tPort Reset\r\n"));
    if (state->HSP)
        DEBUGMSG(ZONE_FUNCTION, (L"\t\tHigh-Speed Port \r\n"));
    
    DEBUGMSG(ZONE_FUNCTION, (L"\t\tLine Status: %x", state->LS));
    switch (state->LS) {
        case 0:
            DEBUGMSG(ZONE_FUNCTION, (L"\t\t\tSE0\r\n"));
            break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -