亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chw.cpp

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? CPP
?? 第 1 頁 / 共 3 頁
字號:

    DEBUGCHK( g_fPowerResuming == FALSE );

    // order is important! resuming indicates that the hcd object is temporarily invalid
    // while powerup simply signals that a powerup event has occurred. once the powerup
    // flag is cleared, we will repeat this whole sequence should it get resignalled.
    g_fPowerUpFlag = FALSE;
    g_fPowerResuming = TRUE;

    const PUCHAR pBufVirt = m_pMem->m_pVirtBase, pBufPhys = m_pMem->m_pPhysBase;
    DWORD cb0 = m_pMem->m_cbTotal, cb1 = m_pMem->m_cbHighPri;

    DeviceDeInitialize();
    while (1) {  // breaks out upon successful reinit of the object

        m_pMem->ReInit();

        if (DeviceInitialize())
            break;

        // getting here means we couldn't reinit the HCD object!
        DEBUGMSG(ZONE_ERROR, (TEXT("USB cannot reinit the HCD at CE resume; retrying...\n")));
        DeviceDeInitialize();
        Sleep(15000);
    }

    // the hcd object is valid again. if a power event occurred between the two flag
    // assignments above then the IST will reinitiate this sequence.
    g_fPowerResuming = FALSE;
    if (g_fPowerUpFlag)
        PowerMgmtCallback(TRUE);
    
    return 0;
}
// ******************************************************************
VOID CHW::PowerMgmtCallback( IN BOOL fOff )
//
// Purpose: System power handler - called when device goes into/out of
//          suspend.
//
// Parameters:  fOff - if TRUE indicates that we're entering suspend,
//                     else signifies resume
//
// Returns: Nothing
//
// Notes: This needs to be implemented for HCDI
// ******************************************************************
{
    if ( fOff )
    {
        if ((GetCapability() & HCD_SUSPEND_RESUME)!= 0  ) {
            m_bDoResume=TRUE; 
            SuspendHostController();
        }
        else {
            m_bDoResume=FALSE;            
            StopHostController();
        }
    }
    else
    {   // resuming...
        g_fPowerUpFlag = TRUE;
        if (m_bDoResume)
            ResumeHostController();
        if (!g_fPowerResuming)
            // can't use member data while `this' is invalid
            SetInterruptEvent(m_dwSysIntr);
    }

    return;
}
VOID CHW::SuspendHostController()
{
    if ( m_portBase != 0 ) {
        m_portBase->HcControl.HCFS = HcRegisters::HcControl::HCFS_SUSPEND;
    }
}
VOID CHW::ResumeHostController()
{
    if ( m_portBase != 0 ) {
        m_portBase->HcControl.HCFS = HcRegisters::HcControl::HCFS_RESUME;
    }

}

DWORD CHW::SetCapability(DWORD dwCap)
{
    m_dwCapability |= dwCap; 
    if ( (m_dwCapability & HCD_SUSPEND_RESUME)!=0) {
        KernelIoControl(IOCTL_HAL_ENABLE_WAKE, &m_dwSysIntr, sizeof(m_dwSysIntr), NULL, 0, NULL);
        if (m_portBase) {
            m_portBase->HcControl.RWC=1;// OHCI 7.2.1
            m_portBase->HcControl.RWE=1;
            m_portBase->HcInterruptEnable.RD=1;
            m_portBase->HcRhStatus.reg= HcRegisters::HcRhStatus::DRWE;
        }
    }
    return m_dwCapability;
};

DWORD CHW::UsbInterruptThreadStub( IN PVOID context )
{
    return ((CHW *)context)->UsbInterruptThread();
}

