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

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

?? chw.cpp

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Module Name:
//     CHW.cpp
// Abstract:
//     This file implements the UHCI specific register routines
//
// Notes:
//
//

#include "chw.hpp"
#include "cpipe.hpp"
#include "Cuhcd.hpp"
#include <nkintr.h>

CHW::CHW( IN const REGISTER portBase,
                              IN const DWORD dwSysIntr,
                              IN CPhysMem * const pCPhysMem,
                              //IN CUhcd * const pHcd,
                              IN LPVOID pvUhcdPddObject )
{
// definitions for static variables
    DEBUGMSG( ZONE_INIT, (TEXT("+CHW::CHW base=0x%x, intr=0x%x\n"), portBase, dwSysIntr));
    g_fPowerUpFlag = FALSE;
    g_fPowerResuming = FALSE;
    m_portBase = portBase;
    //m_pHcd = pHcd;
    m_pMem = pCPhysMem;
    m_pPddContext = pvUhcdPddObject;
    m_frameCounterHighPart = 0;
    m_frameCounterLowPart = 0;
    m_pFrameList = 0;

    m_dwSysIntr = dwSysIntr;
    m_hUsbInterruptEvent = NULL;
    m_hUsbInterruptThread = NULL;
    m_fUsbInterruptThreadClosing = FALSE;

    m_fFrameLengthIsBeingAdjusted = FALSE;
    m_fStopAdjustingFrameLength = FALSE;
    m_hAdjustDoneCallbackEvent = NULL;
    m_uNewFrameLength = 0;
    m_dwCapability = 0;
    m_bDoResume=FALSE;
}
//extern BOOL g_fPowerUpFlag;
//extern BOOL g_fPowerResuming;

