USB設(shè)備驅(qū)動(dòng)開(kāi)發(fā)-USB協(xié)議相關(guān)(3)
一、USB設(shè)備標(biāo)準(zhǔn)請(qǐng)求 本文引用地址:http://2s4d.com/article/201612/329079.htmUSB設(shè)備標(biāo)準(zhǔn)請(qǐng)求是為所有USB設(shè)備定義的操作,即使設(shè)備還沒(méi)有被分配地址或還沒(méi)有被配置都必須相應(yīng)設(shè)備標(biāo)準(zhǔn)請(qǐng)求。 標(biāo)準(zhǔn)特性選擇子
1. Clear Feature wValue中的特性選擇子必須和操作對(duì)象匹配,即設(shè)備特性對(duì)應(yīng)設(shè)備,接口特性對(duì)應(yīng)接口,端點(diǎn)特性對(duì)應(yīng)端點(diǎn)。 若對(duì)應(yīng)的特性不存在或不能被清除,或者操作的接口或端點(diǎn)不存在,將返回一個(gè)請(qǐng)求錯(cuò)誤狀態(tài)。 在Default狀態(tài):設(shè)備接收到這個(gè)請(qǐng)求后的操作是未定義的; 在Address狀態(tài):對(duì)設(shè)備操作是有效的,但對(duì)接口和端點(diǎn)的操作將返回請(qǐng)求錯(cuò)誤; 在Configured狀態(tài):所有的請(qǐng)求都是有效的。 其中TEST_MODE特性不能被ClearFeature請(qǐng)求清除。 2. Set Feature 設(shè)置或使能特性 3. Get Configuration 返回當(dāng)前的設(shè)備配置值(一個(gè)字節(jié)),在配置狀態(tài)下,返回非0的bConfigurationValue值。若設(shè)備沒(méi)有配置則返回0。 4. Set Configuration 設(shè)置設(shè)備的配置 在wValue的低字節(jié)是配置值,若配置值為0,則設(shè)備將仍處于Address狀態(tài)。 5. Set Descriptor 用于更新已有的描述符或新增描述符。 6. Get Descriptor 其中wValue的高字節(jié)表示描述符的類(lèi)型,如下表所示;低字節(jié)表示描述符的索引。一個(gè)設(shè)備可以實(shí)現(xiàn)多個(gè)配置描述符和字符串描述符,因此只有這兩種描述符才會(huì)用到索引值。 7. Get Interface 這個(gè)請(qǐng)求返回接口目前選擇的可選設(shè)置(Alernate Setting)。 8. Set Interface 設(shè)置接口 9. Get Status 返回操作對(duì)象的狀態(tài)。 10. Set Address 設(shè)置設(shè)備的地址 只允許對(duì)設(shè)備描述符、配置描述符和字符串描述符進(jìn)行操作。 11. Synch Frame 在等時(shí)傳輸方式中,用于設(shè)置并返回端點(diǎn)的同步幀。 二、描述符 USB設(shè)備使用描述符來(lái)報(bào)告屬性,一個(gè)描述符即預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu)。每個(gè)描述符的第一個(gè)字節(jié)表示描述符的長(zhǎng)度,第二個(gè)字節(jié)表示描述符的類(lèi)型。 在描述符中可能包含有對(duì)字符串描述符的引用來(lái)描述這個(gè)描述符,若設(shè)備不支持字符串描述符,則其他描述符中字符串描述符引用域必須存儲(chǔ),但需要設(shè)置為0來(lái)描述沒(méi)有可用字符串描述符。 1. 設(shè)備描述符 設(shè)備描述符用于描述一個(gè)設(shè)備的通用信息,一個(gè)USB設(shè)備只具有一個(gè)設(shè)備描述符。高速設(shè)備的設(shè)備描述符有一個(gè)版本號(hào)bcdUSB,0200H來(lái)表示USB 2.0 struct usb_device_descriptor { __u8 bLength; __u8 bDescriptorType; __le16 bcdUSB; __u8 bDeviceClass; __u8 bDeviceSubClass; __u8 bDeviceProtocol; __u8 bMaxPacketSize0; __le16 idVendor; __le16 idProduct; __le16 bcdDevice; __u8 iManufacturer; __u8 iProduct; __u8 iSerialNumber; __u8 bNumConfigurations; } __attribute__ ((packed)); 2. Device_Qualifier 對(duì)于高速設(shè)備,若在其他速度下需要更改一些配置,這需要定義這個(gè)描述符。 3. 配置描述符 配置描述符描述一個(gè)設(shè)備配置的信息,其中的bConfigurationValue值作為傳輸傳遞給SetConfiguration()請(qǐng)求,使設(shè)備采用這個(gè)配置。 一個(gè)USB設(shè)備有一個(gè)或多個(gè)配置描述符,一個(gè)配置描述符擁有一個(gè)或多個(gè)接口,一個(gè)接口擁有0個(gè)或多個(gè)端點(diǎn)。在同一個(gè)配置中,一個(gè)端點(diǎn)不能在不同的接口之間共用,但可以在同一個(gè)接口的不同設(shè)置共有。但在不同的配置中,端點(diǎn)可以在接口之間共用。 一旦配置選定,則設(shè)備一般僅少有的可變?cè)O(shè)置,即接口擁有可選設(shè)置則才可能更改設(shè)置。 4. 接口描述符 接口描述符描述一個(gè)配置中的接口。一個(gè)配置提供一個(gè)或多個(gè)接口。當(dāng)一個(gè)配置支持一個(gè)或多個(gè)接口時(shí),接口描述將作為配置描述符的一部分返回,端點(diǎn)描述符將緊跟著接口描述符返回。接口描述符不能通過(guò)GetDescriptor()或SetDescriptor訪問(wèn)。 一個(gè)接口包含可變?cè)O(shè)置來(lái)允許在設(shè)備配置后允許端點(diǎn)或一些特性做一定的改變。接口默認(rèn)的設(shè)置都為0,SetInterface()請(qǐng)求用于選擇一個(gè)設(shè)置或返回默認(rèn)的設(shè)置。GetInterface()請(qǐng)求返回選擇的設(shè)置。 如果一個(gè)設(shè)備配置支持單個(gè)接口并此接口有兩個(gè)可選設(shè)置,配置描述表返回以后會(huì)緊跟著返回bInterfaceNumber與bAlternateSetting域皆為0的第一個(gè)設(shè)置的接口描述表及相關(guān)的結(jié)點(diǎn)描述表,而隨之后是另一個(gè)設(shè)置接口描述表與結(jié)點(diǎn)描述表第二個(gè)接口描述表的bInterfaceNumber域也應(yīng)為0但bAlternate Setting域應(yīng)為1 。 如果一個(gè)接口僅使用節(jié)點(diǎn)0則接口描述表以后就不再返回節(jié)點(diǎn)描述表并且此接口表示的是一個(gè)請(qǐng)求接口它使用連在節(jié)點(diǎn)0上的缺省通道在這種情況下bNumberEndpoints域應(yīng)被設(shè)置成0 ,一個(gè)接口描述表的節(jié)點(diǎn)個(gè)數(shù)不把結(jié)點(diǎn)0計(jì)在內(nèi)。 5. 端點(diǎn)描述符 接口的端點(diǎn)擁有自己的描述符,描述符包含主機(jī)分配每個(gè)端點(diǎn)帶寬的信息。每個(gè)端點(diǎn)描述符是作為配置信息的一部分在GetDescriptor請(qǐng)求中返回的。端點(diǎn)描述符不能直接通過(guò)GetDescriptor()或SetDescriptor()請(qǐng)求訪問(wèn),這點(diǎn)與接口描述符一致。端點(diǎn)0沒(méi)有端點(diǎn)描述符。 6. 字符串描述符 字符串描述符是可選的,但若設(shè)備不支持字符串描述符,則設(shè)備中配置描述符、接口描述符中對(duì)字符串描述符的引用值必須設(shè)置為0。字符串描述符使用UNICODE編碼方式。USB設(shè)備可能需要支持多種語(yǔ)言,字符串描述符中16位的LANGID來(lái)表示支持的語(yǔ)言。 |
評(píng)論