USB中的多顶级HID收集......是否可以同时向主机提供2个报告?

时间:2017-04-30 13:56:17

标签: usb report mouse hid descriptor

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

我目前在我的报告描述符中定义了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

因此,我面临的情况是,我一次只能更新主机中的一台设备。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

但是,轮询间隔较低会更容易。

示例报告描述符:

 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]