// ******************************************************************
BOOL CHW::Initialize( )
// Purpose: Reset and Configure the Host Controller with the schedule.
//
// Parameters: portBase - base address for host controller registers
//
//             dwSysIntr - system interrupt number to use for USB
//                         interrupts from host controller
//
//             frameListPhysAddr - physical address of frame list index
//                                 maintained by CPipe class
//
//             pvUhcdPddObject - PDD specific structure used during suspend/resume
//
// Returns: TRUE if initialization succeeded, else FALSE
//
// Notes: This function is only called from the CUhcd::Initialize routine.
//
//        This function is static
// ******************************************************************
{
    DEBUGMSG( ZONE_INIT, (TEXT("+CHW::Initialize\n")));

    DEBUGCHK( m_frameCounterLowPart == 0 &&
              m_frameCounterHighPart == 0 );

    ULONG frameListPhysAddr;
    InitializeCriticalSection( &m_csFrameCounter );
    // set up the frame list area.
    if (m_pFrameList==NULL && m_pMem->AllocateSpecialMemory(FRAME_LIST_SIZE_IN_BYTES, (PUCHAR *) &m_pFrameList) == FALSE) {
        DEBUGMSG(ZONE_ERROR, (TEXT("-CHW::Initialize, cannot allocate the frame list!!\n")));
        m_pFrameList = 0;
        frameListPhysAddr = 0;
        return FALSE;
    }
    frameListPhysAddr = m_pMem->VaToPa((PUCHAR) m_pFrameList);

    if ( m_portBase == 0 || frameListPhysAddr == 0 ) {
        DEBUGMSG( ZONE_ERROR, (TEXT("-CHW::Initialize - zero Register Base or Frame List Address\n")));
        return FALSE;
    }

    // UHCI spec 2.1.6 - save SOFMOD before resetting HC
    UCHAR  savedSOFMOD = Read_SOFMOD() & UHCD_SOFMOD_MASK;

    // Signal Global Reset - do this ***BEFORE*** any other USB I/O register writing,
    // since Global Reset will cause all registers to revert to their hardware-reset
    // state.
    DEBUGMSG(ZONE_INIT && ZONE_REGISTERS, (TEXT("CHW::Initialize - signalling global reset\n")));
    Write_USBCMD( Read_USBCMD() | UHCD_USBCMD_GLOBAL_RESET );
    Sleep( 20 );
    DEBUGMSG(ZONE_INIT && ZONE_REGISTERS, (TEXT("CHW::Initialize - end signalling global reset\n")));
    Write_USBCMD( Read_USBCMD() & ~UHCD_USBCMD_GLOBAL_RESET );

    DEBUGMSG(ZONE_INIT && ZONE_REGISTERS, (TEXT("CHW::Initialize - setting USBINTR to all interrupts on\n")));
    // initialize interrupt register - set all interrupts to enabled
    Write_USBINTR( UHCD_USBINTR_SHORT_PACKET_INTERRUPT
                   | UHCD_USBINTR_INTERRUPT_ON_COMPLETE
                   | UHCD_USBINTR_RESUME_INTERRUPT
                   | UHCD_USBINTR_TIMEOUT_CRC_INTERRUPT );

    DEBUGMSG(ZONE_INIT && ZONE_REGISTERS && ZONE_VERBOSE, (TEXT("CHW::Initialize - setting FRNUM = 0\n")));
    // initialize FRNUM register with index 0 of frame list
    Write_FRNUM( 0x0000 );

    DEBUGMSG(ZONE_INIT && ZONE_REGISTERS && ZONE_VERBOSE, (TEXT("CHW::Initialize - setting FLBASEADD = 0x%X\n"), frameListPhysAddr));
    // initialize FLBASEADD with address of frame list
    DEBUGCHK( frameListPhysAddr != 0 );
    // frame list should be aligned on a 4Kb boundary
    DEBUGCHK( (frameListPhysAddr & UHCD_FLBASEADD_MASK) == frameListPhysAddr );
    Write_FLBASEADD( frameListPhysAddr );

    DEBUGMSG(ZONE_INIT && ZONE_REGISTERS && ZONE_VERBOSE, (TEXT("CHW::Initialize - setting SOFMOD to 0x%x\n"), savedSOFMOD ));
    Write_SOFMOD( savedSOFMOD );

    // m_hUsbInterrupt - Auto Reset, and Initial State = non-signaled
    DEBUGCHK( m_hUsbInterruptEvent == NULL );
    m_hUsbInterruptEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
    if ( m_hUsbInterruptEvent == NULL ) {
        DEBUGMSG(ZONE_ERROR, (TEXT("-CHW::Initialize. Error creating USBInterrupt event\n")));
        return FALSE;
    }

    InterruptDisable( m_dwSysIntr ); // Just to make sure this is really ours.
    // Initialize Interrupt. When interrupt id # m_sysIntr is triggered,
    // m_hUsbInterruptEvent will be signaled. Last 2 params must be NULL
    if ( !InterruptInitialize( m_dwSysIntr, m_hUsbInterruptEvent, NULL, NULL) ) {
        DEBUGMSG(ZONE_ERROR, (TEXT("-CHW::Initialize. Error on InterruptInitialize\r\n")));
        return FALSE;
    }
    // Start up our IST - the parameter passed to the thread
    // is unused for now
    DEBUGCHK( m_hUsbInterruptThread == NULL &&
              m_fUsbInterruptThreadClosing == FALSE );
    if (m_hUsbInterruptThread==NULL)
        m_hUsbInterruptThread = CreateThread( 0, 0, UsbInterruptThreadStub, this, 0, NULL );
    if ( m_hUsbInterruptThread == NULL ) {
        DEBUGMSG(ZONE_ERROR, (TEXT("-CHW::Initialize. Error creating IST\n")));
        return FALSE;
    }
    CeSetThreadPriority( m_hUsbInterruptThread, g_IstThreadPriority );
    DEBUGMSG( ZONE_INIT, (TEXT("-CHW::Initialize, success!\n")));
    return TRUE;
}
CHW::~CHW()
{
    if (m_dwSysIntr)
        KernelIoControl(IOCTL_HAL_DISABLE_WAKE, &m_dwSysIntr, sizeof(m_dwSysIntr), NULL, 0, NULL);
    DeInitialize();
}
// ******************************************************************
void CHW::DeInitialize( void )
//
// Purpose: Delete any resources associated with static members
//
// Parameters: none
//
// Returns: nothing
//
// Notes: This function is only called from the ~CUhcd() routine.
//
//        This function is static
// ******************************************************************
{
    m_fUsbInterruptThreadClosing = TRUE; // tell USBInterruptThread that we are closing
    // tell adjustment thread (if it exists) to close
    InterlockedExchange( &m_fStopAdjustingFrameLength, TRUE );

    if ( m_fFrameLengthIsBeingAdjusted ) {
        Sleep( 20 ); // give adjustment thread time to close
        DEBUGCHK( !m_fFrameLengthIsBeingAdjusted );
    }
    // m_hAdjustDoneCallbackEvent <- don't need to do anything to this
    // m_uNewFrameLength <- don't need to do anything to this

    // Wake up the interrupt thread and give it time to die.
    if ( m_hUsbInterruptEvent ) {
        SetEvent(m_hUsbInterruptEvent);
        if ( m_hUsbInterruptThread ) {
            DWORD dwWaitReturn = WaitForSingleObject(m_hUsbInterruptThread, 1000);
            if ( dwWaitReturn != WAIT_OBJECT_0 ) {
                DEBUGCHK( 0 );
                TerminateThread(m_hUsbInterruptThread, DWORD(-1));
            }
            CloseHandle(m_hUsbInterruptThread);
            m_hUsbInterruptThread = NULL;
        }
        // we have to close our interrupt before closing the event!
        InterruptDisable( m_dwSysIntr );

        CloseHandle(m_hUsbInterruptEvent);
        m_hUsbInterruptEvent = NULL;
    } else {
        InterruptDisable( m_dwSysIntr );
    }

    // no need to free the frame list; the entire pool will be freed as a unit.
    m_pFrameList = 0;

    DeleteCriticalSection( &m_csFrameCounter );

    m_fUsbInterruptThreadClosing = FALSE;
    m_frameCounterLowPart = 0;
    m_frameCounterHighPart = 0;
}

