Я создаю адаптер для подключения различных контроллеров видеоигр к ПК через USB. Сердце его - микроконтроллер Teensy 3.1, в котором используется процессор Cortex-M4.
M4 может работать с необработанными USB-пакетами и, таким образом, имитировать любой тип USB-устройства. Я успешно запрограммировал его для представления составного USB-устройства:
- Интерфейс 1, конечная точка 1: последовательный порт USB (для отладки) - интерфейс состояния
- Интерфейс 1, конечная точка 2: последовательный интерфейс USB TX / RX
- Интерфейс 2, конечная точка 3: джойстик HID
Теперь проблема в том, что я хочу иметь возможность одновременно подключать несколько разных типов игровых контроллеров (например, Nintendo и Super Nintendo). Всего у моего адаптера более 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 кнопками.
Можно ли таким образом определить несколько независимых джойстиков?