lkml.org 
[lkml]   [2012]   [May]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 31/94] HID: wiimote: Fix IR data parser
    3.3-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: David Herrmann <dh.herrmann@googlemail.com>

    commit 74b89e8a3625c17c7452532dfb997ac4f1a38751 upstream.

    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.

    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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/hid/hid-wiimote-core.c | 16 +++++-----------
    1 file changed, 5 insertions(+), 11 deletions(-)

    --- 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

    /*
    * 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
    */

    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);
    }

    input_report_abs(wdata->ir, xid, x);



    \
     
     \ /
      Last update: 2012-05-27 04:41    [W:4.744 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site