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

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

?? usb2lib.cpp

?? 嵌入式操作系統(tǒng)WINCE5.0下的USB驅(qū)動程序
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// 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.
//
/*++


Module Name:

    usb2lib.cpp

Abstract:

    interface to usb2lib, usb2 low/full speed scheduling algorithms

Environment:

    kernel or user mode only

Notes:

Revision History:

--*/
#include <windows.h>
#include "usb2lib.h"

TransactionTrasnlate::TransactionTrasnlate (const UCHAR uHubAddress,const UCHAR uPort,TransactionTrasnlate * pNextTT)
    : m_uHubAddress(uHubAddress)
    , m_uPort(uPort)
{
    m_pNextTT =  pNextTT;
    m_dwThink_time =1;
    for (DWORD dwIndex=0; dwIndex<MAXFRAMES; dwIndex++) {
        TT_frame[dwIndex]=NULL;
        frame_budget[dwIndex].time_used=0;;
    }
}
TransactionTrasnlate::~TransactionTrasnlate ()
{
    for (DWORD dwIndex=0; dwIndex<MAXFRAMES; dwIndex++) {
        LPEndpointBugetList pCurList = TT_frame[dwIndex];
        if (pCurList!=NULL) {
            LPEndpointBugetList pNextList = pCurList ->pNextEndpt;
            delete pCurList;
            pCurList = pNextList;
        }
        TT_frame[dwIndex]=NULL;
    }
};
BOOL TransactionTrasnlate::AddedEp(LPEndpointBuget ep)
{
    BOOL bReturn = TRUE;
    if (ep) {
       // split or nonsplit FS/LS speed allocation
        // classic allocation
        // split allocation
        unsigned int min_used = frame_budget[0].time_used;

        if (ep->period > MAXFRAMES)
        	ep->actual_period = MAXFRAMES;
        else
        	ep->actual_period = ep->period;

        // Look at all candidate frames for this period to find the one with min
        // allocated bus time.  
        //
        for (unsigned int i=1; i < ep->actual_period ; i++) {
            if (frame_budget[i].time_used < min_used) {
                min_used = frame_budget[i].time_used;
                ep->start_frame = i;
            }
        }
        //***
        //*** 2. Calculate classic time required
        //***

        // Calculate classic overhead
        DWORD overhead;
        if (ep->ep_type == isoch) {
            if (ep->speed == FSSPEED)
                overhead = FS_ISOCH_OVERHEAD + m_dwThink_time;
            else {
                ASSERT(FALSE);
                return FALSE;
            }
        } 
        else  { // interrupt
            if (ep->speed == FSSPEED)
                overhead = FS_INT_OVERHEAD + m_dwThink_time;
            else
                overhead = LS_INT_OVERHEAD + m_dwThink_time;
        }

        // Classic bus time, NOT including bitstuffing overhead (in FS byte times) since we do best case budget
        ep->calc_bus_time = (USHORT)(ep->max_packet * (ep->speed!=LSSPEED?1:8) + overhead);

        USHORT latest_start = FS_SOF + HUB_FS_ADJ;  // initial start time must be after the SOF transaction

        for (i=0; ep->start_frame + i < MAXFRAMES && bReturn==TRUE; i += ep->actual_period) {
            DWORD t=0;
            if (FindBestTimeSlot(latest_start,ep->calc_bus_time,TT_frame[ep->start_frame + i],&t)) {
                ASSERT(t>=latest_start);
                // update latest start time as required
                if (t > latest_start)
                    latest_start = (USHORT)t;
            }
            else { // Runout the slot this one.
                ASSERT(FALSE);
                ep->calc_bus_time = 0;
                bReturn= FALSE;
                break;
            }
        } // end of for loop looking for latest start time

        if (bReturn==TRUE) {
            // Set the start time for the new endpoint
            ep->start_time = latest_start;

            if ((ep->start_time + ep->calc_bus_time) > FS_MAX_PERIODIC_ALLOCATION)  {
            //		error("start time %d past end of frame", ep->start_time + ep->calc_bus_time);
                ep->calc_bus_time = 0;
                return FALSE;
            }
            BOOL bRet=TRUE;
            for (i=0; ep->start_frame + i < MAXFRAMES; i += ep->actual_period) {
                bRet &= InsertEp(ep->start_frame + i, ep);
                ASSERT(bRet==TRUE);
                frame_budget[0].time_used += ep->calc_bus_time;
            }
            if (bRet == FALSE) {
                for (i=0; ep->start_frame + i < MAXFRAMES; i += ep->actual_period) {
                    RemoveEp(ep->start_frame + i, ep);
                    frame_budget[0].time_used -= ep->calc_bus_time;
                }
            }
            bReturn = bRet;
        }

    }
    ASSERT(bReturn);
    return bReturn;
}
BOOL  TransactionTrasnlate::DeletedEp(LPEndpointBuget ep)
{
    BOOL bReturn = TRUE;
    for (unsigned int i=0; ep->start_frame + i < MAXFRAMES; i += ep->actual_period) {
        if (RemoveEp(ep->start_frame + i, ep))
            frame_budget[0].time_used -= ep->calc_bus_time;
        else{
            ASSERT(FALSE);
            bReturn=FALSE;
        }
    }
    return bReturn;    
}

