HID报告描述符Report Descriptor解析分析
HID独有的报告描述符也叫报表描述符对于初学者来说比较复杂,但是如果真正理解了它,我们又不得不惊吧于设计者的巧妙设计。
HID报告描述符是由一系列的条目(item)组成的,一个item一般是又包括头部信息(bTag,bType,bSize)和数据内容。所以说item在HID的报告描述符中是最小的信息单元。ITEM是HID报告描述符的最最基本的数据结构。
HID报告描述符的最小单元是ITEM,在HID规范中这个ITEM又分为两种:
- 短ITEM :使用最广泛的ITEM类型,我们重点研究的对象
- 长ITEM :几乎不会使用到。
详细的长短项解释可见:http://www.usbzh.com/article/detail-48.html
HID报告描述符的解析
在各操作系统中,HID类驱动程序包含一个报告描述符的解析器,用于分析在报表描述符中找到的项。
- VS2019分析HID报告描述符解析源代码 http://www.usbzh.com/article/detail-461.html
- HID设备的驱动HidClass,HIDUSB.sys,HidParser.sys和HidParse.sys之间的关系 http://www.usbzh.com/zone/detail-31.html
- 没有解析报告描述符的程序例程? http://www.usbzh.com/zone/detail-12.html
从解析器的角度来看,HID类设备如下图所示:
解析器在遍历描述符时收集每个已知项的状态,并将它们存储在项状态表中。项目状态表包含单个项目的状态。
解析器线性的方式进行对各ITEM进行扫描,根所不同的ITEM类型,动作不一样,主要执行的是main重新分配操作,push和pop操作。
main item:当解析器遇到一个main条目后,将分配并初始化新的报告结构使用当前项状态表。然后从item状态表中删除所有local item ,但保留global项目。 这样,Global 项就为后续新的 Main 项设置了默认值。 具有多个类似控件(例如,六个轴)的设备只需要在第一个 Main 项目之前定义 Global 项目一次。
main item按照它们的声明顺序与collection进行相关联,当解析器遇到一个collection时,表示一个集合的的开始,遇到 End Collection表示一个集合的结束。当遇到 Push 项目时,项目状态表被复制并放置在堆栈上供以后检索。
- 当找到一个 Pop 项目时,项目状态表被堆栈中的顶部表替换。 例如:
Unit (Meter), Unit Exponent (-3), Push, Unit Exponent (0)
当解析器到达 Push item时,它会将定义单位为毫米(10-3 米)的项目放置在堆栈上。 下一个项目将项目状态表更改为米单位(100 米)。
- 解析器需要解析整个 Report 描述符以找到所有 Main 项。 这是分析设备发送的报告所必需的。