2011-06-08 03:24:28

by Simon Wood

[permalink] [raw]
Subject: [PATCHv4 1/3] sony_ff_hid_descriptor

This patch modifies the HID descriptor of the Sixaxis controller
to allow the reporting of the accelerometers and gyro via
a joystick axis.

rewrite section from offset 148
--
0x75, 0x08, /* Report Size (8), */
0x95, 0x27, /* Report Count (39), */ /* all the other data
lumped together */
0x09, 0x01, /* Usage (Pointer), */
0x81, 0x02, /* Input (Variable), */
0x75, 0x08, /* Report Size (8), */
0x95, 0x30, /* Report Count (48), */
0x09, 0x01, /* Usage (Pointer), */
0x91, 0x02, /* Output (Variable), */ /* Note Output */
0x75, 0x08, /* Report Size (8), */
0x95, 0x30, /* Report Count (48), */
0x09, 0x01, /* Usage (Pointer), */
0xB1, 0x02, /* Feature (Variable), */ /* Note Feature */
--
with
--
0x95, 0x13, /* Report Count (19), */ /* last 2 not used... */
0x09, 0x01, /* Usage (Pointer), */
0x81, 0x02, /* Input (Variable), */
0x95, 0x0C, /* Report Count (12), */ /* Padding */
0x81, 0x01, /* Input (Constant), */
0x75, 0x10, /* Report Size (16), */
0x95, 0x04, /* Report Count (4), */
0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
0x09, 0x01, /* Usage (Pointer), */
0x81, 0x02, /* Input (Variable), */
--

Signed-off-by: Simon Wood <[email protected]>
---
drivers/hid/hid-sony.c | 11 +++++++++++
1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index 936c911..5c930dc 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -28,6 +28,12 @@
#define SIXAXIS_CONTROLLER_USB (1 << 1)
#define SIXAXIS_CONTROLLER_BT (1 << 2)

+static const u8 sixaxis_rdesc_fixup[] = {
+ 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
+ 0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF,
+ 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
+ };
+
struct sony_sc {
unsigned long quirks;
};
@@ -43,6 +49,11 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n");
rdesc[55] = 0x06;
}
+ if ((sc->quirks & SIXAXIS_CONTROLLER_USB) &&
+ *rsize == 148 && rdesc[83] == 0x75) {
+ hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
+ memcpy((void *)&rdesc[83], (void *) &sixaxis_rdesc_fixup, sizeof(sixaxis_rdesc_fixup));
+ }
return rdesc;
}

--
1.7.4.1


2011-06-08 03:24:45

by Simon Wood

[permalink] [raw]
Subject: [PATCHv4 2/3] sony_ff_byteswap_accelerometer

The accelerometers/gyro on the sixaxis are reported in the wrong
endianness (ie. not compatible with HID), so this patch intercepts
the report and swaps the appropriate bytes over.

Accelerometers are scaled with a nominal value of +/-4000 = 1G,
maximum value would be around +/-32768 = 8G.

Gyro on my device always reports -32768, might need some calibration
set within the controller.

Fix extracted from previous patch submission:
https://patchwork.kernel.org/patch/95212/

Signed-off-by: Marcin Tolysz <[email protected]>
Signed-off-by: Simon Wood <[email protected]>
---
drivers/hid/hid-sony.c | 19 +++++++++++++++++++
1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index 5c930dc..f219746 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -57,6 +57,24 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
return rdesc;
}

