Проводной контроллер Xbox One не будет работать

Я пытался заставить свой 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)
1
задан 1 June 2018 в 13:39

1 ответ

Тот же вид проблемы здесь и я нашел обходное решение. это включает восстанавливание 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

0
ответ дан 8 December 2019 в 00:47

Другие вопросы по тегам:

Похожие вопросы: