1. 程式人生 > >USB開裝置開發學習之四:USB傳輸之控制傳輸

USB開裝置開發學習之四:USB傳輸之控制傳輸

原文:https://blog.csdn.net/go_str/article/details/80782229 

前言
    USB控制傳輸分為以下四種:
批量傳輸:批量傳輸一般用於批量的和非實時的資料傳輸,通俗的來說就是用於資料量大但對時間要求又不高的場合的一種傳輸方式,類似用於USB印表機和USB掃描器等等。
中斷傳輸:中斷傳輸一般用於小批量的和非連續的資料傳輸,通俗的來說就是用於資料量小的資料不連續的但實時性高的場合的一種傳輸方式,類似用於USB滑鼠和USB鍵盤等等。
等時傳輸:等時傳輸也有“同步傳輸”的叫法,一般用於要求資料連續、實時且資料量大的場合,其對傳輸延時十分敏感,類似用於USB攝像裝置,USB語音裝置等等。
控制傳輸:控制傳輸是一種特殊的傳輸方式,且傳輸過程相對以上三種而言更復雜一些,但也十分重要。當USB裝置初次連線主機時,用控制傳輸傳送控制命令等對裝置進行配置。同時裝置接入主機時,需要通過控制傳輸去獲取USB裝置的描述符以及對裝置進行識別,在裝置的列舉過程中都是使用控制傳輸進行資料交換。

一、控制傳輸的結構
    一次完整控制傳輸可以分為三個階段:初始設定階段--->資料階段(不必須)--->狀態資訊階段。下面的

1、初始設定階段
    初始設定階段用於固定建立SETUP事務,標誌一次控制傳輸的開始。初始設定階段為一個SETUP事務,同樣分為三個階段如下:
令牌包階段:
    主機會發送一個SETUP令牌包,如下:

相當於告訴裝置,我要跟你進行通訊請你做好準備。

資料包階段:
    傳送DATA0資料包(注意SETUP只能使用DATA0包,8位元組),讓裝置接收。例如傳送獲取裝置描述符命令包:

相當於告訴裝置,請將裝置描述符的內容發給我。

握手包階段:
    裝置自動應答。


結合上面的過程可以用下圖表示初始設定階段。


2、資料階段
    初始設定階段中命令如果要求讀/寫資料,資料階段就會在這一階段來具體交換資料(如果沒有資料交換要求則可省去該步驟,具體有SETUP事務標準請求命令決定)。在此需要做一些說明:傳輸控制在前言有說到控制傳輸的用途是獲取裝置資訊與對裝置進行配置。所以這些資料操作分為以下三類:
1)、控制讀傳輸;
2)、控制寫傳輸;
3)、無資料控制傳輸。

    一次控制傳輸必定為上面三種中的其中一種,所以資料階段中的資料事務也是根據該規則來決定資料事務的。
    此處還應該注意的是資料階段是由一到多個IN/OUT事務組成。這是由於有時候存在一個事務傳不完的資料,所以可能存在多個連續IN/OUT事務的情況。這也就決定了,在同一次資料傳輸階段中事務型別必定相同(IN/OUT事務)。

2.1、傳輸格式
    綜上所述,所以從傳輸控制的不同型別來講述資料階段的格式會更好理解。
1)、控制讀傳輸
    控制讀傳輸時資料階段在整個傳輸的格式如下圖藍框部分:


資料方向為:裝置 —> 主機 (讀取USB描述符)
    這裡每個資料包是DATA0和DATA1交替出現的。需要注意的是當最後一個包剛好為允許的最大資料包大小時需要再傳一個0長度的資料包,表示傳輸的結束。

控制讀傳輸的資料過程IN事務的三個階段如下:
令牌包階段:
    主機會發送一個IN令牌包,觸發裝置產生IN包中斷,如下:

資料包階段:
    裝置回覆主機請求,迴應資料。例如回覆裝置描述符命令請求:

握手包階段:
    主機自動應答。

2)、控制寫傳輸
    控制寫傳輸時資料階段在整個傳輸的格式如下下圖藍框部分:

資料方向為:主機 —> 裝置(配置USB裝置)

傳輸過程和規則基本與讀取相似,不多做贅述。


3)、無資料控制
    控制傳輸不一定要傳輸很多資料,有些控制可能只是告訴裝置要做一件事,這個命令包含在建立階段的建立事務的8位元組資料中即可,裝置只需回覆主機收到命令與否即可,所以就跳過資料階段直接進入到狀態階段。無資料控制的格式如下圖:

所以注意在無資料控制傳輸時,是無資料階段的!


3、狀態資訊階段
    狀態資訊階段是要返回資料傳輸的成功與否,具體也需要看控制傳輸的型別。需要注意的是,狀態資訊的資料傳輸方向與資料階段方向相反。例如,資料階段為IN事務則狀態資訊階段為OUT事務。

3.1、控制讀傳輸
    在控制讀傳輸時,該階段則為OUT事務,其中的資料包固定為DATA1資料包。返回資料成功與否以有以下情況:
    1)、讀資料成功                      主機發送OUT令牌包(ping令牌包,高速情況下),主機發送0長度資料包,裝置ACK。
    2)、資料傳輸出錯                   主機發送OUT令牌包(ping令牌包,高速情況下),主機發送0長度資料包,裝置STALL。
    3)、裝置忙(比如正在寫資料)   主機發送OUT令牌包(ping令牌包,高速情況下),主機發送0長度資料包,裝置NAK。 

控制讀傳輸的狀態資訊階段OUT事務的三個階段如下(以ACK為例):
令牌包階段:
    主機會發送一個OUT令牌包,如下:

資料包階段:
    主機發送0位元組資料包,作為狀態正常資訊迴應:

握手包階段:
    裝置自動應答。

3.2、控制寫傳輸
    在控制讀傳輸時,該階段則為IN事務,其中的資料包固定為DATA1資料包。返回資料成功與否以有以下情況:
    1)、寫資料成功                      主機發送IN令牌包,主機發送0長度資料包,裝置回覆ACK。
    2)、資料傳輸出錯                   主機發送IN令牌包,裝置回覆STALL。
    3)、裝置忙(比如正在寫資料)   主機發送IN令牌包,裝置回覆NAK。 

控制讀傳輸的狀態資訊階段IN事務過程與讀類似。

3.3、無資料控制傳輸
    該階段則為IN事務,其規則與控制寫傳輸相似。

至此,一次控制傳輸完成,整個過程結束。
    因為最近入門USB開發,該博文是經過看網上的資料結合自己的理解整理完成,如果有不得當的地方,希望大家多多指正,謝謝。
---------------------