USB協議以及枚舉過程淺析

一、概述

數據是由二進制數字串構成的,首先數字串構成域(有七種),域再構成包,包再構成事務(IN、OUT、SETUP),事務最後構成傳輸(中斷傳輸、並行傳輸、批量傳輸和控制傳輸)。

在這裏插入圖片描述

二、域

域:是USB數據最小的單位,由若干位組成(至於是多少位由具體的域決定),域可分爲七個類型

1、同步域(SYNC)

是用來告訴USB的串行接口引擎數據要開始傳輸了,請做好準備。除此之外,同步域還可以用來同步主機端和設備端的數據時鐘,因爲同步域是以一串0開始的,而0在USB總線上就是被編碼爲電平翻轉,結果就是每個數據位都發生電平變化,這讓串行接口引擎很容易就能夠恢復出採樣時鐘信號;對於全速設備和低速設備,同步域使用的是00000001(二進制數,總線上的發送順序);對於高速設備,同步域使用的是31個0,後面跟1個1(需要注意的是,這是對發送端的要求,接收端解碼時,0的個數可以少於這個數)。

2、標識域(PID)

由四位標識符+四位標識符反碼構成,表明包的類型和格式,這是一個很重要的部分,這裏可以計算出,USB的標識碼有16種。

在這裏插入圖片描述

1)令牌包

0x01:輸出(OUT)啓動一個方向爲主機到設備的傳輸,幷包含了設備地址和標號;

0x09:輸入(IN) 啓動一個方向爲設備到主機的傳輸,幷包含了設備地址和標號;

0x05:幀起始(SOF)表示一個幀的開始,並且包含了相應的幀號;

0x0d:設置(SETUP)啓動一個控制傳輸,用於主機對設備的初始化。

2)數據包

0x03:偶數據包(DATA0);

0x0b:奇數據包(DATA1)。

3)握手包

0x02:確認接收到無誤的數據包(ACK);

0x0a:無效,接收(發送)端正在忙而無法接收(發送)信息;

0x0e:錯誤,端點被禁止或不支持控制管道請求。

4)特殊包

0x0C前導,用於啓動下行端口的低速設備的數據傳輸。

3、地址域(ADDR)

七位地址,代表了設備在主機上的地址,地址000 0000被命名爲零地址,是任何一個設備第一次連接到主機時,在被主機配置、枚舉前的默認地址,由此可以知道爲什麼一個USB主機只能接127個設備的原因。

4、端點域(ENDP)

四位,由此可知一個USB設備有的端點數量最大爲16個。

5、幀號域(FRAM)

11位,每一個幀都有一個特定的幀號,幀號域最大容量0x800,對於同步傳輸有重要意義(同步傳輸爲四種傳輸類型之一)。

6、數據域(DATA)

長度爲0~1023字節,在不同的傳輸類型中,數據域的長度各不相同,但必須爲整數個字節的長度 。

7、校驗域(CRC)

對令牌包和數據包(對於包的分類請看下面)中非PID域進行校驗的一種方法,CRC校驗在通訊中應用很泛,是一種很好的校驗方法,至於具體的校驗方法這裏就不多說,請查閱相關資料,只須注意CRC碼的除法是模2運算,不同於10進制中的除法。

三、包

由域構成的包有四種類型,分別是令牌包、數據包、握手包和特殊包,前面三種是重要的包,不同的包的域結構不同,介紹如下

1、令牌包

可分爲輸入包、輸出包、設置包和幀起始包(注意這裏的輸入包是用於設置輸入命令的,輸出包是用來設置輸出命令的,而不是放據數的) 其中輸入包、輸出包和設置包的格式都是一樣的:

SYNC+PID+ADDR+ENDP+CRC5(五位的校驗碼)

幀起始包的格式:

SYNC+PID+11位FRAM+CRC5(五位的校驗碼)

2、數據包

