HomeFreeBSD

synaptics: more support for semi-MT trackpads.

Description

synaptics: more support for semi-MT trackpads.

Several improvements to the Synaptics driver to support
semi-multitouch trackpads and some other fixes:

  • Two finger scrolling support for "semi-MT" touchpads. Those include

many of the older Synaptics touchpads before "true" multitouch support
(indicated by capMultiFinger). Semi-MT touchpads can report a second
finger position, but the X or Y coordinate may be swapped with some
coordinate of the first finger. This is a result of how the hardware
works internally. Therefore, all that can be reliably extracted is the
bounding box of the two finger positions. Semi-MT touchpads can be
recognized by the capAdvancedGestures capability bit. After setting the
mode byte, advanced gestures mode has to be enabled. Then, data packets
compatible with the capMultiFinger format are sent, so the same two
finger scrolling code can be leveraged. Enabling advanced gestures mode
on true multitouch touchpads should be harmless. Linux seems to always
enable advanced gestures mode.

  • Put mode setting logic into own functions synaptics_preferred_mode()

and synaptics_set_mode() to have this in one place.
synaptics_passthrough_on() and synaptics_passthrough_off() currently
always use 0xc1 as the mode byte, which may be wrong for touchpads that
don't have capExtended.

  • Expose X and Y resolution of touchpad to userland. Also expose minimum

and maximum X and Y coordinates. This is useful for programs in
userspace that read raw PSM packets (with PSM_LEVEL_NATIVE enabled) and
need to interpret the coordinates.

  • Also send "extended w mode" packets (see section 3.2.9 of

511-000275-01_RevB.pdf) to userspace if PSM_LEVEL_NATIVE is enabled.
This is useful for userspace programs/drivers such as
xf86-input-synaptics that can handle these packets.

  • Fix parsing of nExtendedQueries, and request extended/continued

capability bits depending on this value.

  • capReportsMax, capClearPad, capAdvancedGestures and capCoveredPad must

be extracted from status[0] and not status[2], I think.

Submitted by: Jan Kokemüller jan.kokemueller at gmail.com

Details

Provenance
rpauloAuthored on
Parents
rS282733: Tag bmake-20150505
Branches
Unknown
Tags
Unknown