Jiri Slaby 10896b
From: Ping Cheng <pinglinux@gmail.com>
Jiri Slaby 10896b
Date: Fri, 24 Feb 2023 08:26:43 -0800
Jiri Slaby 10896b
Subject: [PATCH] HID: wacom: insert timestamp to packed Bluetooth (BT) events
Jiri Slaby 10896b
References: bsc#1012628
Jiri Slaby 10896b
Patch-mainline: 6.3.3
Jiri Slaby 10896b
Git-commit: 17d793f3ed53080dab6bbeabfc82de890c901001
Jiri Slaby 10896b
Jiri Slaby 10896b
commit 17d793f3ed53080dab6bbeabfc82de890c901001 upstream.
Jiri Slaby 10896b
Jiri Slaby 10896b
To fully utilize the BT polling/refresh rate, a few input events
Jiri Slaby 10896b
are sent together to reduce event delay. This causes issue to the
Jiri Slaby 10896b
timestamp generated by input_sync since all the events in the same
Jiri Slaby 10896b
packet would pretty much have the same timestamp. This patch inserts
Jiri Slaby 10896b
time interval to the events by averaging the total time used for
Jiri Slaby 10896b
sending the packet.
Jiri Slaby 10896b
Jiri Slaby 10896b
This decision was mainly based on observing the actual time interval
Jiri Slaby 10896b
between each BT polling. The interval doesn't seem to be constant,
Jiri Slaby 10896b
due to the network and system environment. So, using solutions other
Jiri Slaby 10896b
than averaging doesn't end up with valid timestamps.
Jiri Slaby 10896b
Jiri Slaby 10896b
Signed-off-by: Ping Cheng <ping.cheng@wacom.com>
Jiri Slaby 10896b
Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com>
Jiri Slaby 10896b
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Jiri Slaby 10896b
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Jiri Slaby 10896b
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby 10896b
---
Jiri Slaby 10896b
 drivers/hid/wacom_wac.c | 26 ++++++++++++++++++++++++++
Jiri Slaby 10896b
 drivers/hid/wacom_wac.h |  1 +
Jiri Slaby 10896b
 2 files changed, 27 insertions(+)
Jiri Slaby 10896b
Jiri Slaby 10896b
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
Jiri Slaby 10896b
index e499b447..0c6a82c6 100644
Jiri Slaby 10896b
--- a/drivers/hid/wacom_wac.c
Jiri Slaby 10896b
+++ b/drivers/hid/wacom_wac.c
Jiri Slaby 10896b
@@ -1308,6 +1308,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
Jiri Slaby 10896b
 
Jiri Slaby 10896b
 	struct input_dev *pen_input = wacom->pen_input;
Jiri Slaby 10896b
 	unsigned char *data = wacom->data;
Jiri Slaby 10896b
+	int number_of_valid_frames = 0;
Jiri Slaby 10896b
+	int time_interval = 15000000;
Jiri Slaby 10896b
+	ktime_t time_packet_received = ktime_get();
Jiri Slaby 10896b
 	int i;
Jiri Slaby 10896b
 
Jiri Slaby 10896b
 	if (wacom->features.type == INTUOSP2_BT ||
Jiri Slaby 10896b
@@ -1328,12 +1331,30 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
Jiri Slaby 10896b
 		wacom->id[0] |= (wacom->serial[0] >> 32) & 0xFFFFF;
Jiri Slaby 10896b
 	}
Jiri Slaby 10896b
 
