简介:《USB HID Usage Tables 1.3》是USB Implementers' Forum于2022年发布的HID使用表规范文档,面向USB设备开发者、硬件工程师、驱动程序员与系统集成商,用于解决HID设备功能元素标准化定义与跨平台互操作问题。压缩包内为1个PDF文件,约4.09MB,完整收录规范正文、贡献者名单与修订历史,便于离线查阅与团队共享。文档系统定义了Usage ID分类、Usage Page上下文、Report Descriptor结构、设备类行为要求及协议传输方式,并涵盖通用控制、桌面设备、游戏设备、消费设备、模拟设备等类别,同时说明向后兼容策略。1.3版整合了HUT审查请求101至107及显示器控制、开放街机架构、POS、电源设备等多个规范中的用法,由微软、英特尔、谷歌、苹果、罗技等公司专家参与制定,权威性较高。已有560人学习,适合需要对照标准设计报告描述符、排查兼容性问题或构建符合规范的HID设备的读者参考。
1. 到底什么是 HID Usage Tables:从一个“插上就能用”的困惑说起
你有没有想过一个问题:一个几十块钱的杂牌鼠标,插到电脑上,不用装任何驱动,光标就能动、左右键就能点。而同样是 USB 设备,插一个陌生的工业采集卡上去,系统却一脸茫然。差别在哪?答案就藏在一份叫USB HID Usage Tables的文档里,最新版本是 1.3。
通俗地说,它是一本“设备功能词典”。USB 组织规定,凡是自称 HID(人机交互设备)的东西,都得用一套公共的编号来说话——键盘上那个键是“A”,鼠标左键是“按钮 1”,摇杆的 X 轴是“X”。这份表就是把这些编号和含义一一对应起来的权威清单。搞懂它,你就明白为什么有些设备即插即用,有些却要折腾半天。
2. 为什么需要这本“词典”:HID 设备靠编号对话
2.1 没有标准表,每个设备都得自带翻译
先想象一个没有普通话的世界:每个地方的人说自己方言,见面就得带翻译。早期的输入设备就是这样,每个厂商用自己的私有格式上报数据,操作系统要为每一款设备写专门的解析逻辑,设备一多,驱动就成了泥潭。
HID Usage Tables 解决的就是这个“方言问题”。它规定了一套公共编号体系,任何厂商只要按表上报,操作系统就能读懂。打个比方,它像快递面单上的标准字段:收件人、电话、地址,字段名固定,谁填都一样,分拣系统才不用为每家快递公司单独开发一套识别程序。
这份文档从 1996 年一路修订到 2022 年,1.3 版在 2022 年 1 月发布,把多年积累的审查请求、显示器控制、街机设备、POS 设备、电源设备等零散规范统一收了进来。修订历史里那一长串版本号,本质上是行业不断往这本词典里“补词条”的过程。
2.2 Usage Page 和 Usage ID:先分卷,再查词
这本词典不是一页纸,而是分卷的。Usage Page是“卷”,Usage ID是卷里的“词条”。两者组合,才能唯一确定一个功能。
比如键盘按键在“Keyboard/Keypad Page(0x07)”里,鼠标按钮在“Button Page(0x09)”里,游戏手柄的摇杆在“Generic Desktop Page(0x01)”里。同一个编号在不同页里含义完全不同,所以永远要“页号 + 编号”一起看。
用一段简化的描述符片段感受一下这个结构:
// 简化示意:声明一个来自 Generic Desktop 页的 X 轴 0x05, 0x01, // Usage Page (Generic Desktop) 选卷:通用桌面页 0x09, 0x30, // Usage (X) 选词:X 轴 0x15, 0x81, // Logical Minimum (-127) 数值下限 0x25, 0x7F, // Logical Maximum (127) 数值上限 0x75, 0x08, // Report Size (8) 每个字段 8 位 0x95, 0x01, // Report Count (1) 一个字段 0x81, 0x06 // Input (Data,Var,Rel) 作为输入数据上报这段配置的意思是:我要上报一个 X 轴,取值范围 -127 到 127,占 8 位。操作系统看到0x05 0x01加0x09 0x30,立刻知道“这是鼠标或摇杆的横向位移”,不需要认识具体是哪家厂商。参数里0x15/0x25定范围,0x75/0x95定数据宽度和个数,0x81定这个字段是输入还是输出。改任何一个,设备的行为都会跟着变。
2.3 它和 Report Descriptor 是“词表”与“语法”的关系
很多人第一次接触会把这俩混为一谈。Usage Tables 是词表,告诉你“0x30 代表 X 轴”;Report Descriptor 是语法,告诉系统“这个 X 轴占几位、范围多大、是相对还是绝对”。词表管“叫什么”,描述符管“怎么排”。
打个比方,词表是字典,描述符是造句规则。光有字典造不出句子,光有规则没有词也写不出内容。设备固件里两者配合,操作系统才能把一串二进制字节还原成“鼠标向右移动了 5 个单位”。
3. 常见误区:这几个概念最容易搞混
3.1 误区一:Usage ID 是全局唯一的
易混点:以为看到编号 0x30 就一定是 X 轴。为什么混:文档里编号反复出现,翻表时容易只看数字不看页。怎么区分:编号只在所属 Usage Page 内有效。0x30 在 Generic Desktop 页是 X 轴,换到别的页可能完全是另一回事。判断任何功能,先确认页号,再查编号,两步缺一不可。
3.2 误区二:HID 只能做键盘鼠标
易混点:把 HID 等同于“输入设备”。为什么混:日常接触的 HID 设备几乎都是键鼠。怎么区分:HID 是一套通用的数据上报机制,键盘鼠标只是最典型的用法。1.3 版覆盖的范围包括游戏控制器、VR 控制、运动器械、电话设备、POS 设备、电源控制、显示器控制等。只要功能能在词表里找到对应词条,就能用 HID 上报。
3.3 误区三:新版本会推翻旧设备
易混点:担心升级到 1.3 后老设备不认。为什么混:软件升级常带来不兼容,容易类推。怎么区分:这份表的设计原则是向后兼容,新版本主要是“加词条”和“修错”,不是“改词义”。老设备按旧词条上报,新系统照样能解析。文档里专门有“处理未知用法”的约定,遇到不认识的编号,系统应安全忽略而不是报错,这正是兼容性的兜底。
3.4 误区四:Usage 和 Unit 是一回事
易混点:看到文档里既有 Usage 又有 Unit,觉得重复。为什么混:两者都跟“这个数据代表什么”有关。怎么区分:Usage 回答“这是什么功能”,Unit 回答“这个数值用什么物理单位衡量”。比如一个 Usage 是“温度”,Unit 才告诉你读数是摄氏度还是华氏度。功能靠词表定位,量纲靠单位定义,各管一层。
4. 词表里到底装了什么:从按键到 VR 的完整地图
4.1 页的划分逻辑:按设备领域分卷
整份文档按 Usage Page 组织,每一页对应一个设备领域。Generic Desktop 页放通用桌面控制,比如指针、滚轮、系统电源键;Simulation Controls 页放飞行、汽车、坦克、船舶等模拟设备;VR 页放虚拟现实控制;Game Controls 页放游戏手柄、街机、光枪;Keyboard/Keypad 页放全部按键;LED 页放指示灯;Telephony 页放电话和通话控制。
这种划分的好处是“就近查词”。做手柄的人翻 Game Controls 页,做键盘的人翻 Keyboard 页,互不干扰。页号本身也是编号,0x01 是通用桌面,0x07 是键盘,0x09 是按钮,记住几个常用页号,查表效率会高很多。
4.2 用法类型:同一个词条还有“性格”
文档给每个词条标注了用法类型,这是很多人忽略但很关键的一层。控制类里有线性控制(LC,连续可调)、开关控制(OOC,开或关)、瞬态控制(MC,按住生效)、单次触发(OSC)、重复触发(RTC);数据类里有选择器(Sel)、静态值(SV)、静态标志(SF)、动态标志(DF)、动态值(DV);集合类里有命名数组(NAry)、应用集合(CA)、逻辑集合(CL)、物理集合(CP)等。
通俗地说,这相当于给词条标了“词性”。同样是“按钮”,瞬态控制和开关控制的语义不同:前者松手就复位,后者按一下切换状态。设备固件如果标错类型,系统行为就会怪——比如一个本该“按住才生效”的键变成了“按一下锁死”,用户会觉得这设备有毛病。这类翻车在自研 HID 设备里并不少见。
4.3 集合与嵌套:把一堆数据打包成一个“设备”
HID 允许用集合把多个字段组织成一个逻辑整体。应用集合(CA)通常代表一个完整设备,比如一个鼠标;逻辑集合(CL)把相关字段归组,比如把 X、Y、滚轮归为“指针”;物理集合(CP)对应真实物理部件,比如一个多轴摇杆的每个轴。
这个机制的价值在于“结构化”。没有集合,系统只看到一串散装字节;有了集合,系统知道“这几个字节属于同一个指针”“那几个属于同一个按键面板”。做复合设备(一个接收器同时带键盘和鼠标)时,集合就是区分不同逻辑设备的边界。
4.4 版本 1.3 新增了什么:把散落的规范收编
1.3 版的修订说明写得很直白:把多份审查请求,以及显示器控制类规范、开放式街机设备数据格式、POS 设备用法表、电源设备用法表、物理接口设备类定义中的用法,统一并入。这意味着此前散落在多份文档里的词条,现在有了一个集中出处。
对开发者来说,好处是查表不用再跨文档拼凑。比如做带屏幕控制的设备、做零售终端外设、做带电源管理按键的设备,以前要翻好几份材料,现在一份表覆盖。版本号从 1.0 到 1.3 的演进,本质是这份公共词典越来越全。
5. 什么时候该翻这份表,什么时候别硬套
先说该用的场景。你在做任何需要“被操作系统当成人机交互设备识别”的硬件,这份表就是必查项:自定义键盘、宏键盘、游戏手柄、VR 手柄、带按键的采集设备、带指示灯的终端、触摸与笔输入设备。它的价值在于让你用“公共词”说话,而不是自造私有协议。自造协议的代价是每个平台都要单独适配,而按词表上报,跨系统识别的成本会低很多。
再说别硬套的场景。如果你的设备核心功能根本不在词表覆盖范围内,比如高速数据采集、大容量存储、网络通信,那它本来就不该走 HID 这条路,硬塞进词表只会让描述符臃肿、带宽受限。还有一种情况是功能极简且封闭:设备只在自己的一套软硬件里用,从不接通用系统,那私有格式反而更省事。判断标准很简单——是否需要被不认识你的系统识别。需要,就查表;不需要,就别为了“标准”而标准。
下面这张表可以帮你快速判断:
| 场景 | 建议 | 原因 |
|---|---|---|
| 自定义键盘、宏键盘 | 查表,用 Keyboard/Keypad 页 | 按键语义有公共词条 |
| 游戏手柄、VR 手柄 | 查表,用 Game/VR 页 | 轴和按钮有标准定义 |
| 带按键的工业面板 | 查表,用 Button 页 | 按钮编号可直接复用 |
| 高速数据采集卡 | 不走 HID | 带宽和实时性不适合 |
| 纯私有封闭外设 | 可不查表 | 无需被通用系统识别 |
我自己的习惯是:每次动手写描述符之前,先把要用到的功能在词表里逐个确认页号和编号,确认不了的就先停下来想清楚是不是选错了上报方式。有一次图省事跳过了这一步,结果一个“按住生效”的键被标成了开关类型,测试时表现为按一下锁死、再按才松开,排查了半天才回到词表里找到用法类型那一栏。从那以后我每次定功能都强制走一遍“页号—编号—用法类型”三查,省下的返工时间远比查表花的多。
这份 1.3 版文档把二十多年的词条积累和多次修订收在一处,适合放在手边当工具书。需要完整资料的话,按文末方式获取即可。希望帮到你。
本文还有配套的精品资源,点击获取