diff mbox

[v3,2/2] Input: xpad - fix Xbox One rumble stopping after 2.5 secs

Message ID 0c07f12f63b5bf21374eb35a84a160bffc4f97e4.1480111549.git.aicommander@gmail.com (mailing list archive)
State Accepted
Headers show

Commit Message

Cameron Gutman Nov. 25, 2016, 10:18 p.m. UTC
Unlike previous Xbox pads, the Xbox One pad doesn't have
"sticky" rumble packets. The duration is encoded into
the command and expiration is handled by the pad firmware.

ff-memless needs pseudo-sticky behavior for rumble effects
to behave properly for long duration effects. We already
specify the maximum rumble on duration in the command
packets, but it's still only good for about 2.5 seconds
of rumble. This is easily reproducable running fftest's
sine vibration test.

It turns out there's a repeat count encoded in the rumble
command. We can abuse that to get the pseudo-sticky behavior
needed for rumble to behave as expected for effects with long
duration.

By my math, this change should allow a single ff_effect to
rumble for 10 minutes straight, which should be more than
enough for most needs.

Signed-off-by: Cameron Gutman <aicommander@gmail.com>
---
No changes in v3.

---
 drivers/input/joystick/xpad.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Dmitry Torokhov Nov. 28, 2016, 4:38 a.m. UTC | #1
On Fri, Nov 25, 2016 at 02:18:35PM -0800, Cameron Gutman wrote:
> Unlike previous Xbox pads, the Xbox One pad doesn't have
> "sticky" rumble packets. The duration is encoded into
> the command and expiration is handled by the pad firmware.
> 
> ff-memless needs pseudo-sticky behavior for rumble effects
> to behave properly for long duration effects. We already
> specify the maximum rumble on duration in the command
> packets, but it's still only good for about 2.5 seconds
> of rumble. This is easily reproducable running fftest's
> sine vibration test.
> 
> It turns out there's a repeat count encoded in the rumble
> command. We can abuse that to get the pseudo-sticky behavior
> needed for rumble to behave as expected for effects with long
> duration.
> 
> By my math, this change should allow a single ff_effect to
> rumble for 10 minutes straight, which should be more than
> enough for most needs.
> 
> Signed-off-by: Cameron Gutman <aicommander@gmail.com>

Applied, thank you.

> ---
> No changes in v3.
> 
> ---
>  drivers/input/joystick/xpad.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
> index 19886db..6d94996 100644
> --- a/drivers/input/joystick/xpad.c
> +++ b/drivers/input/joystick/xpad.c
> @@ -1045,9 +1045,9 @@ static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect
>  		packet->data[7] = 0x00;
>  		packet->data[8] = strong / 512;	/* left actuator */
>  		packet->data[9] = weak / 512;	/* right actuator */
> -		packet->data[10] = 0xFF;
> -		packet->data[11] = 0x00;
> -		packet->data[12] = 0x00;
> +		packet->data[10] = 0xFF; /* on period */
> +		packet->data[11] = 0x00; /* off period */
> +		packet->data[12] = 0xFF; /* repeat count */
>  		packet->len = 13;
>  		packet->pending = true;
>  		break;
> -- 
> 2.9.3
>
diff mbox

Patch

diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index 19886db..6d94996 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -1045,9 +1045,9 @@  static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect
 		packet->data[7] = 0x00;
 		packet->data[8] = strong / 512;	/* left actuator */
 		packet->data[9] = weak / 512;	/* right actuator */
-		packet->data[10] = 0xFF;
-		packet->data[11] = 0x00;
-		packet->data[12] = 0x00;
+		packet->data[10] = 0xFF; /* on period */
+		packet->data[11] = 0x00; /* off period */
+		packet->data[12] = 0xFF; /* repeat count */
 		packet->len = 13;
 		packet->pending = true;
 		break;