分爲DATA0包和DATA1包,當USB發送數據的時候,當一次發送的數據長度大於相應端點的容量時,就需要把數據包分爲好幾個包,分批發送,DATA0包和DATA1包交替發送,即如果第一個數據包是 DATA0,那第二個數據包就是DATA1。但也有例外情況,在同步傳輸中(四類傳輸類型中之一),所有的數據包都是爲DATA0,格式如下:

SYNC+PID+0~1023字節+CRC16

3、握手包

結構最爲簡單的包,格式如下 SYNC+PID

每包數據的最後都會有一個包結束符EOP(End-of-Packet),對於高速設備和全速/低速設備也是不一樣的。全速/低速設備的EOF是一個大約爲2個數據位寬度的單端0(SE0)信號。SE0的意思就是,D+和D-同時都保持爲低電平。由於USB使用的是差分數據線,通常都是一高一低的,而SE0不同,是一種都爲低的特殊狀態。SE0用來表示一些特殊的意義,例如包結束、復位信號燈。USB集線器對USB設備進行復位的操作,就是通過將總線設置爲SE0狀態大約10ms來實現的。對於高速設備的EOF,使用故意的位填充錯誤來表示。那麼如何判斷一個位填充錯誤是真的位錯誤還是包結束呢?這個由CRC校驗來判斷。如果CRC校驗正確,則說明這個位填充錯誤是EOP;否則,說明傳輸出錯。

四、事務

分別有IN事務、OUT事務和SETUP事務三大事務,每一種事務都由令牌包、數據包、握手包三個階段構成,這裏用階段的意思是因爲這些包的發送是有一定的時間先後順序的,事務的三個階段如下:

1)令牌包階段:啓動一個輸入、輸出或設置的事務

2)數據包階段:按輸入、輸出發送相應的數據

3)握手包階段:返回數據接收情況,在同步傳輸的IN和OUT事務中沒有這個階段,這是比較特殊的。

事務的三種類型如下(以下按三個階段來說明一個事務):

1、IN事務

令牌包階段——主機發送一個PID爲IN的輸入包給設備,通知設備要往主機發送數據;

數據包階段——設備根據情況會作出三種反應(要注意:數據包階段也不總是傳送數據的,根據傳輸情況還會提前進入握手包階段)

1) 設備端點正常,設備往入主機裏面發出數據包(DATA0與DATA1交替);

2) 設備正在忙,無法往主機發出數據包就發送NAK無效包,IN事務提前結束,到了下一個IN事務才繼續;

3) 相應設備端點被禁止,發送錯誤包STALL包,事務也就提前結束了,總線進入空閒狀態。

握手包階段——主機正確接收到數據之後就會向設備發送ACK包。

2、 OUT事務

令牌包階段——主機發送一個PID爲OUT的輸出包給設備,通知設備要接收數據;

數據包階段——比較簡單,就是主機會給設備送數據,DATA0與DATA1交替

握手包階段——設備根據情況會作出三種反應

1)設備端點接收正確,設備往入主機返回ACK,通知主機可以發送新的數據,如果數據包發生了CRC校驗錯誤,將不返回任何握手信息;

2)設備正在忙,無法接收主機發出數據包就發送NAK無效包,通知主機再次發送數據;

3)相應設備端點被禁止,發送錯誤包STALL包,事務提前結束,總線直接進入空閒狀態。

3、SETUT事務

令牌包階段——主機發送一個PID爲SETUP的輸出包給設備,通知設備要接收數據;

數據包階段——比較簡單,就是主機會設備送數據,注意,這裏只有一個固定爲8個字節的DATA0包,這8個字節的內容就是標準的USB設備請求命令(共有11條)

握手包階段——設備接收到主機的命令信息後,返回ACK,此後總線進入空閒狀態,並準備下一個傳輸(在SETUP事務後通常是一個IN或OUT事務構成的傳輸)

五、傳輸

傳輸由OUT、IN、SETUP事務其中的事務構成,傳輸有四種類型,中斷傳輸、批量傳輸、同步傳輸、控制傳輸,其中中斷傳輸和批量轉輸的結構一樣,同步傳輸有最簡單的結構,而控制傳輸是最重要的也是最複雜的傳輸。

