Message ID | 1307700027-10657-2-git-send-email-ospite@studenti.unina.it (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Jiri Kosina |
Headers | show |
On Fri, 10 Jun 2011, Antonio Ospite wrote: > From: Simon Wood <simon@mungewell.org> > > 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> Applied, thanks guys.
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 60b4257..5d8a200 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, return rdesc; } +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); + + /* Sixaxis HID report has acclerometers/gyro with MSByte first, this + * has to be BYTE_SWAPPED before passing up to joystick interface + */ + if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) && + 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() @@ -190,6 +209,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)