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

📄 xspccardsocket.c

📁 优龙pxa270平台试验程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
**
**  COPYRIGHT (C) 2000 - 2003 Intel Corporation.
**
**  This software as well as the software described in it is furnished under 
**  license and may only be used or copied in accordance with the terms of the 
**  license. The information in this file is furnished for informational use 
**  only, is subject to change without notice, and should not be construed as 
**  a commitment by Intel Corporation. Intel Corporation assumes no 
**  responsibility or liability for any errors or inaccuracies that may appear 
**  in this document or any software that may be provided in association with 
**  this document. 
**  Except as permitted by such license, no part of this document may be 
**  reproduced, stored in a retrieval system, or transmitted in any form or by 
**  any means without the express written consent of Intel Corporation. 
**
**  FILENAME:       XsPcCardSocket.c
**
**  PURPOSE:        This file contains the PCMCIA device driver for the
**                  Intel(r) XScale(tm) Microarchitecture.
**
**  LAST MODIFIED:  $Modtime: 7/10/03 3:40p $
******************************************************************************/

/*
*******************************************************************************
*   HEADER FILES
*******************************************************************************
*/
#include "XsPcCardSocket.h"


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

  Function Name: XsPcCardHWSetup

  Description: Performs the required hardware setup to configure the
               selected socket properly for use. 
               1. Configures the MAINSTONE Board Control Registers
               2. Configures the BULVERDE GPIOs 
               3. Applies power to the socket
               4. Sets the values to be passed to the Expansion 
                  Memory Timing Registers of the Memory Controller.

  Global Registers Modified: 

  Input Arguments:

  Output Arguments:

  Return Value: 


*******************************************************************************/
XS_STATUS_T XsPcCardHWSetup(XS_PCCARD_SOCKET_T *pstrSocketHandle)
{
    XS_STATUS_T ReturnValue = XS_PCCARD_SUCCESS;

    //Check the validity of the input arguments to the function
    if((pstrSocketHandle == XS_NULL_PTR))
    {
        ReturnValue = XS_PCCARD_FAILURE;  
    }
    else
    {    
        // Set MCMEM0 Register Bitmap.
        pstrSocketHandle->pstrMemCtrlRegsHandle->MCMEM0 = XLLP_MCMEM0_SET  |
                                                          XLLP_MCMEM0_ASST |
                                                          XLLP_MCMEM0_HOLD;

        // Set MCATT0 Register Bitmap.
        pstrSocketHandle->pstrMemCtrlRegsHandle->MCATT0 = XLLP_MCATT0_SET  |
                                                          XLLP_MCATT0_ASST |
                                                          XLLP_MCATT0_HOLD;

        // Set MCIO0 Register Bitmap.
        pstrSocketHandle->pstrMemCtrlRegsHandle->MCIO0 = XLLP_MCIO0_SET  |
                                                         XLLP_MCIO0_ASST |
                                                         XLLP_MCIO0_HOLD;

        // Set MCMEM1 Register Bitmap.
        pstrSocketHandle->pstrMemCtrlRegsHandle->MCMEM1 = XLLP_MCMEM1_SET  |
                                                          XLLP_MCMEM1_ASST |
                                                          XLLP_MCMEM1_HOLD;

        // Set MCATT1 Register Bitmap.
        pstrSocketHandle->pstrMemCtrlRegsHandle->MCATT1 = XLLP_MCATT1_SET  |
                                                          XLLP_MCATT1_ASST |
                                                          XLLP_MCATT1_HOLD;

        // Set MCIO1 Register Bitmap.
        pstrSocketHandle->pstrMemCtrlRegsHandle->MCIO1 = XLLP_MCIO1_SET  |
                                                         XLLP_MCIO1_ASST |
                                                         XLLP_MCIO1_HOLD;

        // Set number of supported sockets to 2, card inserted.
        pstrSocketHandle->pstrMemCtrlRegsHandle->MECR = XLLP_MECR_NOS | XLLP_MECR_CIT;

        // Configure PCMCIA GPIOs.
        XsPcCardConfigureGPIOs(pstrSocketHandle);

        // Enable socket 0.
        ReturnValue = XsPcCardEnableSocket(pstrSocketHandle, XS_PCCARD_SOCKET0);
        // Check for errors.
        if(ReturnValue != XS_PCCARD_FAILURE)
        {
            // Enable socket 1.
            ReturnValue = XsPcCardEnableSocket(pstrSocketHandle, XS_PCCARD_SOCKET1);
        }
    }

    return ReturnValue;

} //end XsPcCardHWSetup()



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

  Function Name: XsPcCardConfigureGPIOs

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

  Global Registers Modified: 

  Input Arguments:

  Output Arguments:

  Return Value: 


*******************************************************************************/
void XsPcCardConfigureGPIOs(XS_PCCARD_SOCKET_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, 54, 55, 79 and 85
    //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);
#if 0	//hzh
    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);
#endif
    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 XsPcCardConfigureGPIOs()



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

  Function Name: XsPcCardGetSocketState

  Description: 

  Global Registers Modified: 

  Input Arguments:

  Output Arguments:

  Return Value: 


*******************************************************************************/
XS_STATUS_T XsPcCardGetSocketState(XS_PCCARD_SOCKET_T *pstrSocketHandle,
                                   XLLP_VUINT16_T ushSocketNumber)
{
#if 0	//hzh
    XS_STATUS_T ReturnValue = XS_PCCARD_SUCCESS;

    //Check the validity of the input arguments to the function
    if((ushSocketNumber > XS_MAINSTONE_MAX_PCCARD_SOCKETS) ||
       (pstrSocketHandle == XS_NULL_PTR))
    {
        ReturnValue = XS_PCCARD_FAILURE;  
    } 
    else
    {
        switch(ushSocketNumber)
        {
            case XS_PCCARD_SOCKET0:
                //Check the CD status bit[5] of the Socket 0 Status Register. Set
                //the corresponding member's value in the XLLP Socket State structure.
                if((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR) & (XLLP_BCR_PCMCIA_SCR_S0_nCD))
                {
                    // Card detect being set indicates no card inserted.
                    pstrSocketHandle->pstrPCCardSocketState->blSocket0CDState = XLLP_FALSE;
                }
                else
                {
                    // Card detect being cleared indicates card inserted.
                    pstrSocketHandle->pstrPCCardSocketState->blSocket0CDState = XLLP_TRUE;
                }

                //Check the BVD1 status bit[8] of the Socket 0 Status Register. Set
                //the corresponding member's value in the XLLP Socket State structure.
                if((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR) & 
                                                         (XLLP_BCR_PCMCIA_SCR_S0_nSTSCHG_BVD1))
                {
                    // VDD voltage sense signal/card status changed not asserted.
                    pstrSocketHandle->pstrPCCardSocketState->blSocket0BVD1State = XLLP_FALSE;
                }
                else
                {
                    // VDD voltage sense signal/card status changed asserted.
                    pstrSocketHandle->pstrPCCardSocketState->blSocket0BVD1State = XLLP_TRUE;
                }

                //Check the BVD2 status bit[9] of the Socket 0 Status Register. Set
                //the corresponding member's value in the XLLP Socket State structure.
                if((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR) & 
                                                         (XLLP_BCR_PCMCIA_SCR_S0_nSPKR_BVD2))
                {
                    // VDD voltage sense signal/audio digital speaker not asserted.
                    pstrSocketHandle->pstrPCCardSocketState->blSocket0BVD2State = XLLP_FALSE;
                }
                else
                {
                    // VDD voltage sense signal/audio digital speaker asserted.

⌨️ 快捷键说明

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