pms
—
PS/2 auxiliary port mouse driver
pckbc* at isa?
pms* at pckbc?
wsmouse* at pms?
options PMS_DISABLE_POWERHOOK
options PMS_SYNAPTICS_TOUCHPAD
options PMS_ELANTECH_TOUCHPAD
options PMS_ALPS_TOUCHPAD
The pms
driver provides an interface to PS/2 auxiliary
port mice within the wscons(4)
framework. Parent device in terms of the autoconfiguration framework is
pckbc(4), the PC keyboard
controller. “pms” is a generic driver which supports mice using
common variants of the PS/2 protocol, including wheel mice of the
“IntelliMouse” breed. Wheel movements are mapped to a third (z-)
axis. The driver is believed to work with both 3-button and 5-button mice with
scroll wheels. Mice which use other protocol extensions are not currently
supported, but might be if protocol documentation could be found. Mouse
related data are accessed by
wsmouse(4) devices.
The pms
driver has been updated to attempt
to renegotiate mouse protocol after seeing suspicious or defective mouse
protocol packets, or unusual delays in the middle of a packet; this should
improve the chances that a mouse will recover after being switched away or
reset (for instance, by a console switch).
The PMS_DISABLE_POWERHOOK kernel option
disables PS/2 reset on resume.
In addition, the pms
driver supports the
“Synaptics”, “Elantech” and “ALPS”
touchpads in native mode, enabled with the
PMS_SYNAPTICS_TOUCHPAD,
PMS_ELANTECH_TOUCHPAD and
PMS_ALPS_TOUCHPAD kernel options. This allows the
driver to take advantage of extra features available on Synaptics, Elantech
and ALPS Touchpads.
The following
sysctl(8) variables control
behavior of Synaptics touchpads:
hw.synaptics.up_down_emulation
- If the touchpad reports the existence of extra ("Up/Down")
buttons, this value determines what kind of mouse events they should
generate. On certain clickpads, the Up/Down buttons may be physical
buttons that can be used instead of pressing the pad down, or used as
additional buttons.
- If set to 0, Up/Down events generate button 4 and 5 clicks.
- If set to 1, Up/Down events generate middle button clicks.
- If set to 2, the Up and Down buttons are used for Z-axis emulation,
which more closely resembles how mouse wheels operate.
- If set to 3 (default), Up/Down events generate left/right clicks.
hw.synaptics.up_down_motion_delta
- When the Up/Down buttons are used for Z-axis emulation, this value
specifies the emulated delta-Z value per click.
hw.synaptics.gesture_move
- Gestures will not be recognised if the finger moves by more than this
amount between taps.
hw.synaptics.gesture_length
- Gestures will not be recognised if the number of packets (at 80 packets
per second) between taps exceeds this value.
hw.synaptics.edge_left
-
hw.synaptics.edge_right
-
hw.synaptics.edge_top
-
hw.synaptics.edge_bottom
- These values define a border around the touchpad which will be used for
edge motion emulation during a drag gesture. If a drag gesture is in
progress and the finger moves into this border, the driver will behave as
if the finger continues to move in the same direction beyond the edge of
the touchpad.
hw.synaptics.edge_motion_delta
- This specifies the pointer speed when edge motion is in effect.
hw.synaptics.finger_high
- The driver will ignore new finger events until the reported pressure
exceeds this value.
hw.synaptics.finger_low
- The driver will assume a finger remains on the touchpad until the reported
pressure drops below this value.
hw.synaptics.two_fingers_emulation
- More recent touchpads can report the presence of more than one finger on
the pad. This value determines how such events are used.
- If set to 0 (default), two-finger events are ignored.
- If set to 1, two-finger events generate a right button click.
- If set to 2, two-finger events generate a middle button click.
hw.synaptics.scale_x
-
hw.synaptics.scale_y
-
hw.synaptics.scale_z
- Scale factor used to divide movement deltas derived from Synaptics
coordinates (0-6143) to yield more reasonable values (default 16 for x and
y, 1 for z).
hw.synaptics.max_speed_x
-
hw.synaptics.max_speed_y
-
hw.synaptics.max_speed_z
- Limits pointer rate of change (after scaling) per reported movement event
(default 32 for x and y, 2 for z).
hw.synaptics.movement_threshold
- Movements of less than this value (in Synaptics coordinates) are ignored
(default 4).
hw.synaptics.button_boundary
- Sets the top edge of the button emulation region on a clickpad. Since a
clickpad only reports left clicks this region is used to emulate two or
three buttons by detecting the finger location and reporting either a
button 2 or button 3 click iff the click occurs within the region bounded
by button_boundary and the bottom of the clickpad.
hw.synaptics.button3_edge
- This defines the left hand edge of the button 3 region. If a click occurs
in the region bounded by button_boundary, button3_edge and the right hand
edge of the click pad then the click will be reported as a button3 event.
Button 3 emulation can be disabled by setting button3_edge to the right
hand edge of the clickpad.
hw.synaptics.button2_edge
- This defines the left hand edge of the button 2 region. The button 2
region is bounded by button2_edge, button3_edge and button_boundary. If a
click occurs in this region then it will be reported as a button2 event.
For completeness, the region between the left hand side of the clickpad,
button2_edge and button_boundary will be reported as a button1 event as
will any clicks that occur outside the button emulation region.
hw.synaptics.finger_scroll-min
- The minimum finger width at which the driver will start reporting vertical
movements as Z axis events. Effectively, this emulates a mouse scroll
wheel by the user using two fingers together on the click pad. The default
value is 5, this value cannot be less than 5 due to the way the clickpad
reports finger width.
hw.synaptics.finger_scroll-max
- The maximum finger width at which the driver will report finger movement
as Z axis events. The default value is 12 and cannot be greater than
14.
hw.synaptics.finger_scroll-hysteresis
- This defines the number of packets to continue with the Z axis emulation.
Due to the nature of the clickpad maintaining constant contact can be
difficult. This hysteresis value prevents the driver flipping between two
finger scroll and normal mouse movement erratically. Each time a valid
finger scroll width is detected the packet count is reset. If this
variable is set too high then mouse movements will be interpreted as
Z-axis events after the two finger scoll has finished. If the variable is
set too low then there will be mouse movements observed during the two
finger scroll.
hw.synaptics.aux_mid_button_scroll
- This causes Y-axis movement on the "passthrough device" (e.g.
the TrackPoint on ThinkPads) to result in scrolling events instead of
Y-axis movement when the middle button is held.
The following
sysctl(8) variables control
behavior of Elantech touchpads:
hw.elantech.xy_precision_shift
-
hw.elantech.z_precision_shift
- Increased values improve the accuracy of X, Y, and Z-axis reporting at the
expense of slower mouse movement (default 2 for xy, and 3 for z).
For Elantech touchpads, the Z-axis is emulated using two-finger
Y-axis reporting.
The following
sysctl(8) variables control
behavior of ALPS touchpads:
hw.alps.touchpad_xy_precision_shift
-
hw.alps.tackstick_xy_precision_shift
- Decreased values improve the accuracy of X and Y-axis reporting at the
expense of slower mouse movement (default 2 for touchpad and 1 for
TrackStick).
The pms
driver was originally written by
Christopher G. Demetriou. The changes to merge the
“IntelliMouse” protocol in, and reset the mouse in the event of
protocol problems, were contributed by Peter Seebach.
Special thanks to Ray Trent, at Synaptics, who contributed valuable insight
into how to identify bogus mouse data. The changes to add
“Synaptics” pad support were by Ales
Krenek, Kentaro A. Kurahone, and
Steve C. Woodford. The changes to add
“Elantech” pad support were by Jared D.
McNeill.
It is possible for the driver to mistakenly negotiate the non-scroll-wheel
protocol, after which it is unlikely to recover until the device is closed and
reopened.
The “Elantech” pad code only supports trackpads with
firmware version 2.48 or above.