Parece que isso foi notado quinze anos atrás! Uma série de posts durante um par de dias (2002/07 / 17-18) na lista de discussão Linux Kernel, com o título "PS2 Input Core Support" sugere que isto era conhecido, mas como havia mais de uma maneira de processar os mesmos dados provavelmente teriam que ser manipulados para este produto específico com um parâmetro de módulo manual. No entanto, isso nunca pareceu se materializar. Os detalhes podem ser melhor visualizados em esta postagem :
...
Problem is that A4Tech driver does not care. It just interprets incoming data in the way I described: +-1 is vertical move, +-2 is horizontal, 0 is no move, and everything else is ignored... This is A4Tech's interpretation of ImPS/2 and ExPS/2 protocols.
So we can either assume (like GPM does) that wheel movement can be only +-1, and so we can safely assume that +-2 is horizontal move, and then everything is fine, or we need some option which will affect mouse driver behavior.
All my (A4Tech...) PS/2 wheel mouse report wheel movement only +-1 even with 10Hz sample rate, but I do not think that my mouses are representative sample of available ExPS/2 implementations.
Não, os ratos normais com IMPS / 2 e ExPS / 2 podem, de fato, informar valores maiores que 1 para o movimento das rodas.
Podemos fazer alguma heurística (já vimos movimento de 3? Se sim, então não é um mouse A4Tech ...), ou vá para o parâmetro da linha de comando.
Acho que vou tirar alguns dos meus ratos A4Tech e torturá-los um pouco para veja se eles reagiriam a alguma sequência ...
Outra coisa é o mouse USB A4Tech, que usa um botão para diferenciar entre as rodas, enquanto a especificação USB tem provisões para duas rodas em um mouse :(. Mas esses são pelo menos possíveis de detectar.
-
Vojtech Pavlik
SuSE Labs
Por isso, pretendo envolver um pouco de hackery do kernel para adicionar um parâmetro de módulo a ./drivers/input/mouse/psmouse_base.c
para destruir os dados lidos pelo mouse para corrigi-lo quando habilitado para o caso de psmouse_type
sendo PSMOUSE_IMEX
. / p>
Bem, eu tenho algo que agora funciona para mim e o publiquei na área do grupo Kernel Input Linux como entrada: psmouse - consertar a segunda roda de rolagem em camundongos de roda A4Tech Dual-Scroll , mas como ele será útil para apenas um grupo muito pequeno de usuários, não tenho certeza de que ele será incluído. O patch é razoavelmente pequeno, mas porque modifica o comportamento que será incompatível com outros mouses que usam o protocolo de mouse PS / 2 de uma maneira mais normal, ele não será ativado por padrão. Como um módulo, seria habilitado por um option psmouse a4tech_hack=1
em modules.conf
ou o que é usado no sistema hoje em dia - usando evtest
para demonstrar dá, primeiro com o hack desativado:
stephen@Ripley:~$ sudo modprobe psmouse options a4tech_hack=0 stephen@Ripley:~$ sudo evtest --grab /dev/input/event1 Input driver version is 1.0.1 Input device ID: bus 0x11 vendor 0x2 product 0x6 version 0x0 Input device name: "ImExPS/2 Generic Explorer Mouse" Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 272 (BTN_LEFT) Event code 273 (BTN_RIGHT) Event code 274 (BTN_MIDDLE) Event code 275 (BTN_SIDE) Event code 276 (BTN_EXTRA) Event type 2 (EV_REL) Event code 0 (REL_X) Event code 1 (REL_Y) Event code 6 (REL_HWHEEL) Event code 8 (REL_WHEEL) Properties: Property type 0 (INPUT_PROP_POINTER) Testing ... (interrupt to exit) Event: time 1511190325.037494, type 2 (EV_REL), code 8 (REL_WHEEL), value -1 Event: time 1511190325.037494, -------------- SYN_REPORT ------------ Event: time 1511190325.069545, type 2 (EV_REL), code 8 (REL_WHEEL), value -1 Event: time 1511190325.069545, -------------- SYN_REPORT ------------ Event: time 1511190325.103279, type 2 (EV_REL), code 8 (REL_WHEEL), value -1 Event: time 1511190325.103279, -------------- SYN_REPORT ------------ Event: time 1511190325.360609, type 2 (EV_REL), code 8 (REL_WHEEL), value -1 Event: time 1511190325.360609, -------------- SYN_REPORT ------------ Event: time 1511190325.754597, type 2 (EV_REL), code 8 (REL_WHEEL), value -2 Event: time 1511190325.754597, -------------- SYN_REPORT ------------ Event: time 1511190326.226203, type 2 (EV_REL), code 8 (REL_WHEEL), value 2 Event: time 1511190326.226203, -------------- SYN_REPORT ------------ Event: time 1511190326.335886, type 2 (EV_REL), code 8 (REL_WHEEL), value -2 Event: time 1511190326.335886, -------------- SYN_REPORT ------------ Event: time 1511190326.420238, type 2 (EV_REL), code 8 (REL_WHEEL), value -2 Event: time 1511190326.420238, -------------- SYN_REPORT ------------ Event: time 1511190326.849670, type 2 (EV_REL), code 8 (REL_WHEEL), value -2 Event: time 1511190326.849670, -------------- SYN_REPORT ------------
depois, com isso ativado, observe como os eventos REL_WHEEL com valor de +/- 2 agora são mapeados corretamente para serem eventos REL_HWHEEL:
stephen@Ripley:~$ sudo modprobe -r psmouse stephen@Ripley:~$ sudo modprobe psmouse options a4tech_hack=1 stephen@Ripley:~$ sudo evtest --grab /dev/input/event1 Input driver version is 1.0.1 Input device ID: bus 0x11 vendor 0x2 product 0x6 version 0x0 Input device name: "ImExPS/2 Generic Explorer Mouse" Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 272 (BTN_LEFT) Event code 273 (BTN_RIGHT) Event code 274 (BTN_MIDDLE) Event code 275 (BTN_SIDE) Event code 276 (BTN_EXTRA) Event type 2 (EV_REL) Event code 0 (REL_X) Event code 1 (REL_Y) Event code 6 (REL_HWHEEL) Event code 8 (REL_WHEEL) Properties: Property type 0 (INPUT_PROP_POINTER) Testing ... (interrupt to exit) Event: time 1511190624.369531, type 2 (EV_REL), code 8 (REL_WHEEL), value 1 Event: time 1511190624.369531, -------------- SYN_REPORT ------------ Event: time 1511190625.580824, type 2 (EV_REL), code 8 (REL_WHEEL), value -1 Event: time 1511190625.580824, -------------- SYN_REPORT ------------ Event: time 1511190626.139235, type 2 (EV_REL), code 8 (REL_WHEEL), value 1 Event: time 1511190626.139235, -------------- SYN_REPORT ------------ Event: time 1511190626.419281, type 2 (EV_REL), code 8 (REL_WHEEL), value -1 Event: time 1511190626.419281, -------------- SYN_REPORT ------------ Event: time 1511190626.693413, type 2 (EV_REL), code 8 (REL_WHEEL), value 1 Event: time 1511190626.693413, -------------- SYN_REPORT ------------ Event: time 1511190628.506133, type 2 (EV_REL), code 6 (REL_HWHEEL), value 1 Event: time 1511190628.506133, -------------- SYN_REPORT ------------ Event: time 1511190628.669774, type 2 (EV_REL), code 6 (REL_HWHEEL), value -1 Event: time 1511190628.669774, -------------- SYN_REPORT ------------ Event: time 1511190628.921986, type 2 (EV_REL), code 6 (REL_HWHEEL), value 1 Event: time 1511190628.921986, -------------- SYN_REPORT ------------ Event: time 1511190628.970915, type 2 (EV_REL), code 6 (REL_HWHEEL), value 1 Event: time 1511190628.970915, -------------- SYN_REPORT ------------ Event: time 1511190629.235774, type 2 (EV_REL), code 6 (REL_HWHEEL), value -1 Event: time 1511190629.235774, -------------- SYN_REPORT ------------ Event: time 1511190629.425575, type 2 (EV_REL), code 6 (REL_HWHEEL), value 1 Event: time 1511190629.425575, -------------- SYN_REPORT ------------ Event: time 1511190629.475333, type 2 (EV_REL), code 6 (REL_HWHEEL), value 1 Event: time 1511190629.475333, -------------- SYN_REPORT ------------ Event: time 1511190629.668506, type 2 (EV_REL), code 6 (REL_HWHEEL), value -1 Event: time 1511190629.668506, -------------- SYN_REPORT ------------ Event: time 1511190629.730081, type 2 (EV_REL), code 6 (REL_HWHEEL), value -1 Event: time 1511190629.730081, -------------- SYN_REPORT ------------ Event: time 1511190629.862513, type 2 (EV_REL), code 6 (REL_HWHEEL), value 1 Event: time 1511190629.862513, -------------- SYN_REPORT ------------ Event: time 1511190629.909745, type 2 (EV_REL), code 6 (REL_HWHEEL), value 1 Event: time 1511190629.909745, -------------- SYN_REPORT ------------ Event: time 1511190630.139196, type 2 (EV_REL), code 6 (REL_HWHEEL), value -1 Event: time 1511190630.139196, -------------- SYN_REPORT ------------