📄 xspcmcia.c
字号:
/******************************************************************************
**
** COPYRIGHT (C) 2000, 2001 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: XsPcmcia.c
**
** PURPOSE: This file contains the Cotulla PCMCIA device driver for the
** Intel(r) XScale(tm) Microarchitecture.
**
** LAST MODIFIED: $Modtime: 7/17/03 1:01p $
******************************************************************************/
/*
*******************************************************************************
* HEADER FILES
*******************************************************************************
*/
#include "string.h"
#include "stdio.h"
#include "systypes.h"
#include "timedelays.h"
#include "dm_errors.h"
#include "dm_debug.h"
#include "platform.h"
#include "cotulla.h"
#include "xspccardsocket.h"
#include "xllp_memctrl.h"
#include "XsMemCtrl.h"
#include "XsGpioApi.h"
#include "XsGpio.h"
#include "XsOst.h"
#include "boardcontrol.h"
#define XS_PCMCIA_GLOBALS 1
#include "XsPcmciaApi.h"
/*
*******************************************************************************
*
* FUNCTION:
* XsPcmciaDisableSocket
*
* DESCRIPTION:
* Disable the socket and power it off.
*
* INPUT PARAMETERS:
* XS_PCMCIA_DCST *ctxP - Pointer to the PCMCIA Device Context Structure
*
* RETURNS:
* 0 - Success
* non-zero - Error
*
* GLOBAL EFFECTS:
* Selected socket is turned off.
*
* ASSUMPTIONS:
* None.
*
* CALLS:
* SA_SetCF
*
* CALLED BY:
* Test code and device drivers needing to disable a socket.
*
* PROTOTYPE:
* UINT32 XspcmciaDisableSocket(XS_PCMCIA_DCST *ctxP);
*
*******************************************************************************
*/
UINT32 XsPcmciaDisableSocket(XS_PCMCIA_DCST *ctxP)
{
UINT32 status = 0;
XS_PCCARD_SOCKET_T pcCardSocket;
XS_PCCARD_SOCKET_STATE_T pcCardSocketState;
// Initialize the parameter block with I/O addresses.
pcCardSocket.pstrGpioRegsHandle = (XLLP_GPIO_T *)XS_GPIO_REGISTER_BASE;
pcCardSocket.pstrBcrHandle = (XLLP_BCR_T *)BOARD_REG_BASE;
pcCardSocket.pstrPCCardSocketState = &pcCardSocketState;
pcCardSocket.pstrOstRegsHandle = (XLLP_OST_T *)OST_REGISTER_BASE;
pcCardSocket.pstrMemCtrlRegsHandle =
(XLLP_MEMORY_CONTROL_REGISTER_T *)MEMORY_CONTROL_BASE;
// Reset the socket.
status = XsPcCardDisableSocket(&pcCardSocket, ctxP->socket);
if (status)
{
status = ERRORCODEX(ERR_L_PCMCIA, 0, 0, ERR_T_WRONG_STATE);
}
ctxP->cfEnabled = FALSE; // Flag slot disabled.
return (status);
}
/*
*******************************************************************************
*
* FUNCTION:
* XsPcmciaEnableSocket
*
* DESCRIPTION:
* Enable the socket and power it on.
*
* INPUT PARAMETERS:
* XS_PCMCIA_DCST *ctxP - Pointer to the PCMCIA Device Context Structure
*
* RETURNS:
* 0 - Success
* non-zero - Error
*
* GLOBAL EFFECTS:
* Selected socket is turned on.
*
* ASSUMPTIONS:
* None.
*
* CALLS:
* None.
*
* CALLED BY:
* Test code and device drivers needing to disable a socket.
*
* PROTOTYPE:
* UINT32 XsPcmciaEnableSocket(XS_PCMCIA_DCST *ctxP);
*
*******************************************************************************
*/
UINT32 XsPcmciaEnableSocket(XS_PCMCIA_DCST *ctxP)
{
UINT32 status = 0;
XS_PCCARD_SOCKET_T pcCardSocket;
XS_PCCARD_SOCKET_STATE_T pcCardSocketState;
// Initialize the parameter block with I/O addresses.
pcCardSocket.pstrGpioRegsHandle = (XLLP_GPIO_T *)XS_GPIO_REGISTER_BASE;
pcCardSocket.pstrBcrHandle = (XLLP_BCR_T *)BOARD_REG_BASE;
pcCardSocket.pstrPCCardSocketState = &pcCardSocketState;
pcCardSocket.pstrOstRegsHandle = (XLLP_OST_T *)OST_REGISTER_BASE;
pcCardSocket.pstrMemCtrlRegsHandle =
(XLLP_MEMORY_CONTROL_REGISTER_T *)MEMORY_CONTROL_BASE;
// Reset the socket.
status = XsPcCardEnableSocket(&pcCardSocket, ctxP->socket);
if (status)
{
status = ERRORCODEX(ERR_L_PCMCIA, 0, 0, ERR_T_WRONG_STATE);
}
ctxP->cfEnabled = TRUE; // Flag slot enabled.
return (status);
}
/*
*******************************************************************************
*
* FUNCTION:
* XsPcmciaGetSocket
*
* DESCRIPTION:
* Retrieve the state of the socket and return the socket status.
*
* INPUT PARAMETERS:
* XS_PCMCIA_DCST *ctxP - Pointer to the PCMCIA Device Context Structure
* SocketStatusT *statusP - Pointer to the socket status structure
*
* RETURNS:
* Pointer to the socket status structure
* 0 - Success
* non-zero - Error
*
* GLOBAL EFFECTS:
* None.
*
* ASSUMPTIONS:
* None.
*
* CALLS:
* GetPcmciaRegister, PhysicalToVirtual
*
* CALLED BY:
* Test code and device drivers needing to get the socket status.
*
* PROTOTYPE:
* UINT32 XsPcmciaGetSocket(XS_PCMCIA_DCST *ctxP, SocketStatusT *statusP);
*
*******************************************************************************
*/
UINT32 XsPcmciaGetSocket(XS_PCMCIA_DCST *ctxP, SocketStatusT *statusP)
{
UINT32 status = 0;
XS_PCCARD_SOCKET_T pcCardSocket;
XS_PCCARD_SOCKET_STATE_T pcCardSocketState;
// Initialize the Parameter block with I/O addresses.
pcCardSocket.pstrGpioRegsHandle = (XLLP_GPIO_T *)XS_GPIO_REGISTER_BASE;
pcCardSocket.pstrBcrHandle = (XLLP_BCR_T *)BOARD_REG_BASE;
pcCardSocket.pstrPCCardSocketState = &pcCardSocketState;
pcCardSocket.pstrOstRegsHandle = (XLLP_OST_T *)OST_REGISTER_BASE;
pcCardSocket.pstrMemCtrlRegsHandle =
(XLLP_MEMORY_CONTROL_REGISTER_T *)MEMORY_CONTROL_BASE;
// Reset the socket.
status = XsPcCardGetSocketState(&pcCardSocket, ctxP->socket);
if (status)
{
status = ERRORCODEX(ERR_L_PCMCIA, 0, 0, ERR_T_WRONG_STATE);
}
else
{
// Set the socket state for the given socket number.
if (ctxP->socket)
{
// Fill out the socket 1 status block
statusP->stateMask =
((pcCardSocketState.blSocket1CDState ? 1 << SocketCardDetect : 0) |
(ctxP->cfEnabled ? 1 << SocketCardEnabled : 0) |
(pcCardSocketState.blSocket1IREQState ? 1 << SocketCardReady : 0) |
(pcCardSocketState.blSocket1BVD2State ? 1 << SocketBatteryWeak : 0) |
(pcCardSocketState.blSocket1BVD1State ? 1 << SocketBatteryDead : 0));
}
else
{
// Fill out the socket 0 status block
statusP->stateMask =
((pcCardSocketState.blSocket0CDState ? 1 << SocketCardDetect : 0) |
(ctxP->cfEnabled ? 1 << SocketCardEnabled : 0) |
(pcCardSocketState.blSocket0IREQState ? 1 << SocketCardReady : 0) |
(pcCardSocketState.blSocket0BVD2State ? 1 << SocketBatteryWeak : 0) |
(pcCardSocketState.blSocket0BVD1State ? 1 << SocketBatteryDead : 0));
}
}
if (!status)
{
// Convert attribute physical address to virtual address.
if (PhysicalToVirtual(ctxP->socket ? SLOT1_CF_ATT_PHYSICAL :
SLOT0_CF_ATT_PHYSICAL,
0, &statusP->attSpaceP))
{
status = ERRORCODEX(ERR_L_PCMCIA, 0, 0, ERR_T_ILLPARM_PTOV);
}
// Convert I/O physical address to virtual address.
else if (PhysicalToVirtual(ctxP->socket ? SLOT1_CF_IO_PHYSICAL :
SLOT0_CF_IO_PHYSICAL,
0, &statusP->ioSpaceP))
{
status = ERRORCODEX(ERR_L_PCMCIA, 0, 0, ERR_T_ILLPARM_PTOV);
}
// Convert memory physical address to virtual address.
else if (PhysicalToVirtual(ctxP->socket ? SLOT1_CF_MEM_PHYSICAL :
SLOT0_CF_MEM_PHYSICAL,
0, &statusP->memSpaceP))
{
status = ERRORCODEX(ERR_L_PCMCIA, 0, 0, ERR_T_ILLPARM_PTOV);
}
}
return (status);
}
/*
*******************************************************************************
*
* FUNCTION:
* XsPcmciaHWShutdown
*
* DESCRIPTION:
* Shutdown the PCMCIA socket.
*
* INPUT PARAMETERS:
* XS_PCMCIA_DCST *ctxP - Pointer to the PCMCIA Device Context Structure
*
* RETURNS:
* None.
*
* GLOBAL EFFECTS:
* None.
*
* ASSUMPTIONS:
* None.
*
* CALLS:
* None.
*
* CALLED BY:
* Test code and device drivers needing to shutdown the socket.
*
* PROTOTYPE:
* VOID XsPcmciaHWShutdown(XS_PCMCIA_DCST ctxP);
*
*******************************************************************************
*/
VOID XsPcmciaHWShutdown(XS_PCMCIA_DCST *ctxP)
{
DM_CwDbgPrintf(DM_CW_XS_PCMCIA_0, "CF: XsPcmciaHWShutdown:");
// Turn off the socket.
XsPcmciaDisableSocket(ctxP);
// Clear HW flags.
ctxP->cfDetect = 0;
ctxP->cfEnabled = 0;
ctxP->cfReady = 0;
}
/*
*******************************************************************************
*
* FUNCTION:
* XsPcmciaHWSetup
*
* DESCRIPTION:
* Initialize the memory controller PCMCIA timing registers.
*
* INPUT PARAMETERS:
* XS_PCMCIA_DCST *ctxP - Pointer to the PCMCIA Device Context Structure
*
* RETURNS:
* None.
*
* GLOBAL EFFECTS:
* None.
*
* ASSUMPTIONS:
* None.
*
* CALLS:
* None.
*
* CALLED BY:
* Platform specific initialization routine.
*
* PROTOTYPE:
* VOID XsPcmciaHWSetup(XS_PCMCIA_DCST *ctxP);
*
*******************************************************************************
*/
UINT32 XsPcmciaHWSetup(XS_PCMCIA_DCST *ctxP)
{
UINT32 status = 0;
XS_PCCARD_SOCKET_T pcCardSocket;
XS_PCCARD_SOCKET_STATE_T pcCardSocketState;
if (!(ctxP->cfReady))
{
// Initialize handles.
pcCardSocket.pstrGpioRegsHandle = (XLLP_GPIO_T *)XS_GPIO_REGISTER_BASE;
pcCardSocket.pstrBcrHandle = (XLLP_BCR_T *)BOARD_REG_BASE;
pcCardSocket.pstrPCCardSocketState = &pcCardSocketState;
pcCardSocket.pstrOstRegsHandle = (XLLP_OST_T *)OST_REGISTER_BASE;
pcCardSocket.pstrMemCtrlRegsHandle =
(XLLP_MEMORY_CONTROL_REGISTER_T *)MEMORY_CONTROL_BASE;
// Configure the PCMCIA GPIOs. Don't check status here.
// XsPcCardHWSetup attempts to initialize both sockets and we may
// not have a card inserted into one of the slots at this time.
XsPcCardHWSetup(&pcCardSocket);
// Set HW ready flag.
ctxP->cfReady = TRUE;
}
return (status);
}
/*
*******************************************************************************
*
* FUNCTION:
* XsPcmciaSWInit
*
* DESCRIPTION:
* Initialize the PCMCIA Device Context Structure.
*
* INPUT PARAMETERS:
* None
*
* RETURNS:
* None
*
* GLOBAL EFFECTS:
* None
*
* ASSUMPTIONS:
* None
*
* CALLS:
* XsPcmciaSWInitX
*
* CALLED BY:
* Platform initialization code.
*
* PROTOTYPE:
* XsPcmciaSWInit();
*
*******************************************************************************
*/
VOID XsPcmciaSWInit(VOID)
{
XS_PCMCIA_DCST *ctxP = &XS_PCMCIA_DCS[PCMCIA_SLOT0];
// Initialze socket 0 the function pointer interface to this device driver.
ctxP->XsPcmciaHWSetupFnP = (XsPcmciaHWSetupT)XsPcmciaHWSetup;
ctxP->XsPcmciaHWShutdownFnP = (XsPcmciaHWShutdownT)XsPcmciaHWShutdown;
ctxP->XsPcmciaGetSocketFnP = (XsPcmciaGetSocketT)XsPcmciaGetSocket;
ctxP->XsPcmciaEnableSocketFnP = (XsPcmciaEnableSocketT)XsPcmciaEnableSocket;
ctxP->XsPcmciaDisableSocketFnP = (XsPcmciaDisableSocketT)XsPcmciaDisableSocket;
// Initialize DCS members.
ctxP->socket = 0;
ctxP->cfDetect = 0;
ctxP->cfEnabled = 0;
ctxP->cfReady = 0;
// Get pointer to slot 1.
ctxP = &XS_PCMCIA_DCS[PCMCIA_SLOT1];
// Initialze socket 1 the function pointer interface to this device driver.
ctxP->XsPcmciaHWSetupFnP = (XsPcmciaHWSetupT)XsPcmciaHWSetup;
ctxP->XsPcmciaHWShutdownFnP = (XsPcmciaHWShutdownT)XsPcmciaHWShutdown;
ctxP->XsPcmciaGetSocketFnP = (XsPcmciaGetSocketT)XsPcmciaGetSocket;
ctxP->XsPcmciaEnableSocketFnP = (XsPcmciaEnableSocketT)XsPcmciaEnableSocket;
ctxP->XsPcmciaDisableSocketFnP = (XsPcmciaDisableSocketT)XsPcmciaDisableSocket;
// Initialize DCS members.
ctxP->socket = 1;
ctxP->cfDetect = 0;
ctxP->cfEnabled = 0;
ctxP->cfReady = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -