HID规范
+ -

HID 报告及报告描述简介

2022-01-24 7849 8
原文转自:https://www.sohu.com/a/69911773_119709

USB 中, USB HOST是通过各种描述符来识别设备的,有设备描述符配置描述符接口描述符端点描述符字符串描述符报告描述符等等。

USB 报告描述符(Report Descriptor)是 HID 设备中的一个描述符,它是比较复杂的一个描述符。
USB HID 设备是通过报告来给传送数据的,报告有输入报告和输出报告。

输入报告是 USB 设备发送给主机的,例如 USB 鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给 USB 设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点 0 发送,当有中断输出端点时,通过中断输出端点发出.

报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的?
通过它, USB HOST 可以分析出报告里面的数据所表示的意思。它通过控制输入端点 0 返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的报告通过报告 ID 来识别,报告 ID 在报告最前面,即第一个字节。当报告描述符中没有规定报告 ID 时,报告中就没有 ID 字段,开始就是数据。更详细的说明请参看USB HID 协议,该协议可从 Http://www.usb.org 下载

当然本站USB中文网也提供一个HID报告描述符十六进制的解析工具,大家可以在本站搜索HidReportParser来下载。

通过由 HID Descriptor tool 生成的 USB 鼠标和 USB 键盘来说明一下报告描述符和报告。

code char KeyBoardReportDescriptor[63] = {
//表示用途页为通用桌面设备
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
//表示用途为键盘
0x09, 0x06, // USAGE (Keyboard)
//表示应用集合,必须要以 END_COLLECTION 来结束它,见最后的 END_COLLECTION
0xa1, 0x01, // COLLECTION (Application)
//表示用途页为按键
0x05, 0x07, // USAGE_PAGE (Keyboard)
//用途最小值,这里为左 ctrl 键
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
//用途最大值,这里为右 GUI 键,即 window 键
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
//逻辑最小值为 0
0x15, 0x00, // LOGICAL_MINIMUM (0)
/逻辑最大值为 1
0x25, 0x01, // LOGICAL_MAXIMUM (1)
//报告大小(即这个字段的宽度)为 1bit,所以前面的逻辑最小值为 0,逻辑最大值为 1
0x75, 0x01, // REPORT_SIZE (1)
//报告的个数为 8,即总共有 8 个 bits
0x95, 0x08, // REPORT_COUNT (8)
//输入用,变量,值,绝对值。像键盘这类一般报告绝对值,
//而鼠标移动这样的则报告相对值,表示鼠标移动多少
0x81, 0x02, // INPUT (Data,Var,Abs)
//上面这这几项描述了一个输入用的字段,总共为 8 个 bits,每个 bit 表示一个按键
//分别从左 ctrl 键到右 GUI 键。这 8 个 bits 刚好构成一个字节,它位于报告的第一个字节。
//它的最低位,即 bit-0 对应着左 ctrl 键,如果返回的数据该位为 1,则表示左 ctrl 键被按下,
//否则,左 ctrl 键没有按下。最高位,即 bit-7 表示右 GUI 键的按下情况。中间的几个位,
//需要根据 HID 协议中规定的用途页表(HID Usage Tables)来确定。这里通常用来表示
//特殊键,例如 ctrl, shift, del 键
/这样的数据段个数为 1
0x95, 0x01, // REPORT_COUNT (1)
//每个段长度为 8bits
0x75, 0x08, // REPORT_SIZE (8)
//输入用,常量,值,绝对值
0x81, 0x03, // INPUT (Cnst,Var,Abs)
//上面这 8 个 bit 是常量,设备必须返回 0
//这样的数据段个数为 5
0x95, 0x05, // REPORT_COUNT (5)
//每个段大小为 1bit
0x75, 0x01, // REPORT_SIZE (1)
//用途是 LED,即用来控制键盘上的 LED 用的,因此下面会说明它是输出用
0x05, 0x08, // USAGE_PAGE (LEDs)
//用途最小值是 Num Lock,即数字键锁定灯
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
//用途最大值是 Kana,这个是什么灯我也不清楚^_^
0x29, 0x05, // USAGE_MAXIMUM (Kana)
//如前面所说,这个字段是输出用的,用来控制 LED。变量,值,绝对值。
//1 表示灯亮, 0 表示灯灭
0x91, 0x02, // OUTPUT (Data,Var,Abs)
//这样的数据段个数为 1
0x95, 0x01, // REPORT_COUNT (1)
/每个段大小为 3bits
0x75, 0x03, // REPORT_SIZE (3)
//输出用,常量,值,绝对
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
//由于要按字节对齐,而前面控制 LED 的只用了 5 个 bit,
//所以后面需要附加 3 个不用 bit,设置为常量。
//报告个数为 6
0x95, 0x06, // REPORT_COUNT (6)
//每个段大小为 8bits
0x75, 0x08, // REPORT_SIZE (8)
//逻辑最小值 0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//逻辑最大值 255
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
//用途页为按键
0x05, 0x07, // USAGE_PAGE (Keyboard)
//使用最小值为 0
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
//使用最大值为 0x65
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
//输入用,变量,数组,绝对值
0x81, 0x00, // INPUT (Data,Ary,Abs)
//以上定义了 6 个 8bit 宽的数组,每个 8bit(即一个字节)用来表示一个按键,所以可以同时
//有 6 个按键按下。没有按键按下时,全部返回 0。如果按下的键太多,导致键盘扫描系统
//无法区分按键时,则全部返回 0x01,即 6 个 0x01。如果有一个键按下,则这 6 个字节中的第
一
//个字节为相应的键值(具体的值参看 HID Usage Tables),如果两个键按下,则第 1、 2 两个
//字节分别为相应的键值,以次类推。
//关集合,跟上面的对应
0xc0 // END_COLLECTION
};

