USB描述符(附加USB HID报告描述符 )

USB描述符介绍

USB描述符是主机识别USB设备的依据,主机根据设备的描述符来加载相应的驱动

USB描述符的作用

USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主机分析返回来的数据,判断出该设备是哪一种USB设备,建立相应的数据链接通道。

USB描述符的内容

标准的USB设备总共包括五种USB描述符:设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。HID设备除了需要标准的USB描述符还需要HID报告描述符,HID物理描述符可选。HID是一种USB通信协议,无需安装驱动就能进行交互,
在这里插入图片描述

设备描述符

设备描述符主要包括厂商ID(vendorID)和产品ID(productID)、USB协议等内容。一个设备只有一个设备描述符。

名称字节大小说明
bLength1描述符长度(18字节)
bDescriptorType1描述符类型(设备描述符为0x01)
bcdUSB2设备使用的USB协议版本
bDeviceClass1类代码
bDeviceSubClass1子类代码
bDeviceProtocol1设备使用的协议
bMaxPackeSize01端点0最大包长
idVender2厂商ID
idProduct2产品ID
bcdDevice2设备版本号
iManufacturer1描述厂商的字符串的索引
iProduct1描述产品的字符串的索引
iSerialNumber1产品序列号字符串的索引
bNumConfigurations1可能的配置数

配置描述符

配置描述符,定义了设备的配置信息。一个设备可以有多个配置描述符。配置描述符描述了该配置的接口数、供电模式等信息。

名称字节大小说明
bLength1该描述符字节数长度(9字节)
bDescriptorType1描述符类型(配置描述符为0x02)
wTotalLength2此配置信息的总长度,(包括配置,接口,端点和设备类及厂商定义的描述符)
bNumInterfaces1该配置所支持的接口个数
bConfigurationValue1在SetConfiguration()请求中用做参数来选定此配置
iConfiguration1描述此配置的字串描述表索引
bmAttributes1配置特性
MaxPower1在此配置下的总线电源耗费量 2mA为一个单位

接口描述符

接口描述符描述了该接口的端点数目、以及子类代码等。由配置描述符可知一个设备可以有多个接口描述符。

名称字节大小说明
bLength1该描述符字节数长度(9字节)
bDescriptorType1描述符类型(接口描述符为0x04)
bInterfaceNumber1接口编号,当前配置支持的接口数组索引
bAlternateSetting1可选设置的索引值
bNumEndpoints1此接口用的端点数量
bInterfaceClass1接口所属的类值
bInterfaceSubClass1子类代码
bInterfaceProtocol1接口协议
iInterface1描述此接口的字串描述表的索引值

端点描述符

每个端点都有其端点描述符。主要描述了该端点地址、属性、数据包大小等信息。其数量由接口描述符决定。所以一个设备也可以由多个端点描述符。

名称字节大小说明
bLength1该描述符字节数长度(7字节(0X07))
bDescriptorType1描述符类型(接口描述符为0x05)
bEndpointAddress1USB设备的端点地址
bmAttributes1端点属性
wMaxPacketSize2本端点接收或发送的最大信息包大小
bInterval1主机查询端点的时间间隔

字符串描述符

字符串描述符是可选的。如果不支持字符串描述符,其设备,配置,接口描述符内的所有字符串描述符索引都必须为0。

名称字节大小说明
bLength1该描述符字节数长度
bDescriptorType1描述符类型(字符串描述符为0x03)
bStringNUnicode编码字符串

HID报告描述符(HID设备独有的)

USB设备中有一大类就是HID设备,也就是我们常见的Human Interface Devices ,人机接口设备,HID设备的类型定义放在接口描述符中。
在这里插入图片描述

当USB一个设备为HID设备时,其设备描述符里面的bDeviceClass、bDeviceSubClass、bDeviceProtocol应为0,具体的定义在接口描述符中,接口描述符bInterfaceClass、bInterfaceSubClass、bInterfaceProtocol三个值如下:

HID设备接口描述符特征
名称(均在接口描述符里)
bInterfaceClass0x03:表示HID为设备
bInterfaceSubClass0x00:对无需支持引导的HID设备;0x01:对支持引导的USB设备(鼠标、键盘);其他:保留。
bInterfaceProtocol当bInterfaceSubClass为0x00,此值无效。当bInterfaceSubClass为0x01。设置为0x01:键盘接口 设置为0x02:鼠标接口
HID描述符
名称字节大小说明
bLength1该描述符字节数长度(由下级描述符多少决定)
bDescriptorType1描述符类型(HID描述符为0x21)
bcdHID2HID协议版本
bCountryCode1国家代码
bNumDescriptor1HID设备支持的下级描述符的数量(也就是HID设备特有的报告描述符和物理描述符的综合)
bDescriptorType1下级描述符类型(第一个必须是报告描述符0X22)
wDescriptorLength2下级描述符的长度
… (这里会根据下级描述符数量罗列)
HID报告描述符