Jiri Slaby 10896b
+	/* number of valid frames */
Jiri Slaby 10896b
 	for (i = 0; i < pen_frames; i++) {
Jiri Slaby 10896b
 		unsigned char *frame = &data[i*pen_frame_len + 1];
Jiri Slaby 10896b
 		bool valid = frame[0] & 0x80;
Jiri Slaby 10896b
+
Jiri Slaby 10896b
+		if (valid)
Jiri Slaby 10896b
+			number_of_valid_frames++;
Jiri Slaby 10896b
+	}
Jiri Slaby 10896b
+
Jiri Slaby 10896b
+	if (number_of_valid_frames) {
Jiri Slaby 10896b
+		if (wacom->hid_data.time_delayed)
Jiri Slaby 10896b
+			time_interval = ktime_get() - wacom->hid_data.time_delayed;
Jiri Slaby 10896b
+		time_interval /= number_of_valid_frames;
Jiri Slaby 10896b
+		wacom->hid_data.time_delayed = time_packet_received;
Jiri Slaby 10896b
+	}
Jiri Slaby 10896b
+
Jiri Slaby 10896b
+	for (i = 0; i < number_of_valid_frames; i++) {
Jiri Slaby 10896b
+		unsigned char *frame = &data[i*pen_frame_len + 1];
Jiri Slaby 10896b
+		bool valid = frame[0] & 0x80;
Jiri Slaby 10896b
 		bool prox = frame[0] & 0x40;
Jiri Slaby 10896b
 		bool range = frame[0] & 0x20;
Jiri Slaby 10896b
 		bool invert = frame[0] & 0x10;
Jiri Slaby 10896b
+		int frames_number_reversed = number_of_valid_frames - i - 1;
Jiri Slaby 10896b
+		int event_timestamp = time_packet_received - frames_number_reversed * time_interval;
Jiri Slaby 10896b
 
Jiri Slaby 10896b
 		if (!valid)
Jiri Slaby 10896b
 			continue;
Jiri Slaby 10896b
@@ -1346,6 +1367,7 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
Jiri Slaby 10896b
 			wacom->tool[0] = 0;
Jiri Slaby 10896b
 			wacom->id[0] = 0;
Jiri Slaby 10896b
 			wacom->serial[0] = 0;
Jiri Slaby 10896b
+			wacom->hid_data.time_delayed = 0;
Jiri Slaby 10896b
 			return;
Jiri Slaby 10896b
 		}
Jiri Slaby 10896b
 
Jiri Slaby 10896b
@@ -1382,6 +1404,7 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
Jiri Slaby 10896b
 						 get_unaligned_le16(&frame[11]));
Jiri Slaby 10896b
 			}
Jiri Slaby 10896b
 		}
Jiri Slaby 10896b
+
Jiri Slaby 10896b
 		if (wacom->tool[0]) {
Jiri Slaby 10896b
 			input_report_abs(pen_input, ABS_PRESSURE, get_unaligned_le16(&frame[5]));
Jiri Slaby 10896b
 			if (wacom->features.type == INTUOSP2_BT ||
Jiri Slaby 10896b
@@ -1405,6 +1428,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
Jiri Slaby 10896b
 
Jiri Slaby 10896b
 		wacom->shared->stylus_in_proximity = prox;
Jiri Slaby 10896b
 
Jiri Slaby 10896b
+		/* add timestamp to unpack the frames */
Jiri Slaby 10896b
+		input_set_timestamp(pen_input, event_timestamp);
Jiri Slaby 10896b
+
Jiri Slaby 10896b
 		input_sync(pen_input);
Jiri Slaby 10896b
 	}
Jiri Slaby 10896b
 }
Jiri Slaby 10896b
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
Jiri Slaby 10896b
index 16f22138..1a40bb8c 100644
Jiri Slaby 10896b
--- a/drivers/hid/wacom_wac.h
Jiri Slaby 10896b
+++ b/drivers/hid/wacom_wac.h
Jiri Slaby 10896b
@@ -324,6 +324,7 @@ struct hid_data {
Jiri Slaby 10896b
 	int ps_connected;
Jiri Slaby 10896b
 	bool pad_input_event_flag;
Jiri Slaby 10896b
 	unsigned short sequence_number;
Jiri Slaby 10896b
+	int time_delayed;
Jiri Slaby 10896b
 };
Jiri Slaby 10896b
 
Jiri Slaby 10896b
 struct wacom_remote_data {
Jiri Slaby 10896b
-- 
Jiri Slaby 10896b
2.35.3
Jiri Slaby 10896b