当我从 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