1. 程式人生 > >USB裝置開發---- usb描述符概述

USB裝置開發---- usb描述符概述

  說到USB裝置,不得不提到各種描述符(descriptors), 一般來說,描述符有如下幾種:

    1:裝置描述符(Device Descriptors)

    2:配置描述符(Configuration Descriptors)

    2:介面描述符(Interface Descriptors)

    3:端點描述符(Endpoint Descriptors)

     一個USB裝置只有一個裝置描述符,裝置描述符裡面定義了該裝置有多少種配置,每種配置描述符對應著配置描述符;而在配置描述符中又定義了該配置裡面有多少個介面,每個介面有對應的介面描述符;在介面描述符裡面又定義了該介面有多少個端點,每個端點對應一個端點描述符;端點描述符定義了端點的大小,型別等等。由此我們可以看出,USB的描述符之間的關係是一層一層的,最上一層是裝置描述符,下面是配置描述符,再下面是介面描述符,再下面是端點描述符。在獲取描述符時,先獲取裝置描述符,然後再獲取配置描述符,根據配置描述符中的配置集合長度,一次將配置描述符、介面描述符、端點描述符一起一次讀回。其中可能還會有獲取裝置序列號,廠商字串,產品字串等。

詳細關係如下圖所示:


下面我們從軟體的角度來看看這些描述符的詳細定義(以下定義取自Window系統, Linux下命名稍有區別,成員內容一致)

裝置描述符結構體如下:

  1. typedefstruct _USB_DEVICE_DESCRIPTOR {  
  2.   UCHAR  bLength;                  //該描述符結構體大小(18位元組)
  3.   UCHAR  bDescriptorType;          //描述符型別(本結構體中固定為0x01)
  4.   USHORT bcdUSB;                   //USB版本號
  5.   UCHAR  bDeviceClass;             
    //裝置類程式碼(由USB官方分配)
  6.   UCHAR  bDeviceSubClass;          //子類程式碼(由USB官方分配)
  7.   UCHAR  bDeviceProtocol;          //裝置協議程式碼(由USB官方分配)
  8.   UCHAR  bMaxPacketSize0;          //端點0的最大包大小(有效大小為8,16,32,64)
  9.   USHORT idVendor;                 //生產廠商編號(由USB官方分配)
  10.   USHORT idProduct;                //產品編號(製造廠商分配)
  11.   USHORT bcdDevice;                
    //裝置出廠編號
  12.   UCHAR  iManufacturer;            //裝置廠商字串索引
  13.   UCHAR  iProduct;                 //產品描述字串索引
  14.   UCHAR  iSerialNumber;            //裝置序列號字串索引
  15.   UCHAR  bNumConfigurations;       //當前速度下能支援的配置數量
  16. } USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;  


配置描述符結構體如下:

  1. typedefstruct _USB_CONFIGURATION_DESCRIPTOR {  
  2.   UCHAR  bLength;                  //該描述符結構體大小
  3.   UCHAR  bDescriptorType;          //描述符型別(本結構體中固定為0x02)
  4.   USHORT wTotalLength;             //此配置返回的所有資料大小
  5.   UCHAR  bNumInterfaces;           //此配置的介面數量
  6.   UCHAR  bConfigurationValue;      //Set_Configuration命令所需要的引數值
  7.   UCHAR  iConfiguration;           //描述該配置的字串的索引值
  8.   UCHAR  bmAttributes;             //供電模式的選擇
  9.   UCHAR  MaxPower;                 //裝置從匯流排提取的最大電流
  10. } USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;  


介面描述符結構體如下:

  1. typedefstruct _USB_INTERFACE_DESCRIPTOR {  
  2.   UCHAR bLength;                   //該描述符結構大小
  3.   UCHAR bDescriptorType;           //介面描述符的型別編號(0x04)
  4.   UCHAR bInterfaceNumber;          //該介面的編號
  5.   UCHAR bAlternateSetting;         //備用的介面描述符編號
  6.   UCHAR bNumEndpoints;             //該介面使用的端點數,不包括端點0
  7.   UCHAR bInterfaceClass;           //介面型別
  8.   UCHAR bInterfaceSubClass;        //介面子型別
  9.   UCHAR bInterfaceProtocol;        //介面遵循的協議
  10.   UCHAR iInterface;                //描述該介面的字串索引值
  11. } USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;  


端點描述符結構體如下:

  1. typedefstruct _USB_ENDPOINT_DESCRIPTOR {  
  2.   UCHAR  bLength;                 //端點描述符位元組數大小(7個位元組)
  3.   UCHAR  bDescriptorType;         //端點描述符型別編號(0x05)
  4.   UCHAR  bEndpointAddress;        //端點地址及輸入輸出屬性
  5.   UCHAR  bmAttributes;            //端點的傳輸型別屬性
  6.   USHORT wMaxPacketSize;          //端點收、發的最大包大小
  7.   UCHAR  bInterval;               //主機查詢端點的時間間隔
  8. } USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;  

除以上四種描述符之外,還有一種字串描述符,對於一個USB裝置來說, 該描述符不是必須實現的(當不實現時,應將該描述符設定成0,以表明該功能未實現)。

  1. typedefstruct _USB_STRING_DESCRIPTOR {  
  2.   UCHAR bLength;                 //字串描述符位元組數
  3.   UCHAR bDescriptorType;         //字串描述符型別編號(0x03)
  4.   WCHAR bString[1];              //unicode字串
  5. } USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;  
From:http://blog.csdn.net/saloon_yuan/article/details/7837492