Skip to content

Commit 20ccc8d

Browse files
whotJonathan Corbet
authored andcommitted
Documentation: input: define ABS_PRESSURE/ABS_MT_PRESSURE resolution as grams
ABS_PRESSURE and ABS_MT_PRESSURE on touch devices usually represent contact size (as a finger flattens with higher pressure the contact size increases) and userspace translates the kernel pressure value back into contact size. For example, libinput has pressure thresholds when a touch is considered a palm (palm == large contact area -> high pressure). The values themselves are on an arbitrary scale and device-specific. On pressurepads however, the pressure axis may represent the real physical pressure. Pressurepads are touchpads without a hinge but an actual pressure sensor underneath the device instead, for example the Lenovo Yoga 9i. A high-enough pressure is converted to a button click by the firmware. Microsoft does not require a pressure axis to be present, see [1], so as seen from userspace most pressurepads are identical to clickpads - one button and INPUT_PROP_BUTTONPAD set. However, pressurepads that export the pressure axis break userspace because that axis no longer represents contact size, resulting in inconsistent touch tracking, e.g. [2]. Userspace needs to know when a pressure axis represents real pressure and the best way to do so is to define what the resolution field means. Userspace can then treat data with a pressure resolution as true pressure. This patch documents that the pressure resolution is in units/gram. This allows for fine-grained detail and tops out at roughly ~2000t, enough for the devices we're dealing with. Grams is not a scientific pressure unit but the alternative is: - Pascal: defined as force per area and area is unreliable on many devices and seems like the wrong option here anyway, especially for devices with a single pressure sensor only. - Newton: defined as mass * distance/acceleration and for the purposes of a pressure axis, the distance is tricky to interpret and we get the data to calculate acceleration from event timestamps anyway. For the purposes of touch devices and digitizers, grams seems the best choice and the easiest to interpret. Bonus side effect: we can use the existing hwdb infrastructure in userspace to fix devices that advertise false pressure. [1] https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/windows-precision-touchpad-required-hid-top-level-collections#windows-precision-touchpad-input-reports [2] https://gitlab.freedesktop.org/libinput/libinput/-/issues/562 Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Link: https://lore.kernel.org/r/20210112230310.GA149342@jelly Signed-off-by: Jonathan Corbet <corbet@lwn.net>
1 parent 06a755d commit 20ccc8d

2 files changed

Lines changed: 19 additions & 0 deletions

File tree

Documentation/input/event-codes.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,21 @@ A few EV_ABS codes have special meanings:
236236
- Used to describe multitouch input events. Please see
237237
multi-touch-protocol.txt for details.
238238

239+
* ABS_PRESSURE/ABS_MT_PRESSURE:
240+
241+
- For touch devices, many devices converted contact size into pressure.
242+
A finger flattens with pressure, causing a larger contact area and thus
243+
pressure and contact size are directly related. This is not the case
244+
for other devices, for example digitizers and touchpads with a true
245+
pressure sensor ("pressure pads").
246+
247+
A device should set the resolution of the axis to indicate whether the
248+
pressure is in measurable units. If the resolution is zero, the
249+
pressure data is in arbitrary units. If the resolution is nonzero, the
250+
pressure data is in units/gram. For example, a value of 10 with a
251+
resolution of 1 represents 10 gram, a value of 10 with a resolution on
252+
1000 represents 10 microgram.
253+
239254
EV_SW
240255
-----
241256

Documentation/input/multi-touch-protocol.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,10 @@ ABS_MT_PRESSURE
260260
of TOUCH and WIDTH for pressure-based devices or any device with a spatial
261261
signal intensity distribution.
262262

263+
If the resolution is zero, the pressure data is in arbitrary units.
264+
If the resolution is nonzero, the pressure data is in units/gram. See
265+
:ref:`input-event-codes` for details.
266+
263267
ABS_MT_DISTANCE
264268
The distance, in surface units, between the contact and the surface. Zero
265269
distance means the contact is touching the surface. A positive number means

0 commit comments

Comments
 (0)