主页 > 互联网  > 

ok113i平台——usb触摸屏驱动开发

ok113i平台——usb触摸屏驱动开发

在嵌入式Linux系统中,如果USB触摸屏能够检测到并且在手指移动时有数据,但点击无法触发,这可能是因为触摸屏驱动或配置的问题。以下是一些可能的解决方法:

1. 确认驱动支持

首先,确保您使用的触摸屏驱动程序完全支持您的触摸屏设备。可以通过查看内核日志来确认驱动程序加载和设备识别情况:

dmesg | grep -i 'touch' 2. 检查输入设备

确认触摸屏设备是否正确注册为输入设备:

cat /proc/bus/input/devices

查找您的触摸屏设备条目,并记下其Handlers字段中的eventX(如event0)。

3. 使用evtest工具进行测试

evtest是一个用于测试输入设备的工具,可以详细检测触摸屏的事件输出。 运行evtest并选择触摸屏设备:

evtest /dev/input/eventX

在触摸屏上点击和移动手指,观察evtest输出的事件,确认是否有BTN_TOUCH或BTN_LEFT等事件。

如果没有evtest, 直接用cat也能看到触摸时会有乱码数据输出,用hexdump可以看到二进制数据;

4. 确认tslib的环境变量及配置参数

环境变量通常在/etc/profile里,也有可能在/etc/profile调用了其他文件,如OK113i就用了/etc/profile.d/qtenv.sh文件来配置tslib的环境变量 只需关注/etc/profile.d/qtenv.sh文件中跟TSLIB相关内容

if [ ! -n "$TouchDeviceNum" ]; then echo "use sunxi-ts" export QT_QPA_FB_TSLIB=1 export TSLIB_TSDEVICE=/dev/input/event0 export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONFFILE=/etc/ts.conf export TSLIB_PLUGINDIR=/usr/lib/ts export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0 if [ ! -f "$TSLIB_CALIBFILE" ];then /usr/bin/ts_calibrate fi fi

QT_QPA_FB_TSLIB 是与qt相关的配置; TSLIB_TSDEVICE 表示触摸设备文件,通过第2步,可以确定触摸设备是event8,这里设置成了event0,要改,不然运行ts_test或qt程序触摸会没反应; TSLIB_CALIBFILE 指定校准数据保存文件,很多教程说不用校准,但在我当前的环境中步校准,触摸点是不准确的; TSLIB_CONFFILE 指定ts配置文件,该文件通常使用默认参数即可; TSLIB_PLUGINDIR 示 tslib 插件目录位置; TSLIB_CONSOLEDEVICE 表示控制台设置,这里不设置,因此为 none; TSLIB_FBDEVICE 表示 FB 设备,也就是屏幕,根据实际情况配置;

5. 校准触摸屏

正点原子教程说电容触摸屏不用校准,但我这里不校准不行,校准也很简单,输入ts_calibrate,依次点击屏幕上5个校准点即可; 使用tslib库自带的ts_calibrate工具校准触摸屏:

ts_calibrate

屏幕会弹出校准界面

6. 触摸测试

tslib还提供测试程序供用户测试触摸功能,如ts_test 界面会出现三个按钮“Drag”、“Draw”和“Quit”; Drag 默认选项,拖曳测试; Draw 绘图测试; Quit 退出程序;

7. 问题:tslib要指定eventX才能接收触摸数据,但是usb触摸屏每次上电的eventX编号都可能不一样,又受插拔顺序影响

解决方法: 参考1:linux input如何固定设备event handler; 参考2:Linux下采用软链接来固定触摸屏的event编号; 参考3:如下,使用udev来配置软连接,参考chaptgpt 在使用eudev的时候,有时您可能需要为特定的USB设备分配固定的event编号,以便在系统重启或设备重新插拔时保持一致。这在处理多个相同类型的设备时特别有用。以下是如何使用eudev配置USB设备的固定event编号的步骤。

在OK113i-linux-sdk/platform/framework/auto/rootfs/etc/udev/rules.d/创建文件 54-usbscreentouch.rules 文件内容如下:

KERNEL=="event*", SUBSYSTEM=="input", ATTRS{name}=="ILITEK ILITEK-TP", SYMLINK+="input/event_touch" #意思是匹配event事件设备,名字为ILITEK ILITEK-TP,创建新连接input/event_touch 7.1 确认设备信息

首先,您需要确认USB设备的详细信息,可以使用lsusb和udevadm工具来完成。

使用lsusb查看设备信息 cat /proc/bus/input/devices

找到目标设备的供应商ID(Vendor ID)和产品ID(Product ID)。例如,输出可能如下所示:

