Estoy construyendo un adaptador USB para un controlador de juego antiguo. Hasta ahora todo está funcionando bien. Mi descriptor de HID se ve así:
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x05, /* USAGE (Game Pad) */
0xa1, 0x01, /* COLLECTION (Application) */
0xa1, 0x03, /* COLLECTION (Report) */
0x85, 0x01, /* REPORT_ID (1) */
0x05, 0x09, /* USAGE_PAGE (Button) */
0x19, 0x01, /* USAGE_MINIMUM (Button 1) */
0x29, 0x0e, /* USAGE_MAXIMUM (Button 14) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
0x95, 0x0e, /* REPORT_COUNT (14) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0x95, 0x01, /* REPORT_COUNT (1) */
0x75, 0x02, /* REPORT_SIZE (2) */
0x81, 0x03, /* INPUT (Cnst) */
0xa1, 0x00, /* COLLECTION (Physical) */
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x30, /* USAGE (X) */
0x09, 0x31, /* USAGE (Y) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x64, /* LOGICAL_MAXIMUM (100) */
0x75, 0x08, /* REPORT_SIZE (8) */
0x95, 0x02, /* REPORT_COUNT (2) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0xc0, /* END_COLLECTION */
0xc0, /* END_COLLECTION */
0xc0 /* END_COLLECTION */
Ahora quiero agregar soporte para hasta 4 de estos controladores. Si entiendo el HID correctamente, una forma de hacerlo es repetir el descriptor 4 veces, cada vez con un ID de informe diferente. (Sé que probablemente podría tener varias interfaces USB con la clase HID, pero preferiría no hacerlo de esa manera; mi código USB se volvería mucho más complicado).
Cuando intenté esto, Linux se negó a reconocer el dispositivo como un gamepad. El HID
el controlador ( hid-generic
) está cargado y el descriptor parece analizarse correctamente, pero no hay ningún archivo de dispositivo en /dev/input/
.
EDIT:
Probé mi código en Windows 7 y parece que este problema es específico de Linux. Así que estoy reformulando mi pregunta original:
¿Cómo debo modificar mi descriptor de HID para que funcione tanto en Windows como en Linux?
Al conectar el dispositivo, dmesg
informa de esto:
usb 3-6: new low-speed USB device number 8 using xhci_hcd
usb 3-6: ep 0x81 - rounding interval to 64 microframes, ep desc says 80 microframes
input: XYZ Adapter as /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6:1.0/0003:16C0:05DC.0009/input/input20
hid-generic 0003:16C0:05DC.0009: input,hidraw4: USB HID v1.01 Gamepad [XYZ Adapter] on usb-0000:00:14.0-6/input0
Esto es idéntico a lo que dice al conectar la versión de 1 controlador que funciona. El dispositivo aparece en lsusb
, con los ID / descriptores correctos.