格式说明 - 图1

    这张图详细说明了USB HID设备中主项的二进制编码格式
    主项是报告描述符中用于定义或分组数据字段的核心单元。

    图中清晰地展示了主项的通用结构:

    1. 一字节前缀:每个主项都以一个字节开头。
      一字节前缀的高4位(bTag)指明了主项的标签:

      • 1000:输入项
      • 1001:输出项
      • 1011:特征项
      • 1010:集合项
      • 1100:结束集合项(图中已说明)
    2. 前缀低2位:前缀的低2位(nn)指定了后面跟随的“有效数据”的字节数。这个值可以是0、1、2或4,分别表示有效数据占0、1、2或4个字节。

    3. 有效数据:前缀后面的字节是“有效数据”,它是一个位图,用来定义这个主项所代表的数据字段的详细属性。图中的表格解释了这些位的含义。


    以“输入项 (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:保留位。

    输出项 (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来标记一个集合的结束。