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

📄 xllp_pccardsocket.c

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 C
📖 第 1 页 / 共 3 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
/**************************************************************************

Copyright 1999-2002 Intel Corporation

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:

    Xllp_PCCardSocket.c

Abstract:

    This file implements the common cross-platform API for
    the PC Card interface on the BULVERDE-MAINSTONE platform.
        
Functions defined in this file:
    XllpPCCardHWSetup()
    XllpPCCardConfigureGPIOs()
    XllpPCCardGetSocketState()
    XllpPCCardResetSocket()
    XllpPCCardPowerOn()
    XllpPCCardPowerOff()
    XllpPCCardGetVoltageSetting()


    
**************************************************************************/


#include "Xllp_PCCardSocket.h"


/******************************************************************************

  Function Name: XllpPCCardHWSetup

  Description: Performs the required hardware setup for the PC Card interface
               to configure all sockets properly for use. At present, both
               sockets are configured on the MAINSTONE platform. In particular,
               the following hardware setup is performed:

               1. Configures all BULVERDE GPIOs appropriately for the PC Card
                  interface.
               2. Defaults initial power supply to each socket to 3.3V.
               3. Routes mainboard signals to the PC Card interface (as opposed
                  to the Baseband controller).


  Global Registers Modified:
    NONE

  Input Arguments:
    XLLP_PCCARDSOCKET_T *pstrSocketHandle: Pointer to the global PC Card handle

  Output Arguments:
    NONE

  Return Value:


*******************************************************************************/
XLLP_STATUS_T XllpPCCardHWSetup(XLLP_PCCARDSOCKET_T *pstrSocketHandle)
{
    volatile XLLP_BCR_T *vpstrMainBLRegs = (volatile XLLP_BCR_T *)pstrSocketHandle->pstrBcrHandle;
    XLLP_STATUS_T ReturnValue = XLLP_STATUS_SUCCESS;
    XLLP_UINT32_T uiCardVoltage = 0;

    //
    //Check the validity of the input arguments to the function
    //
    if((pstrSocketHandle == XLLP_NULL_PTR))
    {
        ReturnValue = XLLP_STATUS_PCCARD_FAILURE;   
    }
    
    if(ReturnValue != XLLP_STATUS_PCCARD_FAILURE)
    {
        XllpPCCardConfigureGPIOs(pstrSocketHandle); 

        //
        //*************************** SOCKET 0 **********************************
        //
        vpstrMainBLRegs->PCMCIAS0SCR &= ~(XLLP_BCR_PCMCIA_SCR_S0_PWR);

        //
        //Deassert RESET for Socket 0: bit[4] of the Socket 0 Status Control Register
        //
        vpstrMainBLRegs->PCMCIAS0SCR &= ~(XLLP_BCR_PCMCIA_SCR_S0_RESET);

        //
        //If a card is inserted, configure the MAX1602EE power IC for
        //appropriate power supply to the socket, based on the voltage requirements
        //of the card. If no card is present in the socket, then bypass powering
        //up the socket at this point
        //
        ReturnValue = XllpPCCardGetVoltageSetting(pstrSocketHandle, XLLP_PCCARD_SOCKET0, &uiCardVoltage);

        if(ReturnValue == XLLP_STATUS_SUCCESS)
        {
            XllpPCCardPowerOn(pstrSocketHandle, XLLP_PCCARD_SOCKET0, uiCardVoltage);

            //
            //Assert RESET for Socket 0: bit[4] of the Socket 0 Status Control Register
            //
            vpstrMainBLRegs->PCMCIAS0SCR |= XLLP_BCR_PCMCIA_SCR_S0_RESET;

            //
            //Deassert RESET for Socket 0: bit[4] of the Socket 0 Status Control Register
            //
            vpstrMainBLRegs->PCMCIAS0SCR &= ~(XLLP_BCR_PCMCIA_SCR_S0_RESET);
        }

        //
        //*************************** SOCKET 1 **********************************
        //
        vpstrMainBLRegs->PCMCIAS1SCR &= ~(XLLP_BCR_PCMCIA_SCR_S1_PWR);

        //
        //Deassert RESET for Socket 1: bit[4] of the Socket 1 Status Control Register
        //
        vpstrMainBLRegs->PCMCIAS1SCR &= ~(XLLP_BCR_PCMCIA_SCR_S1_RESET);

        //
        //If a card is inserted, configure the MAX1602EE power IC for
        //appropriate power supply to the socket, based on the voltage requirements
        //of the card. If no card is present in the socket, then bypass powering
        //up the socket at this point
        //
        uiCardVoltage = 0;   //reset the value
        ReturnValue = XLLP_STATUS_SUCCESS;   //reset the value

        ReturnValue = XllpPCCardGetVoltageSetting(pstrSocketHandle, XLLP_PCCARD_SOCKET1, &uiCardVoltage);

        if(ReturnValue == XLLP_STATUS_SUCCESS)
        {
            XllpPCCardPowerOn(pstrSocketHandle, XLLP_PCCARD_SOCKET1, uiCardVoltage);

            //
            //Assert RESET for Socket 1: bit[4] of the Socket 1 Status Control Register
            //
            vpstrMainBLRegs->PCMCIAS1SCR |= XLLP_BCR_PCMCIA_SCR_S0_RESET;

            //
            //Deassert RESET for Socket 1: bit[4] of the Socket 1 Status Control Register
            //
            vpstrMainBLRegs->PCMCIAS1SCR &= ~(XLLP_BCR_PCMCIA_SCR_S0_RESET);
        }

        //
        //Route signals to the PC card interface, as opposed to the Baseband controller
        //
        vpstrMainBLRegs->MISCWR1 |= (XLLP_BCR_MISCWR1_BB_SEL);
        vpstrMainBLRegs->MISCWR1 &= ~(XLLP_BCR_MISCWR1_BB_SEL);
    }

    return ReturnValue;

} //end XllpPCCardHWSetup()



