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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? cpipe.cpp

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? CPP
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
//
// 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:  
//     CPipe.cpp
// Abstract:  
//     Implements the Pipe class for managing open pipes for UHCI
//
//                             CPipe (ADT)
//                           /             \
//                  CQueuedPipe (ADT)       CIsochronousPipe
//                /         |       \ 
//              /           |         \
//   CControlPipe    CInterruptPipe    CBulkPipe
// 
// 
// Notes: 
// 
//

#include "cpipe.hpp"
#include "cphysmem.hpp"
#include "chw.hpp"
#include "cuhcd.hpp"
// ******************************************************************               
void InitializeTD( OUT PUHCD_TD const pTD,
                          IN const TD_LINK_POINTER_PHYSICAL_ADDRESS HW_paLink,
                          IN const PUHCD_TD vaNextTD,
                          IN const UCHAR InterruptOnComplete,
                          IN const UCHAR Isochronous,
                          IN const BOOL  LowSpeedControl,
                          IN const DWORD PID,
                          IN const UCHAR Address,
                          IN const UCHAR Endpoint,
                          IN const USHORT DataToggle,
                          IN const DWORD MaxLength,
                          IN const TD_BUFFER_PHYSICAL_ADDRESS HW_paBuffer, 
                          IN const BOOL bShortPacketOk /*= FALSE*/)
//
// Purpose: Fill in Transfer Descriptor fields
//
// Parameters: pTD - pointer to transfer descriptor to fill in
//
//             Rest of Params - various transfer descriptor fields
//
// Returns: Nothing
//
// Notes: MaxLength field should already be encoded by caller into 
//        (n-1) form
// ******************************************************************
{
    // HW DWORD 1 - Hardware link to the next item in schedule
    pTD->HW_paLink = HW_paLink;

    // HW DWORD 2
    // pTD->ActualLength <- don't need to set
    // pTD->Reserved_1 <- don't need to set
    pTD->Active = 1;
    pTD->StatusField = TD_STATUS_NO_ERROR;
    DEBUGCHK( (InterruptOnComplete & 1) == InterruptOnComplete );
    pTD->InterruptOnComplete = InterruptOnComplete;
    DEBUGCHK( (Isochronous & 1) == Isochronous );
    pTD->Isochronous = Isochronous;
    DEBUGCHK( (LowSpeedControl & 1) == LowSpeedControl );
    pTD->LowSpeedControl = LowSpeedControl;
    pTD->ErrorCounter = TD_ERRORCOUNTER_INTERRUPT_AFTER_THREE;
    pTD->ShortPacketDetect = bShortPacketOk ? 1 : 0;
    // pTD->ReservedMBZ <- don't need to set

    // HW DWORD 3
    DEBUGCHK( PID == TD_IN_PID ||
              PID == TD_OUT_PID ||
              PID == TD_SETUP_PID );
    pTD->PID = PID;
    DEBUGCHK( Address <= USB_MAX_ADDRESS );
    pTD->Address = Address;
    DEBUGCHK( (Endpoint & TD_ENDPOINT_MASK) == Endpoint );
    pTD->Endpoint = Endpoint;
    DEBUGCHK( (DataToggle & 1) == DataToggle );
    pTD->DataToggle = DataToggle;
    // pTD->Reserved_2 <- don't need to set
    // MaxLength is a nonzero length minus one or, for a zero length TD,
    // it might be seen here as a 32-bit -1 or as a zero-extended 11-bit -1.
    DEBUGCHK( (MaxLength == TD_MAXLENGTH_NULL_BUFFER) ||
              (MaxLength == (DWORD)-1) ||
              (MaxLength <= TD_MAXLENGTH_MAX && HW_paBuffer != 0) );
    pTD->MaxLength = MaxLength;

    // HW DWORD 4 - physical address of buffer
    pTD->HW_paBuffer = HW_paBuffer;

    // SW DWORD 5 - virt addr of previous Isoch TD
    pTD->vaPrevIsochTD = NULL;

    // SW DWORD 6 - virt addr of next TD in list
    pTD->vaNextTD = vaNextTD;

#ifdef DEBUG
    // SW DWORD 7 - Unused for now
    pTD->dwUNUSED1 = 0xdeadbeef;
    // SW DWORD 8 - Unused for now
    pTD->dwUNUSED2 = 0xdeadbeef;
#endif // DEBUG
}


