USB 描述符

标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符。

  1 // Standard Device Descriptor
  2 typedef struct
  3 {
  4     u8   bLength;            // 描述符的长度,固定值12H
  5     u8   bDescriptorType;    // 描述符类型,设备描述符=01H
  6     u16  bcdUSB;             // USB规范版本号(采用BCD码,0xAABC)
  7                              // AA:主板本号
  8                              // B: 次版本号
  9                              // C: 子次版本号
 10     u8   bDeviceClass;       // USB设备所属的标准设备类
 11     u8   bDeviceSubClass;    // USB设备所属的标准设备子类
 12     u8   bDeviceProtocol;    // USB设备所采用的设备类协议
 13     u8   bMaxPacketSize0;    // USB设备中端点0所支持最大数据包的长度
 14                              // 低速:bMaxPacketSize0 = 8
 15                              // 全速:bMaxPacketSize0 = 8、16、32或64
 16                              // 高速:bMaxPacketSize0 = 64
 17                              // 超速:bMaxPacketSize0 = 512
 18     u16  idVendor;           // 供应商ID
 19     u16  idProduct;          // 产品ID
 20     u16  bcdDevice;          // USB设备的版本号,一般由设备供应商指定
 21     u8   iManufacturer;      // 供应商字符串描述符的索引值,0表示没有
 22                              // 获取字符串描述符请求中的索引值
 23     u8   iProduct;           // 产品字符串描述符的索引值,0表示没有
 24                              // 获取字符串描述符请求中的索引值
 25     u8   iSerialNumber;      // 设备序列号字符串描述符的索引值,0表示没有
 26                              // 获取字符串描述符请求中的索引值
 27     u8   bNumConfigurations; // USB设备所支持的配置数
 28 } __attribute__((__packed__)) sDevDesc, *pDevDesc;
 29 
 30 /* Standard Configuration Descriptor */
 31 typedef struct
 32 {    
 33     u8   bLength;   // 描述符长度,固定值09H
 34     u8   bType;     // 描述符类型,配置描述符=02H
 35     u16  wLength;   // 配置信息的总长度
 36                     // 该字段所设置的数值必须包括
 37                     // 配置描述符、接口描述符和端点描述符的总和
 38     u8   bNumIntf;  // 配置所支持的接口数
 39     u8   bCV;       // 设备的配置值(设置配置请求中需要引用到此数值)
 40     u8   bIndex;    // 配置字符串描述符的索引值,0表示没有
 41     u8   bAttr;     // 设备的配置特性
 42                     // D0~D4:保留值,一般为0
 43                     // D5:为1表示支持远程唤醒功能,否则不支持
 44                     // D6:为1表示自供电,否则不支持
 45                     // D7:为1表示总线供电,否则不支持
 46     u8   bMaxPower; // 设备运行时需要消耗的总电流
 47 } __attribute__((__packed__)) sCfgDesc, *pCfgDesc;
 48 
 49 // Standard Interface Descriptor
 50 typedef struct
 51 {    
 52     u8   bLength;    // 描述符长度,固定值09H
 53     u8   bType;      // 描述符的类型,接口描述符=04H
 54     u8   iNum;       // 接口号
 55     u8   iAltString; // 接口的可替换设置值?
 56     u8   bEndPoints; // 接口所使用的端点数,该数值为除端点0以外的所有端点总数
 57     u8   iClass;     // 接口所属的USB设备类
 58     u8   iSub;       // 接口所属的USB设备子类
 59     u8   iProto;     // 接口所采用的USB设备类协议
 60     u8   iIndex;     // 接口字符串描述符的索引值,0表示没有
 61 } __attribute__((__packed__)) sIntfDesc, *pIntfDesc;
 62 
 63 // Standard EndPoint Descriptor
 64 typedef struct
 65 {    
 66     u8   bLength;   // 描述符长度,固定值07H
 67     u8   bType;     // 描述符的类型,端点描述符=05H
 68     u8   bEPAdd;    // 端点的端点号以及端点的数据传输方向
 69                     // D7:数据传输方向,0表示OUT数据传输,1表示IN数据传输
 70                     // D3~D0:端点号,0001B表示端点1,0010B表示端点2等
 71                     // 其余位均保留
 72     u8   bAttr;     // 端点的特性
 73                     // D1~D0:端点的数据传输类型
 74                     //        00控制传输,01同步传输,10块传输,11中断传输
 75                     // D3~D2:进一步描述不同的传输类型
 76                     //        如果是同步传输,这两位表示同步类型,
 77                     //        00非同步,01异步,10自适应,11同步
 78                     // D5~D4:端点的用法类型,
 79                     //        00数据端点,01显示反馈端点,10隐式反馈端点,11保留
 80                     // 其余为保留
 81                     // 对于U盘,一般这个值为02H
 82     u16  wPayLoad;  // 端点所支持最大数据包的长度
 83                     // D10~D0:数据包长度
 84                     // D12~D11:指出每小帧最多传输的事务处理数
 85                     // 其余为均保留,必须为0
 86     u8   bInterval; // 端点数据传输的访问间隔,对于不同的端点类型,取值范围不同
 87                     // 低速中断端点,取值范围为10~255,对应的访问间隔为10~255ms
 88                     // 全速中断端点,取值范围为1~255,对应的访问间隔为1~255ms
 89 } __attribute__((__packed__)) sEPDesc, *pEPDesc;
 90 
 91 // Standard String Descriptor
 92 // USB字符串描述符用于保存一些供应商名称、产品序列号等文本信息。
 93 // 在USB协议中,字符串描述符不是必需的,可以更加需要设置、增加或减少。
 94 // 字符串描述符由3三个字段按照固定的顺序组成,该描述的总长度不是固定的,
 95 // 其长度随字符串的数量和信息的长度而变化。
 96 typedef struct
 97 {    
 98     u8   bLength;     // 描述符的长度(N+2字节)
 99     u8   bType;       // 描述符类型,字符串描述符=03H
100     bString  wLang;   // 字符串N
101 } __attribute__((__packed__)) sStrDesc, *pStrDesc;

HID描述符:

 1 struct hid_class_descriptor {
 2     u8  bDescriptorType;
 3     u16 wDescriptorLength;
 4 } __attribute__ ((packed));
 5 
 6 struct hid_descriptor {
 7     u8  bLength;
 8     u8  bDescriptorType;
 9     u16 bcdHID;
10     u8  bCountryCode;
11     u8  bNumDescriptors;
12     struct hid_class_descriptor desc[1];
13 } __attribute__ ((packed));

相关链接:

http://wiki.osdev.org/Universal_Serial_Bus#Introduction

http://blog.csdn.net/alien75/article/details/4622319

http://blog.csdn.net/mcgrady_tracy/article/details/8129992

原文地址:https://www.cnblogs.com/utank/p/4125376.html