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