BOOL TransactionTrasnlate::FindBestTimeSlot(USHORT start_time,USHORT time_duration,LPEndpointBugetList lpList,PDWORD pdwReturn)
{
    while (lpList) {
        // Check this is no overlap.
        if (lpList->endpt.start_time  >= start_time +  time_duration) { // Empty Slot has been found.
            break;
        }
        else if (lpList->endpt.start_time +  lpList->endpt.calc_bus_time <= start_time) { // Have not reach yet . Continue
            lpList = lpList ->pNextEndpt;
        }
        else { // We have overlap. Let us move slot later.
            start_time = lpList->endpt.start_time +  lpList->endpt.calc_bus_time;
            lpList =  lpList ->pNextEndpt;
        }
    }
    *pdwReturn = start_time;
    return TRUE;
}
BOOL TransactionTrasnlate::InsertEp(DWORD frameIndex,LPEndpointBuget ep)
{
    if (frameIndex>=MAXFRAMES || ep == NULL) {
        ASSERT(FALSE);
        return FALSE;
    }
    BOOL bReturn = FALSE;
    EndpointBugetList * pNewEpList = new EndpointBugetList;
    if (pNewEpList) {
        pNewEpList->endpt = *ep;
        // find out where is not
        EndpointBugetList * pPrevNode=NULL;
        EndpointBugetList * pCurNode = TT_frame[frameIndex];
        bReturn = TRUE;
        while (pCurNode) {
            if (pCurNode->endpt.start_time +  pCurNode->endpt.calc_bus_time <= ep->start_time) { // Continue
                pPrevNode = pCurNode;
                pCurNode =pCurNode->pNextEndpt;
            }
            else if (pCurNode->endpt.start_time >= ep->start_time+ep->calc_bus_time) { // Find hole
                bReturn=TRUE;
                break;
            }
            else {// This is really bad. Someone try to inserted something that has overlap.
                ASSERT(FALSE);
                bReturn = FALSE;
                break;
            }
        }
        if (bReturn) { // We reached last one.
            if (pPrevNode) { // Not first.
                pNewEpList->pNextEndpt = pPrevNode ->pNextEndpt;
                pPrevNode->pNextEndpt = pNewEpList;
            } else { // This is first.
                pNewEpList->pNextEndpt = TT_frame[frameIndex];
                TT_frame[frameIndex] = pNewEpList;
            }
        }
        else // Fails we have to clean it.
            delete pNewEpList;
    }
    return bReturn;
};
BOOL TransactionTrasnlate::RemoveEp(DWORD frameIndex,LPEndpointBuget ep)
{
    if (frameIndex>=MAXFRAMES || ep == NULL) {
        ASSERT(FALSE);
        return FALSE;
    }
    BOOL bReturn=FALSE;
    EndpointBugetList * pPrevNode=NULL;
    EndpointBugetList * pCurNode = TT_frame[frameIndex];
    while (pCurNode) {
        if (pCurNode->endpt.start_time +  pCurNode->endpt.calc_bus_time <= ep->start_time) { // Continue
            pPrevNode = pCurNode;
            pCurNode =pCurNode->pNextEndpt;
        }
        else if ( pCurNode->endpt.start_time == ep->start_time && pCurNode->endpt.calc_bus_time == ep->calc_bus_time) {
            bReturn=TRUE;
            break;
        }
        else { // Either overlap or behind, We can not find this one.
            bReturn=FALSE;
            break;            
        }
    };
    if (bReturn == TRUE && pCurNode!=NULL) {
        if (pPrevNode) // Not first one.
            pPrevNode->pNextEndpt=pCurNode->pNextEndpt;
        else
            TT_frame[frameIndex]= pCurNode->pNextEndpt;
        delete pCurNode;
    }
    else
        ASSERT(FALSE);
    return bReturn;

}