/******************************************************************************

  Function Name: XllpPCCardConfigureGPIOs

  Description: Configures BULVERDE's GPIOs for the PC Card interface

  Global Registers Modified:

  Input Arguments:

  Output Arguments:

  Return Value:


*******************************************************************************/
void XllpPCCardConfigureGPIOs(XLLP_PCCARDSOCKET_T *pstrSocketHandle)
{
    XLLP_UINT32_T ulLockID;
    volatile XLLP_GPIO_T *vpstrBvdGPIORegs = (volatile XLLP_GPIO_T *)pstrSocketHandle->pstrGpioRegsHandle;


    //
    //Configure GPIO Output Set registers for active-low, output GPIO pins.This is a required
    //step for programming Bulverde GPIOs.
    //
    ulLockID = XllpLock(GPSR1);
    vpstrBvdGPIORegs->GPSR1 |= (XLLP_GPIO_BIT_PCMCIA_nPOE |
                                XLLP_GPIO_BIT_nPWE |
                                XLLP_GPIO_BIT_PCMCIA_nPIOR |
                                XLLP_GPIO_BIT_PCMCIA_nPIOW |
                                XLLP_GPIO_BIT_PCMCIA_nPCE2 |
                                XLLP_GPIO_BIT_PCMCIA_nPREG);
    XllpUnlock(ulLockID);

    ulLockID = XllpLock(GPSR2);
    vpstrBvdGPIORegs->GPSR2 |= (XLLP_GPIO_BIT_PCMCIA_PSKTSEL |
                                XLLP_GPIO_BIT_PCMCIA_nPCE1);
    XllpUnlock(ulLockID);

    //
    //Configure GPIO pin directions
    //
    //PC Card interface GPIO Output pins: GPIO 48, 49, 50, 51, 55, 78 and 79
    //PC Card interface GPIO Input pins:  GPIO 56 and 57
    ulLockID = XllpLock(GPDR1);
    vpstrBvdGPIORegs->GPDR1 |= (XLLP_GPIO_BIT_PCMCIA_nPOE |
                                XLLP_GPIO_BIT_nPWE |
                                XLLP_GPIO_BIT_PCMCIA_nPIOR |
                                XLLP_GPIO_BIT_PCMCIA_nPIOW |
                                XLLP_GPIO_BIT_PCMCIA_nPCE2 |
                                XLLP_GPIO_BIT_PCMCIA_nPREG);

    vpstrBvdGPIORegs->GPDR1 &= ~(XLLP_GPIO_BIT_PCMCIA_nPWAIT);
    vpstrBvdGPIORegs->GPDR1 &= ~(XLLP_GPIO_BIT_PCMCIA_nIOIS16);
    XllpUnlock(ulLockID);

    ulLockID = XllpLock(GPDR2);
    vpstrBvdGPIORegs->GPDR2 |= XLLP_GPIO_BIT_PCMCIA_PSKTSEL;
    vpstrBvdGPIORegs->GPDR2 |= XLLP_GPIO_BIT_PCMCIA_nPCE1;
    XllpUnlock(ulLockID);

    //
    //Configure GPIO pin alternate functions
    //
    ulLockID = XllpLock(GAFR1_U);
    vpstrBvdGPIORegs->GAFR1_U &= 0xFFF00F00;  //Clear the alternate function bits
                                              //for GPIO 48, 49, 50, 51, 55, 56 and 57
    //Set Alternate Function 2 for GPIO 48, 49, 50, 51 and 55
    vpstrBvdGPIORegs->GAFR1_U |= (XLLP_GPIO_AF_BIT_PCMCIA_nPOE |
                                  XLLP_GPIO_AF_BIT_nPWE |
                                  XLLP_GPIO_AF_BIT_PCMCIA_nPIOR |
                                  XLLP_GPIO_AF_BIT_PCMCIA_nPIOW |
                                  XLLP_GPIO_AF_BIT_PCMCIA_nPCE2 |
                                  XLLP_GPIO_AF_BIT_PCMCIA_nPREG);

    //Set Alternate Function 1 for GPIO 56 and 57
    vpstrBvdGPIORegs->GAFR1_U |= (XLLP_GPIO_AF_BIT_PCMCIA_nPWAIT |
                                  XLLP_GPIO_AF_BIT_PCMCIA_nIOIS16);
    XllpUnlock(ulLockID);

    ulLockID = XllpLock(GAFR2_L);
    vpstrBvdGPIORegs->GAFR2_L &= 0x3FFFFFFF;  //Clear the alternate function bits
                                              //for GPIO 79
    //Set Alternate Function 1 for GPIO 79
    vpstrBvdGPIORegs->GAFR2_L |= XLLP_GPIO_AF_BIT_PCMCIA_PSKTSEL;
    XllpUnlock(ulLockID);

    ulLockID = XllpLock(GAFR2_U);
    vpstrBvdGPIORegs->GAFR2_U &= 0xFFFFF3FF;  //Clear the alternate function bits for GPIO 85
    vpstrBvdGPIORegs->GAFR2_U |= XLLP_GPIO_AF_BIT_PCMCIA_nPCE1;
    XllpUnlock(ulLockID);

} //end XllpPCCardConfigureGPIOs()



