Монитор определяется как сенсорная панель вместо сенсорного экрана

Когда я обновил SUSE до Ubuntu 14.04 LTS, монитор с сенсорным экраном обнаружил, что TOUCHPAD вместо TOUCHSCREEN, Это использует ELO drivers для сенсорного экрана

Я отладил эту проблему, в журнале Xorg тип отображается как "TOUCH PAD" вместо "TOUCH SCREEN",

root@57:~# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 04f2:0116 Chicony Electronics Co., Ltd KU-2971/KU-0325 Keyboard
Bus 001 Device 008: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 006: ID 04e7:0030 Elo TouchSystems 4500U CarrollTouch® Touchmonitor Interface
Bus 001 Device 005: ID 04b3:4670 IBM Corp.
Bus 001 Device 002: ID 0451:2046 Texas Instruments, Inc. TUSB2046 Hub
Bus 001 Device 004: ID 413c:2003 Dell Computer Corp. Keyboard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

root@57:~# xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U        id=11   [slave  pointer  (2)]
⎜   ↳ Logitech USB Optical Mouse                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ Dell Dell USB Keyboard                    id=9    [slave  keyboard (3)]
    ↳ (c) Copyright IBM Corp. 1999 IBM Retail USB 4820 Liquid Crystal Display (Boot mode)                               id=10   [slave  keyboard (3)]
    ↳ CHICONY USB Keyboard                      id=12   [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                          id=13   [slave  keyboard (3)]

/var/log/Xorg.0.log

 [    39.073] (II) config/udev: Adding input device Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U (/dev/input/event7)
    [    39.073] (**) Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Applying InputClass "evdev pointer catchall"
    [    39.073] (**) Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Applying InputClass "Elo class"
    [    39.073] (**) Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Applying InputClass "calibration"
    [    39.073] (II) Using input driver 'evdev' for 'Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U'
    [    39.073] (**) Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: always reports core events
    [    39.073] (**) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Device: "/dev/input/event7"
    [    39.073] (--) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Vendor 0x4e7 Product 0x30
    [    39.073] (--) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Found 1 mouse buttons
    [    39.073] (--) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Found absolute axes
    [    39.073] (--) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Found x and y absolute axes
    [    39.073] (--) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Found absolute touchpad.
    [    39.073] (**) Option "SwapAxes" "0"
    [    39.073] (II) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Configuring as touchpad
    [    39.073] (**) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: YAxisMapping: buttons 4 and 5
[    39.073] (**) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200
[    39.073] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.2/1-3.2:1.0/input/input10/event7"
[    39.073] (II) XINPUT: Adding extended input device "Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U" (type: TOUCHPAD, id 11)
[    39.073] (II) evdev: Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: initialized for absolute axes.
[    39.073] (**) Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: (accel) keeping acceleration scheme 1
[    39.073] (**) Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: (accel) acceleration profile 0
[    39.073] (**) Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: (accel) acceleration factor: 2.000
[    39.073] (**) Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: (accel) acceleration threshold: 4
[    39.073] (II) config/udev: Adding input device Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U (/dev/input/mouse0)
[    39.073] (**) Elo TouchSystems, Inc. Elo TouchSystems CarrollTouch 4500U: Applying InputClass "calibration"

файл xorg.conf

Section "InputDevice"
        Driver      "mouse"
        Identifier  "mouse0"
        Option      "Buttons"   "7"
        Option      "ButtonMapping" "1 1 1"
        Option      "ZAxisMapping"  "4 5 6 6"
EndSection

Section "Device"
        Identifier      "Configured Video Device"
EndSection

Section "Monitor"
        Identifier      "Configured Monitor"
EndSection

Section "Screen"
        Identifier      "Default Screen"
        Monitor         "Configured Monitor"
        Device          "Configured Video Device"
        SubSection "Display"
          Modes "1024x768" "800x600"
        EndSubSection
EndSection

10-evdev.conf

Section "InputClass"
        Identifier "evdev pointer catchall"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

Section "InputClass"
        Identifier "evdev keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection
Section "InputClass"
        Identifier "evdev touchpad catchall"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

Section "InputClass"
        Identifier "evdev tablet catchall"
        MatchIsTablet "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection
Section "InputClass"
        Identifier "evdev touchscreen catchall"
        MatchIsTouchscreen "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

2 ответа

Недавно я столкнулся с этой проблемой в Ubuntu 20.04 с ядром 5.4.0-81 (да, я сдерживаю свои системы 20.04 на ядре 5.4 по разным причинам аппаратной совместимости). Предыдущее ядро ​​-80 было в порядке, и даже ядро ​​5.11.0-27 (последнее доступное в Ubuntu 20.04 на данный момент) работало нормально.

(Примечание: это может быть не 100% решение исходного вопроса, так как 20.04 использует systemd, а 14.04 нет)

Поведение, которое я видел, было таким же: в других ядрах он был указан как TOUCHSCREEN, а в этом - как TOUCHPAD.

tl;dr: Создайте правило в /etc/udev/hwdb.d/60-yourrule.hwdbкоторый соответствует строке вашего устройства, а затем устанавливает ID_INPUT_TOUCHSCREEN=1собственность, а возможно и ID_INPUT_TOUCHPAD=0, затем перезагрузите компьютер.

На высоком уровне я бы резюмировал так: мы говорим игнорировать некоторую информацию от ядра в пользу нашей правильной информации, а затем остальная часть системы (например, xinput, gdm) будет использовать эту правильную информацию и все такое. усердно работать.


В данном случае я использую резистивный сенсорный экран MIMO UM-1000 (дата изготовления 8-2018 или новее; старые экраны отличаются/работают нормально).

В поисках я обнаружил, что нечто, называемое строкой , в этом ядре отличается. В частности, я использовал udevadm info /device/path. Сначала я нашел путь к устройству, проверив вывод loginctl seat-status seat0. Вероятно, есть несколько других способов легко получить этот путь. Этот вывод выглядел так:

        │   ├─/sys/devices/pci0000:00/0000:00:14.0/usb3/3-9/3-9.2/3-9.2:1.0/0003:0EEF:0001.0005/input/input23
  │   │ input:input23 "eGalax Inc. USB TouchController UNKNOWN"
  │   ├─/sys/devices/pci0000:00/0000:00:14.0/usb3/3-9/3-9.2/3-9.2:1.0/0003:0EEF:0001.0005/input/input24
  │   │ input:input24 "eGalax Inc. USB TouchController Stylus"
  │   └─/sys/devices/pci0000:00/0000:00:14.0/usb3/3-9/3-9.2/3-9.2:1.0/0003:0EEF:0001.0005/input/input26
  │     input:input26 "eGalax Inc. USB TouchController"

Из прошлого опыта я знаю, что последней из нескольких записей для моих экранов является фактическое используемое устройство ввода (вы можете определить это, например, с помощью evtest). Итак, я прошел этот путь к udevadm, то есть:

udevadm info /sys/devices/pci0000:00/0000:00:14.0/usb3/3-9/3-9.2/3-9.2:1.0/0003:0EEF:0001.0005/input/input26

Соответствующий бит из этого вывода при запуске на плохом ядре:

      E: MODALIAS=input:b0003v0EEFp0001e0100-e0,1,3,4,k100,145,14A,ra0,1,28,m4,lsfw
E: SUBSYSTEM=input
E: USEC_INITIALIZED=4323633
E: ID_INPUT=1
E: ID_INPUT_TOUCHPAD=1

Проведя эту проверку с несколькими экранами и загрузившись в разные ядра, которые работали или нет, я смог определить, что первая часть строки всегда была одной и той же (вплоть до ,) во всех ядрах, и все работающие ядра имели одинаковую полную строку (заканчивающуюся на mlsfw, но это была целая погоня за гусями, которая не имела отношения к делу).:

Затем я узнал о правилах , которые являются частью udev. Решение состояло в том, чтобы создать файл в /etc/udev/hwdb.d/60-myrules.hwdbчто соответствовало modaliasstring и задайте некоторые свойства.

Решение

Вот что я придумал.

      # Mimo magic monster UM-1000 screens newer than Feb 2018
id-input:modalias:input:b0003v0EEFp0001e0100-e0*
 ID_INPUT_TOUCHPAD=0
 ID_INPUT_TOUCHSCREEN=1

Затем мне пришлось перезагрузиться (или, чтобы не перезагружаться, запустить sudo systemd-hwdb updateи отключите / снова подключите экран), и он начал работать.

Некоторые дополнительные примечания из моего тестирования этого:

  • Кажется, мне пришлось явно отключить значение TOUCHPAD.
  • Если я удалю этот файл и перезагружусь, он вернется к использованию информации ядра (т.е. TOUCHPAD=1)

Это решение является исправлением/обходным путем; Мне не удалось отследить, почему он вдруг сломался с этой версией ядра.

Наконец, если вам интересно, как я нашел свой путь к этому решению, прорыв состоял в том, чтобы узнать о hwdbправила, когда я сделал ag ID_INPUT_TOUCHSCREENв /lib/udev/и нашел /lib/udev/hwdb.d/60-input-id.hwdb.

Если вы устанавливаете пакет xinput (apt-get install xinput), вы можете заставить evdev чтобы увидеть устройство как сенсорный экран по команде

xinput set-mode $ID ABSOLUTE

где $ID идентификатор устройства, возвращаемый командой

xinput -list

Эту операцию необходимо выполнять при каждой загрузке, а идентификатор может изменяться в зависимости от функций других USB-устройств, поэтому будет лучше сделать это в сценарии, который вызывается после startx, что-то вроде этого:

#!/bin/bash

export DISPLAY=:0.0
ID=`xinput --list | grep "Elo TouchSystems" | sed -e 's/.*id=\([0-9]*\).*/\1/'`
xinput set-mode $ID ABSOLUTE

Это прекрасно работает с моим монитором с сенсорным экраном (Elo TouchSystems CarrollTouch 4500U) и Debian 8 (Jessie) и, возможно, будет работать правильно и с Ubuntu.

Другие вопросы по тегам