// ******************************************************************
DWORD CHW::UsbInterruptThread( )
//
// Purpose: Main IST to handle interrupts from the USB host controller
//
// Parameters: context - parameter passed in when starting thread,
//                       (currently unused)
//
// Returns: 0 on thread exit.
//
// Notes:
//
//        This function is private
// ******************************************************************
{
    DEBUGMSG(ZONE_INIT && ZONE_VERBOSE, (TEXT("+CHW::Entered USBInterruptThread\n")));

    while ( !m_fUsbInterruptThreadClosing ) {
        WaitForSingleObject(m_hUsbInterruptEvent, INFINITE);
        if ( m_fUsbInterruptThreadClosing ) {
            break;
        }

        // the cast is used here to remove the volatile qualifier so we can cache the register
        union HcRegisters::HcInterruptStatus usbsts = const_cast<HcRegisters *>(m_portBase)->HcInterruptStatus;
#ifdef DEBUG
        DWORD dwFrame;
        GetFrameNumber(&dwFrame); // calls UpdateFrameCounter
        DEBUGMSG( ZONE_REGISTERS, (TEXT("!!!interrupt!!!! on frame index + 1 = 0x%08x, USBSTS = 0x%08x\n"), dwFrame, usbsts.reg ) );
#else
        UpdateFrameCounter();
#endif // DEBUG

        // This flag gets cleared in the resume thread.
        if (g_fPowerUpFlag && !g_fPowerResuming)
        {
            if (m_bDoResume) {
                g_fPowerUpFlag=FALSE;
                Sleep(20);
                EnterOperationalState();
            }
            else {
                HcdPdd_InitiatePowerUp((DWORD)m_pPddContext);
                HANDLE ht;
                while ((ht = CreateThread(NULL, 0, CeResumeThreadStub, this, 0, NULL)) == NULL) {
                    RETAILMSG(1, (TEXT("HCD IST: cannot spin a new thread to handle CE resume of USB host controller; sleeping.\n")));
                    Sleep(15000);  // 15 seconds later, maybe it'll work.
                }
                CeSetThreadPriority( ht, g_IstThreadPriority );
                CloseHandle(ht);
                
                // The CE resume thread will force this IST to exit so we'll be cooperative proactively.
            break;
            }
        }

        if (usbsts.RHSC) {
        }
        if (usbsts.WDH) {
            DWORD paDoneHead = m_pHCCA->HccaDoneHead & ~1; // ignore LSb (see OHCI figure 4-5)
            m_pHCCA->HccaDoneHead = 0;
            DEBUGCHK( (paDoneHead & 0xF) == 0 );
            DEBUGCHK( paDoneHead != 0 ); // Check Hardware Register Value agains OHCI spec. 7.1.4
            if (paDoneHead) {
                SignalCheckForDoneTransfers( paDoneHead );
            }
        }
        // Acknowledge the interrupt(s)
        m_portBase->HcInterruptStatus.reg = usbsts.reg;
        InterruptDone(m_dwSysIntr);
    }

    DEBUGMSG(ZONE_INIT && ZONE_VERBOSE, (TEXT("-CHW::Leaving USBInterruptThread\n")));

    return (0);
}

// ******************************************************************
void CHW::UpdateFrameCounter( void )
//
// Purpose: Updates our internal frame counter
//
// Parameters: None
//
// Returns: Nothing
//
// Notes: The OHCI frame number register is 16 bits long.
//        Thus, the counter will wrap approx. every 64 seconds.
//        We maintain an additional 16 bits internally so we
//        needn't wrap for 50 days.
//
//        This function should be called at least once a minute;
//        otherwise we could miss frames.
//
// ******************************************************************
{

    EnterCriticalSection( &m_csFrameCounter );

#ifdef DEBUG
    // If this fails, we haven't been called in a long time,
    // so the frame number is no longer accurate
    if (GetTickCount() - dwTickCountLastTime >= 64000 )
        DEBUGMSG(1, (TEXT("!UHCI - CHW::UpdateFrameCounter missed frame count;")
                     TEXT(" isoch packets may have been dropped.\n")));
    dwTickCountLastTime = GetTickCount();
#endif // DEBUG

    WORD fn = m_pHCCA->HccaFrameNumber;
    if (fn < lastFn)
        ++m_wFrameHigh;
    lastFn = fn;

    LeaveCriticalSection( &m_csFrameCounter );
}

// ******************************************************************
BOOL CHW::GetFrameNumber(OUT LPDWORD lpdwFrameNumber )
//
// Purpose: Return the current frame number
//
// Parameters: None
//
// Returns: 32 bit current frame number
//
// Notes: See also comment in UpdateFrameCounter
// ******************************************************************
{
    UpdateFrameCounter();
    *lpdwFrameNumber = ((DWORD) m_wFrameHigh << 16) | m_pHCCA->HccaFrameNumber ;
    return TRUE;
}

// ******************************************************************
BOOL CHW::WaitOneFrame( void )
//
// Purpose: Block the current thread until the HC hardware is
//          no longer processing the current USB frame.
//
// Parameters: None
//
// Returns: TRUE on success, FALSE if the HW is unavailable or not running.
//
// Notes:
// ******************************************************************
{
    // is the host controller operational?
    if ( m_portBase != 0 ) {
        if(m_portBase->HcControl.HCFS != HcRegisters::HcControl::HCFS_OPERATIONAL) {
            // no, just wait a short while and return
            Sleep(10);
            return TRUE;
        }
    }

    // The OS' system clock - prior to CE3.0 - has 25ms granularity
    // which is just too high. Later versions have a 1ms clock.
    //
    // Sleep may not be enough if the frame has been made longer
    // so we poll after the 1ms. If the frame has been made shorter
    // then this will just take too long.
    m_pHCCA->HccaPad1 = 1; // HC will write 0 here when updating FN (OHCI Figure 4-5)
#ifndef CE_PREv3
    Sleep(1);
#endif
    while (m_pHCCA->HccaPad1)
        ; // spin

    return TRUE;
}

