📄 xspccardsocket.c
字号:
/******************************************************************************
**
** 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 + -