如下为一个HID鼠标的报告描述符
在这里插入图片描述
报告描述符解析
这是一个鼠标的HID报告描述符。首先去除中间的观察它的头尾部分可以看的出头尾部分主要表述这是一个鼠标设备。

USAGE_PAGE (Generic Desktop)	05 01
USAGE (Mouse)	09 02
COLLECTION (Application)	A1 01 
  USAGE (Pointer)	09 01
  COLLECTION (Physical)	A1 00 
    .......
  END_COLLECTION	C0
END_COLLECTION	C0

中间部分描述符了相关细节

USAGE_PAGE (Button)	05 09
USAGE_MINIMUM (Button 1)	19 01
USAGE_MAXIMUM (Button 3)	29 03
LOGICAL_MINIMUM (0)	15 00 
LOGICAL_MAXIMUM (1)	25 01 
REPORT_COUNT (3)	95 03 
REPORT_SIZE (1)	75 01 
INPUT (Data,Var,Abs)	81 02 
REPORT_COUNT (1)	95 01 
REPORT_SIZE (5)	75 05 
INPUT (Cnst,Var,Abs)	81 03 
USAGE_PAGE (Generic Desktop)	05 01
USAGE (X)	09 30
USAGE (Y)	09 31
LOGICAL_MINIMUM (-127)	15 81 
LOGICAL_MAXIMUM (127)	25 7F 
REPORT_SIZE (8)	75 08 
REPORT_COUNT (2)	95 02 
INPUT (Data,Var,Rel)	81 06 

内容的详细介绍如下:
USAGE_PAGE (Button)表示一个数据描述的开始,所描述的数据用于按键。在左侧【HID Items】栏中双击【USAGE_PAGE】项时,弹出的窗口中选择【Button】项即可。
USAGE_MINIMUM (Button 1)表示最小按键为Button 1。前面选择了【Button】,然后再单击【USAGE_MINIMUM】项时,窗口中则可以选择【Button 1】~【Button 63】。
USAGE_MAXIMUM (Button 3)表示最大按键为Button 3。实际上第二和第三行表示了一共有三个按键:Button 1 ~ Button3。
LOGICAL_MINIMUM (0)表示按键状态的最小值为 0。
LOGICAL_MAXIMUM (1)表示按键状态的最大值为 1。
REPORT_COUNT (3)表示数量为 3。
REPORT_SIZE (1)表示占用空间,单位为 bit,1 表示占用空间为 1-bit。
INPUT (Data,Var,Abs)表示以上 3-bit 数据为发送给电脑的数据,Data表示这个数据是可变的,由用户决定。6、7、8三行代码表明:表示三个按钮状态的数据占用 3-bit 的空间,分别是 bit0 ~ bit2,数据是可变的。
REPORT_COUNT (1)表示数量 1。
REPORT_SIZE (5)表示占用空间为 5-bit。
INPUT (Cnst,Var,Abs)表示以上 5-bit 数据为发送给上位机的固定数据,Cnst即为 Const 常量的意思。9、10、11行代码表示还有 5-bit 的不可变数据。即图 1 中第一个字节中的 5 个 bit 的不使用数据。
USAGE_PAGE (Generic Desktop)表示开始描述一个新的数据了。
USAGE (X)表示描述的是 X 坐标,在USAGE_PAGE中选择了Generic Desktop后,双击【USAGE】项则可以选择【X】。
USAGE (Y)表示描述的是 Y 坐标,由于 X、Y 坐标格式一致,所以放在一起描述了,这是省略的写法,完全可以单独定义 Y 坐标数据。
LOGICAL_MINIMUM (-127)表示最小值为 -127。
LOGICAL_MAXIMUM (127)表示最大值为 127。我们知道一个字节可存储的有符号整数范围为-128~127。这里只是为了对称,将最小值设为 -127。
REPORT_SIZE (8)表示以上 X、Y数据占用 8-bit 空间。
REPORT_COUNT (2) 数量为 2。
INPUT (Data,Var,Rel)表示以上2个字节是发送给上位机的可变数据,Rel表示这是相对值

键盘报告描述符

在这里插入图片描述
后续补齐。
写HID报告描述符和分析HID报告描述符很麻烦吧
附 HID报告描述符分析工具:USB中文网出品https://www.usbzh.com/article/detail-537.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值