1、中斷傳輸

由OUT事務和IN事務構成,用於鍵盤、鼠標等HID設備的數據傳輸中

2、批量傳輸

由OUT事務和IN事務構成,用於大容量數據傳輸,沒有固定的傳輸速率,也不佔用帶寬,當總線忙時,USB會優先進行其他類型的數據傳輸,而暫時停止批量轉輸。

3、同步傳輸

由OUT事務和IN事務構成,有兩個特殊地方,第一,在同步傳輸的IN和OUT事務中是沒有返回包階段的;第二,在數據包階段所有的數據包都爲DATA0

4、控制傳輸

最重要的也是最複雜的傳輸,控制傳輸由三個階段構成(初始設置階段、可選數據階段、狀態信息步驟),每一個階段可以看成一個的傳輸,也就是說控制傳輸其實是由三個傳輸構成的,用來於USB設備初次加接到主機之後,主機通過控制傳輸來交換信息,設備地址和讀取設備的描述符,使得主機識別設備,並安裝相應的驅動程序,這是每一個USB開發者都要關心的問題。

1)初始設置步驟:就是一個由SETUP事務構成的傳輸;

2)可選數據步驟:就是一個由IN或OUT事務構成的傳輸,這個步驟是可選的,要看初始設置步驟有沒有要求讀/寫數據(由SET事務的數據包階段發送的標準請求命令決定);

3)狀態信息步驟:顧名思義,這個步驟就是要獲取狀態信息,由IN或OUT事務構成構成的傳輸,但是要注意這裏的IN和OUT事務和之前的INT和OUT事務有兩點不同:

(1) 傳輸方向相反,通常IN表示設備往主機送數據,OUT表示主機往設備送數據;在這裏,IN表示主機往設備送數據,而OUT表示設備往主機送數據,這是爲了和可選數據步驟相結合;

(2) 在這個步驟裏,數據包階段的數據包都是0長度的,即SYNC+PID+CRC16。

六、使用舉例

在這裏插入圖片描述

1、設置事務

令牌包:Sync(同步域00000001B)+ADDR(地址域0000000B,設備地址7位,地址0爲缺省地址,要保留,所以總線最多可以掛掛載127個設備)+ENDP(端點域0000B,端點號4位,最多16個端點)+CRC5(校驗域0x08);

後邊跟上一個EOP(End-of-Packet)包結束符

數據包:Sync(同步域)+DATA0(標識域,表示偶數據包,下一次發數據就會用DATA1,表示奇數據包,也是usb的一種糾錯機制,如果兩次數據包的這個標識域相同,那肯定出錯了)+DATA(數據域,0x00 0x05表示設置地址請求,0x02就是設置的地址,後邊的數據在設置地址時全都沒有意義)+CRC16(0xD768);

握手包:Sync(00000001B同步域)+Ack(0x4B標識域)

注意包前面的DIR表示方向,方向都是相對主機的。令牌包都是輸出方向 ->,即不管什麼事務,令牌包都是由主機發出的,也就是說所有的事務都由主機發起。

設置事務是主機發送數據給設備,所以數據包DIR是輸出;握手包是設備收到數據後對主機的響應,DIR是輸入。

2、輸入事務

令牌包 Sync(00000001同步域)+In(0x96標識域,通知設備輸入,可以查看前面的表格看到1001表示IN,後面四位是前面四位取反,所以是0110)+Addr(0000000B地址域)+Endp(0000B端點域)+CRC5(0x08校驗域)

數據包 Sync(00000001同步域)+DATA1(0xD2標識域)+DATA(無,數據域爲空,無數據發送)+CRC16(0x0000校驗域)

握手包:Sync(00000001B同步域)+Ack(0x4B標識域)

可以看到,主機通過令牌包發送了一個In標識域,要求設備發送數據給主機,雖然設備並無數據要發送,但還是發送了一個空數據(數據域爲空)的數據包給主機,主機隨後發了個握手包響應設備,表示正確收到數據。

