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

📄 pcmsock.cpp

📁 Windows CE 6.0 BSP for VOIPAC Board (PXA270) Version 2b.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// 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.
//
/*++
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:  

Abstract:

    MAINSTONEII PCMCIA Socket Services Object for PCMCIA(16-bit) Interface.

Notes: 
--*/
#include <windows.h>
#include <types.h>
#include <socksv2.h>
#include <cardsv2.h>
#include <memory.h>
#include <ceddk.h>
#include <xllp_defs.h>
#define  ZONE_SOCKET ZONE_PDD
#include "pdsocket.h"

//--------------------Pcmcia Socket Implementation--------------------------------------------
const SS_SOCKET_INFO CPcmciaCardSocket::ms_SocketInitInfo =
{
    SOCK_CAP_IO_MEMORY_CARD,
    SOCK_CAP_PWRCYCLE |
    SOCK_CAP_CD |
    SOCK_CAP_BVD1 |
    SOCK_CAP_BVD2,    // Socket Interrupt Capability Set follow bitmap.
    SOCK_CAP_PWRCYCLE |
    SOCK_CAP_CD |
    SOCK_CAP_BVD1 |
    SOCK_CAP_BVD2,    // Socket status report capability
    0,                // Socket status indicate capability
    0,                // Number of power entry this socket have.
    0,                // Number of Window supported in this Socket.
    Isa,              // PCCARD Bus Type is ISA/built-in.
    ( DWORD ) -1,     // CardBus Card Number.
    { - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
};

const SS_SOCKET_STATE CPcmciaCardSocket::ms_SocketInitState = 
{
    SOCK_EVENT_PWRCYCLE |
    SOCK_EVENT_CD |
    SOCK_EVENT_BVD1 |
    SOCK_EVENT_BVD2, // Initial EventMask
    0, // Event Changed.
    0, // Event Status
    CFG_IFACE_MEMORY,  //default interface type
    0,  // Interrupt Enable.
    0,  // Vcc
    0,  // Vpp1
    0   // Vpp2
};


void CPcmciaCardSocket::SocketEventHandle( DWORD dwStatesChange, DWORD dwStates )
{
    SS_SOCKET_STATE sSockState;

    Lock();
    CardGetSocket( &sSockState );

    sSockState.dwEventChanged |= dwStatesChange;
    sSockState.dwEventStatus  |= dwStates;
    sSockState.dwEventChanged &= ~( SOCK_EVENT_CD );
    m_SockState.dwEventChanged = sSockState.dwEventChanged;

    Unlock();

    m_pBridge->CallBackToCardService(m_pBridge->GetSocketNumber(), GetSocketHandle(), &sSockState);
}


CPcmciaCardSocket::CPcmciaCardSocket(CPcmciaBusBridge* pBridge, UINT16 nSlotNumber) : CPCMCIASocketBase<CStaticMemoryWindow<CPcmciaCardSocket>, CStaticIOWindow<CPcmciaCardSocket>, CStaticWindowBridgeContainer<CPcmciaBusBridge>, CPcmciaBusBridge>( pBridge )
{
    DWORD dwPowerOption = 0;

    DEBUGMSG(ZONE_SOCKET, (TEXT("+CPcmciaCardSocket::CPcmciaCardSocket\r\n")));

    m_pBridge          = pBridge;
    m_SockState        = ms_SocketInitState;
    m_PcmciaSocketInfo = ms_SocketInitInfo;

    for( DWORD dwIndex = 0; dwIndex < IRQ_ROUTINGTABLE_SIZE; dwIndex++ )
    {
        m_PcmciaSocketInfo.bArrayIrqRouting[dwIndex] = (BYTE) pBridge->GetFunctionIrq();
    }

    m_PcmciaSocketInfo.dwNumOfPowerEntry = NUM_POWER_ENTRIES;
    m_PcmciaSocketInfo.dwNumOfWindows    = pBridge->GetMemWindowCount() + 
                                           pBridge->GetIoWindowCount();
    m_PcmciaSocketInfo.dwBusNumber       = 0;
    m_bResuming                          = FALSE;

    if(pBridge->GetRegPowerOption(&dwPowerOption))
    {
        m_SockState.dwInteruptStatus |= ((dwPowerOption & REG_POWER_KEEP_DRIVER) !=
                                          0 ?
                                          SOCK_INT_STATUS_CHG_WAKE :
                                          0 );
        m_SockState.dwInteruptStatus |= ((dwPowerOption & REG_POWER_KEEP_POWER) !=
                                          0 ?
                                          (SOCK_INT_STATUS_CHG_WAKE |
                                           SOCK_INT_FUNC_IRQ_WAKE) :
                                          0);
    }
    if((m_SockState.dwInteruptStatus & SOCK_INT_STATUS_CHG_WAKE) != 0)
    {
        m_pBridge->SetupWakeupSource((m_SockState.dwInteruptStatus & SOCK_INT_STATUS_CHG_WAKE) !=
                                      0 );
    }

    // Map device registers.
    // 
    if (!MapDeviceRegisters(pBridge))
    {
        RETAILMSG(TRUE, (TEXT("ERROR: CPcmciaCardSocket: MapDeviceRegisters failed.\r\n")));
        return;
    }

    // Get a unique socket index value to be used as the socket handle.
    m_dwSocketIndex = 0;
    while(m_dwSocketIndex == 0)
    {
        m_dwSocketIndex = ( DWORD )
                          InterlockedIncrement( ( LONG * ) &m_dwSocketLastIndex ); 
        //Make sure it does not already exist.
        CPcmciaCardSocket* pSocket = GetSocket( ( HANDLE ) m_dwSocketIndex );
        if( pSocket != NULL )
        {
            // Duplicated, retry.
            m_dwSocketIndex = 0;
            pSocket->DeRef();
        }
    }


    DEBUGMSG(ZONE_SOCKET, (TEXT("-CPcmciaCardSocket::CPcmciaCardSocket\r\n")));
}


CPcmciaCardSocket::~CPcmciaCardSocket()
{

    DEBUGMSG(ZONE_SOCKET, (TEXT("+CPcmciaCardSocket::Deinitialize()\r\n")));

    Lock();
    m_pBridge->SetupWakeupSource(FALSE );
    BOOL bInitWindow = CardDeInitWindow();
    DEBUGCHK( bInitWindow );
    Unlock();

    DEBUGMSG(ZONE_SOCKET, (TEXT("-CPcmciaCardSocket::Deinitialize()\r\n")));
}


BOOL CPcmciaCardSocket::MapDeviceRegisters(CPcmciaBusBridge* pBridge)
{

    m_pGPIORegs                                   = pBridge->m_pGPIORegs;
//    m_pBLRegs                                     = pBridge->m_pBLRegs;
    m_pOSTRegs                                    = pBridge->m_pOSTRegs;
    m_pMemCtrlRegs                                = pBridge->m_pMemCtrlRegs;

    m_strPCCardSocketHandle.pstrGpioRegsHandle    = (XLLP_GPIO_T *) m_pGPIORegs;
//    m_strPCCardSocketHandle.pstrBcrHandle         = (XLLP_BCR_T *)  m_pBLRegs;
    m_strPCCardSocketHandle.pstrOstRegsHandle     = (XLLP_OST_T *)  m_pOSTRegs;
    m_strPCCardSocketHandle.pstrMemCtrlRegsHandle = (XLLP_MEMORY_CONTROL_REGISTER_T *) m_pMemCtrlRegs;

    m_strPCCardSocketHandle.pstrPCCardSocketState = &m_strPCCardSocketState;
    m_strPCCardSocketHandle.pstrCardTimingHandle  = (XLLP_CARDTIMING_T *)&m_strPCCardExpMemTiming;

    m_pstrPCCardSocketHandle = &m_strPCCardSocketHandle;  

    return(TRUE);
}


//
// GetSocket - return Socket state
// [In/Out] pBuf - pointer to SS_SOCKET_STATE struct
// [In/Out] pnBuf - pointer to size of struct pointed to by pBuf
// return CERR_SUCCESS on success, CERR_UNSUPPORTED_SERVICE if size is anomolous
//
STATUS CPcmciaCardSocket::CardGetSocket( PSS_SOCKET_STATE pState )
{
    UINT16 statusReg        = 0;
    DWORD dwLastEventStatus = 0;

    DEBUGMSG( ZONE_SOCKET, ( TEXT( "+CPcmciaCardSocket::GetSocket()\r\n" ) ) );
    Lock();

    if( pState )
    {
        m_SockState.dwEventStatus = 0;

        //
        // Determine the slot status.
        //
        BOOL bCardDetectStatus = FALSE;
        BOOL bIRQReadyStatus   = FALSE;
        BOOL bBvd1Status       = FALSE;
        BOOL bBvd2Status       = FALSE;
		UINT16        nSlotNumber       = m_pBridge->GetSlotNumber();

		statusReg = XllpPCCardSocketState( m_pstrPCCardSocketHandle, nSlotNumber);

        switch(nSlotNumber)
        {
        case 1:
//            statusReg         = m_pBLRegs->pcmcia1_srcr;
            bCardDetectStatus = !((statusReg & PCMCIA_S1_nCD_MASK) >> 5);
            bBvd1Status       = !((statusReg & PCMCIA_S1_nSTSCHG_BVD1_MASK) >> 8);
            bBvd2Status       = !((statusReg & PCMCIA_S1_nSPKR_BVD2_MASK) >> 9);
            bIRQReadyStatus   = ((statusReg & PCMCIA_S1_nIRQ_MASK) >> 10);
            break;
        case 0:
        default:
//            statusReg         = m_pBLRegs->pcmcia0_srcr;
            bCardDetectStatus = !((statusReg & PCMCIA_S0_nCD_MASK) >> 5);
            bBvd1Status       = !((statusReg & PCMCIA_S0_nSTSCHG_BVD1_MASK) >> 8);
            bBvd2Status       = !((statusReg & PCMCIA_S0_nSPKR_BVD2_MASK) >> 9);
            bIRQReadyStatus   = ((statusReg & PCMCIA_S0_nIRQ_MASK) >> 10);
            break;
        }

        m_SockState.dwEventStatus  |= (bCardDetectStatus ?
                                       SOCK_EVENT_CD :
                                       0 );
        m_SockState.dwEventStatus  |= (bBvd1Status ?
                                       SOCK_EVENT_BVD1 :
                                       0 );
        m_SockState.dwEventStatus  |= (bBvd2Status ?
                                       SOCK_EVENT_BVD2 :
                                       0 );
        m_SockState.dwEventStatus  |= (bIRQReadyStatus ?
                                       SOCK_EVENT_READY :
                                       0 );

        m_SockState.dwEventChanged |= (m_SockState.dwEventStatus ^ dwLastEventStatus);
        dwLastEventStatus           = m_SockState.dwEventStatus;

        *pState = m_SockState;

        DEBUGMSG( ZONE_SOCKET,
                  ( TEXT( "-CPcmciaCardSocket::GetSocket(): dwEventMask: %x dwEventChanged: %x dwEventStatus: %x\r\n" ),
                    pState->dwEventMask,
                    pState->dwEventChanged,
                    pState->dwEventStatus ) );

⌨️ 快捷键说明

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