diff options
author | Simon Wood <simon@mungewell.org> | 2011-06-10 06:00:26 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2011-06-13 07:20:06 -0400 |
commit | 61ab44bebdefab296487e7cd723a634849278827 (patch) | |
tree | c715bcb3a51cd970a6543fed641202e8d1757ff5 /drivers/hid/hid-sony.c | |
parent | 74bc6953135ae1478acc18046321bfca05b0e823 (diff) |
HID: hid-sony: amend Sixaxis descriptor to enable accelerometers
Modify the HID descriptor of the Sixaxis controller to allow the
reporting of the accelerometers and gyro via a joystick axis.
Rewrite section from offset 83:
--
0x75, 0x08, /* Report Size (8), */
/* all the other data lumped together */
0x95, 0x27, /* Report Count (39), */
0x09, 0x01, /* Usage (Pointer), */
0x81, 0x02, /* Input (Variable), */
0x75, 0x08, /* Report Size (8), */
0x95, 0x30, /* Report Count (48), */
0x09, 0x01, /* Usage (Pointer), */
/* Note Output */
0x91, 0x02, /* Output (Variable), */
0x75, 0x08, /* Report Size (8), */
0x95, 0x30, /* Report Count (48), */
0x09, 0x01, /* Usage (Pointer), */
/* Note Feature */
0xB1, 0x02, /* Feature (Variable), */
--
with
--
/* last 2 not used... */
0x95, 0x13, /* Report Count (19), */
0x09, 0x01, /* Usage (Pointer), */
0x81, 0x02, /* Input (Variable), */
/* Padding */
0x95, 0x0C, /* Report Count (12), */
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>
Signed-off-by: Antonio Ospite <ospite@studenti.unina.it>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-sony.c')
-rw-r--r-- | drivers/hid/hid-sony.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 936c911fdca6..539850769b17 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c | |||
@@ -28,6 +28,12 @@ | |||
28 | #define SIXAXIS_CONTROLLER_USB (1 << 1) | 28 | #define SIXAXIS_CONTROLLER_USB (1 << 1) |
29 | #define SIXAXIS_CONTROLLER_BT (1 << 2) | 29 | #define SIXAXIS_CONTROLLER_BT (1 << 2) |
30 | 30 | ||
31 | static const u8 sixaxis_rdesc_fixup[] = { | ||
32 | 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C, | ||
33 | 0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF, | ||
34 | 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02 | ||
35 | }; | ||
36 | |||
31 | struct sony_sc { | 37 | struct sony_sc { |
32 | unsigned long quirks; | 38 | unsigned long quirks; |
33 | }; | 39 | }; |
@@ -43,6 +49,15 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
43 | hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n"); | 49 | hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n"); |
44 | rdesc[55] = 0x06; | 50 | rdesc[55] = 0x06; |
45 | } | 51 | } |
52 | |||
53 | /* The HID descriptor exposed over BT has a trailing zero byte */ | ||
54 | if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) || | ||
55 | ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) && | ||
56 | rdesc[83] == 0x75) { | ||
57 | hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n"); | ||
58 | memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup, | ||
59 | sizeof(sixaxis_rdesc_fixup)); | ||
60 | } | ||
46 | return rdesc; | 61 | return rdesc; |
47 | } | 62 | } |
48 | 63 | ||