aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-sony.c
diff options
context:
space:
mode:
authorSimon Wood <simon@mungewell.org>2011-06-10 06:00:27 -0400
committerJiri Kosina <jkosina@suse.cz>2011-06-13 07:21:30 -0400
commitc9e4d87758e95ef9d78a7767e2405ebaf54adcd8 (patch)
treedc3c078bae72a37195b5edaf2fb4aaa2a8e94ba3 /drivers/hid/hid-sony.c
parent61ab44bebdefab296487e7cd723a634849278827 (diff)
HID: hid-sony: fix endiannes of Sixaxis accel/gyro values
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> 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.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index 539850769b17..5cd25bd907f8 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -61,6 +61,25 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
61 return rdesc; 61 return rdesc;
62} 62}
63 63
64static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
65 __u8 *rd, int size)
66{
67 struct sony_sc *sc = hid_get_drvdata(hdev);
68
69 /* Sixaxis HID report has acclerometers/gyro with MSByte first, this
70 * has to be BYTE_SWAPPED before passing up to joystick interface
71 */
72 if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
73 rd[0] == 0x01 && size == 49) {
74 swap(rd[41], rd[42]);
75 swap(rd[43], rd[44]);
76 swap(rd[45], rd[46]);
77 swap(rd[47], rd[48]);
78 }
79
80 return 0;
81}
82
64/* 83/*
65 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP 84 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
66 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report() 85 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
@@ -209,6 +228,7 @@ static struct hid_driver sony_driver = {
209 .probe = sony_probe, 228 .probe = sony_probe,
210 .remove = sony_remove, 229 .remove = sony_remove,
211 .report_fixup = sony_report_fixup, 230 .report_fixup = sony_report_fixup,
231 .raw_event = sony_raw_event
212}; 232};
213 233
214static int __init sony_init(void) 234static int __init sony_init(void)