(3)本次傳輸是一次控制傳輸,設置usb設備地址爲2.本次傳輸由設置事務和輸入事務組成,沒有輸出事務,也就是說一次傳輸不必三種事務全包含。但是不管是設置事務、輸入事務還是輸出事務,任何事務都必須由三個順序的令牌包、數據包和握手包組成。一個包則有7種域的各種可能組合而成。

七、描述符(description)

談到USB描述符,不得不說USB最強悍的地方就在這裏。一個口可以插很多的設備,可以插U盤、上網卡、音頻設備、還有的是複合設備,一個設備插上後可以虛擬出多個設備出來,太強了。

主設備之所以能區分不同的從設備,靠的就是描述符。 於是USB協議裏就規定了各種不同的USB描述符。讓我們先看一下USB協議裏四大描述符之間的關係

±-----設備描述符

    +----------配置描述符1

±---------接口描述符1

  +----------端點描述符1

±---------端點描述符2

+…

±---------接口描述符2

±---------端點描述符1

+…

+…

    +----------配置描述符2

±---------接口描述符1

±---------端點描述符1

±---------端點描述符2

+…

+…

    +....

1 、設備描述(device description)

故名思意用來描述USB設備的,一個設備只有一個設備描述符,包含了設備類型、設備遵循的協議、廠商ID、產品id、序列號等,一個完整的設備描述符如下:

DEVICE DESCRIPTOR

bLength: 18

bDescriptorType: 0x01 (DEVICE)

bcdUSB: 0x0200

bDeviceClass: Vendor Specific (0xff)

bDeviceSubClass: 255

bDeviceProtocol: 255

bMaxPacketSize0: 64

idVendor: Marvell Semiconductor, Inc.(0x1286)

idProduct: Unknown (0x812a)

bcdDevice: 0x0000

iManufacturer: 3

iProduct: 2

iSerialNumber: 0

bNumConfigurations: 1

2、 配置描述符(configrue description)

配置描述就是用來配置設備的,沒錯,就是這麼簡單。但是要記住一點:一個設備同一時刻只能有一種配置生效,而且要區分配置和設置的區別。還是來看一下配置描述符的內容

CONFIGURATION DESCRIPTOR

bLength: 9

bDescriptorType: 0x02 (CONFIGURATION)

wTotalLength: 121

bNumInterfaces: 4

bConfigurationValue: 1

iConfiguration: 0

Configuration bmAttributes: 0xc0 

SELF-POWERED NO REMOTE-WAKEUP

    1... .... =

Must be 1: Must be 1 for USB 1.1 and higher

    .1.. .... =

Self-Powered: This device is SELF-POWERED

    ..0. .... =

Remote Wakeup: This device does NOT support remote wakeup

bMaxPower: 250  (500mA)

設置是什麼,暫時不多解釋,後面再談。

3、 接口描述符(interface description)

一個interface就代表一個設備。USB interface用來處理一類 USB 邏輯連接, 例如一個鼠標, 一個鍵盤, 或者一個音頻流. 一些 USB 設備有多個接口。也就是複合設備,例如一個 USB 揚聲器可能有 2 個接口: 一個 USB 鍵盤給按鈕和一個 USB 音頻流。

INTERFACE DESCRIPTOR (2.0): class Vendor Specific

bLength: 9

bDescriptorType: 0x04 (INTERFACE)

bInterfaceNumber: 2

bAlternateSetting: 0

bNumEndpoints: 2

bInterfaceClass: Vendor Specific (0xff)

bInterfaceSubClass: 0x00

bInterfaceProtocol: 0x00

iInterface: 8

**一個interface包含多個endpoint

4 、端點描述符(endpoint description)

USB通信的基本物理單位,一個endpiont只能承載一個方向的數據。endpiont分爲如下幾種:

1)CONTROL

控制端點被用來允許對 USB 設備的不同部分存取. 通常用作配置設備, 獲取關於設備的信息, 發送命令到設備, 或者獲取關於設備的狀態報告. 這些端點在尺寸上常常較小. 每個 USB 設備有一個控制端點稱爲"端點 0", 被 USB 核用來在插入時配置設備. 這些傳送由 USB 協議保證來總有足夠的帶寬使它到達設備。