// ******************************************************************
void CHW::EnterOperationalState( void )
//
// Purpose: Signal the host controller to start processing the schedule
//
// Parameters: None
//
// Returns: Nothing.
//
// Notes: This function is only called from the CUhcd::Initialize routine.
//        It assumes that CPipe::Initialize and CHW::Initialize
//        have already been called.
//
//        This function is static
// ******************************************************************
{
    DEBUGMSG( ZONE_INIT, (TEXT("+CHW::EnterOperationalState\n")));

    USHORT usData;

    DEBUGMSG(ZONE_INIT && ZONE_REGISTERS && ZONE_VERBOSE, (TEXT("CHW::EnterOperationalState - clearing status reg\n")));
    Clear_USBSTS( );

    DEBUGMSG(ZONE_INIT && ZONE_REGISTERS && ZONE_VERBOSE, (TEXT("CHW::EnterOperationalState - setting USBCMD run bit\n")));
    usData = Read_USBCMD();
    // if reclamation size is 32, we shouldn't set the USBCMD bit
    DEBUGCHK( UHCD_MAX_RECLAMATION_PACKET_SIZE == 64 );
    Write_USBCMD( usData | UHCD_USBCMD_MAX_RECLAMATION_SIZE_64 | UHCD_USBCMD_RUN_STOP | UHCD_USBCMD_CONFIGURE_FLAG );

    DEBUGMSG( ZONE_INIT, (TEXT("-CHW::EnterOperationalState\n")));
}

