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