2)INTERRUPT

中斷端點傳送小量的數據, 以固定的速率在每次 USB 主請求設備數據時. 這些端點對 USB 鍵盤和鼠標來說是主要的傳送方法. 它們還用來傳送數據到 USB 設備來控制設備, 但通常不用來傳送大量數據. 這些傳送由 USB 協議保證來總有足夠的帶寬使它到達設備。

3)BULK

塊端點傳送大量的數據. 這些端點常常比中斷端點大(它們一次可持有更多的字符). 它們是普遍的, 對於需要傳送不能有任何數據丟失的數據. 這些傳送不被 USB 協議保證來一直使它在特定時間範圍內完成. 如果總線上沒有足夠的空間來發送整個 BULK 報文, 它被分爲多次傳送到或者從設備. 這些端點普遍在打印機, 存儲器, 和網絡設備上。

4)ISOCHRONOUS

同步端點也傳送大量數據, 但是這個數據常常不被保證它完成. 這些端點用在可以處理數據丟失的設備中, 並且更多依賴於保持持續的數據流. 實時數據收集, 例如音頻和視頻設備, 一直都使用這些端點。

BULK端點描述符數據內容如下:

ENDPOINT DESCRIPTOR

bLength: 7

bDescriptorType: 0x05 (ENDPOINT)

bEndpointAddress: 0x86  IN 

Endpoint:6

    1... .... =

Direction: IN Endpoint

    .... 0110 =

Endpoint Number: 0x6

bmAttributes: 0x02

    .... ..10 =

Transfertype: Bulk-Transfer (0x2)

wMaxPacketSize: 512

    .... ..10 0000

0000 = Maximum Packet Size: 512

bInterval: 0

5、 class

class用來描述設備屬於哪種設備,例如音頻、鍵盤、U盤等。設備通過class來確認和加載相應的驅動。class分爲device class 和interface class。具體的class值以及含義,參考define class。

class 包含

class

subclass

protocol

組合在一起,用來指出設備具體功能。

1)device class舉例

DEVICE DESCRIPTOR

bLength: 18

bDescriptorType: 0x01 (DEVICE)

bcdUSB: 0x0200

bDeviceClass: Miscellaneous (0xef)

bDeviceSubClass: 2

bDeviceProtocol: 1 (Interface Association Descriptor)

bMaxPacketSize0: 64

idVendor: Marvell Semiconductor, Inc. (0x1286)

idProduct: Unknown (0x4e31)

bcdDevice: 0x0100

iManufacturer: 1

iProduct: 2

iSerialNumber: 3

bNumConfigurations: 1

2)interface class舉例

INTERFACE DESCRIPTOR (1.0): class CDC-Data

bLength: 9

bDescriptorType: 0x04 (INTERFACE)

bInterfaceNumber: 1

bAlternateSetting: 0

bNumEndpoints: 2

bInterfaceClass: CDC-Data (0x0a)

bInterfaceSubClass: 0x00

bInterfaceProtocol: No class specific

protocol required (0x00)

iInterface: 5

八、USB 請求(用於控制傳輸)

標準的USB設備請求命令是用在控制傳輸中的“初始設置步驟”裏的數據包階段(即DATA0,由8個字節構成)。

也就是說,是控制傳輸的建立階段(SetUP)的 DATA0 的 8 個字節。

命令共有11個,大小都是8個字節,具有相同的結構,由5個字段構成(字段是標準請求命令的數據部分),結構如下(括號中的數字表示字節數,首字母bm,b,w分別表示位圖、字節,雙字節):

BmRequestType (1) + bRequest (1) + wvalue (2) + wIndex
(2) + wLength (2)

在這裏插入圖片描述

其中 bRequest 爲命令編碼值,含意見表2:

在這裏插入圖片描述
對應的11種的命令,其他的域的含義對照表爲:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章