Por que meu mouse com roda de rolagem dupla está se comportando apenas como se tivesse uma única roda?

4

Eu tenho um Wheelmouse Optical GreatEye que tem 2 rodas de rolagem e 5 "botões" (três incluindo meio como "clique" na primeira roda de rolagem) e botões laterais esquerdo e direito (áreas laterais escuras na imagem abaixo) e apesar da xinput --list-props output parece correto BOTH rolagem rodas estão se comportando como botões 4 e 5 em vez do segundo trabalhando em 6 e 7, porque é isso e como faço para corrigi-lo (obter a 2ª roda de rolagem funcionando como a roda de rolagem horizontal)?

Acimadaimagem: Site da A4Tech

Saída de xinput list-props # , em que # é o ID do dispositivo correto:

Device 'ImExPS/2 Generic Explorer Mouse':
    Device Enabled (142):   1
    Coordinate Transformation Matrix (144): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Accel Profile (269): 0
    Device Accel Constant Deceleration (270):   1.000000
    Device Accel Adaptive Deceleration (271):   1.000000
    Device Accel Velocity Scaling (272):    10.000000
    Device Product ID (261):    2, 6
    Device Node (262):  "/dev/input/event1"
    Evdev Axis Inversion (273): 0, 0
    Evdev Axes Swap (275):  0
    Axis Labels (276):  "Rel X" (152), "Rel Y" (153), "Rel Horiz Wheel" (267), "Rel Vert Wheel" (268)
    Button Labels (277):    "Button Left" (145), "Button Middle" (146), "Button Right" (147), "Button Wheel Up" (148), "Button Wheel Down" (149), "Button Horiz Wheel Left" (150), "Button Horiz Wheel Right" (151), "Button Side" (265), "Button Extra" (266), "Button Unknown" (264), "Button Unknown" (264), "Button Unknown" (264), "Button Unknown" (264)
    Evdev Scrolling Distance (278): 1, 1, 1
    Evdev Middle Button Emulation (279):    0
    Evdev Middle Button Timeout (280):  50
    Evdev Third Button Emulation (281): 0
    Evdev Third Button Emulation Timeout (282): 1000
    Evdev Third Button Emulation Button (283):  3
    Evdev Third Button Emulation Threshold (284):   20
    Evdev Wheel Emulation (285):    0
    Evdev Wheel Emulation Axes (286):   0, 0, 4, 5
    Evdev Wheel Emulation Inertia (287):    10
    Evdev Wheel Emulation Timeout (288):    200
    Evdev Wheel Emulation Button (289): 4
    Evdev Drag Lock Buttons (290):  0

Usando xev , vi que os eventos vistos nas duas rodas de rolagem são idênticos. Para mim, isso sugere que é um problema de kernel / módulo, estou usando Debian "Jessie" com backports - o último significa que eu estou usando atualmente, como por uname -a :

Linux XXXXX 4.9.0-0.bpo.1-rt-amd64 #1 SMP PREEMPT RT Debian 4.9.2-2~bpo8+1 (2017-01-26) x86_64 GNU/Linux

Como uma hipótese especulativa eu estou querendo saber (dar o número limitado de ratos que realmente têm mais que um real scroll-wheel) se isso pode ser algo realmente relacionado ao kernel - então, como resposta suplementar, onde posso começar a procurar saber mais sobre o que está errado?

Atualização: talvez eu estivesse errado nisso:

Evdev Wheel Emulation Axes (286):     0, 0, 4, 5

deve ser:

Evdev Wheel Emulation Axes (286):     6, 7, 4, 5

mas apenas alterando isso com xinput set-props # 286 6 7 4 5 , em que # é o número de ID correto, por si só não produz nenhuma alteração ...

Curiosamente, grep -ping meu /var/log/Xorg.0.log gera o arquivo:

[    46.173] (II) config/udev: Adding input device ImExPS/2 Generic Explorer Mouse (/dev/input/event1)
[    46.173] (**) ImExPS/2 Generic Explorer Mouse: Applying InputClass "evdev pointer catchall"
[    46.173] (**) ImExPS/2 Generic Explorer Mouse: Applying InputClass "evdev pointer catchall"
[    46.173] (II) Using input driver 'evdev' for 'ImExPS/2 Generic Explorer Mouse'
[    46.173] (**) ImExPS/2 Generic Explorer Mouse: always reports core events
[    46.173] (**) evdev: ImExPS/2 Generic Explorer Mouse: Device: "/dev/input/event1"
[    46.173] (--) evdev: ImExPS/2 Generic Explorer Mouse: Vendor 0x2 Product 0x6
[    46.173] (--) evdev: ImExPS/2 Generic Explorer Mouse: Found 9 mouse buttons
[    46.173] (--) evdev: ImExPS/2 Generic Explorer Mouse: Found scroll wheel(s)
[    46.173] (--) evdev: ImExPS/2 Generic Explorer Mouse: Found relative axes
[    46.173] (--) evdev: ImExPS/2 Generic Explorer Mouse: Found x and y relative axes
[    46.173] (II) evdev: ImExPS/2 Generic Explorer Mouse: Configuring as mouse
[    46.173] (II) evdev: ImExPS/2 Generic Explorer Mouse: Adding scrollwheel support
[    46.173] (**) evdev: ImExPS/2 Generic Explorer Mouse: YAxisMapping: buttons 4 and 5
[    46.173] (**) evdev: ImExPS/2 Generic Explorer Mouse: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200
[    46.173] (II) XINPUT: Adding extended input device "ImExPS/2 Generic Explorer Mouse" (type: MOUSE, id 9)
[    46.174] (II) evdev: ImExPS/2 Generic Explorer Mouse: initialized for relative axes.
[    46.174] (**) ImExPS/2 Generic Explorer Mouse: (accel) keeping acceleration scheme 1
[    46.174] (**) ImExPS/2 Generic Explorer Mouse: (accel) acceleration profile 0
[    46.174] (**) ImExPS/2 Generic Explorer Mouse: (accel) acceleration factor: 2.000
[    46.174] (**) ImExPS/2 Generic Explorer Mouse: (accel) acceleration threshold: 4
[    46.174] (II) config/udev: Adding input device ImExPS/2 Generic Explorer Mouse (/dev/input/mouse0)

Observe que, embora exista uma linha incluindo YAxisMapping: buttons 4 and 5 , não há XAxisMapping: buttons 6 and 7 correspondente - o que é sugestivo ...

Nota: (em resposta ao comentário) é um mouse conector PS / 2, portanto, os diagnósticos relacionados à USB provavelmente não serão úteis.

Após instalar o pacote evtest , descobri que os eventos das duas rodas de rolagem tinham o mesmo type 2 (EV_REL) , code 8 (EV_WHEEL) , mas que a primeira roda de rolagem tinha value 1 ou -1 (para movimentação nas duas direções opostas), mas a segunda roda de rolagem tinha value 2 ou -2 . É interessante lembrar que, em uso, notei que em alguns aplicativos a segunda roda de rolagem produzia ações de rolagem DUAS VEZES maiores do que a primeira - o que começa a soar como um código pode estar interpretando mal o valor como um movimento quantidade em vez de uma "direção"!

    
por SlySven 02.03.2017 / 17:38

1 resposta

5

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 ------------

    
por 03.03.2017 / 06:55