📄 pcmsock.cpp
字号:
// Copyright (c) David Vescovi. All rights reserved.
// Part of Project DrumStix
// Windows Embedded Developers Interest Group (WE-DIG) community project.
// http://www.we-dig.org
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
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:
Socket Services Object for 16-bit Interface.
Notes:
--*/
#include <windows.h>
#include <types.h>
#include <socksv2.h>
#include <cardsv2.h>
#include <memory.h>
#include <ceddk.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_pOSTRegs = pBridge->m_pOSTRegs;
m_pS1baseAttr = pBridge->m_pS1baseAttr;
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 )
{
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;
switch(m_pBridge->GetSlotNumber())
{
case 1:
bCardDetectStatus = (0x01 == *m_pS1baseAttr) ? TRUE : FALSE;
bIRQReadyStatus = (m_pGPIORegs->GPLR0 & GPIO_27_S1_READY_nIREQ) ? TRUE : FALSE;
bBvd1Status = (m_pGPIORegs->GPLR0 & GPIO_18_S1_BVD1) ? FALSE : TRUE;
break;
case 0:
default:
bCardDetectStatus = (m_pGPIORegs->GPLR0 & GPIO_11_S0_nCARD_DETECT) ? FALSE : TRUE;
bIRQReadyStatus = (m_pGPIORegs->GPLR0 & GPIO_26_S0_READY_nIREQ) ? TRUE : FALSE;
bBvd1Status = (m_pGPIORegs->GPLR0 & GPIO_4_S0_BVD1) ? FALSE : TRUE;
bBvd2Status = (m_pGPIORegs->GPLR1 & GPIO_36_S0_BVD2) ? FALSE : TRUE;
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,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -