HID开发笔记
+ -

HID设备ReportId冲突的验证探讨

2022-11-18 19 1

需求永远是变态的,但能完成这个变态的需求,只能说我们也是极度的变态。
有这么一个需求,一个自定义的HID设备,假如其ReportId分别为1,3,5用于输入,2,4,6用于输出。并且其原有的功能是可以稳定的工作的。

不过现在我们有个需求,就是在不修改固件的情况下,对原有的ReportId=1时,进行扩展。就是需要区分ReportId=1时的两种情况,一种是我们自己的,一种是原有固件自身的功能。

其实想到的第一种方案就是进行报告描述符来复合,这样hidclass.sys通过hidparser.sys解析报告描述符之后,会生成两个HID设备,不过由于通过报告描述符复合,那么由于ReportId公用的冲突,系统会不知道当ReportId=1时,到底是发给那个应用集合。

我们通过报告描述符复合,其实就是写两个相同层级的 Collection (Application),其结构大概如下:

0x06, 0xFF, 0x00,  // Usage Page (Vendor Defined 0xFFA0)
0x09, 0x01,        // Usage (0x01)
0xA1, 0x01,        // Collection (Application)
0x85, 0x01,       //  Report ID(1)
....
0xC0,              // End Collection

0x06, 0xFF, 0x01,  // Usage Page (Vendor Defined 0xFFA0)
0x09, 0x01,        // Usage (0x01)
0xA1, 0x01,        // Collection (Application)
0x85, 0x01,       //  Report ID(1)
....
0xC0,              // End Collection

这里可以通过Usage Page和Usage在应用层来判断是那个设备。不过这里系统是区分了,设备端是无法区分的。所以主机会对此显示错误,我们按照上面的思路在系统中虚拟一个这样的设备,那么在设备管理器中如下:
黄色感叹号
可以看到,设备管理器中设备该设备以黄色感叹号显示,表示设备启动失败。
启动失败
设备状态显示:

This device cannot start. (Code 10)
Report ID declaration found outside of top level collection.

翻译过来说是ReportId的顶层集合之找到,其实真正的原因是因为我们ReportId重复导致。
我们通过修改其中一个的ReportId不重复,可正常加载。
报告描述符复合HID设备

当然,也可以用我们的HidTool来打开设备进行输入输出报告通讯。
HidTool

那么基于以上的这个问题验证,真实情况们该怎么验证呢?
这里可以向上考滤一层,就是通过接口描述答来复合设备。即将这2个Collection (Application)分别指给不同的接口描述符,这样实现在接口层的复合。这样各个接口描述符中指定的Application中均含有ReportId=1时,也相互不影响。

其实这里也从另一个方面来验证了USB的设备寻址思想:

  • USB总线
  • USB设备地址
  • USB接口
  • USB端点
  • [HID ReportId]

0 篇笔记 写笔记

USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
USB复合设备-UVC摄像头HID设备共存的设计实现
通常做USB设备的开发,我们做的都是单一的功能设备。这种单一的功能设备只实现某种特定的功能,如只实现一个HID鼠标或键盘,只实现一个USB存储功能,或再复杂一点只实现一个UVC音频麦克风和扬声器功能或一个UVC摄像头功能。但我们在一般的市场上看到的设备通常不只实现一种功能,如UVC摄像头功能还提供......
HID复合设备(键盘、鼠标)的实现
在使用一些USB键盘或鼠标的时候,特别是一些电竟高档HID设备时,经常发现这些设备会额外定义一些特别的快捷键,使得这些设备不仅有基础设备(如键盘,鼠标)的功能,也有一些特别的快捷功能(如系统声音的放大放小)。甚至更有一些复杂的设备,只需要一个USB接口,就同时支持鼠标键盘功能或在键盘的额外区域支持触......
HID全局条目ReportId
大多数设备都是通过一个数据报告给主机的,但也可以通过ReportId实现实现一个设备返回多个数据报告。例如,带有触摸设备的键盘可以独立报告同一端点上的“按键”数据和“指点”数据。ReportId用于区分不同的数据。Report ID固定为1字节长度,在数据传输前位数据的头部。如果报告描述符中不存在......
USBCCGP 复合USB设备的枚举
当新的 USB 设备连接到主机计算机时,USB 总线驱动程序创建设备的物理设备对象 (PDO),并生成报告新 PDO 的即插即用事件。 操作系统然后,查询的硬件 Id 与 PDO 相关联的总线驱动程序。对于所有 USB 设备、 USB 总线驱动程序报告设备 ID具有以下格式:USBVID_xx......
USBCCGP 复合设备接口设备ID
复合 USB 设备上的接口可分组到集合中或分别代表一个 USB 函数。如果接口未分组在集合中,则通用父驱动程序会为每个接口创建一个 PDO,并为每个 PDO 生成一组硬件 Id。USB设备ID接口 PDO 的设备 ID具有以下格式:USBVID_v(4)&PID_p(4)&MI......
模仿USBCCGP对USB复合设备功能分析打印输出
源代码如下:VOIDDumpFunctionDescriptor( IN PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor, IN ULONG FunctionDescriptorCount){ ULONG Index, Sub......
UAC复合设备(麦克风,扬声器,HID设备)的示例
UAC符合设备(麦克风,扬声器,HID设备)在设备管理器中如下图所示:在BUSHOUND下如下图所示:UAC音频设备UAC音频设备包括扬声器和麦克风。其中USB Pnp Audio Device使用了接口0,1,2,分别用于控制接口,扬声器和麦克风。HID音量控制设备USB输入设备用于音频的......
HID复合设备部分接口设备无数据响应问题
群里有位同学使用USB的多接口功能实现了一个复合设备,即使用了多个接口描述符,每个接口描述符下一组端点,用于数据传输,当然每组下也有一组HID描述符和其对应的HID报告描述符。关于HID复合设备接口描述符与其接口描述符的对应关系可见:http://www.usbzh.com/article/deta......
HID多ReportId数据长度返回的问题
最近搞了一个虚拟的USB HID设备,为了测试各个报告描述符。不过遇到了一个奇怪的问题,以前没有留意,现在分享给大家。比如在自定义的HID的报告描述符中,描述输入的报告内容分别如下:ReportId数据长度总长度011617026061可以看到,当Rep......
HID报告描述符复合HID设备
如我们电脑中有一个键盘,其设备管理器中如下:它们的硬件ID分别如下:USBVID_1A2C&PID_2124&REV_0110USBVID_1A2C&PID_2124&REV_0110&MI_00HIDVID_1A2C&PID_2124......
HID复合鼠标报告描述符
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x02, // USAGE (Mouse) 0xa1, 0x01, ......
HID设备ReportId冲突的验证探讨
需求永远是变态的,但能完成这个变态的需求,只能说我们也是极度的变态。有这么一个需求,一个自定义的HID设备,假如其ReportId分别为1,3,5用于输入,2,4,6用于输出。并且其原有的功能是可以稳定的工作的。不过现在我们有个需求,就是在不修改固件的情况下,对原有的ReportId=1时,进行扩......
作者信息
USB中文网
B站搜索 站长漫谈 看视频。
pnpon内核开发网,USB中文网,
busrom硬核技术网站长
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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