You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:50:28