From patchwork Fri Jun 10 10:00:27 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antonio Ospite X-Patchwork-Id: 868382 X-Patchwork-Delegate: jikos@jikos.cz Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p5AA0bkB004303 for ; Fri, 10 Jun 2011 10:00:37 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754649Ab1FJKAe (ORCPT ); Fri, 10 Jun 2011 06:00:34 -0400 Received: from smtp205.alice.it ([82.57.200.101]:43612 "EHLO smtp205.alice.it" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751941Ab1FJKAe (ORCPT ); Fri, 10 Jun 2011 06:00:34 -0400 Received: from jcn (82.59.101.200) by smtp205.alice.it (8.5.124.08) id 4DE6347500D8A3D0; Fri, 10 Jun 2011 12:00:32 +0200 Received: from ao2 by jcn with local (Exim 4.76) (envelope-from ) id 1QUyVz-0002mT-4B; Fri, 10 Jun 2011 12:00:31 +0200 From: Antonio Ospite To: linux-input@vger.kernel.org Cc: Simon Wood , Jiri Kosina , Marcin Tolysz , Michael Bauer , Antonio Ospite Subject: [PATCH v5 2/2] hid-sony: fix endiannes of Sixaxis accel/gyro values Date: Fri, 10 Jun 2011 12:00:27 +0200 Message-Id: <1307700027-10657-2-git-send-email-ospite@studenti.unina.it> X-Mailer: git-send-email 1.7.5.3 In-Reply-To: <1b0af21baa09ca623bbe62ee253f5d36.squirrel@host171.canaca.com> References: <1b0af21baa09ca623bbe62ee253f5d36.squirrel@host171.canaca.com> X-Face: z*RaLf`X<@C75u6Ig9}{oW$H; 1_\2t5)({*|jhM/Vb; ]yA5\I~93>J<_`<4)A{':UrE Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Fri, 10 Jun 2011 10:00:37 +0000 (UTC) From: Simon Wood 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 Signed-off-by: Simon Wood Signed-off-by: Antonio Ospite --- Changes since v4: - Adjusted the short commit message - Wrapped the sony_raw_event() definition to stay in 80 chars The patch has been tested and it is checkpatch.pl clean. Thanks, Antonio drivers/hid/hid-sony.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) 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)