* [PATCH 0/4] Input: xpad - More Xbox One improvements
@ 2025-05-13 22:53 Vicki Pfau
2025-05-13 22:53 ` [PATCH 1/4] Input: xpad - Allow delaying init packets Vicki Pfau
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Vicki Pfau @ 2025-05-13 22:53 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input; +Cc: Vicki Pfau
This patchset adds support for several more controllers but also adds a bit
more "correctness" to the initialization flow, and a quirk on waiting until
the announce packet for some wireless controllers that delay the init flow.
I have a WIP new driver with a proper initialization flow based on the
recently released documentation, so hopefully this will be the last needed
patch that adds piecemeal per-controller fixes like this.
Pierre-Loup A. Griffais (1):
Input: xpad - Add the ByoWave Proteus controller
Vicki Pfau (3):
Input: xpad - Allow delaying init packets
Input: xpad - Send LED and auth done packets to all Xbox One
controllers
Input: xpad - Add more controllers
drivers/input/joystick/xpad.c | 57 +++++++++++++++++++++++++++--------
1 file changed, 44 insertions(+), 13 deletions(-)
--
2.49.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/4] Input: xpad - Allow delaying init packets
2025-05-13 22:53 [PATCH 0/4] Input: xpad - More Xbox One improvements Vicki Pfau
@ 2025-05-13 22:53 ` Vicki Pfau
2025-05-13 22:54 ` [PATCH 2/4] Input: xpad - Add the ByoWave Proteus controller Vicki Pfau
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Vicki Pfau @ 2025-05-13 22:53 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input; +Cc: Vicki Pfau
Some Xbox One controllers will only start processing the init packets after
sending the GIP announce packet. While most controllers send this packet
immediately, others will delay for some time, e.g. if a dongle needs to connect
to an actual controller first. In those cases, we want to delay until we
receive the announce packet before sending the init sequence.
Signed-off-by: Vicki Pfau <vi@endrift.com>
---
drivers/input/joystick/xpad.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index 57a5ff3d1992..3eaf79cbe262 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -105,6 +105,8 @@
#define PKT_XBE2_FW_5_EARLY 3
#define PKT_XBE2_FW_5_11 4
+#define FLAG_DELAY_INIT BIT(0)
+
static bool dpad_to_buttons;
module_param(dpad_to_buttons, bool, S_IRUGO);
MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads");
@@ -127,6 +129,7 @@ static const struct xpad_device {
char *name;
u8 mapping;
u8 xtype;
+ u8 flags;
} xpad_device[] = {
/* Please keep this list sorted by vendor and product ID. */
{ 0x0079, 0x18d4, "GPD Win 2 X-Box Controller", 0, XTYPE_XBOX360 },
@@ -596,6 +599,7 @@ struct xboxone_init_packet {
* - https://github.com/medusalix/xone/blob/master/bus/protocol.c
*/
#define GIP_CMD_ACK 0x01
+#define GIP_CMD_ANNOUNCE 0x02
#define GIP_CMD_IDENTIFY 0x04
#define GIP_CMD_POWER 0x05
#define GIP_CMD_AUTHENTICATE 0x06
@@ -785,10 +789,13 @@ struct usb_xpad {
const char *name; /* name of the device */
struct work_struct work; /* init/remove device from callback */
time64_t mode_btn_down_ts;
+ bool delay_init; /* init packets should be delayed */
+ bool delayed_init_done;
};
static int xpad_init_input(struct usb_xpad *xpad);
static void xpad_deinit_input(struct usb_xpad *xpad);
+static int xpad_start_input(struct usb_xpad *xpad);
static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num);
static void xpad360w_poweroff_controller(struct usb_xpad *xpad);
@@ -1073,6 +1080,17 @@ static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char
do_sync = true;
}
+ } else if (data[0] == GIP_CMD_ANNOUNCE) {
+ int error;
+
+ if (xpad->delay_init && !xpad->delayed_init_done) {
+ xpad->delayed_init_done = true;
+ error = xpad_start_input(xpad);
+ if (error)
+ dev_warn(&xpad->dev->dev,
+ "unable to start delayed input: %d\n",
+ error);
+ }
} else if (data[0] == GIP_CMD_INPUT) { /* The main valid packet type for inputs */
/* menu/view buttons */
input_report_key(dev, BTN_START, data[4] & BIT(2));
@@ -1251,6 +1269,14 @@ static bool xpad_prepare_next_init_packet(struct usb_xpad *xpad)
if (xpad->xtype != XTYPE_XBOXONE)
return false;
+ /*
+ * Some dongles will discard init packets if they're sent before the
+ * controller connects. In these cases, we need to wait until we get
+ * an announce packet from them to send the init packet sequence.
+ */
+ if (xpad->delay_init && !xpad->delayed_init_done)
+ return false;
+
/* Perform initialization sequence for Xbox One pads that require it */
while (xpad->init_seq < ARRAY_SIZE(xboxone_init_packets)) {
init_packet = &xboxone_init_packets[xpad->init_seq++];
@@ -2066,6 +2092,9 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
xpad->mapping = xpad_device[i].mapping;
xpad->xtype = xpad_device[i].xtype;
xpad->name = xpad_device[i].name;
+ if (xpad_device[i].flags & FLAG_DELAY_INIT)
+ xpad->delay_init = true;
+
xpad->packet_type = PKT_XB;
INIT_WORK(&xpad->work, xpad_presence_work);
@@ -2265,6 +2294,7 @@ static int xpad_resume(struct usb_interface *intf)
struct usb_xpad *xpad = usb_get_intfdata(intf);
struct input_dev *input = xpad->dev;
+ xpad->delayed_init_done = false;
if (xpad->xtype == XTYPE_XBOX360W)
return xpad360w_start_input(xpad);
--
2.49.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/4] Input: xpad - Add the ByoWave Proteus controller
2025-05-13 22:53 [PATCH 0/4] Input: xpad - More Xbox One improvements Vicki Pfau
2025-05-13 22:53 ` [PATCH 1/4] Input: xpad - Allow delaying init packets Vicki Pfau
@ 2025-05-13 22:54 ` Vicki Pfau
2025-05-13 22:54 ` [PATCH 3/4] Input: xpad - Send LED and auth done packets to all Xbox One controllers Vicki Pfau
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Vicki Pfau @ 2025-05-13 22:54 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input; +Cc: Pierre-Loup A. Griffais, Vicki Pfau
From: "Pierre-Loup A. Griffais" <pgriffais@valvesoftware.com>
Signed-off-by: Pierre-Loup A. Griffais <pgriffais@valvesoftware.com>
Signed-off-by: Vicki Pfau <vi@endrift.com>
---
drivers/input/joystick/xpad.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index 3eaf79cbe262..e57157726089 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -416,6 +416,7 @@ static const struct xpad_device {
{ 0x3285, 0x0663, "Nacon Evol-X", 0, XTYPE_XBOXONE },
{ 0x3537, 0x1004, "GameSir T4 Kaleid", 0, XTYPE_XBOX360 },
{ 0x3537, 0x1010, "GameSir G7 SE", 0, XTYPE_XBOXONE },
+ { 0x366c, 0x0005, "ByoWave Proteus Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE, FLAG_DELAY_INIT },
{ 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX },
{ 0x413d, 0x2104, "Black Shark Green Ghost Gamepad", 0, XTYPE_XBOX360 },
{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
@@ -571,6 +572,7 @@ static const struct usb_device_id xpad_table[] = {
XPAD_XBOXONE_VENDOR(0x3285), /* Nacon Evol-X */
XPAD_XBOX360_VENDOR(0x3537), /* GameSir Controllers */
XPAD_XBOXONE_VENDOR(0x3537), /* GameSir Controllers */
+ XPAD_XBOXONE_VENDOR(0x366c), /* ByoWave controllers */
XPAD_XBOX360_VENDOR(0x413d), /* Black Shark Green Ghost Controller */
{ }
};
--
2.49.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/4] Input: xpad - Send LED and auth done packets to all Xbox One controllers
2025-05-13 22:53 [PATCH 0/4] Input: xpad - More Xbox One improvements Vicki Pfau
2025-05-13 22:53 ` [PATCH 1/4] Input: xpad - Allow delaying init packets Vicki Pfau
2025-05-13 22:54 ` [PATCH 2/4] Input: xpad - Add the ByoWave Proteus controller Vicki Pfau
@ 2025-05-13 22:54 ` Vicki Pfau
2025-05-13 22:54 ` [PATCH 4/4] Input: xpad - Add more controllers Vicki Pfau
2025-05-17 1:17 ` [PATCH 0/4] Input: xpad - More Xbox One improvements Dmitry Torokhov
4 siblings, 0 replies; 7+ messages in thread
From: Vicki Pfau @ 2025-05-13 22:54 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input; +Cc: Vicki Pfau
This mirrors what SDL does, and is closer to Windows's behavior as-is.
Signed-off-by: Vicki Pfau <vi@endrift.com>
---
drivers/input/joystick/xpad.c | 21 ++++++++-------------
1 file changed, 8 insertions(+), 13 deletions(-)
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index e57157726089..7746530da030 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -676,20 +676,19 @@ static const u8 xboxone_hori_ack_id[] = {
};
/*
- * This packet is required for most (all?) of the PDP pads to start
- * sending input reports. These pads include: (0x0e6f:0x02ab),
- * (0x0e6f:0x02a4), (0x0e6f:0x02a6).
+ * This packet is sent by default on Windows, and is required for some pads to
+ * start sending input reports, including most (all?) of the PDP. These pads
+ * include: (0x0e6f:0x02ab), (0x0e6f:0x02a4), (0x0e6f:0x02a6).
*/
-static const u8 xboxone_pdp_led_on[] = {
- GIP_CMD_LED, GIP_OPT_INTERNAL, GIP_SEQ0, GIP_PL_LEN(3), 0x00, GIP_LED_ON, 0x14
-};
+static const u8 xboxone_led_on[] = { GIP_CMD_LED, GIP_OPT_INTERNAL, GIP_SEQ0,
+GIP_PL_LEN(3), 0x00, GIP_LED_ON, 0x14 };
/*
* This packet is required for most (all?) of the PDP pads to start
* sending input reports. These pads include: (0x0e6f:0x02ab),
* (0x0e6f:0x02a4), (0x0e6f:0x02a6).
*/
-static const u8 xboxone_pdp_auth[] = {
+static const u8 xboxone_auth_done[] = {
GIP_CMD_AUTHENTICATE, GIP_OPT_INTERNAL, GIP_SEQ0, GIP_PL_LEN(2), 0x01, 0x00
};
@@ -726,12 +725,8 @@ static const struct xboxone_init_packet xboxone_init_packets[] = {
XBOXONE_INIT_PKT(0x045e, 0x02ea, xboxone_s_init),
XBOXONE_INIT_PKT(0x045e, 0x0b00, xboxone_s_init),
XBOXONE_INIT_PKT(0x045e, 0x0b00, extra_input_packet_init),
- XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_led_on),
- XBOXONE_INIT_PKT(0x0f0d, 0x01b2, xboxone_pdp_led_on),
- XBOXONE_INIT_PKT(0x20d6, 0xa01a, xboxone_pdp_led_on),
- XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_auth),
- XBOXONE_INIT_PKT(0x0f0d, 0x01b2, xboxone_pdp_auth),
- XBOXONE_INIT_PKT(0x20d6, 0xa01a, xboxone_pdp_auth),
+ XBOXONE_INIT_PKT(0x0000, 0x0000, xboxone_led_on),
+ XBOXONE_INIT_PKT(0x0000, 0x0000, xboxone_auth_done),
XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumblebegin_init),
XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumblebegin_init),
XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumblebegin_init),
--
2.49.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/4] Input: xpad - Add more controllers
2025-05-13 22:53 [PATCH 0/4] Input: xpad - More Xbox One improvements Vicki Pfau
` (2 preceding siblings ...)
2025-05-13 22:54 ` [PATCH 3/4] Input: xpad - Send LED and auth done packets to all Xbox One controllers Vicki Pfau
@ 2025-05-13 22:54 ` Vicki Pfau
2025-05-13 22:59 ` Vicki Pfau
2025-05-17 1:17 ` [PATCH 0/4] Input: xpad - More Xbox One improvements Dmitry Torokhov
4 siblings, 1 reply; 7+ messages in thread
From: Vicki Pfau @ 2025-05-13 22:54 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input; +Cc: Vicki Pfau
Adds support for a revision of the Turtle Beach Recon Wired Controller, the
Turtle Beach Stealth Ultra, and the PowerA Wired Controller.
Signed-off-by: Vicki Pfau <vi@endrift.com>
---
drivers/input/joystick/xpad.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index 7746530da030..03449571a19f 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -293,6 +293,9 @@ static const struct xpad_device {
{ 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
{ 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
{ 0x10f5, 0x7005, "Turtle Beach Recon Controller", 0, XTYPE_XBOXONE },
+ { 0x10f5, 0x7008, "Turtle Beach Recon Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
+ { 0x10f5, 0x7072, "Turtle Beach Stealth Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, /* bluetooth */
+ { 0x10f5, 0x7073, "Turtle Beach Stealth Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, /* wired */
{ 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
{ 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 },
{ 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 },
@@ -357,6 +360,7 @@ static const struct xpad_device {
{ 0x1ee9, 0x1590, "ZOTAC Gaming Zone", 0, XTYPE_XBOX360 },
{ 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE },
{ 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE },
+ { 0x20d6, 0x2064, "PowerA Wired Controller for Xbox", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
{ 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 },
{ 0x20d6, 0x400b, "PowerA FUSION Pro 4 Wired Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
{ 0x20d6, 0x890b, "PowerA MOGA XP-Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
--
2.49.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 4/4] Input: xpad - Add more controllers
2025-05-13 22:54 ` [PATCH 4/4] Input: xpad - Add more controllers Vicki Pfau
@ 2025-05-13 22:59 ` Vicki Pfau
0 siblings, 0 replies; 7+ messages in thread
From: Vicki Pfau @ 2025-05-13 22:59 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input
On 5/13/25 3:54 PM, Vicki Pfau wrote:
> Adds support for a revision of the Turtle Beach Recon Wired Controller, the
> Turtle Beach Stealth Ultra, and the PowerA Wired Controller.
>
> Signed-off-by: Vicki Pfau <vi@endrift.com>
> ---
> drivers/input/joystick/xpad.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
> index 7746530da030..03449571a19f 100644
> --- a/drivers/input/joystick/xpad.c
> +++ b/drivers/input/joystick/xpad.c
> @@ -293,6 +293,9 @@ static const struct xpad_device {
> { 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
> { 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
> { 0x10f5, 0x7005, "Turtle Beach Recon Controller", 0, XTYPE_XBOXONE },
> + { 0x10f5, 0x7008, "Turtle Beach Recon Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
> + { 0x10f5, 0x7072, "Turtle Beach Stealth Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, /* bluetooth */
> + { 0x10f5, 0x7073, "Turtle Beach Stealth Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, /* wired */
Shoot, it looks like I submitted the wrong version of this patch. The bluetooth line shouldn't be there since this driver doesn't support the bluetooth interface. I'll submit a v2 of this specific patch, as it doesn't depend on any of the others in the sequence.
> { 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
> { 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 },
> { 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 },
> @@ -357,6 +360,7 @@ static const struct xpad_device {
> { 0x1ee9, 0x1590, "ZOTAC Gaming Zone", 0, XTYPE_XBOX360 },
> { 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE },
> { 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE },
> + { 0x20d6, 0x2064, "PowerA Wired Controller for Xbox", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
> { 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 },
> { 0x20d6, 0x400b, "PowerA FUSION Pro 4 Wired Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
> { 0x20d6, 0x890b, "PowerA MOGA XP-Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/4] Input: xpad - More Xbox One improvements
2025-05-13 22:53 [PATCH 0/4] Input: xpad - More Xbox One improvements Vicki Pfau
` (3 preceding siblings ...)
2025-05-13 22:54 ` [PATCH 4/4] Input: xpad - Add more controllers Vicki Pfau
@ 2025-05-17 1:17 ` Dmitry Torokhov
4 siblings, 0 replies; 7+ messages in thread
From: Dmitry Torokhov @ 2025-05-17 1:17 UTC (permalink / raw)
To: Vicki Pfau; +Cc: linux-input
On Tue, May 13, 2025 at 03:53:58PM -0700, Vicki Pfau wrote:
> This patchset adds support for several more controllers but also adds a bit
> more "correctness" to the initialization flow, and a quirk on waiting until
> the announce packet for some wireless controllers that delay the init flow.
>
> I have a WIP new driver with a proper initialization flow based on the
> recently released documentation, so hopefully this will be the last needed
> patch that adds piecemeal per-controller fixes like this.
>
> Pierre-Loup A. Griffais (1):
> Input: xpad - Add the ByoWave Proteus controller
>
> Vicki Pfau (3):
> Input: xpad - Allow delaying init packets
> Input: xpad - Send LED and auth done packets to all Xbox One
> controllers
> Input: xpad - Add more controllers
>
> drivers/input/joystick/xpad.c | 57 +++++++++++++++++++++++++++--------
> 1 file changed, 44 insertions(+), 13 deletions(-)
>
Applied patches 1-3 for next, patch #4 for current.
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-05-17 1:17 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-13 22:53 [PATCH 0/4] Input: xpad - More Xbox One improvements Vicki Pfau
2025-05-13 22:53 ` [PATCH 1/4] Input: xpad - Allow delaying init packets Vicki Pfau
2025-05-13 22:54 ` [PATCH 2/4] Input: xpad - Add the ByoWave Proteus controller Vicki Pfau
2025-05-13 22:54 ` [PATCH 3/4] Input: xpad - Send LED and auth done packets to all Xbox One controllers Vicki Pfau
2025-05-13 22:54 ` [PATCH 4/4] Input: xpad - Add more controllers Vicki Pfau
2025-05-13 22:59 ` Vicki Pfau
2025-05-17 1:17 ` [PATCH 0/4] Input: xpad - More Xbox One improvements Dmitry Torokhov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).