On Tue, 8 May 2012, David Herrmann wrote: > 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@xxxxxxxxxx > Reported-by: Peter Bukovsky <bukovsky.peter@xxxxxxxxx> > Signed-off-by: David Herrmann <dh.herrmann@xxxxxxxxxxxxxx> > --- > drivers/hid/hid-wiimote-core.c | 16 +++++----------- > 1 file changed, 5 insertions(+), 11 deletions(-) > > diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c > index cac3589..84e2fbe 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, > > /* > * 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. > * If data is packed, then the 3rd byte is put first and slightly > * 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) { > - x = ir[1] << 2; > - y = ir[2] << 2; > - > - x |= ir[0] & 0x3; > - y |= (ir[0] >> 2) & 0x3; > + x = ir[1] | ((ir[0] & 0x03) << 8); > + y = ir[2] | ((ir[0] & 0x0c) << 6); > } else { > - x = ir[0] << 2; > - y = ir[1] << 2; > - > - x |= (ir[2] >> 4) & 0x3; > - y |= (ir[2] >> 6) & 0x3; > + x = ir[0] | ((ir[2] & 0x30) << 4); > + y = ir[1] | ((ir[2] & 0xc0) << 2); Applied, thanks David. -- Jiri Kosina SUSE Labs -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html