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" ]; thenecho "use sunxi-ts"export QT_QPA_FB_TSLIB=1export TSLIB_TSDEVICE=/dev/input/event0export TSLIB_CALIBFILE=/etc/pointercalexport TSLIB_CONFFILE=/etc/ts.confexport TSLIB_PLUGINDIR=/usr/lib/tsexport TSLIB_CONSOLEDEVICE=noneexport TSLIB_FBDEVICE=/dev/fb0export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0if [ ! -f "$TSLIB_CALIBFILE" ];then/usr/bin/ts_calibratefi
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
参考 https://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 readingdelete 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触摸屏驱动开发
在嵌入式Linux系统中,如果USB触摸屏能够检测到并且在手指移动时有数据,但点击无法触发,这可能是因为触摸屏驱动或配置的问题。以下是一些可能的解决方法: 1. 确认驱动支持 首先,确保您使用的触摸屏驱动程序完全支持您…...
AI 百炼成神:逻辑回归, 垃圾邮件分类
第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...
【Unity】Unity clone 场景渲染的灯光贴图异位问题
Unity clone 场景渲染的灯光贴图异位问题 问题 需要将一个场景clone 一份保存到本地 当克隆完成后,副本场景的灯光贴图异位了,与原场景存在较大的差别 问题原因 场景被clone 后,场景的灯光渲染数据不能共用,即Lightmapping.li…...
Android Studio安装配置及运行
一、下载Android Studio 官网下载:下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面,选择同意条款,并点击下载,如图: 二、详细安装 双击下载的文件 三、配置Android Studio …...
运维脚本——9.配置漂移检测
场景:检测服务器配置与基准配置的差异,防止未经授权的修改。 示例:使用Ansible Playbook对比当前配置与标准模板。 - hosts: alltasks:- name: Check SSH configuration against baselineansible.builtin.diff:path: /etc/ssh/sshd_configori…...
FTP 实验(ENSP模拟器实现)
FTP 概述 FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型,客户端通过FTP客户端软件,连接到FTP服务…...
基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室
开源项目 botgroup.chat 介绍 AI 多人聊天室: 一个基于 React 和 Cloudflare Pages(免费一键部署) 的多人 AI 聊天应用,支持多个 AI 角色同时参与对话,提供类似群聊的交互体验。体验地址:https://botgroup.chat 开源仓库&#x…...
rust笔记5-derive属性2
在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...
【电机控制器】ESP32-C3语言模型——豆包
【电机控制器】ESP32-C3语言模型——豆包 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具: 提示:以下是本篇文章正文内容,下面案例可供参考 一、简介 二、代码 #include <WiFi.h> #inc…...
Flask实现高效日志记录模块
目录 一. 简介: 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建(包含日志记录的关键字段) 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…...
基于python深度学习遥感影像地物分类与目标识别、分割
我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…...
Spring有哪些缺点?
大家好,我是锋哥。今天分享关于【Spring有哪些缺点?】面试题。希望对大家有帮助; Spring有哪些缺点? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring框架是一个广泛使用的企业级Java开发框架,提供了丰富的功能和强大的灵…...
linux学习【7】Sourc Insight 4.0设置+操作
目录 1.Source Insight是什么?2.需要哪些配置?3.怎么新建项目4.一些问题的解决1.中文乱码问题 5.常规使用1. 在工程中打开文件2. 在文件中查看函数或变量的定义3. 查找函数或变量的引用4. 快捷键 按照这个设置就可以了,下面的设置会标明设置理…...
dify实现分析-rag-关键词索引的实现
概述 在dify中有两种构建索引的方式,一种是经济型,另一种是高质量索引(通过向量数据库来实现)。其中经济型就是关键词索引,通过构建关键词索引来定位查询的文本块,而关键词索引的构建是通过Jieba这个库来完…...
PHP2(WEB)
##解题思路 打开页面什么线索都没有,目录扫描只是扫出来一个index.php,而源代码没有东西,且/robots.txt是不允许访问的 于是一番查询后发现,有个index.phps的文件路径,里头写着一段php的逻辑,对url的id参数…...
黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系
黑盒测试 vs. 白盒测试 vs. 其他测试类型(单元测试、集成测试、系统测试、验收测试)的区别与联系 一、黑盒测试(Black-box Testing) 定义:不关心代码内部实现,只关注输入和输出是否符合预期。特点&#x…...
Halcon 3D加快表面匹配速度
文章目录 gen_box_object_model_3d 创建一个代表盒子的 3D 物体模型write_surface_model — 将表面模型写入文件read_surface_model — 将表面模型读取prepare_object_model_3d - 为某个操作准备三维对象模型select_points_object_model_3d - 对 3D 物体模型的属性应用阈值。se…...
Linux系统编程之高级信号处理
概述 在前一篇文章中,我们介绍了signal函数、sigaction函数等基本的信号处理方法。在本篇中,我们将介绍信号处理的一些高级用法,包括:阻塞与解除阻塞、定时器等。 阻塞与解除阻塞 有时候,我们不希望某个信号立即被处理…...
Ollama 本地GUI客户端:为DeepSeek用户量身定制的智能模型管理与交互工具
Ollama 本地GUI客户端:为DeepSeek用户量身定制的智能模型管理与交互工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例…...
基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘 要 《计算机网络》题库管理系统是一种新颖的考试管理模式,因为系统是用Java技术进行开发。系统分为三个用户进行登录并操作,分别是管理员、教师和学生。教师在系统后台新增试题和试卷,学生进行在线考试,还能对考生记录、错题…...
对Revit事务机制的一些推测
什么是事务机制 首先,什么是事务机制。软件事务机制是指一种在软件系统中用于管理一系列操作的方法,这些操作要么全部成功完成,要么全部失败,不会出现部分完成的情况。事务机制确保了数据的一致性和完整性,特别是在并…...
软件架构设计:网络基础
一、计算机网络概述 计算机网络的定义 计算机网络是通过通信设备和线路将分散的计算机系统连接起来,实现资源共享和信息传递的系统。 计算机网络的分类 按覆盖范围:局域网(LAN)、城域网(MAN)、广域网&…...
《微软量子芯片:开启量子计算新纪元》:此文为AI自动生成
量子计算的神秘面纱 在科技飞速发展的今天,量子计算作为前沿领域,正逐渐走进大众的视野。它宛如一把神秘的钥匙,有望开启未来科技变革的大门,而微软量子芯片则是这把钥匙上一颗璀璨的明珠。 量子计算,简单来说,是一种遵循量子力学规律调控量子信息单元进行计算的新型计算…...
RocksDB Bloom Filter 如何避免假阳性问题探索
1. 引言:Bloom Filter 的机遇与挑战 Bloom Filter 是数据库系统中广泛使用的概率数据结构,它通过极小的内存开销快速判断一个键是否可能存在于磁盘文件中(如 LSM-Tree 的 SSTable)。然而,其核心缺陷是存在假阳性&…...
SpringBoot+Vue+Mysql苍穹外卖
一.项目介绍 1.项目内容 苍穹外卖是一款为大学学子设计的校园外卖服务软件,旨在提供便捷的食堂外卖送至宿舍的服务。该软件包含系统管理后台和用户端(微信小程序)两部分,支持在线浏览菜品、添加购物车、下单等功能,并…...
网络运维学习笔记 018 HCIA-Datacom综合实验02
文章目录 综合实验2sw3:sw4:gw:core1(sw1):core2(sw2):ISP 综合实验2 sw3: vlan 2 stp mode stp int e0/0/1 port link-type trunk port trunk allow-pass v…...
在 Java 中解析 JSON 数据
例子解析以下JSON数据 {"code":0,"msg":"成功","data": [{ "host":"1068222.com", "port":"", "m_token":"490e20e70e7de5f21a24b14c12a393f6", "categ…...
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度
前言 最近在做项目时遇到一个需求,需要将升级的文件压缩成zip,再进行传输; 通过网络调研,有许多方式可以实现,例如QT私有模块的ZipReader、QZipWriter;或者第三方库zlib或者libzip或者quazip等࿱…...
C++ 互斥锁的使用
mutex std::mutex 是C标准库中用于线程同步的互斥锁机制,主要用于保护共享资源,避免多个线程同时访问导致的竞态条件。 它提供了以下功能: 加锁(lock):阻塞当前线程,直到获取锁。 解锁&#…...
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应我要用 chatgpt,也问过,但是比 deepseek 还是差一个级别,具体如下: package mainimport ("bufio&qu…...
