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

📄 pcmciabridge.cpp

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		return pNewSocket;
    }
	
    return NULL;
}

CPcmciaSocket* CPcmciaBusBridge::ObjectBySocket( HANDLE hSocket )
{
	CPcmciaSocket*  pObject = NULL;
	
	DEBUGMSG( 1, ( TEXT( "CPcmciaBusBridge::ObjectBySocket  m_dwArraySize=0x%x\r\n" ), m_dwArraySize) );
	    
	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;
}

void CPcmciaBusBridge::InsertPcmciaCardSocket( CPcmciaSocket* pSocket )
{
	DEBUGMSG( ZONE_PDD, (TEXT("PCCARD: +CPcmciaBusBridge::InsertPcmciaCardSocket\n")));

    if( pSocket )
    {
        //Lock();
        if( m_pCardSocket != pSocket )
            RemovePcmciaCardSocket(  );
        if( m_pCardSocket == NULL  )
        {
            CPcmciaSocket* pReturn = InsertObjectAtEmpty( NULL, pSocket );
            if( pReturn )
            {
                SS_SOCKET_STATE sSockState;
                                              
                m_pCardSocket = pSocket;
                m_pCardSocket->CardGetSocket( &sSockState );
                sSockState.dwEventChanged |= SOCK_EVENT_CD;
                sSockState.dwEventStatus |= SOCK_EVENT_CD;
                
                CallBackToCardService( m_pCardSocket->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 );
    }

	DEBUGMSG( ZONE_PDD, (TEXT("PCCARD: -CPcmciaBusBridge::InsertPcmciaCardSocket\n")));
}


void CPcmciaBusBridge::RemovePcmciaCardSocket( )
{
	DEBUGMSG( ZONE_PDD, (TEXT("PCCARD: +CPcmciaBusBridge::RemovePcmciaCardSocket\n")));
        Lock();
	
    if( m_pCardSocket )
    {
        SS_SOCKET_STATE sSockState;
        m_pCardSocket->CardGetSocket( &sSockState );
        sSockState.dwEventChanged |= SOCK_EVENT_CD;
        sSockState.dwEventStatus &= ~SOCK_EVENT_CD;
        CallBackToCardService( m_pCardSocket->GetSocketHandle(),
                               &sSockState );

		CPcmciaSocket* pSocket = RemoveObjectBy( m_pCardSocket );
		DEBUGCHK( pSocket != NULL );

        m_pCardSocket = NULL;
    }
    Unlock();
   	
	
	DEBUGMSG( ZONE_PDD, (TEXT("PCCARD: -CPcmciaBusBridge::RemovePcmciaCardSocket\n")));
}

void CPcmciaBusBridge::PowerManager( BOOL bPowerDown )
{
    if( bPowerDown )
    {
		g_vPcmciaReg->PER = 0;	// Disable all the interrupts
	
		SetPccPower(0, TRUE);	// Set GPIO pins to 0 volt	

		g_vPcmciaReg->PGCR = PCMCIA_PGCR_LOWPWRMODE;	// Set to Lower Power mode

		//DeinitGpio();
    }
    else
    {
		//InitGpio();

		// Do software reset - then clear bit after it's done 
		PCMCIA_RESET_SOCKET(1);
		UINT32 i=100;
		while(i-- <1);
		//Sleep(1000);
		PCMCIA_RESET_SOCKET(0);

		g_vPcmciaReg->PER = 0;	// Disable all the interrupts
	
		SetPccPower(0, TRUE);	// Set GPIO pins to 0 volt	
	
		g_vPcmciaReg->PGCR = PCMCIA_PGCR_LOWPWRMODE;	// Set to Lower Power mode
		
       	if( m_pCardSocket )
		{
			m_fCardInjectEvent = TRUE;
			SetEvent( m_hISTEvent );
		}
	}
}

void CPcmciaBusBridge::PowerCycleEvent(  )
{
    Lock();
    m_fPowerCycleEvent = TRUE;
    SetEvent( m_hISTEvent );
    Unlock();
}

void CPcmciaBusBridge::CardInjectEvent( )
{
    Lock();
    m_fCardInjectEvent = TRUE;
    SetEvent( m_hISTEvent );
    Unlock();
}

DWORD CPcmciaBusBridge::ThreadRun() // THIS is CardBusBridge IST.
{
	UINT32 	dwStatus, dwStatusChange;

	dwStatus = GET_CARD_STATUS();
	
	if (IS_CARD_INSERTED(dwStatus)) {		
		DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun()  Card is already inserted trigger the IST event\r\n" ) );
              m_fCardInjectEvent = TRUE;		
        	SetEvent( m_hISTEvent );
	}

 
	// run until signalled to terminate
	while( !m_bTerminated )
	{
    		DEBUGCHK(m_hISTEvent!=NULL);

		BOOL bInterrupt;

		bInterrupt = (WaitForSingleObject(m_hISTEvent, m_dwPollTimeout)!=WAIT_TIMEOUT);
		
		if( m_fPollingMode ) // we are pooling, fake an interrupt event
			bInterrupt = TRUE;

		//DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun()  m_fPollingMode=%d\r\n" , m_fPollingMode) );

		if (!bInterrupt) { // we have reached a timeout in non-pooling mode or something bad has occured.
			//DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun() Timeout Continue\r\n" ) );
			continue;
        	}
        	
        	
        	Lock();
	
		UINT32 fNotifyEvents = 0;

        	while (TRUE) {
            		Sleep(20);

			// See what changed and acknowledge any status change interrupts
            		fNotifyEvents = 0;
            		dwStatusChange = GET_CARD_STATUS_CHANGE();
			dwStatus = GET_CARD_STATUS();		

			//DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun() dwStatusChange=0x%X dwStatus=0x%X\r\n" , dwStatusChange, dwStatus ));

			// if nothing has changed, continue until next event
            		if( !m_fPowerCycleEvent &&
                	    !m_fCardInjectEvent &&
                            (dwStatusChange&0x7F) == 0x0 )
            		{
                		break;
            		}

			if( IS_CARDDETEC_CHANGE(dwStatusChange) )
            		{
				DEBUGMSG( ZONE_PDD,( L"PCCARD: ThreadRun() CardStatusChange\r\n" ) );
                		fNotifyEvents |= EVENT_MASK_CARD_DETECT;
            		}

            		if( m_fCardInjectEvent )
            		{
				DEBUGMSG( ZONE_PDD,( L"PCCARD: ThreadRun() CardInjectEvent\r\n" ) );
                		fNotifyEvents |= EVENT_MASK_CARD_DETECT;
                		m_fCardInjectEvent = FALSE;
            		}

            		if( m_fPowerCycleEvent )
            		{
				DEBUGMSG( ZONE_PDD,( L"PCCARD: ThreadRun() PowerCycleEvent\r\n" ) );
                		fNotifyEvents |= EVENT_MASK_POWER_CYCLE;
                		m_fPowerCycleEvent = FALSE;
            		}

            		if( fNotifyEvents & EVENT_MASK_CARD_DETECT )
            		{
                		// we're only processing Card Detection Signal.
                		// If this happens, Something has been changed. 
                		// Send out Card revmoval before doing any more process.
                        		
                		RemovePcmciaCardSocket();
                		ProcessCDD( dwStatus );
            		}
            		else
            		{
                		// Other Event left for type specific socket
				DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun() OtherEvents\r\n" ) );
                		if( m_pCardSocket )
                    		m_pCardSocket->SocketEventHandle( dwStatusChange, fNotifyEvents );
            		}
			
			dwStatusChange = 0;
        	}
        	
        	Unlock();

        if( !m_fPollingMode )
        {
            DEBUGMSG( ZONE_FUNCTION,
                      ( L"CardBus: PCCardBus Call InterruptDone\r\n" ) );
            InterruptDone( m_dwCSCSysIntr );

        }				
    } // while(!m_bTerminated) 
    return 0;      
}

void CPcmciaBusBridge::ProcessCDD( DWORD dwPStateReg )
{
    if( IS_CARD_INSERTED(dwPStateReg) )
    {
	if(!m_pCardSocket)
            InsertPcmciaCardSocket( CreatePCMCIASocket( ) );
    }
    else
    {
    // Complete removal
        if( m_pCardSocket )
        RemovePcmciaCardSocket(  );
    }
}

void CPcmciaBusBridge::CallBackToCardService( HANDLE hSocket,
                                              PSS_SOCKET_STATE pSocketState )
{
    if( m_pCallBackToCardService )
    {
        __try
        {
            m_pCallBackToCardService( hSocket,
                                      m_uSocketNum,
                                      pSocketState );
        } __except( EXCEPTION_EXECUTE_HANDLER )
        {
            DEBUGCHK( FALSE );
        }
    }
    else
    {
        DEBUGCHK( FALSE );
    }
}
BOOL CPcmciaBusBridge::GetSocketNumberFromCardService( BOOL bGet )
{
    STATUS status = CERR_BAD_ARGS;
    if( m_pRequestSocketNumber && m_pDeleteSocket )
    {
        __try
        {
            status = ( bGet ?
                       m_pRequestSocketNumber( &m_uSocketNum,
                                               sizeof( MX27SocketServiceStatic ),
                                               &MX27SocketServiceStatic,
                                               GetSocketName() ) :
                       m_pDeleteSocket( m_uSocketNum ) );
        } __except( EXCEPTION_EXECUTE_HANDLER )
        {
            DEBUGCHK( FALSE );
            status = CERR_BAD_ARGS;
        }
    }
    DEBUGCHK( status == CERR_SUCCESS );
    return ( status == CERR_SUCCESS );
}


//
// Print Pcmcia Register value
//


void PcPrintPcmciaReg(void)
{
	UINT8 i = 0;
		
	DEBUGMSG(ZONE_PDD,(TEXT("PCMCIA Register:g_vPcmciaReg:0x%X\n"),g_vPcmciaReg));
	DEBUGMSG(ZONE_PDD,(TEXT("\tPIPR [0x%X] :0x%X\n"),&(g_vPcmciaReg->PIPR),g_vPcmciaReg->PIPR));	
	DEBUGMSG(ZONE_PDD,(TEXT("\tPSCR [0x%X] :0x%X\n"),&(g_vPcmciaReg->PSCR),g_vPcmciaReg->PSCR));
	DEBUGMSG(ZONE_PDD,(TEXT("\tPER [0x%X] :0x%X\n"),&(g_vPcmciaReg->PER),g_vPcmciaReg->PER));
	DEBUGMSG(ZONE_PDD,(TEXT("\tPGSR [0x%X] :0x%X\n"),&(g_vPcmciaReg->PGSR),g_vPcmciaReg->PGSR));
	DEBUGMSG(ZONE_PDD,(TEXT("\tPGCR [0x%X] :0x%X\n"),&(g_vPcmciaReg->PGCR),g_vPcmciaReg->PGCR));
	for(i=0;i<PCMCIA_NUM_WINDOWS;i++) {
		DEBUGMSG(ZONE_PDD,(TEXT("\tPBR[%d] :0x%X = 0x%X\n"),i,&(g_vPcmciaReg->PBR[i]),g_vPcmciaReg->PBR[i]));
		DEBUGMSG(ZONE_PDD,(TEXT("\tPOR[%d] :0x%X= 0x%X\n"),i,&(g_vPcmciaReg->POR[i]),g_vPcmciaReg->POR[i]));
		DEBUGMSG(ZONE_PDD,(TEXT("\tPOFR[%d] :0x%X= 0x%X\n"),i,&(g_vPcmciaReg->POFR[i]),g_vPcmciaReg->POFR[i]));
	}	
}


⌨️ 快捷键说明

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