Re: [PATCH 1/3] Input: xpad - fix support for some third-party controllers
From: Lyude Paul <lyude@redhat.com>
Date: 2023-03-23 21:40:12
Hey Dmitry, this patch series seems to have only gotten radio silence as well. What could we do to get this moving? On Fri, 2023-02-24 at 17:21 -0800, Vicki Pfau wrote:
quoted hunk ↗ jump to hunk
Some third-party controllers, such as the HORPIAD FPS for Nintendo Switch and Gamesir-G3w, require a specific packet that the first-party XInput driver sends before it will start sending reports. It's not currently known what this packet does, but since the first-party driver always sends it's unlikely that this could cause issues with existing controllers. Co-authored-by: Andrey Smirnov [off-list ref] Signed-off-by: Vicki Pfau <redacted> --- drivers/input/joystick/xpad.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 403b57e8176b..04af2213407f 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c@@ -265,6 +265,7 @@ static const struct xpad_device { { 0x0f0d, 0x0067, "HORIPAD ONE", 0, XTYPE_XBOXONE }, { 0x0f0d, 0x0078, "Hori Real Arcade Pro V Kai Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE }, { 0x0f0d, 0x00c5, "Hori Fighting Commander ONE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE }, + { 0x0f0d, 0x00dc, "HORIPAD FPS for Nintendo Switch", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, { 0x0f30, 0x010b, "Philips Recoil", 0, XTYPE_XBOX }, { 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX }, { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },@@ -2020,6 +2021,27 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id goto err_free_in_urb; } + if (xpad->xtype == XTYPE_XBOX360) { + /* Some third-party controllers Xbox 360-style controllers + * require this message to finish initialization */ + uint8_t dummy[20]; + int ret; + + usb_control_msg_recv(udev, 0, + /* bRequest */ 0x01, + /* bmRequestType */ + USB_TYPE_VENDOR | USB_DIR_IN | + USB_RECIP_INTERFACE, + /* wValue */ 0x100, + /* wIndex */ 0x00, + dummy, sizeof(dummy), + 25, + GFP_KERNEL); + if (ret) + dev_warn(&xpad->dev->dev, + "unable to receive magic message: %d\n", ret); + } + ep_irq_in = ep_irq_out = NULL; for (i = 0; i < 2; i++) {
-- Cheers, Lyude Paul (she/her) Software Engineer at Red Hat