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