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