HID规范
+ -

HID报表描述符原理解释

2022-03-23 5892 1

一个报表描述符主要是为了描述报表的结构以及用途。
报表的结构主要由报表的字段的长度(size)、数量(count)、属性(输入、输出等)决定,而报表的用途则由 HID 用途表文档规定。

下面我们还是从 Kinetis KL25 USB 例程指南—进阶篇中的 USB 鼠标的报表描述符入手,分析报表描述符中各项的含义,并介绍 HID用途表中的要点。

;=========================================
;HID Reports Descriptor 报表描述符
;=========================================
 DB 0x05, 1 ; Usage Page (1: Generic Desktop)
 DB 0x09, 2 ; Usage (2: Mouse) 表示报表定义的是HID鼠标
     DB 0xA1, 1 ; Collection (1: Application) ===============集合开始
     DB 0x09, 1 ; Usage (1: Pointer)
         DB 0Xa1, 0 ; Collection (0: Physical)
         DB 0x05, 9 ; USAGE_PAGE (Button)
         DB 0x19, 1 ; Usage Minimum (1)
         DB 0x29, 3 ; Usage Maximum (3)
         DB 0x15, 0 ; Logical Minimum (0)
         DB 0x25, 1 ; Logical Maximum (1)
         DB 0x95, 3 ; Report Count (3)
         DB 0x75, 1 ; Report Size (1)
         DB 0x81, 2 ; Input (Data, Variable, Absolute)
        ;
         DB 0x95, 1 ; Report Count (1)
         DB 0x75, 5 ; Report Size (5),
         DB 0x81, 1 ; Input (Constant)
        ;
         DB 0x05, 1 ; USAGE_PAGE (Generic Desktop)
         DB 0x09, 30 ; USAGE (X)
         DB 0x09, 31 ; USAGE (Y)
         DB 0x09, 38 ; USAGE (Wheel)
         DB 0x15, 81 ; LOGICAL_MINIMUM (-127)
         DB 0x25, 7f ; LOGICAL_MAXIMUM (127)
         DB 0x75, 8 ; REPORT_SIZE (8)
         DB 0x95, 3 ; REPORT_COUNT (3)
         DB 0x81, 6 ; INPUT (Data, Variable, Relative)
     DB 0xC0
 DB 0xC0 ; End_Collection ====================== 集合结束

用途 ID(Usage ID)和用途页 ID(Usage Page ID)

上文的报表描述符为例,需要一个用途为 Mouse 的最外层应用集合。通过查看 HID 用途表,知道在 Generic Desktop Page(0x01)中有一个用途类型为 CA 的 Mouse(0x02)用途,因此在 USB 鼠标报表描述符中,开头就先指定了使用用途页 Generic Desktop Page(0x01),然后又指定了该用途页下的 Mouse(0x02)用途,接着使用开集合的主条目打开一个应用集合,如下所示。

DB 0x05, 1 ; Usage Page (1: Generic Desktop)
DB 0x09, 2 ; Usage (2: Mouse) 表示报表定义的是HID鼠标
 DB 0xA1, 1 ; Collection (1: Application) ===============集合开始

读到这里,我想大家会对前段加粗所标示出的名词具体所.

用途页 ID(Usage Page ID)用途 ID(Usage ID)就像论文的大标题和小标题一样,大标题着眼于研究领域的划分,而小标题则着眼于该领域中具体分支的介绍,让读者一看题目,就能大致了解论文描述的内容。

而在描述符中,要指定 Input、Output 或 Feature 项目定义的数据域功能时,就需要指定对应的用途页以及用途。指定用途有两种方法:可以一个个的用 Usage 去指定(如 USB 鼠标中对 X、Y 以及滚轮的用途指定),也可以指定用途最小值和用途的最大值(如 USB 鼠标中对按键的用途指定)。这样,每个数据域就会分配到对应的用途。但是这里有一个例外,那就是用途类型(Usage Type)为 Sel(Selectors)的用途 ID,它的数据域属性为 NAry(数组)。一个 Nary 可以有一个或者多个元素,每个元素都具有相同的用途。当对一个属性为 Nary 的数据域指定用用途最小值和用途最大值时,并不是将这些数据域分别分配为这些用途,而是这些数据域的每个数组元素的返回值可以在这些用途中选择。键盘中的普通键就是这种情况,HID 用途表中规定了这些普通键的 Usage ID 类型 Sel 的。

