Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4fc19381 authored by Ping Cheng's avatar Ping Cheng Committed by Dmitry Torokhov
Browse files

Input: wacom - do not send 2FGT Tablet PC events in TAP format



2FGT Tablet PC touch events were processed in _TAP_ format. Remove
them so we can change to _MT_ format.

Signed-off-by: default avatarPing Cheng <pingc@wacom.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 0d3c0737
Loading
Loading
Loading
Loading
+8 −76
Original line number Diff line number Diff line
@@ -675,40 +675,6 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
	return 1;
}


static void wacom_tpc_finger_in(struct wacom_wac *wacom, char *data, int idx)
{
	struct input_dev *input = wacom->input;
	int finger = idx + 1;
	int x = le16_to_cpup((__le16 *)&data[finger * 2]) & 0x7fff;
	int y = le16_to_cpup((__le16 *)&data[4 + finger * 2]) & 0x7fff;

	/*
	 * Work around input core suppressing "duplicate" events since
	 * we are abusing ABS_X/ABS_Y to transmit multi-finger data.
	 * This should go away once we switch to true multitouch
	 * protocol.
	 */
	if (wacom->last_finger != finger) {
		if (x == input_abs_get_val(input, ABS_X))
			x++;

		if (y == input_abs_get_val(input, ABS_Y))
			y++;
	}

	input_report_abs(input, ABS_X, x);
	input_report_abs(input, ABS_Y, y);
	input_report_abs(input, ABS_MISC, wacom->id[0]);
	input_report_key(input, wacom->tool[finger], 1);
	if (!idx)
		input_report_key(input, BTN_TOUCH, 1);
	input_event(input, EV_MSC, MSC_SERIAL, finger);
	input_sync(input);

	wacom->last_finger = finger;
}

static void wacom_tpc_touch_out(struct wacom_wac *wacom, int idx)
{
	struct input_dev *input = wacom->input;
@@ -731,7 +697,6 @@ static void wacom_tpc_touch_in(struct wacom_wac *wacom, size_t len)

	wacom->tool[1] = BTN_TOOL_DOUBLETAP;
	wacom->id[0] = TOUCH_DEVICE_ID;
	wacom->tool[2] = BTN_TOOL_TRIPLETAP;

	if (len != WACOM_PKGLEN_TPC1FG) {

@@ -746,18 +711,6 @@ static void wacom_tpc_touch_in(struct wacom_wac *wacom, size_t len)
			input_report_key(input, wacom->tool[1], 1);
			input_sync(input);
			break;

		case WACOM_REPORT_TPC2FG:
			if (data[1] & 0x01)
				wacom_tpc_finger_in(wacom, data, 0);
			else if (wacom->id[1] & 0x01)
				wacom_tpc_touch_out(wacom, 0);

			if (data[1] & 0x02)
				wacom_tpc_finger_in(wacom, data, 1);
			else if (wacom->id[1] & 0x02)
				wacom_tpc_touch_out(wacom, 1);
			break;
		}
	} else {
		input_report_abs(input, ABS_X, get_unaligned_le16(&data[1]));
@@ -779,46 +732,25 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)

	dbg("wacom_tpc_irq: received report #%d", data[0]);

	if (len == WACOM_PKGLEN_TPC1FG ||		 /* single touch */
	    data[0] == WACOM_REPORT_TPC1FG ||		 /* single touch */
	    data[0] == WACOM_REPORT_TPC2FG) {		 /* 2FG touch */
	if (len == WACOM_PKGLEN_TPC1FG ||
	    data[0] == WACOM_REPORT_TPC1FG) {	/* single touch */

		if (wacom->shared->stylus_in_proximity) {
			if (wacom->id[1] & 0x01)
				wacom_tpc_touch_out(wacom, 0);

			if (wacom->id[1] & 0x02)
				wacom_tpc_touch_out(wacom, 1);

			wacom->id[1] = 0;
			return 0;
		}

		if (len == WACOM_PKGLEN_TPC1FG) {	/* with touch */
		if (len == WACOM_PKGLEN_TPC1FG)
			prox = data[0] & 0x01;
		} else {  /* with capacity */
			if (data[0] == WACOM_REPORT_TPC1FG)
				/* single touch */
		else  /* with capacity */
			prox = data[1] & 0x01;
			else
				/* 2FG touch data */
				prox = data[1] & 0x03;
		}

		if (prox) {
			if (!wacom->id[1])
				wacom->last_finger = 1;
		if (prox)
			wacom_tpc_touch_in(wacom, len);
		} else {
			if (data[0] == WACOM_REPORT_TPC2FG) {
				/* 2FGT out-prox */
				if (wacom->id[1] & 0x01)
					wacom_tpc_touch_out(wacom, 0);

				if (wacom->id[1] & 0x02)
					wacom_tpc_touch_out(wacom, 1);
			} else
				/* one finger touch */
		else {
			wacom_tpc_touch_out(wacom, 0);

			wacom->id[0] = 0;
+2 −3
Original line number Diff line number Diff line
@@ -93,10 +93,9 @@ struct wacom_shared {
struct wacom_wac {
	char name[64];
	unsigned char *data;
	int tool[3];
	int id[3];
	int tool[2];
	int id[2];
	__u32 serial[2];
	int last_finger;
	struct wacom_features features;
	struct wacom_shared *shared;
	struct input_dev *input;