Skip to content

Commit 34087cf

Browse files
ewhacgregkh
authored andcommitted
Input: spaceball - fix parsing of movement data packets
commit bc7ec91 upstream. The spaceball.c module was not properly parsing the movement reports coming from the device. The code read axis data as signed 16-bit little-endian values starting at offset 2. In fact, axis data in Spaceball movement reports are signed 16-bit big-endian values starting at offset 3. This was determined first by visually inspecting the data packets, and later verified by consulting: http://spacemice.org/pdf/SpaceBall_2003-3003_Protocol.pdf If this ever worked properly, it was in the time before Git... Signed-off-by: Leo L. Schwab <ewhac@ewhac.org> Link: https://lore.kernel.org/r/20211221101630.1146385-1-ewhac@ewhac.org Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 9f329d0 commit 34087cf

1 file changed

Lines changed: 9 additions & 2 deletions

File tree

drivers/input/joystick/spaceball.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <linux/module.h>
2020
#include <linux/input.h>
2121
#include <linux/serio.h>
22+
#include <asm/unaligned.h>
2223

2324
#define DRIVER_DESC "SpaceTec SpaceBall 2003/3003/4000 FLX driver"
2425

@@ -75,9 +76,15 @@ static void spaceball_process_packet(struct spaceball* spaceball)
7576

7677
case 'D': /* Ball data */
7778
if (spaceball->idx != 15) return;
78-
for (i = 0; i < 6; i++)
79+
/*
80+
* Skip first three bytes; read six axes worth of data.
81+
* Axis values are signed 16-bit big-endian.
82+
*/
83+
data += 3;
84+
for (i = 0; i < ARRAY_SIZE(spaceball_axes); i++) {
7985
input_report_abs(dev, spaceball_axes[i],
80-
(__s16)((data[2 * i + 3] << 8) | data[2 * i + 2]));
86+
(__s16)get_unaligned_be16(&data[i * 2]));
87+
}
8188
break;
8289

8390
case 'K': /* Button data */

0 commit comments

Comments
 (0)