+/* Sixaxis HID report has acclerometers/gyro with MSByte first, this has
+ * to be BYTE_SWAPPED before passing up to joystick interface
+ */
+static int sony_raw_event(struct hid_device *hdev, struct hid_report *report, __u8 *rd, int size)
+{
+ struct sony_sc *sc = hid_get_drvdata(hdev);
+
+ if ((sc->quirks & SIXAXIS_CONTROLLER_USB) &&
+ rd[0] == 0x01 && size == 49) {
+ swap(rd[41], rd[42]);
+ swap(rd[43], rd[44]);
+ swap(rd[45], rd[46]);
+ swap(rd[47], rd[48]);
+ }
+
+ return 0;
+}
+
/*
* The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
* like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
@@ -205,6 +223,7 @@ static struct hid_driver sony_driver = {
.probe = sony_probe,
.remove = sony_remove,
.report_fixup = sony_report_fixup,
+ .raw_event = sony_raw_event
};

static int __init sony_init(void)
--
1.7.4.1

2011-06-08 03:24:32

by Simon Wood

[permalink] [raw]
Subject: [PATCHv4 3/3] sony_ff_bluetooth

Add support for patching the HID descriptor when Sixaxis is connect
via Bluetooth. In this mode the desciptor contains a trailing '0x00'.

Patch suggested by Antonio

Signed-off-by: Antonio Ospite <[email protected]>
Signed-off-by: Simon Wood <[email protected]>
---
drivers/hid/hid-sony.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index f219746..5d37f97 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -49,8 +49,11 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n");
rdesc[55] = 0x06;
}
- if ((sc->quirks & SIXAXIS_CONTROLLER_USB) &&
- *rsize == 148 && rdesc[83] == 0x75) {
+
+ /* The HID descriptor exposed over BT has a trailing zero byte */
+ if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
+ ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149 )) &&
+ rdesc[83] == 0x75) {
hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
memcpy((void *)&rdesc[83], (void *) &sixaxis_rdesc_fixup, sizeof(sixaxis_rdesc_fixup));
}
@@ -64,7 +67,7 @@ static int sony_raw_event(struct hid_device *hdev, struct hid_report *report, __
{
struct sony_sc *sc = hid_get_drvdata(hdev);

- if ((sc->quirks & SIXAXIS_CONTROLLER_USB) &&
+ if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
rd[0] == 0x01 && size == 49) {
swap(rd[41], rd[42]);
swap(rd[43], rd[44]);
--
1.7.4.1

2011-06-08 07:45:41

by Antonio Ospite

[permalink] [raw]
Subject: Re: [PATCHv4 1/3] sony_ff_hid_descriptor

On Sat, 4 Jun 2011 02:32:35 -0700
Simon Wood <[email protected]> wrote:

> This patch modifies the HID descriptor of the Sixaxis controller
> to allow the reporting of the accelerometers and gyro via
> a joystick axis.
>
> rewrite section from offset 148

From offset 83? Below I see rdesc[83] == 0x75

> --
> 0x75, 0x08, /* Report Size (8), */
> 0x95, 0x27, /* Report Count (39), */ /* all the other data
> lumped together */

I'd keep commit messages wrapped to 72/80 chars as well if possible.

[...]
> @@ -43,6 +49,11 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
> hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n");
> rdesc[55] = 0x06;
> }
> + if ((sc->quirks & SIXAXIS_CONTROLLER_USB) &&
> + *rsize == 148 && rdesc[83] == 0x75) {
> + hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
> + memcpy((void *)&rdesc[83], (void *) &sixaxis_rdesc_fixup, sizeof(sixaxis_rdesc_fixup));
> + }
> return rdesc;
> }
>

Thanks,
Antonio

--
Antonio Ospite
http://ao2.it

PGP public key ID: 0x4553B001

A: Because it messes up the order in which people normally read text.
See http://en.wikipedia.org/wiki/Posting_style
Q: Why is top-posting such a bad thing?


Attachments:
(No filename) (1.25 kB)
(No filename) (198.00 B)
Download all attachments

2011-06-08 07:47:23

by Antonio Ospite

[permalink] [raw]
Subject: Re: [PATCHv4 3/3] sony_ff_bluetooth

On Sat, 4 Jun 2011 02:32:37 -0700
Simon Wood <[email protected]> wrote:

> Add support for patching the HID descriptor when Sixaxis is connect
> via Bluetooth. In this mode the desciptor contains a trailing '0x00'.
>
> Patch suggested by Antonio
>

Simon I think this one can be split and the first hunk can be merged
with 1/2 and the second hunk with 2/2.

Also the short commit messages still need to be fixed for all the
patches to be more descriptive, if you don't want to spend any more
time on that just tell and I'll do it :)

Thanks,
Antonio

> Signed-off-by: Antonio Ospite <[email protected]>
> Signed-off-by: Simon Wood <[email protected]>
> ---
> drivers/hid/hid-sony.c | 9 ++++++---
> 1 files changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
> index f219746..5d37f97 100644
> --- a/drivers/hid/hid-sony.c
> +++ b/drivers/hid/hid-sony.c
> @@ -49,8 +49,11 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
> hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n");
> rdesc[55] = 0x06;
> }
> - if ((sc->quirks & SIXAXIS_CONTROLLER_USB) &&
> - *rsize == 148 && rdesc[83] == 0x75) {
> +
> + /* The HID descriptor exposed over BT has a trailing zero byte */
> + if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
> + ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149 )) &&
> + rdesc[83] == 0x75) {
> hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
> memcpy((void *)&rdesc[83], (void *) &sixaxis_rdesc_fixup, sizeof(sixaxis_rdesc_fixup));
> }
> @@ -64,7 +67,7 @@ static int sony_raw_event(struct hid_device *hdev, struct hid_report *report, __
> {
> struct sony_sc *sc = hid_get_drvdata(hdev);
>
> - if ((sc->quirks & SIXAXIS_CONTROLLER_USB) &&
> + if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
> rd[0] == 0x01 && size == 49) {
> swap(rd[41], rd[42]);
> swap(rd[43], rd[44]);
> --

--
Antonio Ospite
http://ao2.it

PGP public key ID: 0x4553B001

A: Because it messes up the order in which people normally read text.
See http://en.wikipedia.org/wiki/Posting_style
Q: Why is top-posting such a bad thing?


Attachments:
(No filename) (2.17 kB)
(No filename) (198.00 B)
Download all attachments

2011-06-08 23:57:30

by Simon Wood

[permalink] [raw]
Subject: Re: [PATCHv4 3/3] sony_ff_bluetooth


>
> Simon I think this one can be split and the first hunk can be merged
> with 1/2 and the second hunk with 2/2.
>
> Also the short commit messages still need to be fixed for all the
> patches to be more descriptive, if you don't want to spend any more
> time on that just tell and I'll do it :)

I'm traveling for the rest of the week and don't have access to the
Sixaxis hardware to test, so if you have the time/motivation to spin a new
patch that would be great.... if not I can try again over the weekend.

> rewrite section from offset 148
.... er, yes I am an idiot. ;-)

Simon