USB入門系列之七 —— USB的描述符及各種描述符之間的依賴關係

   USB是個通用的總線,端口都是統一的。但是USB設備卻各種各樣,
例如USB鼠標,USB鍵盤,U盤等等,那麼USB主機是如何識別出不同的
設備的呢?這就要依賴於描述符了。
    USB的描述符主要有設備描述符,配置描述符,接口描述符,
端點描述符,字符串描述符,HID描述符,報告描述符等等。
關於報告描述符,請看我以前寫的:《USB HID報告及報告描述符簡介 》
 http://group.ednchina.com/93/198.aspx。

    一個USB設備有一個設備描述符,設備描述符裏面決定了該設備有多
少種配置,每種配置描述符對應着配置描述符;而在配置描述符中又定義
了該配置裏面有多少個接口,每個接口有對應的接口描述符;在接口描
述符裏面又定義了該接口有多少個端點,每個端點對應一個端點描述符;
端點描述符定義了端點的大小,類型等等。由此我們可以看出,USB的
描述符之間的關係是一層一層的,最上一層是設備描述符,下面是配置
描述符,再下面是接口描述符,再下面是端點描述符。在獲取描述符時,
先獲取設備描述符,然後再獲取配置描述符,根據配置描述符中的配置
集合長度,一次將配置描述符、接口描述符、端點描述符一起一次讀回。
其中可能還會有獲取設備序列號,廠商字符串,產品字符串等。
    
  每種描述符都有自己獨立的編號,如下:
 

 
  1. #define DEVICE_DESCRIPTOR               0x01  //設備描述符   
  2. #define CONFIGURATION_DESCRIPTOR        0x02  //配置描述符   
  3. #define STRING_DESCRIPTOR               0x03  //字符串描述符   
  4. #define INTERFACE_DESCRIPTOR            0x04  //接口描述符   
  5. #define ENDPOINT_DESCRIPTOR             0x05  //端點描述符   

    
下面分別詳細介紹一下各描述符。

1.設備描述符
 

 
  1. //定義標準的設備描述符結構   
  2.   
  3. typedef struct _DEVICE_DCESCRIPTOR_STRUCT   
  4. {   
  5.            
  6.            
  7.         BYTE blength;                               //設備描述符的字節數大小   
  8.         BYTE bDescriptorType;                      //設備描述符類型編號   
  9.         WORD bcdUSB;                                //USB版本號   
  10.         BYTE bDeviceClass;                          //USB分配的設備類代碼   
  11.         BYTE bDeviceSubClass;                       //USB分配的子類代碼   
  12.         BYTE bDeviceProtocol;                       //USB分配的設備協議代碼   
  13.         BYTE bMaxPacketSize0;                       //端點0的最大包大小   
  14.         WORD idVendor;                              //廠商編號   
  15.         WORD idProduct;                             //產品編號   
  16.         WORD bcdDevice;                             //設備出廠編號   
  17.         BYTE iManufacturer;                         //設備廠商字符串的索引   
  18.         BYTE iProduct;                              //描述產品字符串的索引   
  19.         BYTE iSerialNumber;                         //描述設備序列號字符串的索引   
  20.         BYTE bNumConfigurations;                    //可能的配置數量   
  21.            
  22.            
  23. }   
  24. DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT;   
  25.   
  26. //實際的設備描述符示例   
  27. code DEVICE_DESCRIPTOR_STRUCT device_descriptor=   //設備描述符   
  28. {   
  29.            
  30.         sizeof(DEVICE_DESCRIPTOR_STRUCT),                   //設備描述符的字節數大小,這裏是18字節   
  31.                 DEVICE_DESCRIPTOR,                              //設備描述符類型編號,設備描述符是01   
  32.                 0x1001,   //USB版本號,這裏是USB01.10,即USB1.1。由於51是大端模式,所以高低字節交換   
  33.                 0x00,                                 //USB分配的設備類代碼,0表示類型在接口描述符中定義   
  34.                 0x00,                                 //USB分配的子類代碼,上面一項爲0時,本項也要設置爲0   
  35.                 0x00,                                //USB分配的設備協議代碼,上面一項爲0時,本項也要設置爲0   
  36.                 0x10,                                //端點0的最大包大小,這裏爲16字節   
  37.                 0x7104,                             //廠商編號,這個是需要跟USB組織申請的ID號,表示廠商代號。   
  38.                 0xf0ff,        //該產品的編號,跟廠商編號一起配合使用,讓主機註冊該設備並加載相應的驅動程序   
  39.                 0x0100,       //設備出廠編號   
  40.                 0x01,        //設備廠商字符串的索引,在獲取字符串描述符時,使用該索引號來識別不同的字符串   
  41.                 0x02,        //描述產品字符串的索引,同上   
  42.                 0x03,         //描述設備序列號字符串的索引,同上   
  43.                 0x01                        //可能的配置數爲1,即該設備只有一個配置  
  44.                    
  45. };  


2.配置描述符
 

 
  1. //定義標準的配置描述符結構   
  2.   
  3. typedef struct _CONFIGURATION_DESCRIPTOR_STRUCT   
  4. {   
  5.         BYTE bLength;                               //配置描述符的字節數大小   
  6.         BYTE bDescriptorType;                       //配置描述符類型編號   
  7.         WORD wTotalLength;                          //此配置返回的所有數據大小   
  8.         BYTE bNumInterfaces;                        //此配置所支持的接口數量   
  9.         BYTE bConfigurationValue;                   //Set_Configuration命令所需要的參數值   
  10.         BYTE iConfiguration;                        //描述該配置的字符串的索引值   
  11.         BYTE bmAttributes;                          //供電模式的選擇   
  12.         BYTE MaxPower;                              //設備從總線提取的最大電流   
  13. }   
  14. CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章