// ******************************************************************
void CHW::StopHostController( void )
//
// Purpose: Signal the host controller to stop processing the schedule
//
// Parameters: None
//
// Returns: Nothing.
//
// Notes:
//
//        This function is static
// ******************************************************************
{
    if ( m_portBase != 0 ) {
        WORD wUSBCmd = Read_USBCMD();
        // Check run bit. Despite what the UHCI spec says, Intel's controller
        // does not always set the HCHALTED bit when the controller is stopped.
        if(wUSBCmd & UHCD_USBCMD_RUN_STOP)
            {
                // clear run bit
                Write_USBCMD( wUSBCmd & ~UHCD_USBCMD_RUN_STOP );
                // clear all interrupts
                Write_USBINTR( 0x0000 );
                // spin until the controller really is stopped
                while ( ! (Read_USBSTS() & UHCD_USBSTS_HCHALTED) )
                    ;
            }
    }
}
DWORD CALLBACK CHW::CeResumeThreadStub ( IN PVOID context )
{
    return ((CHW *)context)->CeResumeThread ( );
}
// ******************************************************************
DWORD CHW::CeResumeThread ( )
//
// Purpose: Force the HCD to reset and regenerate itself after power loss.
//
// Parameters: None
//
// Returns: Nothing.
//
// Notes: Because the PDD is probably maintaining pointers to the Hcd and Memory
//   objects, we cannot free/delete them and then reallocate. Instead, we destruct
//   them explicitly and use the placement form of the new operator to reconstruct
//   them in situ. The two flags synchronize access to the objects so that they
//   cannot be accessed before being reconstructed while also guaranteeing that
//   we don't miss power-on events that occur during the reconstruction.
//
//        This function is static
// ******************************************************************
{
    // reconstruct the objects at the same addresses where they were before;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人av一区二区| 国产精品欧美一区喷水| av电影在线观看不卡| 国产精品 欧美精品| 美女高潮久久久| 免费人成精品欧美精品| 亚洲成人免费在线| 午夜精品久久久久久久蜜桃app| 亚洲天堂福利av| 亚洲人成网站影音先锋播放| 国产精品国产a| 亚洲人成亚洲人成在线观看图片| ...xxx性欧美| 亚洲综合男人的天堂| 午夜久久电影网| 久久99精品国产麻豆不卡| 久久99最新地址| 国产超碰在线一区| 97超碰欧美中文字幕| 91久久奴性调教| 欧美精品视频www在线观看| 欧美顶级少妇做爰| 久久影视一区二区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 久久精品夜夜夜夜久久| 中文字幕+乱码+中文字幕一区| 中文字幕不卡在线播放| 亚洲综合久久av| 美女尤物国产一区| av电影天堂一区二区在线| 欧美亚洲另类激情小说| 欧美大片在线观看| 中文字幕佐山爱一区二区免费| 亚洲精品国产一区二区三区四区在线| 亚洲福利一二三区| 国产真实乱偷精品视频免| 99久久久无码国产精品| 欧美日本一道本| 欧美国产一区二区| 午夜视频久久久久久| 国产一区二区精品久久| 91九色02白丝porn| 久久精品人人爽人人爽| 悠悠色在线精品| 国产成人小视频| 欧美一区二区日韩| 中文字幕五月欧美| 久久99这里只有精品| 色欧美乱欧美15图片| 亚洲精品在线一区二区| 一区av在线播放| 国产jizzjizz一区二区| 欧美丰满一区二区免费视频| 国产精品激情偷乱一区二区∴| 日韩av电影免费观看高清完整版在线观看 | 久久精品人人爽人人爽| 亚洲国产综合在线| 国产iv一区二区三区| 日韩视频在线你懂得| 亚洲激情网站免费观看| 成年人午夜久久久| 久久久久久久久岛国免费| 日韩高清不卡一区二区三区| 91美女福利视频| 中文字幕av一区二区三区高| 久草精品在线观看| 91精品国产综合久久精品app | 国产成人自拍网| 日韩午夜三级在线| 亚洲第一会所有码转帖| 91在线小视频| 国产精品福利av| 成人av免费观看| 国产三级精品视频| 国产在线播精品第三| 日韩一区二区三免费高清| 婷婷丁香久久五月婷婷| 欧美最新大片在线看| 亚洲日穴在线视频| 色婷婷av一区二区三区gif| 中文字幕一区在线| 不卡的av中国片| 中文在线一区二区| 97久久人人超碰| 亚洲手机成人高清视频| 91丨porny丨在线| 亚洲伦在线观看| 欧美日韩一区不卡| 日本一不卡视频| 久久久久久久久久久电影| 国产精品综合网| 1024精品合集| 欧美二区在线观看| 国产精品一区二区不卡| 中文一区二区在线观看| 99re成人精品视频| 亚洲mv在线观看| 精品国产制服丝袜高跟| 国产精品99久久久| 亚洲人吸女人奶水| 欧美挠脚心视频网站| 美女高潮久久久| 国产精品久久久一本精品| 色悠悠久久综合| 青青草原综合久久大伊人精品 | 91麻豆精品秘密| 亚洲国产视频一区| 欧美mv和日韩mv的网站| 成人免费视频国产在线观看| 亚洲天堂福利av| 日韩欧美黄色影院| 不卡av免费在线观看| 亚洲国产精品久久艾草纯爱| 精品盗摄一区二区三区| 色视频欧美一区二区三区| 美女高潮久久久| 亚洲欧美国产三级| 精品女同一区二区| 欧美中文字幕亚洲一区二区va在线| 日韩综合小视频| 中文字幕一区二区5566日韩| 欧美精品日韩精品| aaa亚洲精品一二三区| 奇米精品一区二区三区在线观看一| 久久亚洲一区二区三区四区| 欧美性做爰猛烈叫床潮| 国产福利一区在线| 三级不卡在线观看| 中文字幕中文字幕中文字幕亚洲无线| 欧美日本韩国一区| 91在线观看高清| 国模无码大尺度一区二区三区| 亚洲欧美激情视频在线观看一区二区三区| 日韩限制级电影在线观看| 欧美性色欧美a在线播放| 国产99久久久国产精品潘金| 日韩精品每日更新| 亚洲一卡二卡三卡四卡五卡| 国产欧美日韩三级| 精品区一区二区| 欧美裸体bbwbbwbbw| 91论坛在线播放| 成人免费毛片高清视频| 国产精品综合在线视频| 日本一道高清亚洲日美韩| 亚洲va欧美va国产va天堂影院| 中文字幕在线不卡国产视频| 国产日韩精品视频一区| 精品国产麻豆免费人成网站| 日韩一级黄色片| 欧美丰满少妇xxxbbb| 在线看国产一区二区| 一本色道亚洲精品aⅴ| 99国产精品国产精品久久| 成人一区二区视频| 国产成人午夜视频| 99精品国产一区二区三区不卡| 国产福利一区二区三区视频| 国产一区不卡视频| 狠狠色丁香久久婷婷综合丁香| 久久成人免费电影| 国产一区视频导航| 国产精品一线二线三线| 国产福利91精品| 国产91丝袜在线播放九色| 成人av先锋影音| 色综合久久88色综合天天 | 亚洲伊人色欲综合网| 亚洲女同一区二区| 一区二区三区欧美久久| 国产一区啦啦啦在线观看| 久久99精品国产麻豆不卡| 精久久久久久久久久久| 一区免费观看视频| 国产区在线观看成人精品 | 国产一区二区三区不卡在线观看| 久久aⅴ国产欧美74aaa| 国产性色一区二区| 亚洲午夜激情av| av欧美精品.com| 国产三级精品在线| 日本一道高清亚洲日美韩| 在线视频欧美区| 国产精品美女久久福利网站| 另类综合日韩欧美亚洲| 欧美唯美清纯偷拍| 亚洲激情第一区| 成人免费视频一区| 日本一区二区视频在线| 国产一区二区三区观看| 欧美一区二区三区在线视频| 亚洲电影第三页| 欧美影院精品一区| 亚洲婷婷综合色高清在线| 成人免费视频播放| 久久久精品2019中文字幕之3| 美国欧美日韩国产在线播放| 91麻豆精品久久久久蜜臀| 亚洲成人免费视| 欧美午夜视频网站|