1

I've been trying to get my PDP xbox one controller to work (Kernel 4.16.13) but it isn't even turning on (The power light is off) . It is being recognized with lsusb, it even has the right manufacturer and product, but doesn't respond to anything else. I know that there have been problems with pdp controllers and linux in the past but I read that these problems were fixed in 4.15 (https://www.phoronix.com/scan.php?page=news_item&px=PDP-Xbox-One-Linux-4.15). I've played around a bunch with xboxdrv and xpad but I have no idea what to do anymore. any ideas?

Here's the lsusb descriptors for it but im brand new to linux and can't make heads or tails of it so I don't know if it's relevant.

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)
0

Same kind of problem here and I found a workaround. it includes a rebuild of xpad.c with slight modifications. I'm not an expert in linux so a better solution may exist.

The problem come from the fact that this gamepad needs a initialisation packet to start sending inputs. This behavior is present in the driver xpad but not send to the controller because it have the wrong product id.

If we look at the device list in xpad.c we can found :

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

yours is "02a9" and I have another variant "02a6".

Even if the xpad driver is able to bind to this device, the code checking if the handshake packet should be sent is targeting the product "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),
    ...
};

So from there I modified the xpad.c to send those init packets to the product id of my controller

original code : https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c

I added my product to the device list:

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

with MY_PRODUCT_ID = 0x02a6, your is 0x02a9

and modified the struct line 525 to send the init packets to this product id:

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

To build and install the module I followed the instructions (and used the makefile) from https://github.com/brianguertin/xpad

Your Answer

By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.