我正在构建一个适配器,通过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个按钮单操纵杆。
实际上可以通过这种方式定义多个独立的游戏杆吗?
目标是为多人游戏同时连接多个控制器,还是让一个用户在控制器之间随意切换?看起来在单个控制器情况下,Teensy可以将控制器输入复用到一个16键控制器中。 – 2015-03-31 18:14:14
理想情况下,我想同时连接多个控制器。实际上,一次可能不会超过4个,但例如,你可能有一个使用SNES控制器的玩家和一个使用N64控制器的玩家,并且你希望能够将他们全部插入,并且只需选择一个并使用它。我可能会每次都要在一对夫妇之间切换,但我更愿意将所有连接的控制器始终作为游戏杆呈现。 – Rena 2015-03-31 19:11:34
这是一个很大的问题。我认为最简单的事情就是将几个控制器复用到一个单一的“播放器”中,以便将四个(或更多)“播放器”作为USB端点。只要有控制器上的活动,Teensy就会排队输入报告。 – 2015-03-31 19:17:10