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>
This commit is contained in:
parent
692d30d63b
commit
74b89e8a36
|
@ -769,7 +769,7 @@ static void __ir_to_input(struct wiimote_data *wdata, const __u8 *ir,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Basic IR data is encoded into 3 bytes. The first two bytes are the
|
* Basic IR data is encoded into 3 bytes. The first two bytes are the
|
||||||
* upper 8 bit of the X/Y data, the 3rd byte contains the lower 2 bits
|
* lower 8 bit of the X/Y data, the 3rd byte contains the upper 2 bits
|
||||||
* of both.
|
* of both.
|
||||||
* If data is packed, then the 3rd byte is put first and slightly
|
* If data is packed, then the 3rd byte is put first and slightly
|
||||||
* reordered. This allows to interleave packed and non-packed data to
|
* 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,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (packed) {
|
if (packed) {
|
||||||
x = ir[1] << 2;
|
x = ir[1] | ((ir[0] & 0x03) << 8);
|
||||||
y = ir[2] << 2;
|
y = ir[2] | ((ir[0] & 0x0c) << 6);
|
||||||
|
|
||||||
x |= ir[0] & 0x3;
|
|
||||||
y |= (ir[0] >> 2) & 0x3;
|
|
||||||
} else {
|
} else {
|
||||||
x = ir[0] << 2;
|
x = ir[0] | ((ir[2] & 0x30) << 4);
|
||||||
y = ir[1] << 2;
|
y = ir[1] | ((ir[2] & 0xc0) << 2);
|
||||||
|
|
||||||
x |= (ir[2] >> 4) & 0x3;
|
|
||||||
y |= (ir[2] >> 6) & 0x3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
input_report_abs(wdata->ir, xid, x);
|
input_report_abs(wdata->ir, xid, x);
|
||||||
|
|
Loading…
Reference in New Issue