From nobody Tue Dec 2 02:04:30 2025 Received: from fout-b5-smtp.messagingengine.com (fout-b5-smtp.messagingengine.com [202.12.124.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97B96381AF; Fri, 21 Nov 2025 01:07:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763687263; cv=none; b=ihZL6ITIVw1HaYNdQw9GE8hdoYxP72bYSMFYZI+RjdXNOSGg0IMpovfV3YegVmcYPl0qF0oD3uKmx+HXmK6rowC9H/VV0QFpRYt6CDM0EExef9jZDuRg5nPi20hoBcKtyMK69uGSHD9njRkWmSBV6ydKJXgJRHvKkfH0EXxTZQA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763687263; c=relaxed/simple; bh=fQfZ3bxD/S+hRVj/cWNhZRvET046tgfhHw/kZkeYAeY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HCYPhUZDJ8mNy94DxbZduJAMBUMReo6YlEjnwinUsMBvF0cv4svdSw4UrFc+cCNnvx1NdhkmdUJdgkXgkGT2ap8oL9FjO7Jnm9jJ+xJa56lT+k+pQPgtDyABNro2hrVTezfKaxwEFG9i/Rj9PSpC3dFfTdvIqjoI+bF7PVsDpDI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=who-t.net; spf=pass smtp.mailfrom=who-t.net; dkim=pass (2048-bit key) header.d=who-t.net header.i=@who-t.net header.b=kZI5MxAs; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=pHi4dfYS; arc=none smtp.client-ip=202.12.124.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=who-t.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=who-t.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=who-t.net header.i=@who-t.net header.b="kZI5MxAs"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="pHi4dfYS" Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfout.stl.internal (Postfix) with ESMTP id A1C5B1D00238; Thu, 20 Nov 2025 20:07:40 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-05.internal (MEProxy); Thu, 20 Nov 2025 20:07:40 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=who-t.net; h=cc :cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm2; t=1763687260; x=1763773660; bh=H5bUK2RPSuk/U3cKqzetAtWj+ditPSaDuPILFklbIsk=; b= kZI5MxAsgVVJw3reTU924nftxxchfCHxAWxgZHH8rNEODnc0KOlsp6H3mXmtfYe0 H3Mc1qA4Icftdw3JB/+82IBtGGhNwpnNkWNU6/uBmfkS3qihvgO16EWlkA5ByFD3 g3M4yxUNg1KK+we9mI7eFup7fspGG9QeE32IP5CDLCUyAKbKAp8dexubMaXZLmCO QPWTZKFp6N1cpH4u1+dEFaRrm2W/vL/ESW/maHsMyZsX6QQJ0ruKkpw68xuHJMhA QhbYhCeX9/kzHssXjbSwrbVA5l0syXJcV8XK107wMQymnMgliyOudUSA2cOmLX7i PMhUNoltzO/aEqp4Oyl3Cw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1763687260; x= 1763773660; bh=H5bUK2RPSuk/U3cKqzetAtWj+ditPSaDuPILFklbIsk=; b=p Hi4dfYSViJ3UB3lToJtD5oNF7S3zMIiL+X/iJq2uwSkN58AosI22d0XPfMJ1sacS BhJaWyl9pt5iU7IhjHbyVFugtNh5f1vo0eumWbHkZHMnEAFTIT0+CPnXqBbLmyNW saMq6ZEHXaqlkGhpXe74xlUlaqDZm8ROli0+jtvrunqmbT440QODrIeO002JN8eU yasC+zRIvii0MI440Tn4sk1048UrxC2rY7MIdXajAvaPGEkIJb1jc3enSyxb92I3 js2QUJriSF2XlXn/KXFYjh3pn/S3/H57FarRIMYhmy4Rpq4+gzARsXfCmxCPykAI RtFrTW2xZVSmTLy5mhWew== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggddvvdekiedtucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephfffufggtgfgkfhfjgfvvefosehtjeertdertdejnecuhfhrohhmpefrvghtvghr ucfjuhhtthgvrhgvrhcuoehpvghtvghrrdhhuhhtthgvrhgvrhesfihhohdqthdrnhgvth eqnecuggftrfgrthhtvghrnheptdetffeliefgueeuudfgkeeiveektddufeetjeelveef gfeiheeggeekjedtvdejnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrg hilhhfrhhomhepphgvthgvrhdrhhhuthhtvghrvghrseifhhhoqdhtrdhnvghtpdhnsggp rhgtphhtthhopeelpdhmohguvgepshhmthhpohhuthdprhgtphhtthhopehshhhurghhse hkvghrnhgvlhdrohhrghdprhgtphhtthhopehlihhnuhigqdhkvghrnhgvlhesvhhgvghr rdhkvghrnhgvlhdrohhrghdprhgtphhtthhopehlihhnuhigqdhinhhpuhhtsehvghgvrh drkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepsggvnhhtihhssheskhgvrhhnvghlrdho rhhgpdhrtghpthhtohepughmihhtrhihrdhtohhrohhkhhhovhesghhmrghilhdrtghomh dprhgtphhtthhopehvrgguihhmsegtihhrqhhuvgdrtghomhdprhgtphhtthhopehlihhn uhigqdhkshgvlhhfthgvshhtsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtoh epphgvthgvrhdrhhhuthhtvghrvghrseifhhhoqdhtrdhnvghtpdhrtghpthhtohepjhhi khhosheskhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i7ce144cd:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 20 Nov 2025 20:07:37 -0500 (EST) From: Peter Hutterer Date: Fri, 21 Nov 2025 11:07:11 +1000 Subject: [PATCH 1/3] selftests/hid: require hidtools 0.12 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251121-wip-hid-pressurepad-v1-1-e32e5565a527@who-t.net> References: <20251121-wip-hid-pressurepad-v1-0-e32e5565a527@who-t.net> In-Reply-To: <20251121-wip-hid-pressurepad-v1-0-e32e5565a527@who-t.net> To: Jiri Kosina , Benjamin Tissoires , Shuah Khan Cc: Dmitry Torokhov , linux-input@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Vadim Klishko , Peter Hutterer X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1582; i=peter.hutterer@who-t.net; h=from:subject:message-id; bh=fQfZ3bxD/S+hRVj/cWNhZRvET046tgfhHw/kZkeYAeY=; b=owGbwMvMwCT4yLquYEv6h/2Mp9WSGDLld4fuXuS6OSyB/43jg1crbi+fte9j2oSX+ZvaPX58j D15/27Mjo5YFgZBJgZZMUUWGx3nmy61kRbvXQNfw8xhZQIZwsDFKQATUfRhmGf8LMDh88JleYvk fvldDO/es9u9fQLD/JiDlYrJZUeXHV5w+6jyiprb52Im3AAA X-Developer-Key: i=peter.hutterer@who-t.net; a=openpgp; fpr=3C2C43D9447D5938EF4551EBE23B7E70B467F0BF Not all our tests really require it but since it's likely pip-installed anyway it's trivial to require the new version, just in case we want to start cleaning up other bits. Signed-off-by: Peter Hutterer --- tools/testing/selftests/hid/tests/conftest.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/testing/selftests/hid/tests/conftest.py b/tools/testing/= selftests/hid/tests/conftest.py index 1361ec981db6f79a58cf91e8732dcd7c05c47d38..985a535324b2fbe322e754e561d= 7af6898345b27 100644 --- a/tools/testing/selftests/hid/tests/conftest.py +++ b/tools/testing/selftests/hid/tests/conftest.py @@ -5,6 +5,7 @@ # Copyright (c) 2017 Benjamin Tissoires # Copyright (c) 2017 Red Hat, Inc. =20 +from packaging.version import Version import platform import pytest import re @@ -14,6 +15,19 @@ from .base import HIDTestUdevRule from pathlib import Path =20 =20 +@pytest.fixture(autouse=3DTrue) +def hidtools_version_check(): + HIDTOOLS_VERSION =3D "0.12" + try: + import hidtools + + version =3D hidtools.__version__ # type: ignore + if Version(version) < Version(HIDTOOLS_VERSION): + pytest.skip(reason=3Df"have hidtools {version}, require >=3D{H= IDTOOLS_VERSION}") + except Exception: + pytest.skip(reason=3Df"hidtools >=3D{HIDTOOLS_VERSION} required") + + # See the comment in HIDTestUdevRule, this doesn't set up but it will clean # up once the last test exited. @pytest.fixture(autouse=3DTrue, scope=3D"session") --=20 2.51.1 From nobody Tue Dec 2 02:04:30 2025 Received: from fhigh-b5-smtp.messagingengine.com (fhigh-b5-smtp.messagingengine.com [202.12.124.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2493D27703E; Fri, 21 Nov 2025 01:07:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.156 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763687266; cv=none; b=FWC0FdCSSB9GSfq1YtDjxLwUzSPKdzw2YYN/TgPoCSOleA8l1Mi/G1GYX63/BVxAUHHK/Qjlwu1T8eSiL3tn6HXvpJtMaoTL8PJHf2R/+lPbAdJd8qgNG8sj+GcUy/1leisqiCUlTrKnoS8pNzDp1BUbcqquC2eqQnM4s6KfHak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763687266; c=relaxed/simple; bh=aj8jO1hPBjsPtMUS5tjA/50PXJwqy1Z02JzgOhNjvRs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=E8Suiczi4qf/1bShrp5umpdALNzrhEVK9Jcvww9NpxtDurZEL2q9pE7AIUtmmrNgzVkPEw24JfENY+VDSiPnRT8uGXkF4Nn9fkobI4gkUZbTLrEMTDjeA1J1DAHxHySJen50T944XbShk8bN1nIWksM4/L538E5RPX4zFjsLSEk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=who-t.net; spf=pass smtp.mailfrom=who-t.net; dkim=pass (2048-bit key) header.d=who-t.net header.i=@who-t.net header.b=gON/6Awy; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=jwIYec9m; arc=none smtp.client-ip=202.12.124.156 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=who-t.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=who-t.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=who-t.net header.i=@who-t.net header.b="gON/6Awy"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="jwIYec9m" Received: from phl-compute-01.internal (phl-compute-01.internal [10.202.2.41]) by mailfhigh.stl.internal (Postfix) with ESMTP id 3EA2B7A0035; Thu, 20 Nov 2025 20:07:44 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Thu, 20 Nov 2025 20:07:44 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=who-t.net; h=cc :cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm2; t=1763687264; x=1763773664; bh=AbCygkFIcWfwu1F6Lp8axQFGJ43F+ftdjxZvH/VM+Ts=; b= gON/6AwyYY/FqBy6RYxYs8fcz6qTkDjdJb/IyTwBkMFBNNdHURnRoFd7fM3GdKWl qHuPuWugJyEjWBaau072E68lItJt9KjpsTk8lUgn+69PEIVh+HA3tj1skewKr51Z 9q2D905K0TKtXX8l6BLL9zS13K7IBg6KdUCT3/kWB+jN+aFeoXoKQdHrmBIFBF1p wDrgPNkdZjf4Y1JFb1lydk53BOwkjWgSYSNk5PdtWB35LITNj5orK9aG1ZoiraRY Jwtz9CjhA4JFH+Ia/7NYssKwKtAcWD5/51Rme6LjBO4MAE7vEsHLzLHhxgmlZ0VU QVZiXWuQomE1TMfY1x5DhQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1763687264; x= 1763773664; bh=AbCygkFIcWfwu1F6Lp8axQFGJ43F+ftdjxZvH/VM+Ts=; b=j wIYec9ml8Z/c1SO7IB66vu+QQ5WW6PKx3MsILEZ3sTUrbyr0WFvVEO/ReUA6cIPQ FsPG6lMP4TWV5ZRtXn0RtT8wnksANMr8pRG7PjbLmL7EwruAnIDRgooBUPWbrivr NZGD2wjJCcWypP4fTazcy7aJpxaj/E4keNLsbEnCr7y0sb7Z3Kovw15HZ/JWPj1h 6zVeJHEQKqTZ1nle4YE6xM96FUG6Sn1F/+ZVxTzQ4aBDACawPhFDDb6lMAUliSN5 pFcSuAYXdfXN6ByB1fAi8m+sJMGY2MG6LYv7O+Ezmv3Au0QOf+Jrk8nHEgmsrUbR GpEj33AS+nC/9zmMdNVhg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggddvvdekheelucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephfffufggtgfgkfhfjgfvvefosehtjeertdertdejnecuhfhrohhmpefrvghtvghr ucfjuhhtthgvrhgvrhcuoehpvghtvghrrdhhuhhtthgvrhgvrhesfihhohdqthdrnhgvth eqnecuggftrfgrthhtvghrnhepgffgffevfffgjedvkeefgeeuhfeihfefkeegjeettdel ueeiueegtedvkeevgfeknecuffhomhgrihhnpehfrhgvvgguvghskhhtohhprdhorhhgne cuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepphgvthgv rhdrhhhuthhtvghrvghrseifhhhoqdhtrdhnvghtpdhnsggprhgtphhtthhopeelpdhmoh guvgepshhmthhpohhuthdprhgtphhtthhopehshhhurghhsehkvghrnhgvlhdrohhrghdp rhgtphhtthhopehlihhnuhigqdhkvghrnhgvlhesvhhgvghrrdhkvghrnhgvlhdrohhrgh dprhgtphhtthhopehlihhnuhigqdhinhhpuhhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg pdhrtghpthhtohepsggvnhhtihhssheskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepug hmihhtrhihrdhtohhrohhkhhhovhesghhmrghilhdrtghomhdprhgtphhtthhopehvrggu ihhmsegtihhrqhhuvgdrtghomhdprhgtphhtthhopehlihhnuhigqdhkshgvlhhfthgvsh htsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepphgvthgvrhdrhhhuthht vghrvghrseifhhhoqdhtrdhnvghtpdhrtghpthhtohepjhhikhhosheskhgvrhhnvghlrd horhhg X-ME-Proxy: Feedback-ID: i7ce144cd:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 20 Nov 2025 20:07:41 -0500 (EST) From: Peter Hutterer Date: Fri, 21 Nov 2025 11:07:12 +1000 Subject: [PATCH 2/3] selftests/hid: use a enum class for the different button types Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251121-wip-hid-pressurepad-v1-2-e32e5565a527@who-t.net> References: <20251121-wip-hid-pressurepad-v1-0-e32e5565a527@who-t.net> In-Reply-To: <20251121-wip-hid-pressurepad-v1-0-e32e5565a527@who-t.net> To: Jiri Kosina , Benjamin Tissoires , Shuah Khan Cc: Dmitry Torokhov , linux-input@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Vadim Klishko , Peter Hutterer X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7116; i=peter.hutterer@who-t.net; h=from:subject:message-id; bh=Lc3IOQF10ywFvV7hlfa4v/mu7pLgSPj6/TO/Ja4brfA=; b=owGbwMvMwCT4yLquYEv6h/2Mp9WSGDLld4eerdeYribW+jRmYZjMPWG1l71vp03t3HwwX2KXR +ftUnbnjlgWBkEmBlkxRRYbHeebLrWRFu9dA1/DzGFlAhnCwMUpABO5uZNhfhBn92Zj18AVGS1X tx6Rjl5TrHrhJcOC7p/C6xbpT/3K5v6xwmGlUesdGyVxAA== X-Developer-Key: i=peter.hutterer@who-t.net; a=openpgp; fpr=3C2C43D9447D5938EF4551EBE23B7E70B467F0BF Instead of multiple spellings of a string-provided argument, let's make this a tad more type-safe and use an enum here. And while we do this fix the two wrong devices: - elan_04f3_313a (HP ZBook Fury 15) is discrete button pad - dell_044e_1220 (Dell Precision 7740) is a discrete button pad Equivalent hid-tools commit https://gitlab.freedesktop.org/libevdev/hid-tools/-/commit/8300a55bf4213c6a= 252cab8cb5b34c9ddb191625 Signed-off-by: Peter Hutterer --- .../testing/selftests/hid/tests/test_multitouch.py | 24 +++++++++++++-----= ---- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/hid/tests/test_multitouch.py b/tools/t= esting/selftests/hid/tests/test_multitouch.py index ece0ba8e7d34b75d42245e5936ecf804c46b0846..a06a087f00b6991f7514adf7f8c= 713bef1a43563 100644 --- a/tools/testing/selftests/hid/tests/test_multitouch.py +++ b/tools/testing/selftests/hid/tests/test_multitouch.py @@ -9,6 +9,7 @@ from . import base from hidtools.hut import HUT from hidtools.util import BusType +import enum import libevdev import logging import pytest @@ -232,11 +233,17 @@ class Digitizer(base.UHIDTestDevice): return 0 =20 =20 +class HIDButtonType(enum.IntEnum): + CLICKPAD =3D 0 + PRESSUREPAD =3D 1 + DISCRETE_BUTTONS =3D 2 + + class PTP(Digitizer): def __init__( self, name, - type=3D"Click Pad", + buttontype=3DHIDButtonType.CLICKPAD, rdesc_str=3DNone, rdesc=3DNone, application=3D"Touch Pad", @@ -244,11 +251,8 @@ class PTP(Digitizer): max_contacts=3DNone, input_info=3DNone, ): - self.type =3D type.lower().replace(" ", "") - if self.type =3D=3D "clickpad": - self.buttontype =3D 0 - else: # pressurepad - self.buttontype =3D 1 + self.buttontype =3D buttontype + self.clickpad_state =3D False self.left_state =3D False self.right_state =3D False @@ -983,7 +987,7 @@ class BaseTest: uhdev =3D self.uhdev evdev =3D uhdev.get_evdev() =20 - if uhdev.type =3D=3D "clickpad": + if uhdev.buttontype =3D=3D HIDButtonType.CLICKPAD: r =3D uhdev.event(click=3DTrue) events =3D uhdev.next_sync_events() self.debug_reports(r, uhdev, events) @@ -1918,7 +1922,7 @@ class Testdell_044e_1220(BaseTest.TestPTP): def create_device(self): return PTP( "uhid test dell_044e_1220", - type=3D"pressurepad", + buttontype=3DHIDButtonType.DISCRETE_BUTTONS, rdesc=3D"05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 95 05 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 09 38 95 01 81 06 05 0c 0a 38 02 81 06 c0 c0 05 0d 09 05 a1 01 85 08 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 af 04 75 10 55 0e 65 11 09 30 35 00 46 e8 03 95 01 81 02 26 7b 02 46 12 02 09 31 81 02 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 05 0d 09 56 81 02 09 54 25 05 95 01 75 08 81 02 05 09 19 01 29 03 25 01 75 01 95 03 81 02 95 05 81 03 05 0d 85 09 09 55 75 08 95 01 25 05 b1 02 06 00 ff 85 0a 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 01 ff 09 01 a1 01 85 03 09 01 15 00 26 ff 00 95 1b 81 02 85 04 09 02 95 50 81 02 85 05 09 03 95 07 b1 02 85 06 09 04 81 02 c0 06 02 ff 09 01 a1 01 85 07 09 02 95 86 75 08 b1 02 c0 05 0d 09 0e a1 01 85 0b 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 0c 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0", ) =20 @@ -2018,7 +2022,7 @@ class Testelan_04f3_313a(BaseTest.TestPTP): def create_device(self): return PTP( "uhid test elan_04f3_313a", - type=3D"touchpad", + buttontype=3DHIDButtonType.DISCRETE_BUTTONS, input_info=3D(BusType.I2C, 0x04F3, 0x313A), rdesc=3D"05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 95 05 81 03 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 75 08 95 05 81 03 c0 06 00 ff 09 01 85 0e 09 c5 15 00 26 ff 00 75 08 95 04 b1 02 85 0a 09 c6 15 00 26 ff 00 75 08 95 04 b1 02 c0 06 00 ff 09 01 a1 01 85 5c 09 01 95 0b 75 08 81 06 85 0d 09 c5 15 00 26 ff 00 75 08 95 04 b1 02 85 0c 09 c6 96 80 03 75 08 b1 02 85 0b 09 c7 95 82 75 08 b1 02 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 05 09 09 02 09 03 15 00 25 01 75 01 95 02 81 02 05 0d 95 01 75 04 25 0f 09 51 81 02 05 01 15 00 26 d7 0e 75 10 55 0d 65 11 09 30 35 00 46 44 2f 95 01 81 02 46 12 16 26 eb 06 26 eb 06 09 31 81 02 05 0d 15 00 25 64 95 03 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 25 01 75 01 95 08 81 03 09 c5 75 08 95 02 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 0f b1 03 06 00 ff 06 00 ff 85 06 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 00 09 52 15 00 25 0a 75 10 95 01 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 0e b1 03 c0 c0 05 01 09 02 a1 01 85 2a 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 95 05 81 03 05 01 09 30 09 31 15 81 25 7f 35 81 45 7f 55 00 65 13 75 08 95 02 81 06 75 08 95 05 81 03 c0 c0", ) @@ -2110,7 +2114,7 @@ class Testsipodev_0603_0002(BaseTest.TestPTP): def create_device(self): return PTP( "uhid test sipodev_0603_0002", - type=3D"clickpad", + buttontype=3DHIDButtonType.CLICKPAD, rdesc=3D"05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 02 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 80 25 7f 75 08 95 02 81 06 c0 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 44 0a 75 0c 55 0e 65 11 09 30 35 00 46 ac 03 95 01 81 02 46 fe 01 26 34 05 75 0c 09 31 81 02 05 0d c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 0a 95 01 75 04 81 02 75 01 95 03 81 03 05 09 09 01 25 01 75 01 95 01 81 02 05 0d 85 0a 09 55 09 59 75 04 95 02 25 0f b1 02 85 0b 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 09 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 06 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 07 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 05 01 09 0c a1 01 85 08 15 00 25 01 09 c6 75 01 95 01 81 06 75 07 81 03 c0 05 01 09 80 a1 01 85 01 15 00 25 01 75 01 0a 81 00 0a 82 00 0a 83 00 95 03 81 06 95 05 81 01 c0 06 0c 00 09 01 a1 01 85 02 25 01 15 00 75 01 0a b5 00 0a b6 00 0a b7 00 0a cd 00 0a e2 00 0a a2 00 0a e9 00 0a ea 00 95 08 81 02 0a 83 01 0a 6f 00 0a 70 00 0a 88 01 0a 8a 01 0a 92 01 0a a8 02 0a 24 02 95 08 81 02 0a 21 02 0a 23 02 0a 96 01 0a 25 02 0a 26 02 0a 27 02 0a 23 02 0a b1 02 95 08 81 02 c0 06 00 ff 09 01 a1 01 85 05 15 00 26 ff 00 19 01 29 02 75 08 95 05 b1 02 c0", ) =20 --=20 2.51.1 From nobody Tue Dec 2 02:04:30 2025 Received: from fout-b5-smtp.messagingengine.com (fout-b5-smtp.messagingengine.com [202.12.124.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F241C274FDC; Fri, 21 Nov 2025 01:07:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763687270; cv=none; b=ioBz2cOWhjxKhki6B/01ob2ObKLuVhrpXPqQjH13w13u6tgCqwcyRNFcKvIs9y8cp/dP+2hBoecumk5z7ZRpIiI/td5Zk0IclPljGyjIB3lQDzp/zkwHzQ1LH8q3Ho/7n3BXiinbFryAg/SNDPaX8kUTNKSORU8DoFrfw1cSpjU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763687270; c=relaxed/simple; bh=Fe9UHUAmq7/WInUlOtK/pd6bKsZ1wCLJviDVoGEZC1g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y9QfcQeZKxhKcAvpghxesc3QHsw09RGXpqjcutYVPQeBSkJwe6EO7M7jwohR8A+YgbhW3DsXKH990fUrrDribroMegDI2qqxz79CeMqouTRb/DXtNhZPRO0bH1zsI8Es45xggx0zF6EGv++CA7j20z9wWFBVAIeY1jsuuekUtN0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=who-t.net; spf=pass smtp.mailfrom=who-t.net; dkim=pass (2048-bit key) header.d=who-t.net header.i=@who-t.net header.b=0ZI0JWnB; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=ArBBjmzR; arc=none smtp.client-ip=202.12.124.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=who-t.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=who-t.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=who-t.net header.i=@who-t.net header.b="0ZI0JWnB"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="ArBBjmzR" Received: from phl-compute-11.internal (phl-compute-11.internal [10.202.2.51]) by mailfout.stl.internal (Postfix) with ESMTP id 03C2D1D00061; Thu, 20 Nov 2025 20:07:47 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-11.internal (MEProxy); Thu, 20 Nov 2025 20:07:48 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=who-t.net; h=cc :cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm2; t=1763687267; x=1763773667; bh=flExpwKsOFLn3nGWjFeZND6vqUIE/ZguTyJ+0e3fyUY=; b= 0ZI0JWnBOT+C5yEKXy3skX81pQBmFySm72CNYFcskgnrZyPTFidaDPiVnyqoHqKY Y3F9li7BLAXfWT0PxWuoBhyW8+4Aaaiut8S7G/ub7q9OCXc8GKK/b3gd+MISlXGW qPHDC3OYDDEZmDdjAthGulq2o5U1gXIysNz2OO58RbvF9lQ8EqAdj17uB3SG3WvK LGwcL05h5hDJhjYas1jV95LaONyv1f7AI8nYlQm+t3PWtv24mUuU8CjIWKRYSBnB Twdv96wClorIUqzfDFPHF9US4yoLAGOH0wyU+c1Yd/w0LIKf895qDrpx/mxfUUPN vJCRThkNCfLJqZ1vAt2YcQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1763687267; x= 1763773667; bh=flExpwKsOFLn3nGWjFeZND6vqUIE/ZguTyJ+0e3fyUY=; b=A rBBjmzR5mKpOenN7bOFF8xBmZ0iD/hvUOaRy0BfvD9kNtiKDILLmgFaI5SC5ZJOH E+1GEAk/L9rCmlZugESuUVrLAINsDwjtKGhoh+dr+9uD2jfsm5zF7yuBpxmzKpA2 S6lCNd7FLL3waJZO12Z07R/2iVxkD3/meVIT+ELNG8iRwmuh2iSIDi34FDnY+mPi 4A+qTjNj+pmNYkEBoKFaGV0F0XpVGAcrTWEoJ9smv4DNnlNXs+PLGOv0K9TSAdTu 1U4sGN1/ulTyjpeUO3pEyKo/7iKGr8UlI+G6l4P1XKHlEhPuOQ2L81u4mwlD5MxW FkdKTm97YQE0YNlrXHLNg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggddvvdekheelucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephfffufggtgfgkfhfjgfvvefosehtjeertdertdejnecuhfhrohhmpefrvghtvghr ucfjuhhtthgvrhgvrhcuoehpvghtvghrrdhhuhhtthgvrhgvrhesfihhohdqthdrnhgvth eqnecuggftrfgrthhtvghrnhepteegfffhleetvedugfffhfekleehvedvkedtffevfeel ledtgfdtffehieevjeeknecuffhomhgrihhnpehmihgtrhhoshhofhhtrdgtohhmnecuve hluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepphgvthgvrhdr hhhuthhtvghrvghrseifhhhoqdhtrdhnvghtpdhnsggprhgtphhtthhopeelpdhmohguvg epshhmthhpohhuthdprhgtphhtthhopehshhhurghhsehkvghrnhgvlhdrohhrghdprhgt phhtthhopehlihhnuhigqdhkvghrnhgvlhesvhhgvghrrdhkvghrnhgvlhdrohhrghdprh gtphhtthhopehlihhnuhigqdhinhhpuhhtsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhr tghpthhtohepsggvnhhtihhssheskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepughmih htrhihrdhtohhrohhkhhhovhesghhmrghilhdrtghomhdprhgtphhtthhopehvrgguihhm segtihhrqhhuvgdrtghomhdprhgtphhtthhopehlihhnuhigqdhkshgvlhhfthgvshhtse hvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepphgvthgvrhdrhhhuthhtvghr vghrseifhhhoqdhtrdhnvghtpdhrtghpthhtohepjhhikhhosheskhgvrhhnvghlrdhorh hg X-ME-Proxy: Feedback-ID: i7ce144cd:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 20 Nov 2025 20:07:44 -0500 (EST) From: Peter Hutterer Date: Fri, 21 Nov 2025 11:07:13 +1000 Subject: [PATCH 3/3] HID: multitouch: set INPUT_PROP_PRESSUREPAD based on Digitizer/Button Type Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251121-wip-hid-pressurepad-v1-3-e32e5565a527@who-t.net> References: <20251121-wip-hid-pressurepad-v1-0-e32e5565a527@who-t.net> In-Reply-To: <20251121-wip-hid-pressurepad-v1-0-e32e5565a527@who-t.net> To: Jiri Kosina , Benjamin Tissoires , Shuah Khan Cc: Dmitry Torokhov , linux-input@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Vadim Klishko , Peter Hutterer X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7507; i=peter.hutterer@who-t.net; h=from:subject:message-id; bh=/eg4/R7xVnJBKIdFDgm4ajRb980bl2bFPJm1VxyKdVY=; b=owGbwMvMwCT4yLquYEv6h/2Mp9WSGDLld4ee/ujJeUta+inz7PvVziVrA67tfPJ/8vPWG3aKr 7f5Jjy42hHLwiDIxCArpshio+N806U20uK9a+BrmDmsTCBDGLg4BWAiWvoMc2VeGMw8+MS66Xjr kn9B7Axvt4kmCTEsmJKo3B86yeHSNs/NVrfWRR+6vPLBMwA= X-Developer-Key: i=peter.hutterer@who-t.net; a=openpgp; fpr=3C2C43D9447D5938EF4551EBE23B7E70B467F0BF A Digitizer/Button Type value of 1 indicates the device is a pressurepad, see https://learn.microsoft.com/en-us/windows-hardware/design/component-guideli= nes/touchpad-windows-precision-touchpad-collection#device-capabilities-feat= ure-report For the selftests we have to resort to a bit of a hack: python-libevdev gets the properties from libevdev at module init time. If libevdev hasn't been rebuilt with the new property it won't be automatically populated. So we hack around this by constructing the property manually. Signed-off-by: Peter Hutterer --- drivers/hid/hid-multitouch.c | 12 ++++++- .../testing/selftests/hid/tests/test_multitouch.py | 39 ++++++++++++++++++= +--- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 179dc316b4b518d78bdc900d9fd15756c5eba83e..382e6f50c4f7e663af7d028abb8= be7cb2e6e7b8e 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -81,6 +81,7 @@ MODULE_LICENSE("GPL"); #define MT_INPUTMODE_TOUCHPAD 0x03 =20 #define MT_BUTTONTYPE_CLICKPAD 0 +#define MT_BUTTONTYPE_PRESSUREPAD 1 =20 enum latency_mode { HID_LATENCY_NORMAL =3D 0, @@ -179,6 +180,7 @@ struct mt_device { __u8 inputmode_value; /* InputMode HID feature value */ __u8 maxcontacts; bool is_buttonpad; /* is this device a button pad? */ + bool is_pressurepad; /* is this device a pressurepad? */ bool is_haptic_touchpad; /* is this device a haptic touchpad? */ bool serial_maybe; /* need to check for serial protocol */ =20 @@ -530,8 +532,14 @@ static void mt_feature_mapping(struct hid_device *hdev, } =20 mt_get_feature(hdev, field->report); - if (field->value[usage->usage_index] =3D=3D MT_BUTTONTYPE_CLICKPAD) + switch (field->value[usage->usage_index]) { + case MT_BUTTONTYPE_CLICKPAD: td->is_buttonpad =3D true; + break; + case MT_BUTTONTYPE_PRESSUREPAD: + td->is_pressurepad =3D true; + break; + } =20 break; case 0xff0000c5: @@ -1393,6 +1401,8 @@ static int mt_touch_input_configured(struct hid_devic= e *hdev, =20 if (td->is_buttonpad) __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); + if (td->is_pressurepad) + __set_bit(INPUT_PROP_PRESSUREPAD, input->propbit); =20 app->pending_palm_slots =3D devm_kcalloc(&hi->input->dev, BITS_TO_LONGS(td->maxcontacts), diff --git a/tools/testing/selftests/hid/tests/test_multitouch.py b/tools/t= esting/selftests/hid/tests/test_multitouch.py index a06a087f00b6991f7514adf7f8c713bef1a43563..fa4fb2054bd4febb1d2497f2787= 944f538b27889 100644 --- a/tools/testing/selftests/hid/tests/test_multitouch.py +++ b/tools/testing/selftests/hid/tests/test_multitouch.py @@ -979,15 +979,36 @@ class BaseTest: assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_ORIENTATION,= 90) in events =20 class TestPTP(TestWin8Multitouch): + def test_buttontype(self): + """Check for the right ButtonType.""" + uhdev =3D self.uhdev + assert uhdev is not None + evdev =3D uhdev.get_evdev() + + # If libevdev.so is not yet compiled with INPUT_PROP_PRESSUREP= AD + # python-libevdev won't have it either, let's fake it + if not getattr(libevdev, "INPUT_PROP_PRESSUREPAD", None): + prop =3D libevdev.InputProperty(name=3D"INPUT_PROP_PRESSUR= EPAD", value=3D0x7) + libevdev.INPUT_PROP_PRESSUREPAD =3D prop + libevdev.props.append(prop) + + if uhdev.buttontype =3D=3D HIDButtonType.CLICKPAD: + assert libevdev.INPUT_PROP_BUTTONPAD in evdev.properties + elif uhdev.buttontype =3D=3D HIDButtonType.PRESSUREPAD: + assert libevdev.INPUT_PROP_PRESSUREPAD in evdev.properties + else: + assert libevdev.INPUT_PROP_PRESSUREPAD not in evdev.proper= ties + assert libevdev.INPUT_PROP_BUTTONPAD not in evdev.properti= es + def test_ptp_buttons(self): """check for button reliability. - There are 2 types of touchpads: the click pads and the pressur= e pads. - Each should reliably report the BTN_LEFT events. + There are 3 types of touchpads: click pads + pressure pads and + those with discrete buttons. Each should reliably report the B= TN_LEFT events. """ uhdev =3D self.uhdev evdev =3D uhdev.get_evdev() =20 - if uhdev.buttontype =3D=3D HIDButtonType.CLICKPAD: + if uhdev.buttontype in [HIDButtonType.CLICKPAD, HIDButtonType.= PRESSUREPAD]: r =3D uhdev.event(click=3DTrue) events =3D uhdev.next_sync_events() self.debug_reports(r, uhdev, events) @@ -999,7 +1020,7 @@ class BaseTest: self.debug_reports(r, uhdev, events) assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 0) in= events assert evdev.value[libevdev.EV_KEY.BTN_LEFT] =3D=3D 0 - else: + elif uhdev.buttontype =3D=3D HIDButtonType.DISCRETE_BUTTONS: r =3D uhdev.event(left=3DTrue) events =3D uhdev.next_sync_events() self.debug_reports(r, uhdev, events) @@ -2062,6 +2083,16 @@ class Testite_06cb_2968(BaseTest.TestPTP): ) =20 =20 +class Testven_0488_108c(BaseTest.TestPTP): + def create_device(self): + return PTP( + "uhid test ven_0488_108c", + rdesc=3D"05 01 09 02 a1 01 85 06 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 c0 c0 05 0d 09 05 a1 01 85 01 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 81 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35 00 46 d0 05 95 01 81 02 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26 ff 7f 46 ff 7f 09 30 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 81 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35 00 46 d0 05 95 01 81 02 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26 ff 7f 46 ff 7f 09 30 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 81 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35 00 46 d0 05 95 01 81 02 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26 ff 7f 46 ff 7f 09 30 81 02 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 05 0d 09 56 81 02 09 54 25 05 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 02 09 55 75 08 95 01 25 05 b1 02 09 59 b1 02 06 00 ff 85 03 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 05 0e 09 01 a1 02 85 13 09 23 15 00 25 64 75 08 95 01 b1 02 c0 c0 05 0d 09 0e a1 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 01 ff 09 02 a1 01 09 00 85 07 15 00 26 ff 00 75 08 96 12 02 b1 02 c0 06 00 ff 09 01 a1 01 85 0d 15 00 26 ff 00 75 08 95 11 09 01 81 02 09 01 91 02 c0 05 0e 09 01 a1 01 85 11 09 35 15 00 26 ff 00 75 08 95 17 b1 02 c0 06 81 ff 09 01 a1 01 09 20 85 17 15 00 26 ff 00 75 08 95 3f 09 01 81 02 09 01 91 02 c0", + input_info=3D(0x18, 0x0488, 0x108C), + buttontype=3DHIDButtonType.PRESSUREPAD, + ) + + class Testn_trig_1b96_0c01(BaseTest.TestWin8Multitouch): def create_device(self): return Digitizer( --=20 2.51.1