// ******************************************************************               
void InitializeQH( OUT PUHCD_QH const pQH, 
                          IN const PUHCD_QH vaPrevQH,
                          IN const QUEUE_HEAD_LINK_POINTER_PHYSICAL_ADDRESS HW_paHLink,
                          IN const PUHCD_QH vaNextQH )
//
// Purpose: Fill in Queue Head Fields
//
// Parameters: pQH - pointer to Queue Head to Initialize
//
//             Rest of Params - various Queue Head fields
//
// Returns: Nothing
//
// Notes: 
// ******************************************************************
{
    DEBUGCHK( pQH != NULL );

    // HW DWORD #1 - Horizontal link 
    pQH->HW_paHLink = HW_paHLink;
    // HW DWORD #2 - Vertical link - No Transfer Descriptors right now
    pQH->HW_paVLink = QUEUE_ELEMENT_LINK_POINTER_TERMINATE;
    // SW DWORD #3 - previous QH in schedule, or NULL
    pQH->vaPrevQH = vaPrevQH;
    // SW DWORD #4 - next QH in schedule, or NULL
    pQH->vaNextQH = vaNextQH;
    // SW DWORD #5 - first Transfer Descriptor - NULL for now
    pQH->vaVertTD = NULL;
#ifdef DEBUG
    // SW DWORD #6
    pQH->dwInterruptTree.Load = 0xdeadbeef;
    // SW DWORD #7
    pQH->dwUNUSED1 = 0xdeadbeef;
    // SW DWORD #8
    pQH->dwUNUSED2 = 0xdeadbeef;
#endif // DEBUG
}

