标准的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