| From c824b89b8436db1a0f7f76a4c74e342819042d54 Mon Sep 17 00:00:00 2001 |
| From: "Pierre-Loup A. Griffais" <githubpublic@plagman.net> |
| Date: Wed, 9 Dec 2015 13:40:37 -0800 |
| Subject: Input: xpad - update Xbox One Force Feedback Support |
| |
| [ Upstream commit 2a6d7527b35cf987260800807e328d167aef22ac ] |
| |
| There's apparently a serial number woven into both input and output |
| packets; neglecting to specify a valid serial number causes the controller |
| to ignore the rumble packets. |
| |
| The scale of the rumble was also apparently halved in the packets. |
| |
| The initialization packet had to be changed to allow force feedback to |
| work. |
| |
| see https://github.com/paroj/xpad/issues/7 for details. |
| |
| Signed-off-by: Pavel Rojtberg <rojtberg@gmail.com> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/input/joystick/xpad.c | 15 ++++++++++----- |
| 1 file changed, 10 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c |
| index 88de7b17bf7d..bfe94216621f 100644 |
| --- a/drivers/input/joystick/xpad.c |
| +++ b/drivers/input/joystick/xpad.c |
| @@ -350,6 +350,7 @@ struct usb_xpad { |
| struct urb *irq_out; /* urb for interrupt out report */ |
| bool irq_out_active; /* we must not use an active URB */ |
| unsigned char *odata; /* output data */ |
| + u8 odata_serial; /* serial number for xbox one protocol */ |
| dma_addr_t odata_dma; |
| spinlock_t odata_lock; |
| |
| @@ -925,7 +926,10 @@ static int xpad_start_xbox_one(struct usb_xpad *xpad) |
| /* Xbox one controller needs to be initialized. */ |
| packet->data[0] = 0x05; |
| packet->data[1] = 0x20; |
| - packet->len = 2; |
| + packet->data[2] = xpad->odata_serial++; /* packet serial */ |
| + packet->data[3] = 0x01; /* rumble bit enable? */ |
| + packet->data[4] = 0x00; |
| + packet->len = 5; |
| packet->pending = true; |
| |
| /* Reset the sequence so we send out start packet first */ |
| @@ -1000,17 +1004,18 @@ static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect |
| case XTYPE_XBOXONE: |
| packet->data[0] = 0x09; /* activate rumble */ |
| packet->data[1] = 0x08; |
| - packet->data[2] = 0x00; |
| + packet->data[2] = xpad->odata_serial++; |
| packet->data[3] = 0x08; /* continuous effect */ |
| packet->data[4] = 0x00; /* simple rumble mode */ |
| packet->data[5] = 0x03; /* L and R actuator only */ |
| packet->data[6] = 0x00; /* TODO: LT actuator */ |
| packet->data[7] = 0x00; /* TODO: RT actuator */ |
| - packet->data[8] = strong / 256; /* left actuator */ |
| - packet->data[9] = weak / 256; /* right actuator */ |
| + packet->data[8] = strong / 512; /* left actuator */ |
| + packet->data[9] = weak / 512; /* right actuator */ |
| packet->data[10] = 0x80; /* length of pulse */ |
| packet->data[11] = 0x00; /* stop period of pulse */ |
| - packet->len = 12; |
| + packet->data[12] = 0x00; |
| + packet->len = 13; |
| packet->pending = true; |
| break; |
| |
| -- |
| 2.17.1 |
| |