HID报告描述符未声明项是否有默认值?以Speedlink摇杆为例
HID报告描述符集合作用与按钮逻辑最值问题解析
设备背景与报告描述符
我有一款Speedlink摇杆,是Commodore/Atari时代经典Competition Pro的USB复刻版,它的HID报告描述符如下:
0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x09, 0x05, // Usage (Game Pad) 0xA1, 0x01, // Collection (Application) 0x09, 0x01, // Usage (Pointer) 0xA1, 0x00, // Collection (Physical) 0x09, 0x30, // Usage (X) 0x09, 0x31, // Usage (Y) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x35, 0x00, // Physical Minimum (0) 0x46, 0xFF, 0x00, // Physical Maximum (255) 0x66, 0x00, 0x00, // Unit (None) 0x75, 0x08, // Report Size (8) 0x95, 0x02, // Report Count (2) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0xC0, // End Collection 0x05, 0x09, // Usage Page (Button) 0x19, 0x01, // Usage Minimum (0x01) 0x29, 0x04, // Usage Maximum (0x04) 0x95, 0x04, // Report Count (4) 0x75, 0x01, // Report Size (1) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0x95, 0x04, // Report Count (4) 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0xC0, // End Collection
该设备的X、Y轴逻辑最大值为255,但实际功能类似方向键:摇杆推向某一方向时发送0或255,默认位置发送127。
核心疑问
- 报告描述符中按钮部分未重新声明逻辑最大值,解析器会不会沿用之前的255?但按钮是1位开关,仅能发送0或1。
- X、Y轴封装在Physical集合中,集合内定义的全局项是否仅在集合内有效?
- 若集合内全局项仅在集合内有效,按钮的逻辑最值缺失,是否存在默认值?尤其是逻辑最大值是否为1?
- USB官方HID文档仅提及部分项(如Physical Maximum)未声明时处于未定义状态,但未找到默认值相关信息。
解答
1. 集合对全局项的作用范围
HID报告描述符的全局项(如Logical Minimum/Logical Maximum、Report Size等)遵循嵌套集合的作用域规则:
- 在子集合(比如这里的Physical集合)内定义的全局项,仅对该集合内部的
Input/Output/Feature条目生效;当遇到End Collection退出子集合后,这些全局项的作用终止,回到外层集合的全局项上下文——如果外层未提前定义对应全局项,则该全局项恢复到“未声明”状态。 - 对应到你的描述符:Physical集合内的
Logical Maximum (255)只作用于X/Y轴的Input项,退出该集合后,这个全局值不会被按钮部分继承。
2. 按钮逻辑最值的默认处理
对于按钮这类Report Size为1的输入,即使未显式声明Logical Minimum和Logical Maximum,HID解析器会根据数据位宽自动推导合理范围:
- 1位数据的物理取值只能是0或1,这是硬件层面的限制,行业内的HID解析器都会默认将这类输入的逻辑最值设为0(最小值)和1(最大值),无需显式声明。
- 你担心的“沿用255”是错误的,因为Physical集合的全局项在退出后已经失效,按钮部分的全局项是重新初始化的状态,不会继承无关的全局设置。
3. 官方文档模糊点的补充
USB HID规范确实没有明确列出所有全局项的默认值,但对于布尔型输入(按钮)这种场景,基于数据位宽的默认逻辑是行业共识——解析器会自动适配1位数据的状态限制,不会套用之前其他输入的全局参数。
内容的提问来源于stack exchange,提问作者MassMover
相关产品推荐
相关产品推荐

