USB裝置開發---- usb描述符概述
阿新 • • 發佈:2019-02-17
說到USB裝置,不得不提到各種描述符(descriptors), 一般來說,描述符有如下幾種:
1:裝置描述符(Device Descriptors)
2:配置描述符(Configuration Descriptors)
2:介面描述符(Interface Descriptors)
3:端點描述符(Endpoint Descriptors)
一個USB裝置只有一個裝置描述符,裝置描述符裡面定義了該裝置有多少種配置,每種配置描述符對應著配置描述符;而在配置描述符中又定義了該配置裡面有多少個介面,每個介面有對應的介面描述符;在介面描述符裡面又定義了該介面有多少個端點,每個端點對應一個端點描述符;端點描述符定義了端點的大小,型別等等。由此我們可以看出,USB的描述符之間的關係是一層一層的,最上一層是裝置描述符,下面是配置描述符,再下面是介面描述符,再下面是端點描述符。在獲取描述符時,先獲取裝置描述符,然後再獲取配置描述符,根據配置描述符中的配置集合長度,一次將配置描述符、介面描述符、端點描述符一起一次讀回。其中可能還會有獲取裝置序列號,廠商字串,產品字串等。
詳細關係如下圖所示:
下面我們從軟體的角度來看看這些描述符的詳細定義(以下定義取自Window系統, Linux下命名稍有區別,成員內容一致)
裝置描述符結構體如下:
- typedefstruct _USB_DEVICE_DESCRIPTOR {
- UCHAR bLength; //該描述符結構體大小(18位元組)
- UCHAR bDescriptorType; //描述符型別(本結構體中固定為0x01)
- USHORT bcdUSB; //USB版本號
-
UCHAR bDeviceClass;
- UCHAR bDeviceSubClass; //子類程式碼(由USB官方分配)
- UCHAR bDeviceProtocol; //裝置協議程式碼(由USB官方分配)
- UCHAR bMaxPacketSize0; //端點0的最大包大小(有效大小為8,16,32,64)
- USHORT idVendor; //生產廠商編號(由USB官方分配)
- USHORT idProduct; //產品編號(製造廠商分配)
-
USHORT bcdDevice;
- UCHAR iManufacturer; //裝置廠商字串索引
- UCHAR iProduct; //產品描述字串索引
- UCHAR iSerialNumber; //裝置序列號字串索引
- UCHAR bNumConfigurations; //當前速度下能支援的配置數量
- } USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;
配置描述符結構體如下:
- typedefstruct _USB_CONFIGURATION_DESCRIPTOR {
- UCHAR bLength; //該描述符結構體大小
- UCHAR bDescriptorType; //描述符型別(本結構體中固定為0x02)
- USHORT wTotalLength; //此配置返回的所有資料大小
- UCHAR bNumInterfaces; //此配置的介面數量
- UCHAR bConfigurationValue; //Set_Configuration命令所需要的引數值
- UCHAR iConfiguration; //描述該配置的字串的索引值
- UCHAR bmAttributes; //供電模式的選擇
- UCHAR MaxPower; //裝置從匯流排提取的最大電流
- } USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;
介面描述符結構體如下:
- typedefstruct _USB_INTERFACE_DESCRIPTOR {
- UCHAR bLength; //該描述符結構大小
- UCHAR bDescriptorType; //介面描述符的型別編號(0x04)
- UCHAR bInterfaceNumber; //該介面的編號
- UCHAR bAlternateSetting; //備用的介面描述符編號
- UCHAR bNumEndpoints; //該介面使用的端點數,不包括端點0
- UCHAR bInterfaceClass; //介面型別
- UCHAR bInterfaceSubClass; //介面子型別
- UCHAR bInterfaceProtocol; //介面遵循的協議
- UCHAR iInterface; //描述該介面的字串索引值
- } USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;
端點描述符結構體如下:
- typedefstruct _USB_ENDPOINT_DESCRIPTOR {
- UCHAR bLength; //端點描述符位元組數大小(7個位元組)
- UCHAR bDescriptorType; //端點描述符型別編號(0x05)
- UCHAR bEndpointAddress; //端點地址及輸入輸出屬性
- UCHAR bmAttributes; //端點的傳輸型別屬性
- USHORT wMaxPacketSize; //端點收、發的最大包大小
- UCHAR bInterval; //主機查詢端點的時間間隔
- } USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
除以上四種描述符之外,還有一種字串描述符,對於一個USB裝置來說, 該描述符不是必須實現的(當不實現時,應將該描述符設定成0,以表明該功能未實現)。
- typedefstruct _USB_STRING_DESCRIPTOR {
- UCHAR bLength; //字串描述符位元組數
- UCHAR bDescriptorType; //字串描述符型別編號(0x03)
- WCHAR bString[1]; //unicode字串
- } USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;