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

📄 xllp_pccardsocket.c

📁 Windows CE 6.0 BSP for VOIPAC Board (PXA270) Version 2b.
💻 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"

//#define XLLP_BCR_PCMCIA_SCR_S0_RESET        (XLLP_BIT_4)
#define XLLP_BCR_PCMCIA_SCR_S0_nCD          (XLLP_BIT_5)
//#define XLLP_BCR_PCMCIA_SCR_S0_nVS1         (XLLP_BIT_6)
//#define XLLP_BCR_PCMCIA_SCR_S0_nVS2         (XLLP_BIT_7)
//#define XLLP_BCR_PCMCIA_SCR_S0_nVS          (XLLP_BIT_6 | XLLP_BIT_7)
#define XLLP_BCR_PCMCIA_SCR_S0_nSTSCHG_BVD1 (XLLP_BIT_8)
#define XLLP_BCR_PCMCIA_SCR_S0_nSPKR_BVD2   (XLLP_BIT_9)
#define XLLP_BCR_PCMCIA_SCR_S0_nIRQ         (XLLP_BIT_10)

//#define XLLP_BCR_PCMCIA_SCR_S1_RESET        (XLLP_BIT_4)
#define XLLP_BCR_PCMCIA_SCR_S1_nCD          (XLLP_BIT_5)
//#define XLLP_BCR_PCMCIA_SCR_S1_nVS1         (XLLP_BIT_6)
//#define XLLP_BCR_PCMCIA_SCR_S1_nVS2         (XLLP_BIT_7)
//#define XLLP_BCR_PCMCIA_SCR_S1_nVS          (XLLP_BIT_6 | XLLP_BIT_7)
#define XLLP_BCR_PCMCIA_SCR_S1_nSTSCHG_BVD1 (XLLP_BIT_8)
#define XLLP_BCR_PCMCIA_SCR_S1_nSPKR_BVD2   (XLLP_BIT_9)
#define XLLP_BCR_PCMCIA_SCR_S1_nIRQ         (XLLP_BIT_10)

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

  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;
	volatile XLLP_GPIO_T *vpstrBvdGPIORegs = (volatile XLLP_GPIO_T *)pstrSocketHandle->pstrGpioRegsHandle;
    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);
		vpstrBvdGPIORegs->GPCR3 = XLLP_BIT_11;	// GPIO107 PPENpcmcia

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

        //
        //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;
			vpstrBvdGPIORegs->GPSR0 = XLLP_BIT_11;	// GPIO11 RESETpcmcia

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

        //
        //*************************** 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);
		vpstrBvdGPIORegs->GPCR0 = XLLP_BIT_16;	// GPIO11 RESETcf

        //
        //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;
			vpstrBvdGPIORegs->GPSR0 = XLLP_BIT_16;	// GPIO11 RESETcf

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

        //
        //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_UINT16_T XllpPCCardSocketState(XLLP_PCCARDSOCKET_T *pstrSocketHandle,
                                       XLLP_VUINT16_T       ushSocketNumber)
{
	volatile XLLP_GPIO_T *vpstrBvdGPIORegs = (volatile XLLP_GPIO_T *)pstrSocketHandle->pstrGpioRegsHandle;
	XLLP_UINT16_T SocketState = (XLLP_BIT_8 | XLLP_BIT_9);		// BVD1 & BVD2

    switch(ushSocketNumber)
    {
        case XLLP_PCCARD_SOCKET0:
			if( vpstrBvdGPIORegs->GPLR2 & XLLP_BIT_20)	// GPIO84 nCDpcmcia
				SocketState |= XLLP_BCR_PCMCIA_SCR_S0_nCD;
			if( vpstrBvdGPIORegs->GPLR1 & XLLP_BIT_3)	// GPIO35 IRQpcmcia
				SocketState |= XLLP_BCR_PCMCIA_SCR_S0_nIRQ;
		break;

        case XLLP_PCCARD_SOCKET1:
			if( vpstrBvdGPIORegs->GPLR0 & XLLP_BIT_17)	// GPIO17 nCDcf
				SocketState |= XLLP_BCR_PCMCIA_SCR_S1_nCD;
			if( vpstrBvdGPIORegs->GPLR0 & XLLP_BIT_12)	// GPIO12 IRQcf
				SocketState |= XLLP_BCR_PCMCIA_SCR_S1_nIRQ;
		break;
	}

	return SocketState; 
}

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))
    {

⌨️ 快捷键说明

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