打印
[应用方案]

USB2.0协议学习笔记---各种描述符

[复制链接]
850|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
USB设备描述符

bLenth :该描述符的长度,单位字节一般USB设备描述符都是固定的18字节即0x12;
bDescriptorType :描述符种类代码。USB设备描述符为0x01;
bcdUSB :USB协议版本,采用BCD编码如2.0就是0x0200,但是USB是小端结构,因此实际就是 【0x00 ,0x20】
bDeviceClass: 设备类代码,大多数是0而在接口描述符中的bInterfaceClass中指定该接口实现的功能,注意的是当bDeviceClass为0时,bDeviceSubClass也必须为0;
bDeviceSubClass :配合bDeviceClass代码决定,USB标准定义。
bDeviceProtocol:设备所使用类的协议,如果没有定义类就为0 ,字段为0xFF表示使用自定义协议
bMaxPackSize0 :端点0的最大包长,最小是8,因为枚举过程,第一次获取设备描述符只会读取一次,因此需要在这个包中包含USB设备描述符的长度
idVendor:厂商ID VID,需要交保护费申请。
idProduct :产品ID PID由厂商自己定义。通常主机会根据VID和PID来加载本地或源的驱动程序。
bcdDevice :设备版本号,也采用BCD码,同理USB协议版本号。
iSerialNumber :设备序列号字符串索引值。
bNumConfigurations :设备有多少种配置,大部分USB设备就只有一个配置

使用特权

评论回复
评论
lwei2 2020-9-2 09:14 回复TA
楼主,请问如何获取对应的插入的USB设备描述符呢?目前我自己通过win接口去获取,总是会有鼠标、键盘等一些标准的USB设备在里面,怎么把这些排除,并获取对应的USB设备描述符呢? 

相关帖子

沙发
余三水|  楼主 | 2019-8-30 16:06 | 只看该作者
USB配置描述符
需要注意的是在有些时候,配置描述符中会包含接口描述符,特殊类描述符,端点描述符等信息,并在主机枚举请求设备配置描述符时一起返回给主机,不能单独返回给主机。
bLenth :该描述符长度
bDescriptorType:描述符类型,配置描述符为0x02
wTotalLength:表示整个配置描述符的总长度,包括配置描述符,接口描述符,类特殊描述符和端点描述符。
bNumInterfaces:配置支持的接口数
bConfigurationValue:每个配置都有一个标识值。
iConfiguration:配置描述符索引。
bmAttributes:描述特性 D7保留,D6辨识供电方式,为1表示自供电的,否则是总线供电,D5标识是否支持远程唤醒(1),D4-D0保留。
bMaxPower:总线供电时的最大电流,如值为100则最大电流为200mA。

使用特权

评论回复
板凳
余三水|  楼主 | 2019-8-30 16:06 | 只看该作者
USB接口描述符

bLenth: 描述符的长度。
bDescriptorType: 描述符的类型(接口描述符为4)
bInterfaceNumber:  表示该接口的编号,用在配置有多个接口,每个接口有唯一放入编号,从0 开始编号。
bAlterateSetting:接口的备用编号,规则同上。一般不用
bNumEndpoint:该接口使用的端点数,不包括端点0。即如果为0 就只有控制端点
bInterfaceClass:接口使用的类
bInterfaceSubClass:接口使用的子类
bInterfaceProtocol:接口使用的协议。三个一起定义了设备的功能,鼠标键盘就只需要改协议部分就可以。其他两个都是HID类
iInterface:接口字符串描述符的索引值。

使用特权

评论回复
地板
余三水|  楼主 | 2019-8-30 16:07 | 只看该作者
USB端点描述符

bLenth: 该描述符的长度(字节)
bDescriptorType: 该描述符的类型(0x05)
bEndpointAddress:端点的地址,D7表示端点的传输方向,为1则为输入,为0则为输出,D3-D0为端点号,其他位没有用。
bmAttributes:一个字节的属性描述字节,D1~D0表示端点传输类型,0 为控制传输,1为等时传输,2为批量传输,3为中断传输。如果为等时传输,D3-D2表示等时传输的类型,0表示无同步,1为异步,2为适配,3为同步;D5-D4辨识用途,0为数据端点,1为反馈端点,2为暗反馈端点,3保留;D7-D6保留。但是如果不是同步传输则只用到D1-D0其他位全部保留。
wMaxPackSize:该端点支持的最大数据长度,对于低速和全速设备而言,D10-D0表示数据包最大长,其他位未用,对于高速设备D12-D11表示每个帧的附件传送次数,具体参考USB标准协议。
bInterval:表示该端点的查询时间,对于中断传输表示查询的帧间隔数;对于其他传输方式参考USB标准协议。

使用特权

评论回复
5
余三水|  楼主 | 2019-8-30 16:08 | 只看该作者
类特殊描述符
有些设备还需要有类特殊描述符,这里拿HID设备举例,HID设备的特殊描述符如下
类比前面描述符的作用这里只需要记一下一下几个字段的意义:
bcdHID:为 HID设备的版本,用BCD码表示,两个字节,如下表示版本为1.10
bCountryCode:  国家代码(这个用在特殊情况下 比如键盘,美式键盘等)。
bNumDescriptors:下级描述符的数量,在HID设备中至少有一个是报告描述符。
bDescriptorType:HID报告描述符为0x22.
bDescriptorLength:对应描述符的大小
因为下级描述符至少有一个因此,HID类描述至少是10个字节,底下就是一个HID描述符的例子。
0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x10,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country */
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
    0x22,         /* bDescriptorType */
    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
    0x00,


使用特权

评论回复
6
玛尼玛尼哄| | 2019-9-25 00:06 | 只看该作者
是不是做USB设备驱动就要了解这些。

使用特权

评论回复
7
捉虫天师| | 2019-9-25 23:40 | 只看该作者
资料不错,看看。

使用特权

评论回复
8
zlmin| | 2019-10-3 19:32 | 只看该作者
感谢分享!

使用特权

评论回复
9
看别人照片| | 2020-9-6 07:58 | 只看该作者
感谢分享,这个描述符真的有用的,我想有助于新手的开发和工作需要。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

356

帖子

1

粉丝