USB2lib::USB2lib()
{
    // allocate at TT to test with
    //myHC.tthead = (PTT) malloc(sizeof(TT));
    Lock();
    pTTRoot = NULL;
    thinktime = HS_HC_THINK_TIME;
    allocation_limit = HS_MAX_PERIODIC_ALLOCATION;
    speed = HSSPEED;

    for (int i=0; i<MAXFRAMES; i++) {
        for (int j=0; j < MICROFRAMES_PER_FRAME; j++) {
            HS_microframe_info[i][j].time_used = 0;
        }
    }
    Unlock();
}
USB2lib::~USB2lib()
{
    Lock();
    TransactionTrasnlate * pCurTT= pTTRoot;
    while (pCurTT) {
        TransactionTrasnlate * pNextTT = pCurTT->GetNextTT();
        delete pCurTT;
        pCurTT = pNextTT;
    }
    Unlock();
}
BOOL USB2lib::AddedTt( UCHAR uHubAddress,UCHAR uPort)
{
    BOOL bReturn = FALSE;
    Lock();
    if (GetTT( uHubAddress,uPort) == NULL) {
        TransactionTrasnlate * pNewTT = new TransactionTrasnlate(uHubAddress,uPort, pTTRoot);
        if ( pNewTT) {
            pTTRoot=pNewTT;
            bReturn=TRUE;
        }
    }
    else
        bReturn=TRUE;
    Unlock();
    return bReturn;
        
}
BOOL USB2lib::DeleteTt( UCHAR uHubAddress,UCHAR uPort)
{
    BOOL bReturn = FALSE;
    Lock();
    TransactionTrasnlate * pPrevTT= NULL;
    TransactionTrasnlate * pCurTT = pTTRoot;
    while ( pCurTT!=NULL ) {
        if (pCurTT->GetHubAddress()==uHubAddress && pCurTT->GetHubPort() == uPort)
            break;
        else {
            pPrevTT = pCurTT;
            pCurTT = pCurTT->GetNextTT();
        }
    }
    if (pCurTT) { // We found one matched.
        if (pPrevTT) { // Not First One.
            pPrevTT ->SetNextTT(pCurTT->GetNextTT());
            delete pCurTT;
        }
        else { // First one
            pTTRoot = pCurTT->GetNextTT();
            delete pCurTT;
        }
        bReturn=TRUE;
     }
    Unlock();
    return bReturn;
}
TransactionTrasnlate * USB2lib::GetTT( const UCHAR uHubAddress,const UCHAR uHubPort)
{
    Lock();
    TransactionTrasnlate * pFoundTT = pTTRoot;
    while (pFoundTT) {
        if (pFoundTT->GetHubAddress() == uHubAddress && pFoundTT->GetHubPort() == uHubPort)
            break;
        else
            pFoundTT = pFoundTT->GetNextTT();
    }
    Unlock();
    return pFoundTT;
}