注意:HID 用途表文档列出了各式的用途页,并在每个用途页下都规定了很多的用途,切记用途页和用途不可随意使用。

HID 用途表文档还规定了用途的类型,总共 3 种,分为:集合(Collections)、控制(Controls)、数据(Data),上段中提到的 Sel是数据中一种,而 CA 则为集合的一种,具体分类请参考 HID 用途表文档。集合与控制、数据的用法区别,已经在 HID 用途表中标示出来啊(如图 1)。至于控制和数据的差异,个人意见是两者着眼于 Input、Output 或 Feature 项目定义的数据域的不同位域,一个用于说明数据域的属性,另一个则用于说明数据域的类型(如表 1),感觉没什么可比
性,所以只好乖乖的遵守 HID 用途表文档中的分类了。
用途表

190618556888

注:
①:该位不能应用到数组。
②:只应用于 Output 和 Feature 项目,对于 Input 项目该位保留。

完成集合内的各用途 ID(Usage ID)及对应数据域指定

DB 0x09, 1 ; Usage (1: Pointer)
DB 0Xa1, 0 ; Collection (0: Physical)
     DB 0x05, 9 ; USAGE_PAGE (Button)
     DB 0x19, 1 ; Usage Minimum (1)
     DB 0x29, 3 ; Usage Maximum (3)
     DB 0x15, 0 ; Logical Minimum (0)
     DB 0x25, 1 ; Logical Maximum (1)
     DB 0x95, 3 ; Report Count (3)
     DB 0x75, 1 ; Report Size (1)
     DB 0x81, 2 ; Input (Data, Variable, Absolute)
    ;
     DB 0x95, 1 ; Report Count (1)
     DB 0x75, 5 ; Report Size (5),
     DB 0x81, 1 ; Input (Constant)
    ;
     DB 0x05, 1 ; USAGE_PAGE (Generic Desktop)
     DB 0x09, 30 ; USAGE (X)
     DB 0x09, 31 ; USAGE (Y)
     DB 0x09, 38 ; USAGE (Wheel)
     DB 0x15, 81 ; LOGICAL_MINIMUM (-127)
     DB 0x25, 7f ; LOGICAL_MAXIMUM (127)
     DB 0x75, 8 ; REPORT_SIZE (8)
     DB 0x95, 3 ; REPORT_COUNT (3)
     DB 0x81, 6 ; INPUT (Data, Variable, Relative)

在指定了 Mouse(0x02)用途,并打开了一个应用集合后,这样系统软件在分析此报表描述符时,就知道最外层的一个应用集合是用作鼠标的,操作系统就会增加一个 HID 鼠标设备。接着在该应用集合中,增加一个用途为 Point 的物理集合。Point 也是 Generic DesktopPage 中的一个开物理集合的用途,是指针设备集合。由于鼠标上有三个按键,因此需要用到按键(Button)的功能。在 HID 用途表中,专门一个按键页:Button Page(0x09),选择了按键用途 1~3,分别为左键、
右键、中键。另外,鼠标还有 X 轴、Y 轴以及滚轮,这些用途在Generic Desktop 页中定义的,所以接着又切换到了 Generic Desktop 页,将三个宽度为 8 位的数据段分别定义为 X 轴、Y 轴、滚轮。

关闭集合

最后,使用关闭集合的主条目将两个集合关闭。这样,一个 USB鼠标的 HID 报表符就构造好了

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一般的,单选按钮实现有一个机械系统,它释放任何未按下的按钮,并将最后按下的按钮保持在活......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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