|
@@ -158,18 +158,21 @@ static void magicmouse_emit_buttons(struct magicmouse_sc *msc, int state)
|
|
|
static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tdata)
|
|
|
{
|
|
|
struct input_dev *input = msc->input;
|
|
|
- __s32 x_y = tdata[0] << 8 | tdata[1] << 16 | tdata[2] << 24;
|
|
|
- int misc = tdata[5] | tdata[6] << 8;
|
|
|
- int id = (misc >> 6) & 15;
|
|
|
- int x = x_y << 12 >> 20;
|
|
|
- int y = -(x_y >> 20);
|
|
|
- int down = (tdata[7] & TOUCH_STATE_MASK) != TOUCH_STATE_NONE;
|
|
|
+ int id = (tdata[6] << 2 | tdata[5] >> 6) & 0xf;
|
|
|
+ int x = (tdata[1] << 28 | tdata[0] << 20) >> 20;
|
|
|
+ int y = -((tdata[2] << 24 | tdata[1] << 16) >> 20);
|
|
|
+ int size = tdata[5] & 0x3f;
|
|
|
+ int orientation = (tdata[6] >> 2) - 32;
|
|
|
+ int touch_major = tdata[3];
|
|
|
+ int touch_minor = tdata[4];
|
|
|
+ int state = tdata[7] & TOUCH_STATE_MASK;
|
|
|
+ int down = state != TOUCH_STATE_NONE;
|
|
|
|
|
|
/* Store tracking ID and other fields. */
|
|
|
msc->tracking_ids[raw_id] = id;
|
|
|
msc->touches[id].x = x;
|
|
|
msc->touches[id].y = y;
|
|
|
- msc->touches[id].size = misc & 63;
|
|
|
+ msc->touches[id].size = size;
|
|
|
|
|
|
/* If requested, emulate a scroll wheel by detecting small
|
|
|
* vertical touch motions.
|
|
@@ -180,7 +183,7 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
|
|
|
int step_y = msc->touches[id].scroll_y - y;
|
|
|
|
|
|
/* Calculate and apply the scroll motion. */
|
|
|
- switch (tdata[7] & TOUCH_STATE_MASK) {
|
|
|
+ switch (state) {
|
|
|
case TOUCH_STATE_START:
|
|
|
msc->touches[id].scroll_x = x;
|
|
|
msc->touches[id].scroll_y = y;
|
|
@@ -216,11 +219,9 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
|
|
|
|
|
|
/* Generate the input events for this touch. */
|
|
|
if (report_touches && down) {
|
|
|
- int orientation = (misc >> 10) - 32;
|
|
|
-
|
|
|
input_report_abs(input, ABS_MT_TRACKING_ID, id);
|
|
|
- input_report_abs(input, ABS_MT_TOUCH_MAJOR, tdata[3]);
|
|
|
- input_report_abs(input, ABS_MT_TOUCH_MINOR, tdata[4]);
|
|
|
+ input_report_abs(input, ABS_MT_TOUCH_MAJOR, touch_major);
|
|
|
+ input_report_abs(input, ABS_MT_TOUCH_MINOR, touch_minor);
|
|
|
input_report_abs(input, ABS_MT_ORIENTATION, orientation);
|
|
|
input_report_abs(input, ABS_MT_POSITION_X, x);
|
|
|
input_report_abs(input, ABS_MT_POSITION_Y, y);
|