通过上面的分析,我们知道这个报告中只有一个报告,所以没有报告 ID,因此返回的都是实际使用的数据。总共有 8 字节输入, 1 字节输出。其中输入的第一字节用来表示特殊按键,第二字节保留,后面的六字节为普通按键。如果只有左 ctrl 键按下,则返回 01 00 00 00 00 00 00 00(十六进制),如果只有数字键 1 按下,则返回 00 00 59 00 00 00 00 00,如果数字 1 和 2 同时按下,则返回 00 00 59 5A 00 00 00 00,如果再按下左 shift 键,则返回 02 00 59 5A 00 00 00 00,然后再释放 1 键,则返回 02 00 5A 00 00 00 00 00,然后全部按键释放,则返回 00 00 00 00 00 00 00 00。
这些数据(即报告)都是通过中断端点返回的。当按下 Num Lock 键时, PC 会发送输出报告,从报告描述符中我们知道, Num Lock 的 LED 对应着输出报告的最低位,当数字小键盘打开时,输出 xxxxxxx1(二进制,打 x 的由其它的 LED 状态决定);
当数字小键盘关闭时,输出 xxxxxxx0(同前)。取出最低位就可以控制数字键锁定 LED 了。下面这个报告描述符是 USB 鼠标报告描述符,比起键盘的来说要简单些。它描述了 4 个字节,第一个字节表示按键,第二个字节表示 x 轴(即鼠标左右移动,
0 表示不动,正值表示往右移,负值表示往左移),第三个字节表示 y 轴(即鼠标上下移动, 0 表示不动,正值表示往下移动,负值表示往上移动),第四个字节表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。

code char MouseReportDescriptor[52] = {
//通用桌面设备
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
//鼠标
0x09, 0x02, // USAGE (Mouse)
//集合
0xa1, 0x01, // COLLECTION (Application)
//指针设备
0x09, 0x01, // USAGE (Pointer)
//集合
0xa1, 0x00, // COLLECTION (Physical)
//按键
0x05, 0x09, // USAGE_PAGE (Button)
//使用最小值 1
0x19, 0x01, // USAGE_MINIMUM (Button 1)
//使用最大值 3。 1 表示左键, 2 表示右键, 3 表示中键
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
//逻辑最小值 0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//逻辑最大值 1
0x25, 0x01, // LOGICAL_MAXIMUM (1)
//数量为 3
0x95, 0x03, // REPORT_COUNT (3)
//大小为 1bit
0x75, 0x01, // REPORT_SIZE (1)
//输入,变量,数值,绝对值
/以上 3 个 bit 分别表示鼠标的三个按键情况,最低位(bit-0)为左键
//bit-1 为右键, bit-2 为中键,按下时对应的位值为 1,释放时对应的值为 0
0x81, 0x02, // INPUT (Data,Var,Abs)
//填充 5 个 bit,补足一个字节
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
//用途页为通用桌面
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
//用途为 X
0x09, 0x30, // USAGE (X)
//用途为 Y
0x09, 0x31, // USAGE (Y)
//用途为滚轮
0x09, 0x38, // USAGE (Wheel)
//逻辑最小值为-127
0x15, 0x81, // LOGICAL_MINIMUM (-127)
//逻辑最大值为+127
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
//大小为 8 个 bits
0x75, 0x08, // REPORT_SIZE (8)
//数量为 3 个,即分别代表 x,y,滚轮
0x95, 0x03, // REPORT_COUNT (3)
//输入,变量,值,相对值
0x81, 0x06, // INPUT (Data,Var,Rel)
//关集合
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};

