wsp: Add sysctl tunable for Z-Axis inversion

This adds a new sysctl to Wellspring Touchpad driver for controlling
Z-Axis (2-finger vertical scroll) direction "hw.usb.wsp.z_invert".

Submitted by:	James Wright <james.wright_AT_digital-chaos_DOT_com>
Reviewed by:	wulf
PR:		253321
Differential revision:	https://reviews.freebsd.org/D28521
This commit is contained in:
Vladimir Kondratyev 2021-02-09 00:26:42 +03:00
parent dd2516fc07
commit d8c6d4c732
2 changed files with 12 additions and 2 deletions

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd January 15, 2018
.Dd February 9, 2021
.Dt WSP 4
.Os
.Sh NAME
@ -67,6 +67,11 @@ Pointer sensitivity can be controlled using the sysctl tunable
Tap to left-click can be controlled using the sysctl tunable
.Nm hw.usb.wsp.enable_single_tap_clicks ,
set to 0 to disable single tap clicks or 1 to enable them (default).
Z-Axis sensitivity can be controlled using the sysctl tunable
.Nm hw.usb.wsp.z_factor .
Z-Axis inversion can be controlled using the sysctl tunable
.Nm hw.usb.wsp.z_invert ,
set to 0 to disable (default) or 1 to enable inversion.
.Sh FILES
.Nm
creates a blocking pseudo-device file,

View File

@ -88,6 +88,7 @@ SYSCTL_INT(_hw_usb_wsp, OID_AUTO, debug, CTLFLAG_RWTUN,
static struct wsp_tuning {
int scale_factor;
int z_factor;
int z_invert;
int pressure_touch_threshold;
int pressure_untouch_threshold;
int pressure_tap_threshold;
@ -98,6 +99,7 @@ static struct wsp_tuning {
{
.scale_factor = 12,
.z_factor = 5,
.z_invert = 0,
.pressure_touch_threshold = 50,
.pressure_untouch_threshold = 10,
.pressure_tap_threshold = 120,
@ -110,6 +112,7 @@ wsp_runing_rangecheck(struct wsp_tuning *ptun)
{
WSP_CLAMP(ptun->scale_factor, 1, 63);
WSP_CLAMP(ptun->z_factor, 1, 63);
WSP_CLAMP(ptun->z_invert, 0, 1);
WSP_CLAMP(ptun->pressure_touch_threshold, 1, 255);
WSP_CLAMP(ptun->pressure_untouch_threshold, 1, 255);
WSP_CLAMP(ptun->pressure_tap_threshold, 1, 255);
@ -121,6 +124,8 @@ SYSCTL_INT(_hw_usb_wsp, OID_AUTO, scale_factor, CTLFLAG_RWTUN,
&wsp_tuning.scale_factor, 0, "movement scale factor");
SYSCTL_INT(_hw_usb_wsp, OID_AUTO, z_factor, CTLFLAG_RWTUN,
&wsp_tuning.z_factor, 0, "Z-axis scale factor");
SYSCTL_INT(_hw_usb_wsp, OID_AUTO, z_invert, CTLFLAG_RWTUN,
&wsp_tuning.z_invert, 0, "enable Z-axis inversion");
SYSCTL_INT(_hw_usb_wsp, OID_AUTO, pressure_touch_threshold, CTLFLAG_RWTUN,
&wsp_tuning.pressure_touch_threshold, 0, "touch pressure threshold");
SYSCTL_INT(_hw_usb_wsp, OID_AUTO, pressure_untouch_threshold, CTLFLAG_RWTUN,
@ -1126,7 +1131,7 @@ wsp_intr_callback(struct usb_xfer *xfer, usb_error_t error)
dx = dy = 0;
if (sc->dz_count == 0)
dz = sc->dz_sum / tun.z_factor;
dz = (sc->dz_sum / tun.z_factor) * (tun.z_invert ? -1 : 1);
if (sc->scr_mode == WSP_SCR_HOR ||
abs(sc->pos_x[0] - sc->pos_x[1]) > MAX_DISTANCE ||
abs(sc->pos_y[0] - sc->pos_y[1]) > MAX_DISTANCE)