/******************************************************************************

  Function Name: XllpPCCardGetSocketState

  Description:

  Global Registers Modified:

  Input Arguments:

  Output Arguments:

  Return Value:


*******************************************************************************/
XLLP_STATUS_T XllpPCCardGetSocketState(XLLP_PCCARDSOCKET_T *pstrSocketHandle,
                                       XLLP_VUINT16_T       ushSocketNumber)
{

    XLLP_STATUS_T ReturnValue = XLLP_STATUS_SUCCESS;


    //Check the validity of the input arguments to the function
    if((ushSocketNumber > XLLP_MAINSTONE_MAX_PCCARD_SOCKETS) ||
       (pstrSocketHandle == XLLP_NULL_PTR))
    {
        ReturnValue = XLLP_STATUS_PCCARD_FAILURE;   
    }

    if(ReturnValue != XLLP_STATUS_PCCARD_FAILURE)
    {
        switch(ushSocketNumber)
        {
            case XLLP_PCCARD_SOCKET0:

                //
                //Check the CD status bit[5] of the Socket 0 Status Register. If set, it indicates
                //that a card is either not present or is not properly inserted in the socket. If clear,
                //it indicates that a card is present in the socket.
                //
                if((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR) & (XLLP_BCR_PCMCIA_SCR_S0_nCD))
                {
                    pstrSocketHandle->pstrPCCardSocketState->blSocket0CDState = XLLP_FALSE;
                }
                else
                {
                    pstrSocketHandle->pstrPCCardSocketState->blSocket0CDState = XLLP_TRUE;
                }

                //
                //Check the BVD1 status bit[8] of the Socket 0 Status Register. If set, then it
                //indicates that the card status has not changed. If clear, then it indicates that
                //a card status change event has occurred.
                //

⌨️ 快捷键说明

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