USB 中的多个顶级 HID 集合...是否可以同时向主机发送 2 个报告?

Multi top-level HID collection in USB... Is it possible to deliver 2 reports to the host simultaneously?

我的 USB 设备有 一个 HID Class 接口。

我目前在报告描述符中定义了 2 个设备:鼠标(报告 ID == 1)和键盘(报告 ID == 2)。

我已将 HID 轮询周期设置为 100 毫秒。

为了让主机知道我正在发送键盘或鼠标数据,我必须在所述数据之前加上报告 ID,如:

//Mouse data for the host
0x01 //report ID for mouse
0x0n //buttons
0xnn //delta X
0xnn //delta y

所以,我面临的情况是,我一次只能向主机更新这些设备中的一个。

我的问题是:有没有办法同时发送两种报告(鼠标和键盘)?

如果不是,您认为将轮询频率加倍并在两个设备之间交替是一个合适的解决方案吗?

总是按顺序报告两个不同的报告,因为它们都使用相同的中断管道来通过。

现在,如果您不需要使用 Boot 协议键盘和鼠标报告,您可以设计一个自定义报告描述符来描述包含鼠标和键盘数据的单个报告。这样,您就可以同步发送两个数据集。

不过,降低轮询间隔会更容易。

示例报告描述符:

 0x05, 0x01,                    // UsagePage (desktop)
 0x09, 0x06,                    // Usage (Keyboard)
 0xa1, 0x01,                    // Collection (Application)
 0x85, 0x01,                    //     ReportID (1)
 0x25, 0x01,                    //     LogicalMaximum (1)
 0x75, 0x01,                    //     ReportSize (1)
 0x95, 0x08,                    //     ReportCount (8)
 0x05, 0x07,                    //     UsagePage (keyboard)
 0x19, 0xe0,                    //     UsageMinimum (LeftControl)
 0x29, 0xe7,                    //     UsageMaximum (RightGui)
 0x81, 0x02,                    //     Input (Variable)
 0x26, 0xdd, 0x00,              //     LogicalMaximum (221)
 0x75, 0x08,                    //     ReportSize (8)
 0x95, 0x06,                    //     ReportCount (6)
 0x19, 0x00,                    //     UsageMinimum (NoEvent)
 0x29, 0xdd,                    //     UsageMaximum (KeypadHexadecimal)
 0x81, 0x00,                    //     Input
 0x25, 0x01,                    //     LogicalMaximum (1)
 0x75, 0x01,                    //     ReportSize (1)
 0x95, 0x03,                    //     ReportCount (3)
 0x05, 0x08,                    //     UsagePage (led)
 0x19, 0x01,                    //     UsageMinimum (NumLock)
 0x29, 0x03,                    //     UsageMaximum (ScrollLock)
 0x91, 0x02,                    //     Output (Variable)
 0x15, 0x81,                    //     LogicalMinimum (-127)
 0x25, 0x7f,                    //     LogicalMaximum (127)
 0x75, 0x08,                    //     ReportSize (8)
 0x95, 0x02,                    //     ReportCount (2)
 0x05, 0x01,                    //     UsagePage (desktop)
 0x09, 0x30,                    //     Usage (X)
 0x09, 0x31,                    //     Usage (Y)
 0x81, 0x04,                    //     Input (Relative)
 0x15, 0x00,                    //     LogicalMinimum (0)
 0x25, 0x01,                    //     LogicalMaximum (1)
 0x75, 0x01,                    //     ReportSize (1)
 0x95, 0x03,                    //     ReportCount (3)
 0x05, 0x09,                    //     UsagePage (button)
 0x19, 0x01,                    //     UsageMinimum (Button(1))
 0x29, 0x03,                    //     UsageMaximum (Button(3))
 0x81, 0x02,                    //     Input (Variable)
 0xc0,                          // EndCollection

这说明:

  • 输入报告 #1 包含:

    Data Byte : [0        ][1 .. 6][7       ][8       ][9         ]
    Data      : [Modifiers][Keys  ][Mouse dx][Mouse dy][Mouse Btns]
    
  • 输出报告 #1 包含:

    Data Byte : [0       ]
    Data      : [Kbd leds]