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