• 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

  • 相关阅读:
    14:求满足条件的3位数
    1696:逆波兰表达式
    筛法求素数 6分
    1751:分解因数
    1750:全排列
    1788:Pell数列
    666:放苹果
    06:寻宝
    04:最匹配的矩阵
    雷电
  • 原文地址:https://www.cnblogs.com/utank/p/4125376.html
Copyright © 2020-2023  润新知