unsigned USB2lib::Add_bitstuff(unsigned bus_time) const
{
	// Bit stuffing is 16.6666% extra.
	// But we'll calculate bitstuffing as 16% extra with an add of a 4bit
	// shift (i.e.  value + value/16) to avoid floats.
	return (bus_time + (bus_time>>4));
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久亚洲精精品中文字幕早川悠里| 色综合天天在线| 亚洲欧美一区二区在线观看| 欧美mv和日韩mv国产网站| 欧美一卡2卡3卡4卡| 欧美一区二区三区免费在线看| 在线电影院国产精品| 欧美理论片在线| 9191国产精品| 久久久久久久综合日本| 久久久99精品免费观看| 中文字幕欧美三区| 亚洲欧美日韩系列| 亚洲成人激情av| 日产国产欧美视频一区精品| 久久超碰97中文字幕| 国产精品一区二区三区网站| 高清不卡在线观看av| 色综合色狠狠综合色| 欧美色大人视频| 精品国产精品网麻豆系列| 国产午夜精品一区二区三区视频| 国产精品青草久久| 亚洲午夜在线电影| 美女高潮久久久| 国产成人精品免费视频网站| 91浏览器在线视频| 欧美一区在线视频| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲欧洲国产日韩| 亚洲一二三区不卡| 国产美女av一区二区三区| 成人av资源在线观看| 欧美少妇一区二区| 国产日产精品一区| 亚洲大型综合色站| 国产不卡视频在线播放| 91麻豆精品国产自产在线观看一区| 日韩欧美亚洲另类制服综合在线| 久久综合成人精品亚洲另类欧美| 成人欧美一区二区三区| 亚洲韩国一区二区三区| 国产一区 二区 三区一级| 欧美性做爰猛烈叫床潮| 国产人成一区二区三区影院| 亚洲成人av资源| aaa欧美色吧激情视频| 日韩免费视频一区二区| 亚洲国产美国国产综合一区二区| 国产成人精品www牛牛影视| 欧美色男人天堂| 国产精品久久福利| 国产一二三精品| 日韩欧美国产一区二区三区| 亚洲一区免费在线观看| proumb性欧美在线观看| 久久久99精品免费观看不卡| 蜜臀va亚洲va欧美va天堂| 91福利在线观看| 国产精品欧美一区喷水| 韩国一区二区三区| 日韩欧美久久久| 亚洲国产视频一区二区| 色综合天天综合网天天狠天天| 国产亚洲精久久久久久| 精品一区二区三区欧美| 日韩视频一区二区三区| 性欧美疯狂xxxxbbbb| 欧美午夜精品免费| 亚洲一区二区三区小说| 欧美午夜影院一区| 亚洲影院在线观看| 欧美日韩三级一区二区| 亚洲亚洲人成综合网络| 在线观看一区二区精品视频| 亚洲你懂的在线视频| 99麻豆久久久国产精品免费| 国产精品亲子伦对白| 不卡在线观看av| 亚洲日本青草视频在线怡红院| 91亚洲资源网| 亚洲一区视频在线观看视频| 欧美最猛黑人xxxxx猛交| 亚洲精品精品亚洲| 精品视频免费看| 日本中文一区二区三区| 日韩美一区二区三区| 国产在线麻豆精品观看| 欧美激情在线观看视频免费| 成人av免费在线播放| 自拍偷拍亚洲综合| 在线观看不卡视频| 图片区小说区区亚洲影院| 91精品国产日韩91久久久久久| 蜜臀久久久99精品久久久久久| 精品处破学生在线二十三| 国产suv精品一区二区6| 依依成人综合视频| 日韩视频一区二区三区| 不卡一区二区三区四区| 亚洲成av人片一区二区| 欧美精品一区二区三区在线| 成人精品视频网站| 午夜精品视频一区| 久久久久久电影| 91电影在线观看| 老司机精品视频导航| 国产精品的网站| 欧美美女一区二区在线观看| 国产一二三精品| 亚洲一卡二卡三卡四卡 | 国产一区二区三区四区五区美女| 国产亚洲欧洲一区高清在线观看| 99久久婷婷国产综合精品电影| 亚洲成av人片一区二区三区| 久久久久国产精品人| 在线视频一区二区三区| 国产麻豆精品一区二区| 亚洲午夜久久久久中文字幕久| 久久免费偷拍视频| 欧美精品777| 色综合中文字幕国产| 日韩av不卡在线观看| 1000精品久久久久久久久| 精品福利二区三区| 欧美一区二区成人6969| 91久久精品国产91性色tv| 狠狠色丁香婷婷综合| 亚洲h在线观看| 亚洲女与黑人做爰| 国产欧美日韩中文久久| 欧美一区二区二区| 欧美日本在线一区| 91丨porny丨户外露出| 国产不卡视频在线播放| 国内精品不卡在线| 男男成人高潮片免费网站| 亚洲一区二区三区视频在线| 亚洲国产成人午夜在线一区| 337p粉嫩大胆色噜噜噜噜亚洲| 69p69国产精品| 欧美亚洲日本一区| 欧美在线制服丝袜| 在线看不卡av| 欧美中文字幕不卡| 欧美无乱码久久久免费午夜一区| heyzo一本久久综合| 国产69精品久久久久777| 国产一区二区视频在线| 国产综合成人久久大片91| 青青草91视频| 久久精品国内一区二区三区| 日韩av电影天堂| 日产国产欧美视频一区精品 | 欧美色老头old∨ideo| 91亚洲精品乱码久久久久久蜜桃| 99久久精品国产导航| 成人av网站在线观看| 91视频免费播放| 91女人视频在线观看| 欧美中文字幕久久| 欧美情侣在线播放| 欧美大白屁股肥臀xxxxxx| 精品欧美乱码久久久久久| 久久久久久日产精品| 国产午夜精品福利| 亚洲精品写真福利| 午夜久久久久久电影| 另类小说一区二区三区| 国内精品伊人久久久久av一坑 | 不卡的av在线| 91极品视觉盛宴| 欧美日韩高清一区二区| 日韩免费视频一区| 国产精品理伦片| 亚洲最新视频在线播放| 蜜桃一区二区三区在线| 国产一区二区三区日韩| 99久久伊人精品| 91精品国产综合久久小美女| 久久久精品黄色| 亚洲欧美日韩一区二区| 免费观看一级欧美片| 成人国产精品免费观看动漫 | 91精品国产丝袜白色高跟鞋| 亚洲精品一线二线三线无人区| 久久久不卡网国产精品一区| 亚洲欧美区自拍先锋| 久久精品国产**网站演员| 成人一区二区三区视频在线观看 | 国内精品嫩模私拍在线| 91一区一区三区| 精品福利av导航| 亚洲一区二区三区爽爽爽爽爽| 狠狠色伊人亚洲综合成人| 色婷婷国产精品久久包臀| 精品欧美乱码久久久久久| 亚洲精品少妇30p| 狠狠色丁香久久婷婷综合_中| 欧美在线免费观看视频|