UHCI的資料流控制

2021-06-15 00:25:00 字數 3349 閱讀 9358

uhci的資料結構和資料流控制

一、資料結構

主要涉及到三個資料結構:frame list 、transfer descriptors(td)、queue head(qh)。frame list必須要4k位元組對齊;而td和qh需要16位元組對齊,一般情況本身的結構大小要超過16位元組。

三者之間的關係如下圖所示:

其中frame list base address從uhci的io register中讀到的,uhcispec中有介紹。frame counter也是在io register中讀到,也base address共同得到當前uhci需要處理的frame list中的frame pointer。

剩下的問題就是如何控制frame pointer中td、qh的資料流。

關於td和qh的資料結構問題:

frame list pointer指第乙個需要排程的結構體的位址。

q:表示link pointer指向的是td(0)還是qh(1)。

t:表示告知hc,該frame是否有有效的資料流入口。1、表示空的frame;0表示有效入口。

2、transfer descriptor

針對同步、中斷、控制、bulk傳輸,有四種不同的td,當然結構大同小異,只是部分控制bit不一樣而已。按理說會有8個dword,實際使用前4個dword,最後4個dword是留給software使用的。

link pointer指指向另外乙個td或者qh。

vf:告知hc,該深度遍歷還是廣度遍歷。深度遍歷就是跑向link pointer的指向的td;廣度遍歷跑向link pointer指向的另外乙個qh。1=depth first;0=breadth first。

q:表示link pointer指向的是td(0)還是qh(1)。

t:1=link pointer無效;0=link pointer是有效的。該bit告知hc本td中link pointer是否指向另外乙個資料流入口。如果td在乙個佇列裡中,該bit代表告知hc,佇列中已經沒有另外的有效資料流入口了。也就是說本td是最後乙個td。

另外的字段說明請看spec。

在status欄位中,bit23是active bit。也就是說,software將所有的qh或者td設定好,frame list base address也設定好之後,在將該bit置位,則hc馬上開始usb的資料傳輸。在等待若干time之後判斷是否得到ack。

buffer pointer指本td中需要傳輸的資料內容。大小必須不小於max length中定義的size。

3、queue head

qh是特別針對控制、bulk和中斷傳輸定義的結構。而同步傳輸中不會使用qh。必須16位元組對齊。

q:表示link pointer指向的是td(0)還是qh(1)。

t:告知hc,本qh已經是本次排程序列中最後乙個qh了。1=last qh;0=pointer有效,指向td或者qh。

二、如何控制資料流

hcd設定hc的register:frame list baseaddress和frame list index,並通過hc的run、stop控制hc執行排程序列。

hc首先從frame list中讀取乙個入口,判斷bit0 是否是pointer address有效;判斷bit1 是指定td還是qh;另外乙個欄位即pointer address。

如果針對isochronous傳輸,frame list則指向td,如果沒有isochronous傳輸,則指向qh。如果指向td,則hc獲取到入口位址開始在usb匯流排上傳輸資料,每個td包含的link pointer指向下乙個入口,td或者qh;如果是指向qh的,hc就會按照qh中的結構來相應處理。

1、  處理同步傳輸的描述符

同步傳輸的描述符是link到frame list中,每1ms發生一次資料的傳送。所以同步傳輸的控制也要保證host端到端點之間的固定頻率的資料傳送。同步td的處理如下:

1)、hc獲取對應的isochronous td;

2)、hc decode td的各個字段,來做相應的傳輸控制。

3)、hc產生usb token,開始傳送 usb資料。

4)、當傳輸過程完成,hc將更新狀態,標誌td非活躍狀態。

5)、hc獲取當前td中link pointer指向的td或者qh。

6)、類似的同樣處理td或者qh。

2、  處理bulk、control和interrupt的傳輸描述符

像bulk、control和interrupt td傳輸資料是通過qh佇列來實現的。步驟如下:

1)、hc從frame list中獲得qh,並確認是否有有效的入口。

2)、如果資料(td or qh)入口有效,hc從qh的元素指標中獲取td或者qh,如果是td,則跳轉到3);如果qh則跳轉到1);如果是無效的入口,直接跳轉到10)。

3)、hc解析td欄位,覺得採取何種方式傳輸。

4)、hc產生usb token,並開始執行傳輸,setup階段。

5)、等傳輸過程結束,hc更新狀態。

6)、如果傳輸結束並成功,td被標誌位非活躍狀態,並跳轉到9)。

7)、如果此次傳輸沒有成功,但是error次數沒有達到門限值,那麼td將依舊重新開始活躍。跳轉到10)。

8)、如果此次傳輸失敗,而且error也達到了門限值,那麼td將被標誌成非活躍態,跳轉到10)。

9)、hc將當前td的link pointer寫入到當前qh結構中的元素指標中(也就是將qh中之前處理完的td從鍊錶中移除),如果link pointer的vf bit置位了(depth),(將當前qh傳遞過去)跳轉到2);否則直接進入10)。

10)、hc從當前qh的qh linkpointer中獲取到qh或者td的指向。如果該qh link pointer的t位置位的話,hc進入idle轉跳等待1ms 幀時間的消耗完。

11)、uhci的處理過程繼續以此流程進行下去。

資料流控制的結構圖如下:

下圖是乙個佇列的例項:

UHCI的資料流控制

uhci的資料結構和資料流控制 一 資料結構 主要涉及到三個資料結構 frame list transfer descriptors td queue head qh frame list必須要4k位元組對齊 而td和qh需要16位元組對齊,一般情況本身的結構大小要超過16位元組。三者之間的關係如下...

TCP互動資料流 成塊資料流

tcp資料流分類 基於tcp的各類解決方案,可以根據資料吞吐量來大致分成兩大類 1 互動資料型別,例如telnet,ssh,這種型別的協議在大多數情況下只是做小流量的資料交換,比如說按一下鍵盤,回顯一些文字等等。2 資料成塊型別,例如ftp,這種型別的協議要求tcp能盡量的運載資料,把資料的吞吐量做...

C 的資料流

1 stringstream std stringstream png file png file qq 此時是把qq賦值給png file,png file.str 就是qq 即 std cout png file.str 輸出是qq 2 ofstream ofstream outfile out...