Я пытался заставить свой Xbox PDP один контроллер работать (Ядро 4.16.13), но это даже не включает (Свет питания выключен). Это распознается с lsusb, это даже имеет правильного производителя и продукт, но не отвечает ни на что больше. Я знаю, что были проблемы с pdp контроллерами и Linux в прошлом, но я считал, что эти проблемы были решены в 4,15 (https://www.phoronix.com/scan.php? page=news_item&px=PDP-Xbox-One-Linux-4.15). Я играл вокруг набора с xboxdrv и xpad, но я понятия не имею, что больше делать. какие-либо идеи?
Вот lsusb дескрипторы для него, но я являюсь совершенно новым к Linux и не могу понять его так, я не знаю, релевантно ли это.
Bus 001 Device 002: ID 0e6f:02a9 Logic3 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 255 Vendor Specific Class bDeviceSubClass 71 bDeviceProtocol 208 bMaxPacketSize0 64 idVendor 0x0e6f Logic3 idProduct 0x02a9 bcdDevice 1.0e iManufacturer 1 Performance Designed Products iProduct 2 PDP Wired Controller for Xbox One - Midnight Blue iSerial 3 0000AFA7AFE41F1D bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 64 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xa0 (Bus Powered) Remote Wakeup MaxPower 500mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 71 bInterfaceProtocol 208 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 4 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 4 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 71 bInterfaceProtocol 208 iInterface 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 1 bNumEndpoints 2 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 71 bInterfaceProtocol 208 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x00e0 1x 224 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0080 1x 128 bytes bInterval 1 Device Status: 0x0000 (Bus Powered)
Тот же вид проблемы здесь и я нашел обходное решение. это включает восстанавливание xpad.c с небольшими модификациями. Я не эксперт в Linux, таким образом, лучшее решение может существовать.
Проблема возникает из того, что этому игровому планшету нужен пакет инициализации, чтобы начать отправлять исходные данные. Это поведение присутствует в драйвере xpad, но не отправляют к контроллеру, потому что это имеет неправильный идентификатор продукта.
Если мы смотрим на список устройств в xpad.c, мы можем найденный:
...
{ 0x0e6f, 0x02a4, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
...
Ваш - "02a9", и у меня есть другой вариант "02a6".
Даже если xpad драйвер сможет связать с этим устройством, код, проверяющий, должен ли пакет квитирования быть отправлен, предназначается для продукта "02a4":
/*
* This specifies the selection of init packets that a gamepad
* will be sent on init *and* the order in which they will be
* sent. The correct sequence number will be added when the
* packet is going to be sent.
*/
static const struct xboxone_init_packet xboxone_init_packets[] = {
...
XBOXONE_INIT_PKT(0x0e6f, 0x02a4, xboxone_pdp_init1),
XBOXONE_INIT_PKT(0x0e6f, 0x02a4, xboxone_pdp_init2),
...
};
Таким образом, оттуда я изменил xpad.c для отправки тех init пакетов в идентификатор продукта моего контроллера
исходный код: https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c
Я добавил свой продукт к списку устройств:
...
{ 0x0e6f, 0x02a4, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
{ 0x0e6f, MY_PRODUCT_ID, "PDP Wired Controller for Xbox One - mine", 0, XTYPE_XBOXONE },
...
с MY_PRODUCT_ID = 0x02a6, Ваш 0x02a9
и измененный строка структуры 525 для отправки init пакетов в этот идентификатор продукта:
static const struct xboxone_init_packet xboxone_init_packets[] = {
XBOXONE_INIT_PKT(0x0e6f, 0x0165, xboxone_hori_init),
XBOXONE_INIT_PKT(0x0f0d, 0x0067, xboxone_hori_init),
XBOXONE_INIT_PKT(0x0000, 0x0000, xboxone_fw2015_init),
XBOXONE_INIT_PKT(0x0e6f, 0x02ab, xboxone_pdp_init1),
XBOXONE_INIT_PKT(0x0e6f, 0x02ab, xboxone_pdp_init2),
XBOXONE_INIT_PKT(0x0e6f, 0x02a4, xboxone_pdp_init1),
XBOXONE_INIT_PKT(0x0e6f, 0x02a4, xboxone_pdp_init2),
XBOXONE_INIT_PKT(0x0e6f, MY_PRODUCT_ID, xboxone_pdp_init1),
XBOXONE_INIT_PKT(0x0e6f, MY_PRODUCT_ID, xboxone_pdp_init2),
XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumblebegin_init),
XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumblebegin_init),
XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumblebegin_init),
XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumbleend_init),
XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumbleend_init),
XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumbleend_init),
};
Чтобы создать и установить модуль, я следовал инструкциям (и использовал make-файл) от https://github.com/brianguertin/xpad