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

📄 pdsocket.cpp

📁 Windows CE 6.0 针对PXA270的开发板的BSP参考代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                         &dwSize ) )
    {
        m_uPriority = ( UINT )dwData;
    }

    dwRet = ERROR_SUCCESS;

    grc_fail : return dwRet;
}   // GetRegistryConfig


BOOL CPcmciaBusBridge::InitCardBusBridge( void )
{

    // Get PCCARD controller registry information.
    if((GetRegistryConfig()) != ERROR_SUCCESS)
    {
        DEBUGMSG( ZONE_PDD,
                  ( TEXT( "PDCardInitServices GetRegistryConfig failed.\r\n" )));
        return(FALSE);
    }

    // Map PCCARD controller device buffers.
    if( !MapDeviceRegisters() )
    {
        DEBUGMSG( ZONE_PDD,
                  ( TEXT( "PDCardInitServices MapDeviceRegisters failed %d\r\n" )));
        return(FALSE);
    }

    // Initialize the PCMCIA bridge hardware.
    if( !InitializeBridgeHW() )
    {
        DEBUGMSG( ZONE_PDD,
                  ( TEXT( "PDCardInitServices InitializeBridgeHW failed %d\r\n" )));
        return(FALSE);
    }

    // Initialize slot interrupts.
    InstallIsr();

    return(TRUE);
}


BOOL CPcmciaBusBridge::Init()
{
    if(!loadPcCardEntry())
    {
        return(FALSE);
    }

    if(!InitCardBusBridge())
    {
        return(FALSE);
    }

    if (!GetSocketNumberFromCS( TRUE ))
    {
        return(FALSE);
    }

    // Set Tread Priority.
    CeSetPriority( m_uPriority );
    m_bTerminated = FALSE;

    ThreadStart();
    return(TRUE);
}


BOOL CPcmciaBusBridge::GetRegPowerOption( PDWORD pOption )
{
    if( pOption )
    {
        return GetRegValue( POWER_OPTION_NAME,
                            ( PBYTE ) pOption,
                            sizeof( DWORD ) );
    }
    return TRUE;
}


void CPcmciaBusBridge::PowerMgr( BOOL bPowerDown )
{
}


BOOL CPcmciaBusBridge::NeedPowerResuming()
{
    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;

    // 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;
    }

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

    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;
        }

        if (!bInterrupt)    // we have reached a timeout in non-pooling mode or something bad has occured.
        {
            continue;
        }

        Lock();

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

        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;
        }

        // if nothing has changed, continue to the next slot
        if( !m_rgfPowerCycleEvent && !m_rgForceEject &&
            bCardDetectStatus == bLastCardDetectStatus &&
            bBvd1Status == bLastBvd1Status &&
            bBvd2Status == bLastBvd2Status &&
            bIRQReadyStatus == bLastIRQReadyStatus)
        {
            Unlock();
            continue;
        }

        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) {
            m_rgForceEject = FALSE;
            RemovePcmciaCardSocket(); 
            bIsCardInserted = false;
        }
        
        if( bIsCardInserted && !bCardDetectStatus )
        {
            RemovePcmciaCardSocket();
            bIsCardInserted = false;
        }
        else if ( !bIsCardInserted && bCardDetectStatus )
        {
            RemovePcmciaCardSocket();
            InsertPcmciaCardSocket(CreatePCMCIASocket(this, m_SlotNumber));
            bIsCardInserted = true;
        }
        else
        {

            // 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_FUNCTION,
                      ( 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 + -