
这张图详细说明了USB HID设备中主项的二进制编码格式。
主项是报告描述符中用于定义或分组数据字段的核心单元。
图中清晰地展示了主项的通用结构:
一字节前缀:每个主项都以一个字节开头。
一字节前缀的高4位(bTag)指明了主项的标签:1000:输入项1001:输出项1011:特征项1010:集合项1100:结束集合项(图中已说明)
前缀低2位:前缀的低2位(
nn)指定了后面跟随的“有效数据”的字节数。这个值可以是0、1、2或4,分别表示有效数据占0、1、2或4个字节。有效数据:前缀后面的字节是“有效数据”,它是一个位图,用来定义这个主项所代表的数据字段的详细属性。图中的表格解释了这些位的含义。
以“输入项 (Input)”为例,它的完整格式如下:
- 前缀:
1000 00 nn - 有效数据:紧随前缀的
nn(b)个字节。图中的表格解释了这nn(b)个字节中每一位的含义:- Bit 0:数据/常数。
0= 数据,1= 常数。 - Bit 1:数组/变量。
0= 数组,1= 变量。 - Bit 2:绝对/相对。
0= 绝对坐标,1= 相对坐标。 - Bit 3:无卷绕/卷绕。
0= 无卷绕,1= 卷绕。 - Bit 4:线性/非线性。
0= 线性,1= 非线性。 - Bit 5:首选状态/无首选状态。
0= 首选状态,1= 无首选状态。 - Bit 6:无空位置/空位置。
0= 无空位置,1= 空位置。 - Bit 7:保留位。
- Bit 8:位域/缓冲区。
0= 位域,1= 缓冲区。 - Bit 31-9:保留位。
- Bit 0:数据/常数。
输出项 (Output) 和特征项 (Feature) 的前缀和数据位定义与输入项类似,但它们的有效数据位中,Bit 0 和 Bit 4 有特殊的用途,图中用特定标注(如Vol/Arr等)做了区分。
集合项 (Collection) 的有效数据是1个字节,用来指定集合的类型,如图中所示:
前缀字节 0xA1 后面的那1个字节数据,就对应图中表格的第三、四列。它定义了这是一个什么性质的集合。
0x00- 物理集合 (Physical):将代表物理上相关联的多个数据项组合在一起。最常见的是将多个轴(如游戏杆的X轴、Y轴、Z轴、油门)组合起来,表示一个单一的物理控制设备。0x01- 应用集合 (Application):定义设备的功能类别或用途。这是最常用的集合类型,用于向操作系统声明“这是一个什么设备”。- 示例:
0x01后面如果跟着鼠标相关的数据项(按键、移动),操作系统就知道这是一个鼠标;如果跟着键盘相关的数据项,就知道是键盘。
- 示例:
0x02- 逻辑集合 (Logical):将逻辑上相关联的数据项组合在一起,这些数据共同描述一个状态或实体。- 示例:一个数据项表示“按下Alt键”,另一个表示“按下Ctrl键”,将它们放在一个逻辑集合中,可以共同表示“Ctrl+Alt”这个组合键状态。
0x03- 报告集合 (Report):将一个完整的报告(即一组在主机和设备间一次性传输的数据包)定义为一个集合。在较新的HID规范中较少独立使用。0x04- 命名数组集合 (Named Array):用于定义一组具有相同用途但不同索引的数据项。- 示例:键盘上的一排功能键 (F1-F12),它们用途相同(都是功能键),但索引不同。
0x05- 用法开关集合 (Usage Switch): 用于更高级的用途切换功能,相对少见。0x06- 用法修饰符集合 (Usage Modifier):用于更高级的修饰功能,相对少见。0x07-0x7F- 保留 (Reserved):为未来的HID规范扩展预留。0x80-0xFF- 供应商定义 (Vendor-defined):设备制造商可以自定义集合类型,用于特定功能,通常需要配套的专用驱动程序才能识别。
结束集合项 (End Collection) 没有有效数据(nn=00),它只用一个字节前缀1100 00 00来标记一个集合的结束。