通过对上面的报告分析,我们知道报告返回 4 个字节,没有报告 ID。如果鼠标左键按下,则返回 01 00 00 00(十六进制值),如果右键按下,则返回 02 00 00 00,如果中键按下,则返回 04 00 00 00,如果三个键同时按下,则返回 07 00 00 00。如果鼠标往右移动则第二字节返回正值,值越大移动速度越快。其它的类推.

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
HID报告描述符详解
HID的报告描述符和其它描述符不一样,不是具有固定的数据结构,而是由固件开发商根据上报的数据自行组装的。这个组装的原材料是HID规范定义的ITEM。所以说HID报告描述符就像搭积木一样,其最终的数据结构和设计图纸是什么,都是由固件开发商决定的,但是其最终的产品又是由HID规范提供的各个标准积木模块搭......
USB键盘报告描述符数据格式分析
USB键盘的HID报表描述符的内容参见下表。数据的输入端点为中断方式,当有键盘敲击事件时,会上报数据长度为8字节的数据报告。0x05,0x01,// Global Generic Desktop0x09,0x06,// Local KeyBoard 0xA1,0x01,// Main app col......
USB鼠标HID报告描述符数据格式分析
注意:这里的鼠标为普通鼠标报告描述符的信息解释,其并不适用于全鼠标报表描述符。一个示例如下:0x05,0x01, // Global Generic Desktop0x09,0x02, // Local Mouse0xa1,0x01, // Main app collection0x09,......
USB中文网出品-HID报告描述符分析工具
HidReportParser.exe工具已经网页化,可访问http://www.usbzh.com/tool/usb.html 在线分析USB-HID报告描述符USB HID规范中有一个很重要的概念,就是HID的报告描述符。本人搞了这么久的HID设备开发,其中一项最头疼的是HID报告描述符的......
HID 报表描述符/报告描述符
报表描述符用于描述USB HID设备与主机之间数据交互的格式。根据数据的传输方向,分为输入报告和输出报告。输入报告是USB设备发送数据给主机的。大部分的USB HID设备主要实现的是输入报告。如我们平常使用的USB鼠标,就是通过我们点击鼠标按键或滑动鼠标流轮实现给主机上报鼠标的报告信息。输出报告......
HID报告描述符协议
HID报告描述符通过报告描述符的条目定义了HID报告数据的格式。对于大部分的HID设备来说,数据的传输方向都是输入的,即使用输入端点数据从设备端到主机端,并且使用的是中断的方式。当然HID设备不仅仅为数据的输入,有时也需要数据的输出。这时就需要一个输出中断端点来实现。报告描述符包含了属于特定Rep......
USB官网HID报告描述符生成工具
USB规范官网提供了一个HID报告描述符生成工具,https://www.usb.org/document-library/hid-descriptor-tool 使用我们此工具,我们可以:创建、编辑和验证HID报告描述符。输出多种输出(.txt、.inc、.h等)查看一些标准的设备报告描述符......
VS2019分析HID报告描述符解析源代码
常有人问,有没有HID解析的工具,好像除了usb官网提供的dt.exe,没有其它的好的东东了。Linux下有相关的工具,在本站的社区里:http://www.usbzh.com/zone/detail-12.html 可以查看做HID开发,其实最麻烦的就是HID报表描述符了。这里本人移植了Reac......
HID报告描述符Report Descriptor解析分析
HID独有的报告描述符也叫报表描述符对于初学者来说比较复杂,但是如果真正理解了它,我们又不得不惊吧于设计者的巧妙设计。HID报告描述符是由一系列的条目(item)组成的,一个item一般是又包括头部信息(bTag,bType,bSize)和数据内容。所以说item在HID的报告描述符中是最小的信息单......
HID报告描述符Usage
Usage是HID报告描述符的一部分,用于应用开发人员提供有关控制测量内容的信息。Usage标签指示了设备供应商对其设备的控制或者设备控制组的特定用途建议。例如虽然报告描述符中定义了数据格式(例如,三个 8 位字段),但使用Usages定义了应对数据执行的操作含义,例如 x、y 和 z 输入。 此功......
HID报告描述符分类大全
下表列出的是全部的项目的前缀字和简要功能说明。项目类型项目标志(Tag)项目前缀,nn为数据长度功能说明MainInput8x1000 00 nn定义输入报表,主机利用该信息解析设备提供的数据。主机向控制端口发送Get_Report实现输入MainOutpu......
HID音量控制报告描述符
音量控制HID规范提供了两种报告描述符,分别对应按钮式和旋钮式。Up/Down 按钮音量控制下面的示例定义了一对按钮,用于渐变变量,例如音量增大和音量向下按钮。输入设备必须定义为相对设备。–1将减小音量+1将增大音量。0对音量没有影响。UsagePage(Consumer)Usage(Vol......
HID磁带滚轮按钮报告描述符
磁带滚轮按钮是一个弹簧式旋钮,可旋转 ±90°,用户食指有一个小凹痕。 当用户向右或向左扭转旋钮时,磁带与从弹簧加载的中心位置的旋转成正比的速率前进或后退。UsagePage(Consumer)Usage(Tape Jog)Logical Minimum(-127),Logical Maxi......
HID 单元按钮报告描述符
单选按钮是一组相互排斥的按钮。在下面的示例中,音频接收器使用三个单选按钮在计算机、DVD 设备或万维网之间进行选择作为显示源。机械连接式单选接钮 Mechanically Linked Radio Buttons一般的,单选按钮实现有一个机械系统,它释放任何未按下的按钮,并将最后按下的按钮保持在活......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!