USB裝置開發---- usb描述符概述(libusb庫使用)
說到USB裝置,不得不提到各種描述符(descriptors), 一般來說,描述符有如下幾種:
1:裝置描述符(Device Descriptors)
2:配置描述符(Configuration Descriptors)
2:介面描述符(Interface Descriptors)
3:端點描述符(Endpoint Descriptors)
一個USB裝置只有一個裝置描述符,裝置描述符裡面定義了該裝置有多少種配置,每種配置描述符對應著配置描述符;而在配置描述符中又定義了該配置裡面有多少個介面,每個介面有對應的介面描述符;在介面描述符裡面又定義了該介面有多少個端點,每個端點對應一個端點描述符;端點描述符定義了端點的大小,型別等等。由此我們可以看出,USB的描述符之間的關係是一層一層的,最上一層是裝置描述符,下面是配置描述符,再下面是介面描述符,再下面是端點描述符。在獲取描述符時,先獲取裝置描述符,然後再獲取配置描述符,根據配置描述符中的配置集合長度,一次將配置描述符、介面描述符、端點描述符一起一次讀回。其中可能還會有獲取裝置序列號,廠商字串,產品字串等。
詳細關係如下圖所示:
下面我們從軟體的角度來看看這些描述符的詳細定義(以下定義取自Window系統, Linux下命名稍有區別,成員內容一致)
裝置描述符結構體如下:
typedef struct _USB_DEVICE_DESCRIPTOR { UCHAR bLength; //該描述符結構體大小(18位元組) UCHAR bDescriptorType; //描述符型別(本結構體中固定為0x01) USHORT bcdUSB; //USB版本號 UCHAR bDeviceClass; //裝置類程式碼(由USB官方分配) 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;
配置描述符結構體如下:
typedef struct _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;
介面描述符結構體如下:
typedef struct _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;
端點描述符結構體如下:
typedef struct _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,以表明該功能未實現)。
typedef struct _USB_STRING_DESCRIPTOR {
UCHAR bLength; //字串描述符位元組數
UCHAR bDescriptorType; //字串描述符型別編號(0x03)
WCHAR bString[1]; //unicode字串
} USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;
轉載:http://blog.csdn.net/saloon_yuan/article/details/7837492
參考資料: