USB设备开发---- usb描述符概述

转载自:http://blog.csdn.net/saloon_yuan/article/details/7837492 

说到USB设备,不得不提到各种描述符(descriptors), 一般来说,描述符有如下几种:

    1:设备描述符(Device Descriptors)

    2:配置描述符(Configuration Descriptors)

    2:接口描述符(Interface Descriptors)

    3:端点描述符(Endpoint Descriptors)

     一个USB设备只有一个设备描述符,设备描述符里面定义了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。

详细关系如下图所示:


下面我们从软件的角度来看看这些描述符的详细定义(以下定义取自Window系统, Linux下命名稍有区别,成员内容一致)

设备描述符结构体如下:

[cpp]  view plain  copy
  1. typedef struct _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;  


配置描述符结构体如下:

[cpp]  view plain  copy
  1. typedef struct _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;  


接口描述符结构体如下:

[cpp]  view plain  copy
  1. typedef struct _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;  


端点描述符结构体如下:

[cpp]  view plain  copy
  1. typedef struct _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,以表明该功能未实现)。

[cpp]  view plain  copy
  1. typedef struct _USB_STRING_DESCRIPTOR {  
  2.   UCHAR bLength;                 //字符串描述符字节数  
  3.   UCHAR bDescriptorType;         //字符串描述符类型编号(0x03)  
  4.   WCHAR bString[1];              //unicode字符串  
  5. } USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值