筆記,最近在看《圈圈教你玩USB》,做一些記錄。
一串神祕的數字:80 06 00 01 00 00 12 00
昨天提到了USB上電枚舉過程的流程圖,在這個流程圖中,可以看到USB主機和USB設備在剛上電的時候進行了哪些操作,最終實現主機識別USB設備,設備穩定工作。
今天看下USB上電枚舉過程中的第一步,也是最重要的一步:標準設備請求。如圖所示,這是我的USB無線鼠標連接到電腦的時候,通過軟件BUS Hound抓取得到的數據流。
現在我換成一個優盤,數據如下:
你會發現,無論你接入什麼USB設備,USB主機(也就是電腦)發送給USB設備的第一串數字都是:80 06 00 01 00 00 12 00
不同的USB主機,倒數第二個數字可能會有些不同。那麼,這幾個數字究竟是什麼意思?
首先我們要明確一點:USB設備不會主動向USB主機發送數據,只能是USB主機發起請求,然後USB設備再發送。而這是USB設備上電後,兩者之間發生的第一次數據交互,所以它必然是從主機發送到設備的。
看下錶:
字節偏移量 |
名稱 |
大小 |
功能描述 |
0 |
bmRequest Type |
1 |
每一位的功能: D7:數據傳輸方向,0:主到從;1:從到主 D6~5:請求的類型 0:標準請求 1:類請求 2:廠商 3:保留 D4~0:請求的接收者 0:設備 1:接口 2:端點 3:其它 4~31:保留 |
1 |
bRequest |
1 |
請求類型對應的代碼 |
2 |
wValue |
2 |
根據請求類型決定 |
4 |
wIndex |
2 |
根據請求類型決定 |
6 |
wLength |
2 |
數據過程(如果有)需要傳輸的字節數 |
請求類型有三種,這裏只說標準請求對應的代碼,具體如下:
bRequest |
Value |
|
bRequest |
Value |
GET_STATUS |
0 |
|
GET_CONFIGURATION |
8 |
CLEAR_FEATURE |
1 |
|
SET_CONFIGURATION |
9 |
SET_FEATURE |
3 |
|
GET_INTERFACE |
10 |
SET_ADDRESS |
5 |
|
SET_INTERFACE |
11 |
GET_DESCRIPTOR |
6 |
|
SYNCH_FRAME |
12 |
SET_DESCRIPTOR |
7 |
|
|
|
前面說了,這一步操作叫做:標準設備請求。主機向設備發出的,要求接下來進行的操作遵從如下內容:
80 06 00 01 00 00 12 00
數據傳輸方向:設備到主機,請求類型:標準請求,請求的接收者爲設備。
因爲是標準請求,請求類型的代碼爲:0x06.對應:GET_DESCRIPTOR,也就是獲取描述符。
接下來是wValue,有兩個字節:00 01。高字節(01)--描述符類型 低字節(00)--描述符索引。
描述符類型及編號如下:
描述符類型 |
編號 |
設備描述符 |
1 |
配置描述符 |
2 |
字符串描述符 |
3 |
接口描述符 |
4 |
端點描述符 |
5 |
所以主機請求的是設備描述符。
然後是wIndex,00 00. 它只有在獲取字符串描述符的時候有用,表示字符串的語言Id號,其他情況下這個值都是0。
最後是wLength,表示請求設備返回的數據的字節個數。實際返回的個數可以比這個少,但一定要返回。
好了,這8個數字解釋完了~~~