// ******************************************************************
BOOL CHW::GetFrameLength(OUT LPUSHORT lpuFrameLength)
//
// Purpose: Return the current frame length in 12 MHz clocks
//          (i.e. 12000 = 1ms)
//
// Parameters: None
//
// Returns: frame length
//
// Notes:
// ******************************************************************
{
    *lpuFrameLength=m_portBase->HcFmInterval.FI;
    return TRUE;
}

// ******************************************************************
BOOL CHW::SetFrameLength( IN HANDLE /*hEvent*/,
                          IN const USHORT /*uFrameLength*/ )
//
// Purpose: Set the Frame Length in 12 Mhz clocks. i.e. 12000 = 1ms
//
// Parameters:  hEvent - event to set when frame has reached required
//                       length
//
//              uFrameLength - new frame length
//
// Returns: TRUE if frame length changed, else FALSE
//
// Notes:
// ******************************************************************
{
    BOOL fSuccess = FALSE;

    // to prevent multiple threads from simultaneously adjusting the
    // frame length, InterlockedTestExchange is used. This is
    // cheaper than using a critical section.
#ifdef JEFFRO
    if ( FALSE == InterlockedTestExchange( &m_fFrameLengthIsBeingAdjusted,
                                           FALSE, // Test value (Old value)
                                           TRUE ) ) { // New value

        // m_fFrameLengthIsBeingAdjusted was set to TRUE
        // by the InterlockedTestExchange
        if ( uFrameLength >= UHCD_SOFMOD_MINIMUM_LENGTH &&
             uFrameLength <= UHCD_SOFMOD_MAXIMUM_LENGTH &&
             hEvent != NULL ) {

            // ok, all the params are fine
            m_hAdjustDoneCallbackEvent = hEvent;
            m_uNewFrameLength = uFrameLength;
            InterlockedExchange( &m_fStopAdjustingFrameLength, FALSE );

            // the frame length needs to be adjusted over
            // many frames, so we need a separate thread

            HANDLE hWorkerThread = CreateThread( 0, 0, UsbAdjustFrameLengthThreadStub, (LPVOID) this, 0, NULL );
            if ( hWorkerThread != NULL ) {
                CeSetThreadPriority( hWorkerThread, g_IstThreadPriority + RELATIVE_PRIO_ADJUST_FRAME );	
                CloseHandle( hWorkerThread );
                hWorkerThread = NULL;
                fSuccess = TRUE;
            }
        }
        if ( !fSuccess ) {
            // we didn't succeed, so change m_fFrameLengthIsBeingAdjusted
            // back to FALSE
        #ifdef DEBUG
            LONG oldValue =
        #endif // DEBUG
                InterlockedExchange( &m_fFrameLengthIsBeingAdjusted, FALSE );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲婷婷综合色高清在线| 精品亚洲免费视频| 在线欧美一区二区| 午夜精品爽啪视频| 欧美欧美午夜aⅴ在线观看| 偷拍亚洲欧洲综合| 国产亚洲一区二区三区| 国产成人精品一区二区三区网站观看| 91精品免费观看| 粉嫩aⅴ一区二区三区四区| 久久精品夜色噜噜亚洲aⅴ| 91污片在线观看| 日韩制服丝袜av| www国产成人免费观看视频 深夜成人网 | 欧美日韩1区2区| 国产乱码精品一区二区三区忘忧草 | 亚洲四区在线观看| 2021中文字幕一区亚洲| 欧美亚洲日本一区| 国产精品白丝jk黑袜喷水| 亚洲一区精品在线| 欧美激情一区二区在线| 日韩欧美亚洲国产另类| 91在线观看高清| 免费成人在线观看视频| 亚洲不卡一区二区三区| 亚洲免费在线看| 日本一区二区在线不卡| 日韩视频免费直播| 欧美日韩欧美一区二区| 99久久伊人网影院| 国产精品系列在线观看| 福利一区二区在线观看| 国内精品伊人久久久久影院对白| 亚洲一线二线三线久久久| 亚洲男人的天堂av| 玉米视频成人免费看| 亚洲激情网站免费观看| 亚洲国产综合在线| 亚洲午夜免费电影| 亚洲精品日产精品乱码不卡| 自拍偷拍国产亚洲| 国产精品久久久久影院老司| 国产精品电影一区二区| 国产精品久久久久aaaa樱花| 国产精品久久久久永久免费观看| 亚洲乱码国产乱码精品精小说| 亚洲欧洲成人自拍| 亚洲精品水蜜桃| 天天色天天操综合| 麻豆国产欧美一区二区三区| 国产精品一区二区在线观看网站 | 日本不卡1234视频| 中文字幕综合网| 五月综合激情婷婷六月色窝| 日韩精品一区第一页| 国产成人在线视频播放| 欧美日韩一区精品| 国产精品午夜电影| 日本伊人精品一区二区三区观看方式| 精品夜夜嗨av一区二区三区| 欧美探花视频资源| 欧美国产日韩一二三区| 久久精工是国产品牌吗| 在线观看国产日韩| 亚洲图片你懂的| 丁香激情综合国产| 久久精品夜夜夜夜久久| 国产成人99久久亚洲综合精品| 国产激情精品久久久第一区二区 | 成人福利视频网站| 精品福利在线导航| 日韩高清不卡一区二区| 成人av在线资源网站| 欧美不卡一二三| 日本vs亚洲vs韩国一区三区 | 91在线视频官网| 亚洲国产婷婷综合在线精品| 欧美在线观看一二区| 一区二区三区在线高清| 在线视频欧美区| 亚洲1区2区3区视频| 这里是久久伊人| 免费在线观看一区二区三区| 精品理论电影在线观看 | 亚洲一区二区三区在线看| 成人午夜av电影| 亚洲图片激情小说| 日韩天堂在线观看| 国产精品亚洲午夜一区二区三区 | 国产69精品久久久久毛片| 亚洲欧美日韩一区| 欧美一级在线视频| 欧美羞羞免费网站| 91亚洲精品乱码久久久久久蜜桃| 亚洲视频香蕉人妖| 91精品国产91久久综合桃花| 国内精品在线播放| 亚洲在线免费播放| 国产精品美女久久福利网站| 日韩你懂的在线观看| 丁香六月综合激情| 亚洲黄色尤物视频| 久久免费视频一区| 日韩亚洲欧美综合| 777xxx欧美| 欧美日韩在线播放三区| 色哟哟国产精品| 粉嫩aⅴ一区二区三区四区| 亚洲国产视频直播| 国产精品激情偷乱一区二区∴| 欧美一区二区在线不卡| 日韩小视频在线观看专区| 欧美精品第1页| 欧美一区日本一区韩国一区| 欧美日本在线视频| 日韩一区二区三区视频在线 | 北岛玲一区二区三区四区| 美女看a上一区| 久久国产精品露脸对白| 国产一区在线观看麻豆| 国产精品69久久久久水密桃| 国产在线不卡一卡二卡三卡四卡| 日韩国产欧美在线播放| 久久精品国产一区二区| 国产麻豆成人精品| 色爱区综合激月婷婷| 欧美日韩中文字幕精品| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 成人免费视频免费观看| 99久久久精品| 欧美美女黄视频| 26uuu色噜噜精品一区二区| 欧美激情艳妇裸体舞| 亚洲午夜精品17c| 免费在线看成人av| 成人免费高清视频| 日韩欧美一区在线观看| 91精品国产一区二区三区香蕉| 欧美日韩亚洲高清一区二区| 久久久精品蜜桃| 蜜臀av性久久久久蜜臀aⅴ四虎| av在线一区二区三区| 国产欧美一区二区三区鸳鸯浴| 欧美v国产在线一区二区三区| 国产精品丝袜91| 日韩综合小视频| 色香蕉久久蜜桃| 亚洲视频在线一区二区| 91玉足脚交白嫩脚丫在线播放| 日韩欧美中文一区二区| 亚洲免费视频成人| av一区二区三区| 国产人成亚洲第一网站在线播放 | 美女视频黄免费的久久| 在线亚洲免费视频| 亚洲免费观看高清完整版在线| 国产一区二区三区久久悠悠色av| 日韩欧美高清在线| 精品系列免费在线观看| 欧美激情一区二区在线| 国产成人一级电影| 中文字幕精品一区二区精品绿巨人| 日韩专区欧美专区| 日韩无一区二区| 国产v综合v亚洲欧| 亚洲国产人成综合网站| 欧美一卡2卡3卡4卡| 国内精品久久久久影院色| 中文字幕一区不卡| 欧美日韩国产高清一区二区三区 | 日本一区二区三区在线观看| 99re视频精品| 五月天一区二区三区| 日韩视频免费观看高清完整版| 韩国一区二区三区| 最新国产の精品合集bt伙计| 91蝌蚪国产九色| 国产经典欧美精品| 亚洲精品成人天堂一二三| 欧美成人欧美edvon| 色综合天天综合给合国产| 免费成人av在线| 一区二区视频免费在线观看| 日韩亚洲欧美高清| 色就色 综合激情| 国产精品66部| 日韩av一区二| 亚洲国产一区视频| 一区二区三区加勒比av| 久久久91精品国产一区二区三区| 91在线观看地址| 国产福利精品导航| 国产乱人伦精品一区二区在线观看 | 欧美激情综合在线| 国产欧美精品一区| 亚洲欧洲中文日韩久久av乱码| 久久久久国产精品麻豆ai换脸| 欧美一二三四在线| 日韩精品一区二区三区在线播放|