I: Bus=0003 Vendor=222a Product=0001 Version=0110 N: Name="ILITEK ILITEK-TP" P: Phys=usb-sunxi-ehci-1.2/input0 S: Sysfs=/devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.2/1-1.2:1.0/0003:222A:0001.0006/input/input14 U: Uniq=V06.00.00.00 H: Handlers=event4 B: PROP=0 B: EV=1b B: KEY=400 0 0 0 0 0 0 0 0 0 0 B: ABS=100 3 B: MSC=10

在此示例中,供应商ID是1234,产品ID是5678。

使用udevadm查看设备属性

使用udevadm info命令获取设备的详细属性:

udevadm info --query=all --name=/dev/input/eventX # 获取设备属性 udevadm info --attribute-walk --name=/dev/input/eventX # 获取所有子属性, 下面更改ATTRS{idVendor}会有用

替换/dev/input/eventX为实际的设备节点路径。输出将包含许多属性,例如:

P: /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:1234:5678.0001/input/input5/event5 N: input/event5 S: input/by-id/usb-Example_Corp_Example_Device-if00-event E: DEVNAME=/dev/input/event5 E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:1234:5678.0001/input/input5/event5 E: ID_VENDOR_ID=1234 E: ID_MODEL_ID=5678 E: ID_SERIAL=Example_Corp_Example_Device ... 7.2. 创建udev规则

使用上述信息创建一个自定义的udev规则文件,在/etc/udev/rules.d/目录中。 具体路径如下: OK113i-linux-sdk/platform/framework/auto/rootfs/etc/udev/rules.d/54-usbscreentouch.rules

示例规则文件

以下是一个示例规则文件,命名为99-usb-static-event.rules:

vi /etc/udev/rules.d/99-usb-static-event.rules

内容如下:

# /etc/udev/rules.d/99-usb-static-event.rules # 固定USB设备的event编号 # 规则格式: 通过设备属性匹配设备,并创建符号链接为固定的event编号 KERNEL=="event*", SUBSYSTEM=="input", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="input/event_touch" KERNEL=="event*", SUBSYSTEM=="input", ATTRS{name}=="ILITEK ILITEK-TP", SYMLINK+="input/event_touch" ## 注意:ATTRS{name}不能与ATTRS{idVendor}共用,不然匹配不到设备

在此示例中,1234和5678分别是设备的供应商ID和产品ID。SYMLINK+="input/event-fixed0"表示创建一个符号链接,将目标设备的event节点链接到/dev/input/event-fixed0。

7.3 重新加载udev规则

保存规则文件后,重新加载udev规则以使其生效:

udevadm control --reload-rules udevadm trigger 7.4 验证配置

拔掉并重新插入USB设备,或使用以下命令触发设备事件:

udevadm trigger --action=add /dev/input/eventX

替换/dev/input/eventX为实际的设备节点路径。然后,检查符号链接是否已创建:

ls -l /dev/input/event-fixed0

您应该看到类似如下的输出:

lrwxrwxrwx 1 root root 6 Jul 26 12:34 /dev/input/event-fixed0 -> eventX

这表明设备的event节点已被链接到固定的event编号。

问题:重新插拔设备,需要软件重启才能接收到触摸事件

解决方案1:《qt+tslib支持usb触摸屏热插拔功能实现》 解决方案2:不使用tslib 参考 blog.csdn.net/weixin_42968584/article/details/128336470?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-3-128336470-blog-120849874.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-3-128336470-blog-120849874.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=4

qt5直接屏蔽tslib的使用就能多点触摸;配置文件:/etc/profile.d/qtenv.sh屏蔽tslib后,usb触摸屏不能热插拔,需要qt更改源码 buildroot/build/qt5base-5.12.5/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp 更改后的内容如下: …… // 从426行开始 if (errno != EINTR && errno != EAGAIN) { qErrnoWarning(errno, "evdevtouch-test: Could not read from input device"); if (errno == ENODEV) { // device got disconnected -> stop reading delete m_notify; m_notify = nullptr; QT_CLOSE(m_fd); m_fd = -1; while(1){ m_fd = QT_OPEN(d->deviceNode.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0); if(m_fd >= 0){ m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); connect(m_notify, SIGNAL(activated(int)), this, SLOT(readData())); return; } // system("echo waiting for evdevtouch ..."); system("sleep 1"); } // unregisterTouchDevice(); } return; }

当前更改源码后,重新编译buildroot成功,且热插拔也成功;

出厂系统配置触摸方式文件

更改/home/OK113i-linux-sdk/platform/framework/auto/rootfs/etc/profile.d/qtenv.sh

标签:

ok113i平台——usb触摸屏驱动开发由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“ok113i平台——usb触摸屏驱动开发