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

📄 init.cpp

📁 EP9315开发板的Wince6.0的BSP包文件
💻 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 + -