显示器检测为触摸板而不是触摸屏

显示器检测为触摸板而不是触摸屏

当我从 SUSE 升级到 Ubuntu 14.04 LTS 时,触摸屏显示器检测到 而TOUCHPAD不是TOUCHSCREEN。它使用 来ELO drivers实现触摸屏功能。

我调试了这个问题,在 Xorg Log 中类型显示为 a"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

答案1

如果你安装了 xinput 包 ( apt-get install xinput),你可以evdev通过以下命令强制将设备视为触摸屏

xinput set-mode $ID ABSOLUTE

$ID命令返回的设备 ID 在哪里

xinput -list

每次启动时都需要执行此操作,并且其他 USB 设备的功能中 id 可能会发生变化,因此最好在之后调用的脚本中执行此操作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 配合正常。

答案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 没有)

我看到的行为是相同的:在其他内核中,它被列为触摸屏,而在这个内核中,它被列为触摸板。

总结:创建一个/etc/udev/hwdb.d/60-yourrule.hwdb与您的设备modalias字符串匹配的规则,然后设置ID_INPUT_TOUCHSCREEN=1属性,可能还包括ID_INPUT_TOUCHPAD=0,然后重新启动。

从高层次上讲,我总结如下:我们告诉udev忽略来自内核的某些信息,而使用正确的信息,然后系统的其余部分(例如 xinput、gdm)将使用正确的信息,一切正常。


在这种情况下,我使用的是 MIMO UM-1000 电阻式触摸屏(制造日期为 8-2018 或更新;旧屏幕不同/工作正常)。

在侦查过程中,我发现了一种叫做modalias细绳在这个内核上有所不同。具体来说,我使用的是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

在使用多个屏幕进行检查并启动到可工作或不可工作的不同内核之后,我能够确定字符串的第一部分在所有内核中modalias始终相同(直到,),并且所有可工作的内核都有相同的完整字符串(以 结尾mlsfw,但那是完全不相关的徒劳无功的事情):

然后我发现hwdb规则,它们是 的一部分udev。解决方案是在 中创建一个与字符串/etc/udev/hwdb.d/60-myrules.hwdb匹配的文件modalias,并设置一些属性。

解决方案

以下是我想出的办法。

# 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

相关内容