xspccardsocket.c
来自「优龙YLP270开发板 光盘自带的BIOS和实验例程源码 强烈推荐」· C语言 代码 · 共 756 行 · 第 1/3 页
C
756 行
/******************************************************************************
**
** 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);
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 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)
{
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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?