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

📄 xspcmcia.c

📁 优龙YLP270开发板 光盘自带的BIOS和实验例程源码 强烈推荐
💻 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 + -