每當一個USB
外設接入主機后,系統會提示用戶USB
設備接入了,并不停的查找對應的驅動文件,如果找到驅動文件,則加載對應驅動;如果沒有找到,則提示用戶沒有對應的驅動,需要用戶主動去配置驅動。
那么主機是如何判斷設備類型以及找到對應的設備驅動?在解決這問題之前,先來了解幾個概念:
- 設備描述符 :描述設備的通用信息,如廠商IDD、產品ID和修訂ID,支持的設備類、設備子類、適用的協議以及默認端點的最大包大小等。
- 配置描述符 :描述當前配置中的接口數、支持的掛起和恢復能力以及功率要求。單個物理的
USB
設備,可以包含一個或者多個配置,不同的配置描述表現出不同的設備功能。 - 接口描述符 :接口類、子類和適用的協議,接口備用配置的數目和端點數目。USB協議根據功能將不同的接口劃分成不同的類,如下:
1:音頻類,2:CDC控制類,3:人機接口類(HID),5:物理類,6:圖像類,7:打印機類,8:大數據存儲類,9:集線器類,10:CDC數據類,11:智能卡類,13:安全類,220:診斷設備類,224:無線控制類,254:特定應用類,255廠商定義的設備。
- 端點描述符 :描述端點地址、方向和類型、支持的最大包大小。主機只能通過端點和設備通信。主機通過
USB
地址+端點號來尋址,確定數據最終是發到那個端點。
0號端點是個特殊端點,通常稱作控制端點
,用戶設備的初始化
我們來看一下下面這個圖,描述了設備描述符、配置、接口以及端點個層次包含關系。
USB各描述符層次關系
我們可以看到,最頂層的設備描述符
包含一個USB
設備的所有信息,也就是說可以通過設備描述符
依次獲取到整個USB
設備的信息.
枚舉的整個過程大概就是這樣:
- 獲取設備描述: 獲取設備基本信息,并獲取配置描述符。
- 獲取配置信息: 根據配置描述獲取到接口描述
- 獲取接口描述: 根據接口描述,得到端點描述符
- 獲取端點描述: 得到端點描述符
以上只是個基本過程,大體上要識別一個USB設備,這幾步驟是必須的。
那么這幾步驟具體是怎么完成的的?說到這就得說說SETUP
過程,枚舉過程中每次HOST和Device的交互,都是通過SETUP
來完成的。下來詳細說說這SETUP
過程, 整個過程分為三個階段:
1. CMD階段(SETUP階段)
數據方向:HOST->DEVICE單方向,這就是為什么USB所有的動作都必須是由HOST發起的原因
HOST發出的都是固定的8字節,每個字節代表不同含義。
每個字節含義解釋
2. DATA階段
數據方向雙方向:HOST<->DEVICE。數據傳輸方向由CMD命令決定。
數據階段是可有可無的,具體根據命令字的類型,比如:設置地址命令,是沒有數據階段,Device端接收命令成功,后設置地址,如果地址設置成功則返回ACK信號,失敗則是NAK信號。
3. ACK階段
數據雙方向:HOST<->DEVICE。比如設置地址的命令,DEVICE端設置完成之后需要給HOST回復ACK/NAK信號.
4. SETUP
實例
下圖是USB協議分析儀解析出的獲取描述符的過程(這里主要關注軟件部分,圖例中設置數字標號的部分):
- 圖中標號
1
: 命令階段,主機發送獲取描述符指令,請求獲取設備描述符. - 圖中標號
2
: 數據階段(Device->Host),設備回送設備描述信息. - 圖中標號
3
: 數據階段(Device->Host),在USB1.1設備中,0
號端點的BUFFER都比較小,單次不能把數據發送完成,需要多次 - 圖中標號
4
:ACK
階段(Host->Device),主機告訴設備數據正確接收完成
獲取設備描述符
HOST端主機軟件就是通過以上SETUP
過程,一步一步完成整個枚舉過程。
-
USB主機
+關注
關注
0文章
22瀏覽量
9340 -
集線器
+關注
關注
0文章
383瀏覽量
39459 -
ACK
+關注
關注
0文章
28瀏覽量
11134 -
無線控制
+關注
關注
0文章
96瀏覽量
19965
發布評論請先 登錄
相關推薦
評論