USB:可以在一个接口(interface)上定义多个不同的 HID 操纵杆吗?

标签 usb protocols hid usb-descriptor

我正在构建一个适配器,用于通过 USB 将各种视频游戏 Controller 连接到 PC。它的核心是 Teensy 3.1 微 Controller ,它使用 Cortex-M4 处理器。

M4 能够处理原始 USB 数据包,从而模拟任何类型的 USB 设备。我已成功对其进行编程以呈现复合 USB 设备:

  • 接口(interface)1,端点1:USB串口(调试用)-状态接口(interface)
  • 接口(interface)1,端点2:USB串行TX/RX接口(interface)
  • 接口(interface) 2,端点 3:HID 操纵杆

现在的问题是,我希望能够同时连接几种不同类型的游戏 Controller (例如任天堂和 super 任天堂)。我的适配器总共有超过 15 个端口,这意味着我不能只为每个端口分配一个端点,因为 USB 总共只允许 16 个端点。

阅读 HID 报告描述符规范后,我的印象是可以在同一接口(interface)上定义多个独立设备。然而,尽管我尽了最大努力,但我似乎无法实现这一目标。应用程序(例如 jstest-gtk )只能看到一个巨大的操纵杆。

现在我正在使用这个报告描述符:

static uint8_t joystick_report_desc[] = {
    0x05, 0x01,                     // Usage Page (Generic Desktop)
    0x09, 0x04,                     // Usage (Joystick)
    0xA1, 0x01,                     // Collection (Application)
        0x85, 0x01,                     // Report ID (1)
        0x15, 0x00,                     // Logical Minimum (0)
        0x25, 0x01,                     // Logical Maximum (1)
        0x75, 0x01,                     // Report Size (1)
        0x95, 0x08,                     // Report Count (8)
        0x05, 0x09,                     // Usage Page (Button)
        0x19, 0x01,                     // Usage Minimum (Button #1)
        0x29, 0x08,                     // Usage Maximum (Button #8)
        0x81, 0x02,                     // Input (variable,absolute)
    0xC0,                           // End Collection

    0x05, 0x01,                     // Usage Page (Generic Desktop)
    0x09, 0x04,                     // Usage (Joystick)
    0xA1, 0x01,                     // Collection (Application)
        0x85, 0x02,                     // Report ID (2)
        0x15, 0x00,                     // Logical Minimum (0)
        0x25, 0x01,                     // Logical Maximum (1)
        0x75, 0x01,                     // Report Size (1)
        0x95, 0x10,                     // Report Count (16)
        0x05, 0x09,                     // Usage Page (Button)
        0x19, 0x01,                     // Usage Minimum (Button #1)
        0x29, 0x10,                     // Usage Maximum (Button #16)
        0x81, 0x02,                     // Input (variable,absolute)
    0xC0,                           // End Collection
};

我原本希望能够呈现一个带有 8 个按钮的操纵杆和一个带有 16 个按钮的操纵杆,但应用程序却看到一个带有 24 个按钮的操纵杆。

实际上可以通过这种方式定义多个独立的操纵杆吗?

最佳答案

我最近使用 mbed 实现了一个类似的项目,并且可以确认仅使用您所描述的报告描述符即可定义多个操纵杆。

在 Windows 中,它应该正常工作。对于 Linux,需要使用 HID_QUIRK_MULTI_INPUT 加载 usbhid 驱动程序怪癖。

# rmmod usbhid && modprobe usbhid quirks=0xVID:0xPID:0x40

哪里VID是您的供应商 ID,并且 PID是您的产品 ID。然后它应该在 /dev/input 中显示为多个操纵杆设备。 .

关于USB:可以在一个接口(interface)上定义多个不同的 HID 操纵杆吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358179/

相关文章:

objective-c - 越狱ios中的USB检测

java - 在 Android 和 iOS 中使用的最佳服务器客户端通信协议(protocol)是什么?

swift - 覆盖协议(protocol)定义变量的 setter 并使用协议(protocol)默认实现中的 getter

python :Read from a USB HID device

delphi - 在 64 位应用程序中使用 SetupAPI 枚举 USB HID 设备

c# - USB 连接 "The semaphore timeout period has expired"错误

go - 在 Go 中使用 USB

cocoa - 如何在 OS X 中与 GPIO USB 设备通信?

swift - 符合协议(protocol)但没有任何反应

c# - 如何从软件中捕获准确的 USB-HID 设备交互并在我自己的代码中重新实现它