USB協議分析
USB裝置邏輯結構
在USB裝置的邏輯組織中,包含裝置、配置、介面和端點4個層次。裝置通常有一個或多個配置,配置通常有一個或多個介面,介面通常有零個或多個端點。
USB裝置描述符
當我們把USB裝置(例如USB滑鼠)插到我們的PC時,主機能夠自動識別出我們的USB裝置型別。在每一個USB裝置內部,包含了固定格式的資料,通過這些資料,USB主機就可以獲取USB裝置的型別、生產廠商等資訊。這些固定格式的資料,我們稱之為USB描述符。標準裝置有5種USB描述符:裝置描述符、配置描述符、介面描述符、端點描述符、字串描述符。這些描述符在USB裝置內部的暫存器中,供主機來調取檢視。
一個USB裝置只有一個裝置描述符,裝置描述符的長度為18個位元組。
1.重要的裝置描述符有:
bDeviceClass:型別程式碼
bDeviceSubClass:子型別程式碼
idVendor:供應商ID
idProduct:產品ID
通過型別程式碼和子型別程式碼就可以確定USB裝置的型別。
2.重要的配置描述符有:
bNumInterfaces:配置所支援的介面數,指該配置裝置配置的介面數量,也表示該配置下介面描述符的數量。
USB資料通訊
一個transfer(傳輸)由一個或多個transaction(事務)構成,一個transaction(事務)由一個或多個packet(包)構成,一個packet(包)由一個或多個sync(域)構成。
1.傳輸資料通訊
USB的資料通訊首先是基於傳輸(transfer)的,傳輸的型別有:中斷傳輸、批量傳輸、同步傳輸、控制傳輸。
2.事務資料通訊
一次傳輸由一個或多個事務(transaction)構成,事務可以分為:in事務、out事務、setup事務。
3.包資料通訊
一個事務由一個或多個包(packet)構成,包可分為:令牌包(setup)、資料包(data)、握手包(ack)、特殊包。
4.域資料通訊
一個包由多個域構成,域可分為:同步域(sync)、標識域(pid)、地址域(addr)、端點域(endp)、幀號域(fram)、資料域(data)、校驗域(crc)。
USB裝置列舉
USB裝置在正常工作以前,第一件要做的事就是列舉。列舉是讓主機認得這個USB裝置,並且為該裝置準備資源,建立好主機和裝置之間的資料傳遞通道。
1.獲取裝置描述符
2.復位
3.設定地址
4.再次獲取裝置描述符
5.獲取配置描述符
6.獲取介面、端點描述符
7.獲取字串描述符
8.選擇裝置配置
在具體分析之前我們先來掌握一些基礎知識:
這個表格就是主控制器傳送給裝置的請求資訊的格式
bmRequestType主要規定了下一條資訊的傳輸方向,0表示主機發送給裝置,1相反
bRequest請求的型別:
wValue根據不同的請求而設定不同的值,一般就是傳送引數給裝置標明這是什麼請求。在GET_DESCRIPTOR獲取裝置描述符裡,它的值是00 01。在GET_DESCRIPTOR裡這個欄位的低位元組表示描述符的索引,高位元組表示描述符的型別,高位元組的型別如下
我們來看個例子:01 00
01表示裝置描述符,00表示從偏移地址0處開始讀取裝置描述符。
wIndex 用來說明端點號或者說明介面標識
wLength傳送資料的長度
好的,接下來我們開始分析:
我們插上滑鼠後後出現如下的資訊,我們先來分析第一個傳輸:
我們看到第一個是控制傳輸,它包含了4個事物,分別是:1個setup事務,3個in事務,1個out事務,我們先開啟setup事務:
我們看到這個事務裡包含了3個包
第一個包是令牌包,它由主控制器傳送給目標裝置的0號埠,用於設定目標裝置的地址和埠號,我們看到後面兩個包都缺省了地址與埠號。在usb系統中,所有的通訊都是由主機發出相應的令牌所引起的。
第二個是資料包,由主控器傳送給目標裝置,其中資料的內容表示:
80:表示要求裝置向主機發送資訊
06:表示GET_DESCRIPTOR,即裝置向主機發送裝置描述符
00與01:Word-sized field that varies according to request
00與40:Word-sized field that varies according to request; typically used to pass an index or offset
00:Number of bytes to transfer if there is a:Data stage
總結一下第二個包就是向預設地址0 傳送GET_DESCRIPTOR 指令包,請求裝置傳送裝置描述符
第三個是應答包:裝置接收到主機發送的資料後會給出應答
接著我們看第一個in事務
我們看到這個事務裡也有三個包
第一個是in包:由主機發送給裝置,表示要裝置向主機發送上面請求的裝置描述符
第二個是資料包:由裝置傳送給主機,當然是傳送裝置描述符,我們來分析一下:
12:表示接下來要求主機向裝置傳送資訊
01:CLEAR_FEATURE、
第三個是應答包,由主機發送給裝置
接著我們來看第二個in事務
這個事務裡依舊是3個包
第一個是in包:由主機發送給裝置,表示需要輸入
第二個是資料包:由裝置傳送給主機,我們來解析一下:
6D:表示要求主機發給裝置資料
04:Reserved for future use
第三個是主機給裝置的應答包
然後看第三個in事務
第一個是in包:主機發給裝置
第二個是資料包,由裝置發給主機
00:要求主機發給裝置資訊
01:CLEAR_FEATURE
第三個是主機給裝置的應答訊號
最後來看out事務
第一個是out包:由主機發給裝置
第二個是資料包:由主機發給裝置,無資料
第三個包是裝置給主機的應答包
總結一下,第一個傳輸就是主控制器要求裝置傳送裝置描述符,然後裝置分三次將裝置描述符傳送給了主控制器,但是由於主控制器不知道裝置描述符有多長,所以要求傳送的是64個位元組長度。由於知道了裝置描述符,主控制器就可以找到相應的驅動程式了。
第一個傳輸後面是是一個復位包
下面我們的分析就不在貼出圖片了,知識列出重要的資訊
第二個傳輸:
00 05 02 00 00 00 00 00
這是主控制器傳送給裝置的配置資訊,05表示這是一個地址配置包。由於每條usb總線上最多可以連線127個裝置,每個裝置必須要有唯一的地址才能正常通訊。02表示分配的裝置地址是02。
第三次傳輸:
80 06 00 01 00 00 12 00
這是主控制器向裝置發出的資訊,06表示要獲取裝置的描述符,(00和01)表示要獲取的是裝置描述裡面的關於裝置的資訊。長度是12。注意因為上一個傳輸已經將裝置的地址設定為2了,所以這裡是向地址2傳送資訊。
12 01 00 02 00 00 00 08
6D 04 18 C0 01 43 01 02
00 01
這三條是裝置傳送給主機的裝置描述符
第四次傳輸:
80 06 00 02 00 00 09 00
這條資料由主機發送給裝置,(00和02)表示裝置描述符的型別是配置資訊。長度是9
09 02 22 00 01 01 00 A0
32
這9個位元組是裝置傳送給主機的配置資訊。
第五次傳輸:
80 06 00 02 00 00 22 00
表示主控制器要求主機發送配置資訊
09 02 22 00 01 01 00 A0
32 09 04 00 00 01 03 01
02 00 09 21 11 01 00 01
22 34 00 07 05 81 03 05
00 0A
這幾條是裝置傳送給主控制器的配置資訊
第六次傳輸:
80 06 00 03 00 00 FF 00
03表示字串描述符,值主機要求裝置傳送字串描述符
04 03 09 04
這是裝置傳送給主機的字串描述符
第七次傳輸:
80 06 02 03 09 04 FF 00
表示主控制器要求主機發送配置資訊,偏移地址是02
24 03 55 00 53 00 42 00
20 00 4F 00 70 00 74 00
69 00 63 00 61 00 6C 00
20 00 4D 00 6F 00 75 00
73 00 65 00
這是裝置傳送給主機的配置資訊
第八次傳輸:
80 06 01 03 09 04 FF 00
表示主控制器要求主機發送配置資訊,偏移地址是01
12 03 4C 00 6F 00 67 00
69 00 74 00 65 00 63 00
68 00
這幾條就是裝置傳遞給主控制器的配置資訊
第九次傳輸:
00 09 01 00 00 00 00 00
表示主控器要對裝置進行配置,偏移為1。
第十次傳輸:
21 0A 00 00 00 00 00 00
表示主控制器要獲得裝置的介面資訊
第十一次傳輸:
81 06 00 22 00 00 34 00
表示主控制器要獲得裝置描述符
05 01 09 02 A1 01 09 01
A1 00 05 09 19 01 29 03
15 00 25 01 75 01 95 03
81 02 75 05 95 01 81 01
05 01 09 30 09 31 09 38
15 81 25 7F 75 08 95 03
81 06 C0 C0
這是裝置傳送給主機的裝置描述符