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

📄 pdsocket.cpp

📁 EP9315开发板的Wince6.0的BSP包文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    m_bResumeFlag = TRUE;
    SetInterruptEvent( m_dwCSCSysIntr );
    return TRUE;
}


void CPcmciaBusBridge::PowerCycleEvent(UINT16 nSlotNumber)
{
    Lock();
    m_rgfPowerCycleEvent = TRUE;
    SetEvent( m_hISTEvent );
    Unlock();
}
void  CPcmciaBusBridge::ForceEjectEvent(UINT16 nSlotNumber)
{
    Lock();
    m_rgForceEject = TRUE;
    SetEvent( m_hISTEvent );
    Unlock();
}


DWORD CPcmciaBusBridge::ThreadRun() // This is card status change IST
{
    UINT16 statusReg            = 0;
    BOOL  bLastCardDetectStatus = FALSE;
    BOOL  bLastIRQReadyStatus   = FALSE;
    BOOL  bLastBvd1Status       = FALSE;
    BOOL  bLastBvd2Status       = FALSE;
    DWORD dwLastNotifyEvents    = FALSE;
    DWORD  dwNotifyEvents       = 0;
    BOOL bIsCardInserted        = FALSE;

	ULONG	ulGPIOF;

    // Test if a PCMCIA card is already inserted in one of the sockets
/*
    switch(m_SlotNumber)
    {
    case 1:
        statusReg             = m_pBLRegs->pcmcia1_srcr;
        bLastCardDetectStatus = !((statusReg & PCMCIA_S1_nCD_MASK) >> 5);
        if (bLastCardDetectStatus)
        {
            bLastIRQReadyStatus   = ((statusReg & PCMCIA_S1_nIRQ_MASK) >> 10);
            bLastBvd1Status       = !((statusReg & PCMCIA_S1_nSTSCHG_BVD1_MASK) >> 8);
            bLastBvd2Status       = !((statusReg & PCMCIA_S1_nSPKR_BVD2_MASK) >> 9);
        }
        break;
    case 0:
    default:
        statusReg             = m_pBLRegs->pcmcia0_srcr;
        bLastCardDetectStatus = !((statusReg & PCMCIA_S0_nCD_MASK) >> 5);
        if (bLastCardDetectStatus)
        {
            bLastIRQReadyStatus   = ((statusReg & PCMCIA_S0_nIRQ_MASK) >> 10);
            bLastBvd1Status       = !((statusReg & PCMCIA_S0_nSTSCHG_BVD1_MASK) >> 8);
            bLastBvd2Status       = !((statusReg & PCMCIA_S0_nSPKR_BVD2_MASK) >> 9);
        }
        break;
    }
	*/

	ulGPIOF=*GPIO_PFDR;
//    bLastCardDetectStatus= ( ulGPIOF & (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ) ? false: true;
    bLastCardDetectStatus= ( ulGPIOF & (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ) == (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ? false: true;

	if( bLastCardDetectStatus )
	{
		bLastBvd1Status       = ulGPIOF & GPIOF_PCMCIA_BVD1 ;
		bLastBvd2Status       = ulGPIOF & GPIOF_PCMCIA_BVD2 ;
		bLastIRQReadyStatus   = ulGPIOF & GPIOF_PCMCIA_IRQ;
	}

//    bLastCardDetectStatus= false;
//    bLastBvd1Status       = false;
//    bLastBvd2Status       = false;
//    bLastIRQReadyStatus   = false;



    if (bLastCardDetectStatus)
    {
        InsertPcmciaCardSocket(CreatePCMCIASocket(this, m_SlotNumber));
        bIsCardInserted = true;
    }

	DEBUGMSG( ZONE_INT,( L"EP93XX: PCCardBus interrupt handler %d\r\n",m_fPollingMode ) );

    while( !m_bTerminated )
    {
        BOOL bInterrupt;

        ASSERT(m_hISTEvent != NULL);

        bInterrupt = (WaitForSingleObject(m_hISTEvent, m_dwPollTimeout) != WAIT_TIMEOUT);
        if( m_fPollingMode )    // Fake the interrupt if we're polling.
        {
            bInterrupt = true;
        }
		DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus Get interrupt\r\n" ) );

		Sleep(10 );
        if (!bInterrupt)    // we have reached a timeout in non-pooling mode or something bad has occured.
        {
			DEBUGMSG( ZONE_INT,( L"PCC EP93XX interrupt ERROR\r\n" ) );
            continue;
        }

        Lock();

        //
        // Determine the slot status.
        //
        BOOL bCardDetectStatus;
        BOOL bIRQReadyStatus;
        BOOL bBvd1Status;
        BOOL bBvd2Status;

		ulGPIOF=*GPIO_PFDR;

//		*GPIO_FINTTYPE2   = ~ulGPIOF & ( GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2 | GPIOF_PCMCIA_BVD1 | GPIOF_PCMCIA_BVD2);
        //bCardDetectStatus = ( ulGPIOF & (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ) ? false: true;
	    bCardDetectStatus= ( ulGPIOF & (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ) == (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ? false: true;

		if( bCardDetectStatus )
		{
			bBvd1Status       = ulGPIOF & GPIOF_PCMCIA_BVD1 ;
			bBvd2Status       = ulGPIOF & GPIOF_PCMCIA_BVD2 ;
			bIRQReadyStatus   = ulGPIOF & GPIOF_PCMCIA_IRQ;
		}

		/*
        switch(m_SlotNumber)
        {
        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;
        }
		*/

		DEBUGMSG( ZONE_INT,( L"PCCardBus Detect %d  BVD1 %d BVD2 %d IRQ %d\r\n"
			,bCardDetectStatus
			,bBvd1Status
			,bBvd2Status
			,bIRQReadyStatus
			));

		DEBUGMSG( ZONE_INT,( L"PCCardBus LAST Detect %d  BVD1 %d BVD2 %d IRQ %d\r\n"
			,bLastCardDetectStatus
			,bLastBvd1Status
			,bLastBvd2Status
			,bLastIRQReadyStatus
			));

        // if nothing has changed, continue to the next slot
        if( !m_rgfPowerCycleEvent && !m_rgForceEject &&
            bCardDetectStatus == bLastCardDetectStatus &&
            bBvd1Status == bLastBvd1Status &&
            bBvd2Status == bLastBvd2Status &&
            bIRQReadyStatus == bLastIRQReadyStatus)
        {
			DEBUGMSG( ZONE_INT,( L"PCC EP93XX InterruptDone\r\n" ) );
			InterruptDone( m_dwCSCSysIntr );
            Unlock();
            continue;
        }
/*
		if( bCardDetectStatus ) 
			*GPIO_FINTTYPE2 |= (GPIOF_PCMCIA_CD1|GPIOF_PCMCIA_CD2);  //Card is present, so set CD to rising edge triger.
		else
			*GPIO_FINTTYPE2 &= ~(GPIOF_PCMCIA_CD1|GPIOF_PCMCIA_CD2);
*/

        bLastCardDetectStatus = bCardDetectStatus;
        bLastBvd1Status       = bBvd1Status;
        bLastBvd2Status       = bBvd2Status;
        bLastIRQReadyStatus   = bIRQReadyStatus;

        //
        // Figure out the socket state
        //

        if(bCardDetectStatus)
        {
            dwNotifyEvents |= SOCK_EVENT_CD;

            if (bIRQReadyStatus)
            {
                dwNotifyEvents |= SOCK_EVENT_READY;
            }

            if(bBvd1Status)
            {
                dwNotifyEvents |= SOCK_EVENT_BVD1;
            }
    
            if(bBvd2Status)
            {
                dwNotifyEvents |= SOCK_EVENT_BVD2;
            }
						
        }
        else
        {
            dwNotifyEvents &= ~(SOCK_EVENT_CD);	               
        }

        Unlock();
        
        if (m_rgForceEject) {
			DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus int 00000000000\r\n" ) );
            m_rgForceEject = FALSE;
            RemovePcmciaCardSocket(); 
            bIsCardInserted = false;
        }
        
        if( bIsCardInserted && !bCardDetectStatus )
        {
			DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus int 111111111\r\n" ) );
            RemovePcmciaCardSocket();
            bIsCardInserted = false;
        }
        else if ( !bIsCardInserted && bCardDetectStatus )
        {
			DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus int 222222222\r\n" ) );
            RemovePcmciaCardSocket();
            InsertPcmciaCardSocket(CreatePCMCIASocket(this, m_SlotNumber));
            bIsCardInserted = true;
        }
        else
        {
			DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus int 33333333333\r\n" ) );

            // Other Event left for type specific socket
            DWORD dwNotifyEventsChanged = dwLastNotifyEvents ^ dwNotifyEvents;
            dwLastNotifyEvents = dwNotifyEvents;
            if (m_prgCardSocket)
            {
                m_prgCardSocket->SocketEventHandle( dwNotifyEventsChanged, dwNotifyEvents );
            }
        }

        if( !m_fPollingMode )
        {
            DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus Call InterruptDone\r\n" ) );
            InterruptDone( m_dwCSCSysIntr );
        }
    } // while(!m_bTerminated) 

    return(0);

}


BOOL CPcmciaBusBridge::SetupWakeupSource( BOOL bSet )
{
    return(FALSE);
}


void CPcmciaBusBridge::CallBackToCardService( UINT16 nSocketNumber,
                                              HANDLE hSocket,
                                              PSS_SOCKET_STATE pSocketState )
{
    if( m_pCallBackToCardService )
    {
        __try
        {
            m_pCallBackToCardService( hSocket,
                                      nSocketNumber,
                                      pSocketState );
        } __except( EXCEPTION_EXECUTE_HANDLER )
        {
            DEBUGCHK( FALSE );
        }
    }
    else
    {
        DEBUGCHK( FALSE );
    }
}


BOOL CPcmciaBusBridge::GetSocketNumberFromCS(BOOL bGet)
{
    STATUS status = CERR_BAD_ARGS;
    if (m_pRequestSocketNumber && m_pDeleteSocket)
    {
        __try
        {
            status = (bGet ?
                      m_pRequestSocketNumber(&m_SocketNumber,
                                             sizeof( MAINSTONEIISocketServiceStatic ),
                                             &MAINSTONEIISocketServiceStatic,
                                             GetSocketName()) :
                       m_pDeleteSocket(m_SocketNumber));
        } __except(EXCEPTION_EXECUTE_HANDLER)
        {
            DEBUGCHK(FALSE);
            status = CERR_BAD_ARGS;
        }
    }
    DEBUGCHK(status == CERR_SUCCESS);
    return (status == CERR_SUCCESS);
}


⌨️ 快捷键说明

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