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

📄 pdsocket.cpp

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    {
        m_fPollingMode = TRUE; // RegQueryValueEx failed, default to TRUE
    }
    else
    {
        m_fPollingMode = dwData ? TRUE : FALSE;
    }

    // Get client (function) IRQ.
    dwSize = sizeof( DWORD );
    if( !RegQueryValueEx( CLIENT_IRQ_VALUE_NAME,
                          &dwType,
                          ( PUCHAR ) & dwData,
                          &dwSize ) )
    {
        DEBUGMSG( ZONE_PDD,
                  ( TEXT( "PCMCIA:GetRegistyConfig RegQueryValueEx(%s) failed\r\n" ),
                    CLIENT_IRQ_VALUE_NAME ) );
        goto grc_fail;
    }
    m_dwClientIrq = dwData;

    // TODO - get CD IRQ and SYSINTR - no polling.

    // Get card status change (CSC) IRQ and SYSINTR values.
    // NOTE: the CSC and CD IRQ values are part of the same IRQ multi-string in the registry.
    dwSize = sizeof( DWORD );
    if( !RegQueryValueEx( IRQ_VALUE_NAME,
                          &dwType,
                          ( PUCHAR ) & dwData,
                          &dwSize ) )
    {
        m_dwCSCIrq = 0;
        m_fPollingMode = FALSE;
    }
    else
    {
        m_dwCSCIrq = dwData;
    }
    dwSize = sizeof( DWORD );
    if( !RegQueryValueEx( SYSINTR_VALUE_NAME,
                          &dwType,
                          ( PUCHAR ) & dwData,
                          &dwSize ) )
    {
        m_dwCSCSysIntr = 0;
        m_dwCSCIrq = 0;
        m_fPollingMode = FALSE;
    }
    else
    {
        m_dwCSCSysIntr = dwData;
    }

    // Get the polling timeout value.
    dwSize = sizeof( DWORD );
    if( !RegQueryValueEx( POLL_TIMEOUT_NAME,
                          &dwType,
                          ( PUCHAR ) & dwData,
                          &dwSize ) )
    {
        // RegQueryValueEx failed; if pooling, set the timeout to 0.5 sec, otherwise set to INFINITE
        m_dwPollTimeout = m_fPollingMode ? 500 : INFINITE;
    }
    else
    {
        m_dwPollTimeout = dwData;
    }

    // Get thread priority from registry and set it.
    m_uPriority = DEFAULT_PRIORITY;
    dwSize = sizeof( DWORD );
    if( RegQueryValueEx( CSC_THREAD_PRIORITY_NAME,
                         &dwType,
                         ( PUCHAR ) & dwData,
                         &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 )
{
    if( m_prgCardSocket )
    {
        if( !bPowerDown )
        {
            //Resume
            InitializeBridgeHW();
        }

        m_prgCardSocket->PowerMgr( 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;

    //
    // Plato Device has a PCMCIA(CF) device always inserted into the socket
    //
    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;
        }

        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 )
{
    if( bSet )
    {
        KernelIoControl( IOCTL_HAL_ENABLE_WAKE,
                         &m_dwCSCSysIntr,
                         sizeof( m_dwCSCSysIntr ),
                         NULL,
                         0,
                         NULL );
    }
    else
    {
        KernelIoControl( IOCTL_HAL_DISABLE_WAKE,
                         &m_dwCSCSysIntr,
                         sizeof( m_dwCSCSysIntr ),
                         NULL,
                         0,
                         NULL );
    }
    return TRUE;
}


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( PlatoSocketServiceStatic ),
                                             &PlatoSocketServiceStatic,
                                             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 + -