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