linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv4 1/3] sony_ff_hid_descriptor
@ 2011-06-04  9:32 Simon Wood
  2011-06-04  9:32 ` [PATCHv4 2/3] sony_ff_byteswap_accelerometer Simon Wood
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Simon Wood @ 2011-06-04  9:32 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Michael Bauer, Marcin Tolysz, Simon Wood

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 <simon@mungewell.org>
---
 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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCHv4 2/3] sony_ff_byteswap_accelerometer
  2011-06-04  9:32 [PATCHv4 1/3] sony_ff_hid_descriptor Simon Wood
@ 2011-06-04  9:32 ` Simon Wood
  2011-06-04  9:32 ` [PATCHv4 3/3] sony_ff_bluetooth Simon Wood
  2011-06-08  7:45 ` [PATCHv4 1/3] sony_ff_hid_descriptor Antonio Ospite
  2 siblings, 0 replies; 6+ messages in thread
From: Simon Wood @ 2011-06-04  9:32 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Michael Bauer, Marcin Tolysz, Simon Wood

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 <tolysz@gmail.com>
Signed-off-by: Simon Wood <simon@mungewell.org>
---
 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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCHv4 3/3] sony_ff_bluetooth
  2011-06-04  9:32 [PATCHv4 1/3] sony_ff_hid_descriptor Simon Wood
  2011-06-04  9:32 ` [PATCHv4 2/3] sony_ff_byteswap_accelerometer Simon Wood
@ 2011-06-04  9:32 ` Simon Wood
  2011-06-08  7:47   ` Antonio Ospite
  2011-06-08  7:45 ` [PATCHv4 1/3] sony_ff_hid_descriptor Antonio Ospite
  2 siblings, 1 reply; 6+ messages in thread
From: Simon Wood @ 2011-06-04  9:32 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Michael Bauer, Marcin Tolysz,
	Simon Wood, Antonio Ospite

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 <ospite@studenti.unina.it>
Signed-off-by: Simon Wood <simon@mungewell.org>
---
 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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCHv4 1/3] sony_ff_hid_descriptor
  2011-06-04  9:32 [PATCHv4 1/3] sony_ff_hid_descriptor Simon Wood
  2011-06-04  9:32 ` [PATCHv4 2/3] sony_ff_byteswap_accelerometer Simon Wood
  2011-06-04  9:32 ` [PATCHv4 3/3] sony_ff_bluetooth Simon Wood
@ 2011-06-08  7:45 ` Antonio Ospite
  2 siblings, 0 replies; 6+ messages in thread
From: Antonio Ospite @ 2011-06-08  7:45 UTC (permalink / raw)
  To: Simon Wood
  Cc: linux-input, linux-kernel, Jiri Kosina, Michael Bauer, Marcin Tolysz

[-- Attachment #1: Type: text/plain, Size: 1325 bytes --]

On Sat,  4 Jun 2011 02:32:35 -0700
Simon Wood <simon@mungewell.org> 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?

[-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCHv4 3/3] sony_ff_bluetooth
  2011-06-04  9:32 ` [PATCHv4 3/3] sony_ff_bluetooth Simon Wood
@ 2011-06-08  7:47   ` Antonio Ospite
  2011-06-08 23:57     ` simon
  0 siblings, 1 reply; 6+ messages in thread
From: Antonio Ospite @ 2011-06-08  7:47 UTC (permalink / raw)
  To: Simon Wood
  Cc: linux-input, linux-kernel, Jiri Kosina, Michael Bauer, Marcin Tolysz

[-- Attachment #1: Type: text/plain, Size: 2280 bytes --]

On Sat,  4 Jun 2011 02:32:37 -0700
Simon Wood <simon@mungewell.org> 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 <ospite@studenti.unina.it>
> Signed-off-by: Simon Wood <simon@mungewell.org>
> ---
>  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?

[-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCHv4 3/3] sony_ff_bluetooth
  2011-06-08  7:47   ` Antonio Ospite
@ 2011-06-08 23:57     ` simon
  0 siblings, 0 replies; 6+ messages in thread
From: simon @ 2011-06-08 23:57 UTC (permalink / raw)
  To: Antonio Ospite
  Cc: Simon Wood, linux-input, linux-kernel, Jiri Kosina,
	Michael Bauer, Marcin Tolysz


>
> 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



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-06-08 23:57 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-04  9:32 [PATCHv4 1/3] sony_ff_hid_descriptor Simon Wood
2011-06-04  9:32 ` [PATCHv4 2/3] sony_ff_byteswap_accelerometer Simon Wood
2011-06-04  9:32 ` [PATCHv4 3/3] sony_ff_bluetooth Simon Wood
2011-06-08  7:47   ` Antonio Ospite
2011-06-08 23:57     ` simon
2011-06-08  7:45 ` [PATCHv4 1/3] sony_ff_hid_descriptor Antonio Ospite

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).