You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 16.04触摸屏故障求助:信息亭触屏Linux下无法工作

解决Linux下触摸屏无法生成Input事件的问题

看起来你的触摸屏已经被系统识别为HID设备(从/dev/hidraw1能输出事件就能看出来),但内核还没把它的HID数据转换成标准的鼠标/触摸Input事件。咱们一步步来排查解决:

1. 确认触摸屏的HID协议类型

首先得搞清楚你的触摸屏用的是哪种HID协议,有些触摸屏需要特定内核模块来解析:

  • 安装usbhid-dump工具(Debian/Ubuntu直接用sudo apt install usbhid-dump,Fedora用sudo dnf install usbhid-dump
  • 执行命令:sudo usbhid-dump -es,找到对应触摸屏的设备(可以先通过lsusb确认设备的Vendor ID和Product ID来定位)
  • 查看输出的报告描述符,如果里面有Usage Page (Digitizer)(通常是0x0D),说明这是一个数字化触摸屏,需要hid-multitouch模块来处理。

2. 加载必要的内核模块

如果hid-multitouch模块没加载,手动加载它:

sudo modprobe hid-multitouch

要是想让模块开机自动加载,把模块名加到/etc/modules-load.d/touchscreen.conf里:

hid-multitouch

3. 配置udev规则让系统识别为触摸屏

有时候系统没自动把设备标记为触摸屏,咱们手动添加udev规则:

  1. lsusb获取设备的Vendor ID和Product ID,比如输出类似Bus 001 Device 003: ID 1234:5678 XXXX Touchscreen,这里1234是Vendor ID,5678是Product ID
  2. 创建规则文件:sudo nano /etc/udev/rules.d/99-touchscreen.rules,写入内容:
    SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", RUN+="/sbin/modprobe hid-multitouch", ENV{ID_INPUT_TOUCHSCREEN}="1"
    
    12345678换成你设备的实际ID
  3. 重新加载udev规则:
    sudo udevadm control --reload-rules && sudo udevadm trigger
    

4. 找到正确的Input设备并测试

之前你查看的/dev/input/mouse0event4可能不是触摸屏对应的设备,用evtest工具来确认:

  • 安装evtest(Debian/Ubuntu:sudo apt install evtest,Fedora:sudo dnf install evtest
  • 执行sudo evtest,会列出所有Input设备,选择名字里带有TouchscreenDigitizer的设备
  • 触摸屏幕,看看有没有EV_ABS类型的事件输出,如果有,说明设备已经正常生成Input事件了

5. 配置Xorg/Wayland适配触摸屏

如果你用X11:

创建Xorg配置文件/etc/X11/xorg.conf.d/99-touchscreen.conf,内容如下:

Section "InputClass"
    Identifier "Touchscreen"
    MatchIsTouchscreen "on"
    Driver "libinput"
    # 如果需要校准,可以调整CalibrationMatrix参数,比如旋转或偏移
    Option "CalibrationMatrix" "1 0 0 0 1 0 0 0 1"
EndSection

重启Xorg或者注销重新登录,触摸屏应该就能正常工作了。

如果你用Wayland:

大部分现代桌面环境(比如GNOME、KDE)会自动识别触摸屏,但如果没反应:

  • 检查桌面设置里的“触摸屏”选项是否开启
  • 查看Wayland日志(比如journalctl -b | grep libinput),有没有设备识别错误的信息

为什么/dev/hidraw1有输出但Input设备没有?

/dev/hidraw*是直接读取HID设备的原始数据包,不需要内核解析;而/dev/input/*是内核把HID数据转换成标准Input事件后提供的节点。你的问题就出在内核没有把触摸屏的HID数据转换成Input事件,上面的步骤就是帮你完成这个转换流程。

内容的提问来源于stack exchange,提问作者Andrey Svistunov

火山引擎 最新活动