2015-03-30 135 views
2

我正在构建一个适配器,通过USB将各种视频游戏控制器连接到PC。它的核心是使用Cortex-M4处理器的Teensy 3.1微控制器。USB:可以在一个接口上定义多个不同的HID操纵杆?

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

  • 接口1,端点1:USB串行端口(调试) - 状态界面
  • 接口1,端点2:USB串行TX/RX接口
  • 接口2,端点3:HID摇杆

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

阅读HID报告描述符规范,我觉得可以在同一接口上定义多个独立设备。然而,尽管我尽了最大的努力,但我似乎无法取消这一点。应用程序(如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个按钮单操纵杆。

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

+0

目标是为多人游戏同时连接多个控制器,还是让一个用户在控制器之间随意切换?看起来在单个控制器情况下,Teensy可以将控制器输入复用到一个16键控制器中。 – 2015-03-31 18:14:14

+1

理想情况下,我想同时连接多个控制器。实际上,一次可能不会超过4个,但例如,你可能有一个使用SNES控制器的玩家和一个使用N64控制器的玩家,并且你希望能够将他们全部插入,并且只需选择一个并使用它。我可能会每次都要在一对夫妇之间切换,但我更愿意将所有连接的控制器始终作为游戏杆呈现。 – Rena 2015-03-31 19:11:34

+0

这是一个很大的问题。我认为最简单的事情就是将几个控制器复用到一个单一的“播放器”中,以便将四个(或更多)“播放器”作为USB端点。只要有控制器上的活动,Teensy就会排队输入报告。 – 2015-03-31 19:17:10

回答

2

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

在Windows中,它应该只是工作。在Linux下,usbhid驱动程序需要使用HID_QUIRK_MULTI_INPUT怪癖加载。

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

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