version 1.50, 2019/07/05 05:09:24 |
version 1.50.2.7, 2020/10/08 16:47:12 |
Line 98 static void pms_sysctl_synaptics(struct |
|
Line 98 static void pms_sysctl_synaptics(struct |
|
static int pms_sysctl_synaptics_verify(SYSCTLFN_ARGS); |
static int pms_sysctl_synaptics_verify(SYSCTLFN_ARGS); |
|
|
/* Controlled by sysctl. */ |
/* Controlled by sysctl. */ |
static int synaptics_up_down_emul = 2; |
static int synaptics_up_down_emul = 3; |
static int synaptics_up_down_motion_delta = 1; |
static int synaptics_up_down_motion_delta = 1; |
static int synaptics_gesture_move = 200; |
static int synaptics_gesture_move = 200; |
static int synaptics_gesture_length = 20; |
static int synaptics_gesture_length = 20; |
Line 124 static int synaptics_fscroll_min = 13; |
|
Line 124 static int synaptics_fscroll_min = 13; |
|
static int synaptics_fscroll_max = 14; |
static int synaptics_fscroll_max = 14; |
static int synaptics_dz_hold = 30; |
static int synaptics_dz_hold = 30; |
static int synaptics_movement_enable = 1; |
static int synaptics_movement_enable = 1; |
|
static bool synaptics_aux_mid_button_scroll = TRUE; |
|
|
/* Sysctl nodes. */ |
/* Sysctl nodes. */ |
static int synaptics_button_boundary_nodenum; |
static int synaptics_button_boundary_nodenum; |
Line 152 static int synaptics_finger_scroll_min_n |
|
Line 153 static int synaptics_finger_scroll_min_n |
|
static int synaptics_finger_scroll_max_nodenum; |
static int synaptics_finger_scroll_max_nodenum; |
static int synaptics_dz_hold_nodenum; |
static int synaptics_dz_hold_nodenum; |
static int synaptics_movement_enable_nodenum; |
static int synaptics_movement_enable_nodenum; |
|
static int synaptics_aux_mid_button_scroll_nodenum; |
|
|
static int |
static int |
synaptics_poll_cmd(struct pms_softc *psc, ...) |
synaptics_poll_cmd(struct pms_softc *psc, ...) |
Line 484 pms_synaptics_enable(void *vsc) |
|
Line 486 pms_synaptics_enable(void *vsc) |
|
(sc->flags & SYN_FLAG_HAS_ADV_GESTURE_MODE)) |
(sc->flags & SYN_FLAG_HAS_ADV_GESTURE_MODE)) |
synaptics_special_write(psc, SYNAPTICS_WRITE_DELUXE_3, 0x3); |
synaptics_special_write(psc, SYNAPTICS_WRITE_DELUXE_3, 0x3); |
|
|
synaptics_poll_cmd(psc, PMS_DEV_ENABLE, 0); |
|
|
|
sc->up_down = 0; |
sc->up_down = 0; |
sc->prev_fingers = 0; |
sc->prev_fingers = 0; |
sc->gesture_start_x = sc->gesture_start_y = 0; |
sc->gesture_start_x = sc->gesture_start_y = 0; |
Line 832 pms_sysctl_synaptics(struct sysctllog ** |
|
Line 832 pms_sysctl_synaptics(struct sysctllog ** |
|
goto err; |
goto err; |
|
|
synaptics_dz_hold_nodenum = node->sysctl_num; |
synaptics_dz_hold_nodenum = node->sysctl_num; |
|
|
|
if ((rc = sysctl_createv(clog, 0, NULL, &node, |
|
CTLFLAG_PERMANENT | CTLFLAG_READWRITE, |
|
CTLTYPE_BOOL, "aux_mid_button_scroll", |
|
SYSCTL_DESCR("Interpet Y-Axis movement with the middle button held as scrolling on the passthrough device (e.g. TrackPoint)"), |
|
pms_sysctl_synaptics_verify, 0, |
|
&synaptics_aux_mid_button_scroll, |
|
0, CTL_HW, root_num, CTL_CREATE, |
|
CTL_EOL)) != 0) |
|
goto err; |
|
|
|
synaptics_aux_mid_button_scroll_nodenum = node->sysctl_num; |
return; |
return; |
|
|
err: |
err: |
Line 852 pms_sysctl_synaptics_verify(SYSCTLFN_ARG |
|
Line 864 pms_sysctl_synaptics_verify(SYSCTLFN_ARG |
|
return error; |
return error; |
|
|
/* Sanity check the params. */ |
/* Sanity check the params. */ |
if (node.sysctl_num == synaptics_up_down_emul_nodenum || |
if (node.sysctl_num == synaptics_up_down_emul_nodenum) { |
node.sysctl_num == synaptics_two_fingers_emul_nodenum) { |
if (t < 0 || t > 3) |
|
return (EINVAL); |
|
} else |
|
if (node.sysctl_num == synaptics_two_fingers_emul_nodenum) { |
if (t < 0 || t > 2) |
if (t < 0 || t > 2) |
return (EINVAL); |
return (EINVAL); |
} else |
} else |
if (node.sysctl_num == synaptics_gesture_length_nodenum || |
if (node.sysctl_num == synaptics_gesture_length_nodenum || |
node.sysctl_num == synaptics_edge_motion_delta_nodenum || |
node.sysctl_num == synaptics_edge_motion_delta_nodenum || |
node.sysctl_num == synaptics_up_down_motion_delta_nodenum) { |
node.sysctl_num == synaptics_up_down_motion_delta_nodenum || |
|
node.sysctl_num == synaptics_max_speed_x_nodenum || |
|
node.sysctl_num == synaptics_max_speed_y_nodenum || |
|
node.sysctl_num == synaptics_max_speed_z_nodenum) { |
if (t < 0) |
if (t < 0) |
return (EINVAL); |
return (EINVAL); |
} else |
} else |
Line 919 pms_sysctl_synaptics_verify(SYSCTLFN_ARG |
|
Line 937 pms_sysctl_synaptics_verify(SYSCTLFN_ARG |
|
if (t < 0 || t > 1) |
if (t < 0 || t > 1) |
return (EINVAL); |
return (EINVAL); |
} else |
} else |
|
if (node.sysctl_num == synaptics_aux_mid_button_scroll_nodenum) { |
|
if (t < 0 || t > 1) |
|
return (EINVAL); |
|
} else |
return (EINVAL); |
return (EINVAL); |
|
|
*(int *)rnode->sysctl_data = t; |
*(int *)rnode->sysctl_data = t; |
Line 1003 pms_synaptics_parse(struct pms_softc *ps |
|
Line 1025 pms_synaptics_parse(struct pms_softc *ps |
|
psc->packet[3], psc->packet[4], psc->packet[5]); |
psc->packet[3], psc->packet[4], psc->packet[5]); |
|
|
if ((psc->packet[4] & SYN_1BUTMASK) != 0) |
if ((psc->packet[4] & SYN_1BUTMASK) != 0) |
sp.sp_left = PMS_LBUTMASK; |
sc->ext_left = PMS_LBUTMASK; |
|
else |
|
sc->ext_left = 0; |
|
|
if ((psc->packet[4] & SYN_3BUTMASK) != 0) |
if ((psc->packet[4] & SYN_3BUTMASK) != 0) |
sp.sp_middle = PMS_MBUTMASK; |
sc->ext_middle = PMS_MBUTMASK; |
|
else |
|
sc->ext_middle = 0; |
|
|
if ((psc->packet[5] & SYN_2BUTMASK) != 0) |
if ((psc->packet[5] & SYN_2BUTMASK) != 0) |
sp.sp_right = PMS_RBUTMASK; |
sc->ext_right = PMS_RBUTMASK; |
|
else |
|
sc->ext_right = 0; |
|
|
if ((psc->packet[5] & SYN_4BUTMASK) != 0) |
if ((psc->packet[5] & SYN_4BUTMASK) != 0) |
sp.sp_up = 1; |
sc->ext_up = 1; |
|
else |
|
sc->ext_up = 0; |
|
|
if ((psc->packet[4] & SYN_5BUTMASK) != 0) |
if ((psc->packet[4] & SYN_5BUTMASK) != 0) |
sp.sp_down = 1; |
sc->ext_down = 1; |
|
else |
|
sc->ext_down = 0; |
} else { |
} else { |
/* Left/Right button handling. */ |
/* Left/Right button handling. */ |
sp.sp_left = psc->packet[0] & PMS_LBUTMASK; |
sp.sp_left = psc->packet[0] & PMS_LBUTMASK; |
Line 1091 pms_synaptics_parse(struct pms_softc *ps |
|
Line 1123 pms_synaptics_parse(struct pms_softc *ps |
|
/* Old style Middle Button. */ |
/* Old style Middle Button. */ |
sp.sp_middle = (psc->packet[0] & PMS_LBUTMASK) ^ |
sp.sp_middle = (psc->packet[0] & PMS_LBUTMASK) ^ |
(psc->packet[3] & PMS_LBUTMASK); |
(psc->packet[3] & PMS_LBUTMASK); |
} else if (synaptics_up_down_emul == 1) { |
} else if (synaptics_up_down_emul != 1) { |
|
sp.sp_middle = 0; |
|
} |
|
|
|
/* Overlay extended button state */ |
|
sp.sp_left |= sc->ext_left; |
|
sp.sp_right |= sc->ext_right; |
|
sp.sp_middle |= sc->ext_middle; |
|
sp.sp_up |= sc->ext_up; |
|
sp.sp_down |= sc->ext_down; |
|
|
|
switch (synaptics_up_down_emul) { |
|
case 1: |
/* Do middle button emulation using up/down buttons */ |
/* Do middle button emulation using up/down buttons */ |
sp.sp_middle = sp.sp_up | sp.sp_down; |
sp.sp_middle = sp.sp_up | sp.sp_down; |
sp.sp_up = sp.sp_down = 0; |
sp.sp_up = sp.sp_down = 0; |
} else |
break; |
sp.sp_middle = 0; |
case 3: |
|
/* Do left/right button emulation using up/down buttons */ |
|
sp.sp_left = sp.sp_left | sp.sp_up; |
|
sp.sp_right = sp.sp_right | sp.sp_down; |
|
sp.sp_up = sp.sp_down = 0; |
|
break; |
|
default: |
|
/* |
|
* Don't do any remapping... |
|
* Z-axis emulation is handled in pms_synaptics_process_packet |
|
*/ |
|
break; |
|
} |
} |
} |
|
|
pms_synaptics_process_packet(psc, &sp); |
pms_synaptics_process_packet(psc, &sp); |
} |
} |
|
|
|
/* |
|
* Passthrough is used for e.g. TrackPoints and additional pointing |
|
* devices connected to a Synaptics touchpad. |
|
*/ |
static void |
static void |
pms_synaptics_passthrough(struct pms_softc *psc) |
pms_synaptics_passthrough(struct pms_softc *psc) |
{ |
{ |
Line 1132 pms_synaptics_passthrough(struct pms_sof |
|
Line 1191 pms_synaptics_passthrough(struct pms_sof |
|
psc->buttons ^= changed; |
psc->buttons ^= changed; |
|
|
if (dx || dy || dz || changed) { |
if (dx || dy || dz || changed) { |
|
/* |
|
* If the middle button is held, interpret Y-axis |
|
* movement as scrolling. |
|
*/ |
|
if (synaptics_aux_mid_button_scroll && |
|
dy && (psc->buttons & 0x2)) { |
|
dz = -dy; |
|
dx = dy = 0; |
|
} |
buttons = (psc->buttons & 0x1f) | ((psc->buttons >> 5) & 0x7); |
buttons = (psc->buttons & 0x1f) | ((psc->buttons >> 5) & 0x7); |
s = spltty(); |
s = spltty(); |
wsmouse_input(psc->sc_wsmousedev, |
wsmouse_input(psc->sc_wsmousedev, |
Line 1154 pms_synaptics_input(void *vsc, int data) |
|
Line 1222 pms_synaptics_input(void *vsc, int data) |
|
|
|
getmicrouptime(&psc->current); |
getmicrouptime(&psc->current); |
|
|
if (psc->inputstate != 0) { |
if (psc->inputstate > 0) { |
timersub(&psc->current, &psc->last, &diff); |
timersub(&psc->current, &psc->last, &diff); |
if (diff.tv_sec > 0 || diff.tv_usec >= 40000) { |
if (diff.tv_sec > 0 || diff.tv_usec >= 40000) { |
aprint_debug_dev(psc->sc_dev, |
aprint_debug_dev(psc->sc_dev, |