aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-wiimote-core.c
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@googlemail.com>2012-05-08 10:52:31 -0400
committerJiri Kosina <jkosina@suse.cz>2012-05-09 05:40:51 -0400
commit74b89e8a3625c17c7452532dfb997ac4f1a38751 (patch)
treeba8a0046db4f8e9c15f0212e621452a8dafa659b /drivers/hid/hid-wiimote-core.c
parent692d30d63b80b174d0ed24bbffb7a1ea536d5fee (diff)
HID: wiimote: Fix IR data parser
We incorrectly parse incoming IR data. The extra byte contains the upper bits and not the lower bits of the x/y coordinates. User-space expects absolute position data from us so this patch does not break existing applications. On the contrary, it extends the virtual view and fixes garbage reports for margin areas of the virtual screen. Cc: stable@kernel.org Reported-by: Peter Bukovsky <bukovsky.peter@gmail.com> Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-wiimote-core.c')
-rw-r--r--drivers/hid/hid-wiimote-core.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c
index cac3589b1ed5..84e2fbec5fbb 100644
--- a/drivers/hid/hid-wiimote-core.c
+++ b/drivers/hid/hid-wiimote-core.c
@@ -769,7 +769,7 @@ static void __ir_to_input(struct wiimote_data *wdata, const __u8 *ir,
769 769
770 /* 770 /*
771 * Basic IR data is encoded into 3 bytes. The first two bytes are the 771 * Basic IR data is encoded into 3 bytes. The first two bytes are the
772 * upper 8 bit of the X/Y data, the 3rd byte contains the lower 2 bits 772 * lower 8 bit of the X/Y data, the 3rd byte contains the upper 2 bits
773 * of both. 773 * of both.
774 * If data is packed, then the 3rd byte is put first and slightly 774 * If data is packed, then the 3rd byte is put first and slightly
775 * reordered. This allows to interleave packed and non-packed data to 775 * reordered. This allows to interleave packed and non-packed data to
@@ -778,17 +778,11 @@ static void __ir_to_input(struct wiimote_data *wdata, const __u8 *ir,
778 */ 778 */
779 779
780 if (packed) { 780 if (packed) {
781 x = ir[1] << 2; 781 x = ir[1] | ((ir[0] & 0x03) << 8);
782 y = ir[2] << 2; 782 y = ir[2] | ((ir[0] & 0x0c) << 6);
783
784 x |= ir[0] & 0x3;
785 y |= (ir[0] >> 2) & 0x3;
786 } else { 783 } else {
787 x = ir[0] << 2; 784 x = ir[0] | ((ir[2] & 0x30) << 4);
788 y = ir[1] << 2; 785 y = ir[1] | ((ir[2] & 0xc0) << 2);
789
790 x |= (ir[2] >> 4) & 0x3;
791 y |= (ir[2] >> 6) & 0x3;
792 } 786 }
793 787
794 input_report_abs(wdata->ir, xid, x); 788 input_report_abs(wdata->ir, xid, x);