CUHCIFrame::CUHCIFrame(IN CPhysMem* const pCPhysMem ) 
:   m_pCPhysMem( pCPhysMem)
{
// memory manager
    numReclamationTransfers = 0;
    m_pCUhcd=NULL;
#ifdef DEBUG
    m_debug_fInitializeAlreadyCalled = FALSE;
#endif // DEBUG

// schedule related vars
    m_vaFrameList = NULL;
    m_pFinalQH = NULL;
    m_pFrameSynchTD = NULL;
                                    
#ifdef DEBUG
    m_debug_TDMemoryAllocated = 0;
    m_debug_QHMemoryAllocated = 0;
    m_debug_BufferMemoryAllocated = 0;
    m_debug_ControlExtraMemoryAllocated = 0;
#endif // DEBUG

// Handle Done Transfers thread variables
    m_fCheckTransferThreadClosing = FALSE;
    m_hCheckForDoneTransfersEvent = NULL;
    m_hCheckForDoneTransfersThread = NULL;
    m_pBusyPipeList = NULL;
#ifdef DEBUG
    m_debug_numItemsOnBusyPipeList = 0;
#endif // DEBUG
};
CUHCIFrame::~CUHCIFrame()
{
    DeInitialize();
}
// *****************************************************************
// Scope: public static
BOOL CUHCIFrame::Initialize(  CUhcd * pCUhcd)
//
// Purpose: Initialize CPipe's static variables. This
//          also sets up the original empty schedule
//          with the frame list, and interrupt Queue Head tree.
//          We also set up a thread for processing done transfers
//
// Parameters: pCPhysMem - pointer to memory manager object
//
// Returns: TRUE - if everything initialized ok
//          FALSE - in case of failure
//
// Notes: This function is only called from the CUhcd::Initialize routine.
//        It should only be called once, to initialize the static variables
// ******************************************************************
{
    DEBUGMSG(ZONE_INIT, (TEXT("+CUHCIFrame::Initialize\n")));
    m_pCUhcd=pCUhcd;
    
#ifdef DEBUG // only call this once to init static vars/schedule
    DEBUGCHK( m_debug_fInitializeAlreadyCalled == FALSE );
    m_debug_fInitializeAlreadyCalled = TRUE;
#endif // DEBUG

    // TDs and QHs must satisfy certain size/alignment criteria
    DEBUGCHK( sizeof( UHCD_TD ) == TD_REQUIRED_SIZE_IN_BYTES );
    DEBUGCHK( sizeof( UHCD_QH ) % QH_ALIGNMENT_BOUNDARY == 0 );
    // memory manager will provide alignment - check if it
    // will satisfy our TD/QH requirements
    DEBUGCHK( CPHYSMEM_MEMORY_ALIGNMENT % TD_ALIGNMENT_BOUNDARY == 0 );
    DEBUGCHK( CPHYSMEM_MEMORY_ALIGNMENT % QH_ALIGNMENT_BOUNDARY == 0 );

    // init static variables
    // frame list variables
    InitializeCriticalSection( &m_csFrameListLock );
    DEBUGCHK( m_vaFrameList == NULL );
    // QH scheduling variables
    InitializeCriticalSection( &m_csQHScheduleLock );
    memset( m_interruptQHTree, 0, 2 * UHCD_MAX_INTERRUPT_INTERVAL * sizeof( PUHCD_QH ) );
    // check for done transfers thread variables
    DEBUGCHK( m_fCheckTransferThreadClosing == FALSE &&
              m_hCheckForDoneTransfersThread == NULL &&
              m_hCheckForDoneTransfersEvent == NULL );
    DEBUGCHK( m_pBusyPipeList == NULL &&
              m_debug_numItemsOnBusyPipeList == 0 );
    InitializeCriticalSection( &m_csBusyPipeListLock );

    if ( m_pCPhysMem == NULL ) {
        DEBUGCHK( 0 ); // This should never happen
        DEBUGMSG(ZONE_ERROR, (TEXT("-CPipe::Initialize, no memory manager object!!\n")));
        return FALSE;
    }

    // m_hCheckForDoneTransfersEvent - Auto Reset, and Initial State = non-signaled
    m_hCheckForDoneTransfersEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
    if ( m_hCheckForDoneTransfersEvent == NULL ) {
        DEBUGMSG(ZONE_ERROR, (TEXT("-CPipe::Initialize. Error creating process done transfers event\n")));
        return FALSE;
    }

    // set up our thread to check for done transfers
    // currently, the context passed to CheckForDoneTransfersThread is ignored
    m_hCheckForDoneTransfersThread = CreateThread( 0, 0, CheckForDoneTransfersThreadStub, (PVOID)this, 0, NULL );
    if ( m_hCheckForDoneTransfersThread == NULL ) {
        DEBUGMSG(ZONE_ERROR, (TEXT("-CPipe::Initialize. Error creating process done transfers thread\n")));
        return FALSE;
    }
    CeSetThreadPriority( m_hCheckForDoneTransfersThread, g_IstThreadPriority + RELATIVE_PRIO_CHECKDONE );

    // ask CHW about the frame list
    {
        // 
        // The frame list is just an array of FRAME_LIST_LENGTH pointers. Each
        // is either invalid, or points to a TD/QH which starts the schedule for
        // that frame.
        //
        // frame list should be 4Kb according to UHCI spec
        DEBUGCHK( FRAME_LIST_SIZE_IN_BYTES == 4096 );
        // frame list should be same size as USBPAGESIZE used by memory manager
        DEBUGCHK( FRAME_LIST_SIZE_IN_BYTES == USBPAGESIZE );
    
        DEBUGCHK( m_vaFrameList == NULL );
        m_vaFrameList = m_pCUhcd->CHW::GetFrameListAddr(); // was allocated from CPhysMem by CHW
    
        // the frame list MUST be aligned on a 4Kb memory boundary
        if ( GetFrameListPhysAddr() % FRAME_LIST_SIZE_IN_BYTES != 0 ) {
            DEBUGMSG(ZONE_ERROR, (TEXT("-CPipe::Initialize - Error. Unable to create frame list. m_vaFrameList = 0x%X\n"), m_vaFrameList ));
            DEBUGCHK( 0 ); // this should never happen
            return FALSE;
        }
    
        DEBUGCHK( m_vaFrameList != NULL );
        DEBUGMSG(ZONE_INIT && ZONE_VERBOSE, (TEXT("CPipe::Initialize - Created frame list. m_vaFrameList = 0x%X, PhysAddr=0x%X\n"), m_vaFrameList, GetFrameListPhysAddr() ));
    } 

    // set up the queue head scheduling structures
    {
        // We set this up as follows:
        // (demonstrated for UHCD_MAX_INTERRUPT_INTERVAL = 4)
        // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        //
        //                         level 2 level 1 level 0    Full Speed QH     End of Schedule 
        //

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩在线| 国产精品美女一区二区三区| 国产高清无密码一区二区三区| 国产精品初高中害羞小美女文| 日韩片之四级片| 色综合激情久久| 韩国毛片一区二区三区| 亚洲成av人片在线观看| 国产精品久久久久久户外露出| 日韩午夜激情免费电影| 在线精品视频免费播放| 成人精品视频一区| 美女诱惑一区二区| 五月天国产精品| 一区二区三区在线视频观看58| 奇米影视7777精品一区二区| 尤物视频一区二区| 国产精品护士白丝一区av| 国产午夜精品在线观看| 日韩精品一区二区在线| 欧美精品三级在线观看| 在线视频中文字幕一区二区| 成人做爰69片免费看网站| 国产一区欧美日韩| 久久99日本精品| 美腿丝袜亚洲综合| 日韩精品视频网| 五月天精品一区二区三区| 亚洲影院在线观看| 亚洲免费观看高清在线观看| 国产精品第四页| 国产精品福利一区二区三区| 日本一区二区成人| 亚洲国产精品av| 久久精品一区二区三区不卡| 亚洲精品一线二线三线无人区| 日韩三级视频在线观看| 日韩欧美视频在线| 久久这里只精品最新地址| 26uuu亚洲综合色欧美| 久久综合色婷婷| 久久精品免费在线观看| 国产欧美日韩另类视频免费观看 | 欧美日韩一区二区三区四区| 91免费观看在线| 色噜噜狠狠成人网p站| 91理论电影在线观看| 91国偷自产一区二区使用方法| 色吧成人激情小说| 欧美日韩免费一区二区三区| 在线成人av网站| 精品久久人人做人人爱| 久久久久综合网| 国产精品久久福利| 亚洲美女视频一区| 天堂午夜影视日韩欧美一区二区| 日韩精品成人一区二区在线| 精品一区二区三区免费| 国产精品一级片在线观看| 成人黄色a**站在线观看| 色婷婷综合五月| 欧美一区在线视频| 久久久精品黄色| 亚洲精品视频免费观看| 日本中文字幕一区二区视频| 国产在线视频精品一区| 波多野结衣欧美| 欧美老肥妇做.爰bbww视频| 精品国产露脸精彩对白| 国产精品免费丝袜| 午夜亚洲福利老司机| 激情久久久久久久久久久久久久久久| 成人在线综合网| 欧美色倩网站大全免费| 337p日本欧洲亚洲大胆色噜噜| 国产精品嫩草影院com| 亚洲午夜久久久久久久久久久| 免费在线看一区| 成人免费高清在线观看| 欧美日高清视频| 国产欧美精品在线观看| 亚洲地区一二三色| 国产成人精品网址| 欧美区在线观看| 国产拍欧美日韩视频二区| 亚洲一区免费在线观看| 极品尤物av久久免费看| 99久久精品免费| 精品区一区二区| 一区二区三区免费观看| 国产自产v一区二区三区c| 在线免费观看日韩欧美| 国产欧美日韩综合精品一区二区| 亚洲一区二区av在线| 国产成人午夜视频| 在线电影一区二区三区| 亚洲欧洲日韩女同| 国产美女精品人人做人人爽 | 久久久久九九视频| 亚洲sss视频在线视频| caoporm超碰国产精品| 日韩精品中午字幕| 亚洲第一在线综合网站| 99国产精品视频免费观看| 精品国产乱码91久久久久久网站| 亚洲一区二区三区四区在线免费观看| 国产精品资源网| 欧美一区二区三区免费| 亚洲成人自拍一区| 色综合久久久久综合| 中文字幕高清一区| 国产乱子伦一区二区三区国色天香| 欧美性大战xxxxx久久久| 亚洲三级在线免费| proumb性欧美在线观看| 国产日本欧洲亚洲| 国产乱人伦偷精品视频不卡| 日韩一区二区精品葵司在线| 亚洲图片欧美综合| 在线看国产一区| 亚洲婷婷综合色高清在线| 成人午夜又粗又硬又大| 久久久久国产成人精品亚洲午夜| 麻豆91精品91久久久的内涵| 717成人午夜免费福利电影| 亚洲国产cao| 欧美在线播放高清精品| 亚洲综合清纯丝袜自拍| 色噜噜夜夜夜综合网| 一区二区三区在线观看网站| 色综合久久久久久久久| 亚洲精品免费在线播放| 色8久久人人97超碰香蕉987| 亚洲欧洲中文日韩久久av乱码| www.色精品| 亚洲视频你懂的| 色成人在线视频| 亚洲成人动漫在线观看| 欧美精品久久久久久久久老牛影院| 午夜精品久久久久久久久久久| 欧美日韩国产影片| 蜜臀av性久久久久蜜臀aⅴ| 欧美xxxxx裸体时装秀| 国产在线播放一区三区四| 国产欧美日韩亚州综合| 99视频一区二区三区| 亚洲一区二区三区中文字幕在线| 欧美色图第一页| 麻豆精品一区二区三区| 久久婷婷一区二区三区| 成人丝袜18视频在线观看| 日韩毛片精品高清免费| 精品视频一区 二区 三区| 日本成人在线看| 国产喂奶挤奶一区二区三区 | 欧美一区二区三区在线| 久久99久久99精品免视看婷婷| 久久久久久免费网| 99久久久国产精品| 婷婷六月综合亚洲| 精品国产乱码久久| 成人福利视频网站| 亚洲国产精品一区二区www| 欧美一区二区三区四区五区 | av在线不卡电影| 亚洲五码中文字幕| 精品国产一区二区三区不卡| 成人免费的视频| 午夜电影久久久| 久久天堂av综合合色蜜桃网| av一区二区三区四区| 视频在线观看91| 国产欧美1区2区3区| 欧美视频一区二区| 国产在线精品国自产拍免费| 一区二区三区在线影院| 欧美成人一区二区| 色屁屁一区二区| 久久精品国产77777蜜臀| 成人欧美一区二区三区| 日韩午夜精品视频| 一本到三区不卡视频| 蜜桃视频在线观看一区二区| 亚洲欧美影音先锋| 日韩精品专区在线| 91福利在线观看| 高清beeg欧美| 日韩av不卡一区二区| 亚洲欧美在线aaa| 2024国产精品| 欧美麻豆精品久久久久久| 成人国产精品免费观看视频| 青青草国产精品97视觉盛宴| 亚洲天堂福利av| 久久九九99视频| 91精品国产综合久久香蕉麻豆 | 欧美在线不卡一区| 懂色av一区二区三区蜜臀| 日韩不卡免费视频| 亚洲精品日产精品乱码不卡|