📄 init.cpp
字号:
//**********************************************************************
//
// Filename: init.cpp
//
// Description: Platform dependent PCMCIA initialization functions
//
// 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.
//
// Use of this source code is subject to the terms of the Cirrus 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
// EULA.RTF on your install media.
//
// Copyright(c) Cirrus Logic Corporation 2005, All Rights Reserved
//
//**********************************************************************
#include <windows.h>
#include <types.h>
#include <socksv2.h>
#include <ceddk.h>
#include <devload.h>
//#include <pcibus.h>
#include "PDSocket.h"
#ifdef DEBUG
DBGPARAM dpCurSettings =
{
TEXT("PCMCIA"),
{
TEXT("Init"),TEXT("Deinit"),TEXT("Main"),TEXT("I/O"),
TEXT("PCMCIA"),TEXT("PCI"),TEXT("IOCTL"),TEXT("CDROM"),
TEXT("DMA"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),
TEXT("Warning"),TEXT("Error"),TEXT("Helper"), TEXT("Current")
},
ZONE_PDD | ZONE_API| ZONE_FUNCTION
};
#endif
class CSocketContainer : public CStaticContainer <CPcmciaCardSocket, MAX_NUM_SLOTS>
{
public:
CPcmciaCardSocket* ObjectBySocket( HANDLE hSocket )
{
CPcmciaCardSocket* pObject = NULL;
Lock();
for( DWORD dwIndex = 0; dwIndex < m_dwArraySize; dwIndex++ )
{
if( ( pObject = m_rgObjectArray[dwIndex] ) != NULL )
{
if( pObject->GetSocketHandle() == hSocket )
{
pObject->AddRef();
break;
}
}
pObject = NULL;
}
Unlock();
return pObject;
}
};
class CSocketContainer* pSocketContainer = NULL;
extern "C"
BOOL WINAPI DllEntry( HANDLE hInstDll,
DWORD dwReason,
LPVOID lpvReserved )
{
switch( dwReason )
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER( ( HINSTANCE ) hInstDll );
DEBUGMSG( ZONE_INIT, ( TEXT( "PCC_EP93XX : DLL_PROCESS_ATTACH\r\n" ) ) );
DisableThreadLibraryCalls( ( HMODULE ) hInstDll );
pSocketContainer = new CSocketContainer();
if( !pSocketContainer )
{
return ( FALSE );
}
break;
case DLL_PROCESS_DETACH:
DEBUGMSG( ZONE_INIT, ( TEXT( "PCC_EP93XX : DLL_PROCESS_DETACH\r\n" ) ) );
if( pSocketContainer )
{
delete pSocketContainer;
pSocketContainer = NULL;
}
break;
}
return ( TRUE );
}
extern "C"
DWORD Init( DWORD dwInfo )
{
CPcmciaBusBridge* pSocket = new CPcmciaBusBridge( ( LPCTSTR ) dwInfo );
if( pSocket )
{
if( pSocket->Init() )
{
return ( DWORD ) pSocket;
}
else
{
delete pSocket;
}
}
return 0;
}
extern "C"
void Deinit( DWORD dwSocketNum ) // This argument is return value from PDCardInitServices.
{
CPcmciaBusBridge* pSocket = ( CPcmciaBusBridge* ) dwSocketNum;
if( pSocket )
{
delete pSocket;
}
}
CPcmciaCardSocket* GetSocket( HANDLE hSocket )
{
return ( pSocketContainer !=
0 ?
pSocketContainer->ObjectBySocket( hSocket ) :
NULL );
}
void CPcmciaBusBridge::InsertPcmciaCardSocket(CPcmciaCardSocket* pSocket)
{
if( pSocket )
{
Lock();
if( m_prgCardSocket != pSocket )
RemovePcmciaCardSocket();
if( m_prgCardSocket == NULL &&
pSocketContainer != NULL )
{
CPcmciaCardSocket* pReturn = pSocketContainer->InsertObjectAtEmpty( NULL,
pSocket );
if( pReturn )
{
SS_SOCKET_STATE sSockState;
m_prgCardSocket = pSocket;
m_prgCardSocket->CardGetSocket( &sSockState );
sSockState.dwEventChanged |= SOCK_EVENT_CD;
sSockState.dwEventStatus |= SOCK_EVENT_CD;
CallBackToCardService(m_SocketNumber,
m_prgCardSocket->GetSocketHandle(),
&sSockState );
}
else
{
// This should never happens.But we do our best to recover.
DEBUGCHK( FALSE );
delete pSocket;
}
}
else
DEBUGCHK( FALSE );
Unlock();
}
else
{
DEBUGCHK( FALSE );
}
}
void CPcmciaBusBridge::RemovePcmciaCardSocket( void )
{
Lock();
if( m_prgCardSocket )
{
SS_SOCKET_STATE sSockState;
m_prgCardSocket->CardGetSocket( &sSockState );
sSockState.dwEventChanged |= SOCK_EVENT_CD;
sSockState.dwEventStatus &= ~SOCK_EVENT_CD;
CallBackToCardService(m_SocketNumber,
m_prgCardSocket->GetSocketHandle(),
&sSockState );
if( pSocketContainer )
{
CPcmciaCardSocket* pSocket = pSocketContainer->RemoveObjectBy( m_prgCardSocket );
DEBUGCHK( pSocket != NULL );
}
else
{
// This should never happens.But we do our best to recover.
DEBUGCHK( FALSE );
delete m_prgCardSocket;
}
m_prgCardSocket = NULL;
}
Unlock();
}
extern "C"
BOOL PowerUp( DWORD dwData )
{
CPcmciaBusBridge* pSocket = ( CPcmciaBusBridge* ) dwData;
if( pSocket )
{
pSocket->PowerMgr( FALSE );
}
return TRUE;
};
extern "C"
BOOL PowerDown( DWORD dwData )
{
CPcmciaBusBridge* pSocket = ( CPcmciaBusBridge* ) dwData;
if( pSocket )
{
pSocket->PowerMgr( TRUE );
}
return TRUE;
}
STATUS PDCardGetSocket( HANDLE hSocket, // @parm Socket number (first socket is 0)
PSS_SOCKET_STATE pState // @parm Pointer to PDCARD_SOCKET_STATE structure
)
{
STATUS rStatus =CERR_BAD_SOCKET;
CPcmciaCardSocket* pSocket = GetSocket( hSocket );
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardGetSocket entered\r\n" ) ) );
if( pSocket )
{
rStatus = pSocket->CardGetSocket( pState );
pSocket->DeRef();
}
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardGetSocket %d\r\n" ), rStatus ) );
return rStatus;
}
STATUS PDCardSetSocket( HANDLE hSocket, // @parm Socket number (first socket is 0)
PSS_SOCKET_STATE pState // @parm Pointer to PDCARD_SOCKET_STATE structure
)
{
STATUS rStatus =CERR_BAD_SOCKET;
CPcmciaCardSocket* pSocket = GetSocket( hSocket );
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardSetSocket\r\n" )) );
if( pSocket )
{
rStatus = pSocket->CardSetSocket( pState );
pSocket->DeRef();
}
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardSetSocket %d\r\n" ), rStatus ) );
return rStatus;
}
STATUS PDCardResetSocket( HANDLE hSocket // @parm Socket number (first socket is 0)
)
{
STATUS rStatus =CERR_BAD_SOCKET;
CPcmciaCardSocket* pSocket = GetSocket( hSocket );
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardResetSocket \r\n" ) ) );
if( pSocket )
{
rStatus = pSocket->CardResetSocket();
pSocket->DeRef();
}
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardResetSocket %d\r\n" ), rStatus ) );
return rStatus;
}
STATUS PDCardGetWindow( UINT32 uWindow, // @parm Window number (the first window is 0)
PSS_WINDOW_STATE pWindowState // @parm Pointer to a PDCARD_WINDOW_STATE structure.
)
{
STATUS rStatus =CERR_BAD_WINDOW;
if( pWindowState )
{
HANDLE hSocket = pWindowState->hSocket;
CPcmciaCardSocket* pSocket = GetSocket( hSocket );
if( pSocket != NULL )
{
rStatus = pSocket->CardGetWindow( uWindow, pWindowState );
pSocket->DeRef();
}
}
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardGetWindow %d\r\n" ), rStatus ) );
return rStatus;
}
STATUS PDCardSetWindow( UINT32 uWindow, // @parm Window number (the first window is 0)
PSS_WINDOW_STATE pWindowState // @parm Pointer to a PDCARD_WINDOW_STATE structure.
)
{
STATUS rStatus =CERR_BAD_WINDOW;
if( pWindowState )
{
HANDLE hSocket = pWindowState->hSocket;
CPcmciaCardSocket* pSocket = GetSocket( hSocket );
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardSetWindow 1111111\r\n" ) ) );
if( pSocket != NULL )
{
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardSetWindow 2222222\r\n" ) ) );
rStatus = pSocket->CardSetWindow( uWindow, pWindowState );
pSocket->DeRef();
}
}
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardSetWindow %d\r\n" ), rStatus ) );
return rStatus;
}
STATUS PDCardInquireWindow( UINT32 uWindow, // @parm Window number (the first window is 0)
PSS_WINDOW_INFO pWinInfo // @parm Pointer to a PDCARD_WINDOW_INFO structure.
)
{
STATUS rStatus =CERR_BAD_WINDOW;
if( pWinInfo )
{
HANDLE hSocket = pWinInfo->hSocket;
CPcmciaCardSocket* pSocket = GetSocket( hSocket );
if( pSocket )
{
rStatus = pSocket->CardInquireWindow( uWindow, pWinInfo );
pSocket->DeRef();
}
}
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardInquireWindow %d\r\n" ), rStatus ) );
return rStatus;
}
STATUS PDCardInquireSocket( HANDLE hSocket, PSS_SOCKET_INFO pSocketInfo )
{
STATUS rStatus =CERR_BAD_SOCKET;
CPcmciaCardSocket* pSocket = GetSocket( hSocket );
if( pSocket )
{
rStatus = pSocket->CardInquireSocket( pSocketInfo );
pSocket->DeRef();
}
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardInquireSocket %d\r\n" ), rStatus ) );
return rStatus;
}
STATUS PDCardAccessMemory( HANDLE hSocket, PSS_MEMORY_ACCESS pMemoryAccess )
{
STATUS rStatus =CERR_BAD_SOCKET;
CPcmciaCardSocket* pSocket = GetSocket( hSocket );
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardAccessMemory \r\n" )) );
if( pSocket )
{
rStatus = pSocket->CardAccessMemory( pMemoryAccess );
pSocket->DeRef();
}
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDCardAccessMemory %d\r\n" ), rStatus ) );
return rStatus;
}
STATUS PDGetPowerEntry( HANDLE hSocket,
PDWORD pdwNumOfEnery,
PSS_POWER_ENTRY pPowerEntry )
{
STATUS rStatus =CERR_BAD_SOCKET;
CPcmciaCardSocket* pSocket = GetSocket( hSocket );
if( pSocket )
{
rStatus = pSocket->GetPowerEntry( pdwNumOfEnery, pPowerEntry );
pSocket->DeRef();
}
DEBUGMSG( ZONE_API, ( TEXT( "PCC_EP93XX : PDGetPowerEntry %d\r\n" ), rStatus ) );
return rStatus;
}
const SS_SOCKET_SERVICE CPcmciaBusBridge::MAINSTONEIISocketServiceStatic =
{
0,//
PDCardInquireSocket,
PDCardGetSocket,
PDCardSetSocket,
PDCardResetSocket,
PDCardInquireWindow,
PDCardGetWindow,
PDCardSetWindow,
PDCardAccessMemory,
PDGetPowerEntry,
NULL, // No need to support Translate Bus address.
NULL // No need to support Translate System Address.
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -