USB設(shè)備驅(qū)動開發(fā)-USB協(xié)議相關(guān)(2)
1. 熱插拔
本文引用地址:http://2s4d.com/article/201612/329080.htm在熱插拔中,USB HUB扮演著很重要的角色,HUB向主機(jī)報告端口的狀態(tài)改變,主機(jī)才能對相應(yīng)的動作采取相應(yīng)的操作;
2. 地址分派
當(dāng)USB設(shè)備插入后,主機(jī)會對USB設(shè)備分配一個獨(dú)一無二的地址,同時resetUSB設(shè)備并對HUB的相應(yīng)端口使能;
3. 配置(Configuration):
在USB設(shè)備的功能可用之前必須被配置,主機(jī)首先獲取設(shè)備的配置信息了解設(shè)備的功能進(jìn)而進(jìn)行配置。主機(jī)將設(shè)置設(shè)備的配置(configuration),并且可能對接口(Interface)選擇可變的設(shè)置(setting).
在一個配置中,設(shè)備可能支持多個接口,一個接口就是相關(guān)的一些端點(diǎn)(Endpoint) ,通過這些端點(diǎn)提供一個功能。因此,一個接口就向主機(jī)提供一個功能,在一個配置中,一個USB設(shè)備可以向主機(jī)提供多個不同的功能。接口中端點(diǎn)的特性和端點(diǎn)與主機(jī)通信的協(xié)議可以通過設(shè)備類(device class)或廠商自定義的標(biāo)記來標(biāo)示。
接口可以有一些設(shè)置來重定義接口關(guān)聯(lián)的端點(diǎn)的編號和特性,但這需要設(shè)備支持GetInterface()請求來報告接口的當(dāng)前設(shè)置,并通過SetInterface()請求來為接口選則可變的設(shè)置。
接口配置符(Interface Descriptor)數(shù)據(jù)結(jié)構(gòu)包含表示接口號和可變設(shè)置的域,其中接口號是從0至n-1(n表示當(dāng)前配置所支持的接口數(shù)),可變設(shè)置也是編號從0至n-1編號,當(dāng)設(shè)備初始化配置中接口的默認(rèn)設(shè)置是0號設(shè)置。
為了支持通用性驅(qū)動程序,設(shè)備描述符和接口描述符中都包含Class、SubClass和Protocol域,來標(biāo)示USB設(shè)備提供的功能和利用這些功能主機(jī)和設(shè)備的通信協(xié)議。
4. 數(shù)據(jù)傳輸
USB設(shè)備和主機(jī)之間有四種數(shù)據(jù)傳輸方式(控制、中斷、批量和等時),端口號可以在不同的接口設(shè)置中使用不同的傳輸方式。但一旦這種接口設(shè)置選定,在這種接口設(shè)置期間相應(yīng)的端口就只能使用這種設(shè)置中指定的數(shù)據(jù)傳輸方式。
5. 請求響應(yīng)
在USB設(shè)備處理請求時,為了保證處理的及時性,設(shè)置了一個時間上限5秒。在5秒內(nèi)任何請求都必須被處理完成,但這不是強(qiáng)制性的規(guī)定。一個設(shè)備標(biāo)準(zhǔn)的請求包括三個階段:發(fā)出請求,傳輸數(shù)據(jù),返回狀態(tài)。
在設(shè)備標(biāo)準(zhǔn)請求中,若沒有數(shù)據(jù)階段,則設(shè)備必須在50ms內(nèi)完成請求處理并返回狀態(tài),這個限制適用于設(shè)備、接口和端點(diǎn)。
若需要在數(shù)據(jù)階段傳輸數(shù)據(jù)給主機(jī),則設(shè)備必須在接收到請求50ms內(nèi)發(fā)出第一個數(shù)據(jù)包,并在500ms內(nèi)傳輸完其他數(shù)據(jù)包,然后在最后一個數(shù)據(jù)傳輸完50ms內(nèi)返回狀態(tài),完成狀態(tài)階段。也就是說,主機(jī)獲取數(shù)據(jù)的請求必須在600ms內(nèi)完成。
若主機(jī)需要發(fā)送數(shù)據(jù)到設(shè)備,則是5秒的限制。設(shè)備需要在5秒內(nèi)完成數(shù)據(jù)的接收和狀態(tài)階段。
二、USB設(shè)備請求(USB Device Request)
所有的USB設(shè)備請求都是通過設(shè)備的默認(rèn)控制通道(0號控制端點(diǎn))完成的,使用控制傳輸協(xié)議。這些請求和請求的參數(shù)通過Setup包發(fā)送,每個Setup包都是8個字節(jié)。
Setup包的格式:
bmRequestType:請求類型相關(guān)信息,一個字節(jié)
其中的Direction表示第二階段數(shù)據(jù)傳輸?shù)姆较?,若wLength字段為0,表示沒有數(shù)據(jù)傳輸,則這個位可以忽略。
Type位(兩位)表示請求的類型,USB設(shè)備規(guī)范定義了一些所有設(shè)備必須支持的標(biāo)準(zhǔn)設(shè)備請求,用Standard?;蛘哌@類設(shè)備定義了一些請求,用class表示,或這個廠商自定義的請求,用vendor。
Recipient位(5位)表示請求的對象,請求對象可以是設(shè)備、設(shè)備上的接口或指定的端點(diǎn)。若操作的對象是接口或端點(diǎn),則wIndex域來表示接口號或端點(diǎn)號。
bRequest:是具體的請求,一個字節(jié)
具體的請求操作,標(biāo)準(zhǔn)設(shè)備請求將在后表列出
wValue:根據(jù)請求的不同有不同的含義,兩個字節(jié)
與具體的請求相關(guān),將在后表列出
wIndex:根據(jù)請求的不同有不同的含義,一般表示索引或便宜量,兩個字節(jié)
當(dāng)請求操作對象是設(shè)備時,可用于傳遞給設(shè)備的參數(shù);
當(dāng)請求操作對象是接口或端點(diǎn)時,用于表示操作的接口號或端點(diǎn)號
Direction位設(shè)為0,表示OUT端點(diǎn),設(shè)為1表示IN端點(diǎn)。在控制通道中,應(yīng)當(dāng)將其設(shè)置為0。
wLength:若請求有數(shù)據(jù)傳輸,則表示傳輸數(shù)據(jù)的長度
表示在第二階段數(shù)據(jù)傳輸?shù)拈L度,bmRequestType字段中指示了數(shù)據(jù)傳輸?shù)姆较?。若wlength表示為0,則沒有數(shù)據(jù)傳輸階段。
在一個獲取數(shù)據(jù)的請求中,設(shè)備不能返回多于wLength的數(shù)據(jù),但可以返回少于wLength的數(shù)據(jù)。而在輸出數(shù)據(jù)的請求豬,wLength總是發(fā)出數(shù)據(jù)的準(zhǔn)確長度,若發(fā)出的數(shù)據(jù)長度超過wLength,則設(shè)備的行為是不可知。
設(shè)備標(biāo)準(zhǔn)請求指令和Setup包中相關(guān)字段對應(yīng)的值
評論