aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-sony.c
diff options
context:
space:
mode:
authorSimon Wood <simon@mungewell.org>2011-06-10 06:00:26 -0400
committerJiri Kosina <jkosina@suse.cz>2011-06-13 07:20:06 -0400
commit61ab44bebdefab296487e7cd723a634849278827 (patch)
treec715bcb3a51cd970a6543fed641202e8d1757ff5 /drivers/hid/hid-sony.c
parent74bc6953135ae1478acc18046321bfca05b0e823 (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.c15
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
31static 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
31struct sony_sc { 37struct 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