|
@@ -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()
|
|
@@ -209,6 +228,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)
|