O controlador Xbox One com fios não funciona

1

Estou tentando fazer com que o meu controlador PDP xbox one funcione (Kernel 4.16.13), mas ele não está nem ligando (a luz de energia está apagada). Ele está sendo reconhecido com o lsusb, ele ainda tem o fabricante e o produto certos, mas não responde a mais nada. Eu sei que houve problemas com controladores pdp e linux no passado, mas eu li que esses problemas foram corrigidos em 4.15 ( ). Eu brinquei com um monte de xboxdrv e xpad, mas não tenho mais ideia do que fazer. alguma idéia?

Aqui estão os descritores lsusb para ele, mas eu sou novo no linux e não posso fazer cara ou coroa dele, então não sei se é relevante.

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)
    
por Starazer 01.06.2018 / 09:33

1 resposta

0

O mesmo tipo de problema aqui e eu encontrei uma solução alternativa. inclui uma reconstrução do xpad.c com pequenas modificações. Não sou especialista em linux, portanto, uma solução melhor pode existir.

O problema vem do fato de que este gamepad precisa de um pacote de inicialização para começar a enviar entradas. Esse comportamento está presente no xpad do driver, mas não é enviado para o controlador porque ele possui o ID do produto errado.

Se olharmos para a lista de dispositivos em xpad.c, podemos encontrar:

...
{ 0x0e6f, 0x02a4, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
...

a sua é "02a9" e eu tenho outra variante "02a6".

Mesmo que o driver do xpad seja capaz de se ligar a este dispositivo, o código que verifica se o pacote de handshake deve ser enviado tem como alvo o produto "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),
    ...
};

Então, a partir daí, modifiquei o xpad.c para enviar esses pacotes init para o ID do produto do meu controlador

código original: link

Eu adicionei meu produto à lista de dispositivos:

...
{ 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 },
...

com MY_PRODUCT_ID = 0x02a6, o seu é 0x02a9

e modificou a linha de estrutura 525 para enviar os pacotes init para este id de produto:

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),
};

Para criar e instalar o módulo, segui as instruções (e usei o makefile) no link

    
por TDk b206 17.07.2018 / 21:58