tslib-1.4在I.MX6ULL开发板上电容屏不能触摸问题

news2024/11/15 8:47:00

一、前言

在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。也就是Tslib 为触摸屏驱动和应用层之间的适配层,其从驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕坐标。

本次移植tslib的软硬件环境环境如下:

主机环境:Ubuntu 16.04 LTS

编译环境:arm-linux-gcc-4.2.3

目标机:正点原子I.MX6ULL开发板

目标机内核:linux 4.0.8

QT版本:5.12.10

二、问题及排查过程

问题:

为了移植带3D功能的QT5.12.10到ARM板上,在源码QT源码的时候,选用了tslib-1.4版本,但没想到在移植到板子上后,板子上的电容触摸屏不能触摸,点击无反应。

排查过程:

首先就是分析了硬件驱动,查看 /dev/input下也有event节点,proc/bus/input/devices 下也有输入设备,所以驱动应该是成功了的,但是触摸就是不行,运行 ts_test 测试也不行

然后开始怀疑是tslib配置的问题,因为开发板是电容触摸屏,所有一直觉得是 pointercal 的问题,觉得是电容屏校准了,但是如果把 export TSLIB_CALIBFILE=/etc/pointercal 去掉、/etc/pointercal删掉后,ts_test 都运行不起来!

最后都快放弃了,突然想起来,会不会是tslib的问题,正点原子出厂镜像里tslib是1.21版本的,然后用 gcc4.2.3 重新交叉编译了 tslib-1.21 ,结果还真是,将板卡中的tslib替换后触摸好了!! 后面在网上看见有说 tslib1.4不支持多点触摸。所以要注意根据自己的需求选择一个合适的版本。 

三、tslib-1.21交叉编译

1、下载tslib

在github下载tslib-1.21 (tslib-1.21下载地址)获取到tslib-1.21.tar.gz安装源文件。

2、编译和安装

编写编译脚本:新建自动编译脚本automake_tslib.sh,内容如下

#!/bin/sh
tar -zxvf tslib-1.21.tar.gz
cd tslib-1.21
./autogen.sh 
mkdir _install
echo "ac_cv_func_malloc_0_nonnull=yes" > arm-linux.cache
./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/_install
make
make install

3、编译时遇到的问题

问题1:linux/hidraw.h: No such file or directory

waveshare-raw.c:26:26: error: linux/hidraw.h: No such file or directory
waveshare-raw.c: In function 'waveshare_read':
waveshare-raw.c:44: error: storage size of 'info' isn't known
waveshare-raw.c:62: error: 'HIDRAW_MAX_DEVICES' undeclared (first use in this function)
waveshare-raw.c:62: error: (Each undeclared identifier is reported only once
waveshare-raw.c:62: error: for each function it appears in.)
waveshare-raw.c:80: error: 'HIDIOCGRAWINFO' undeclared (first use in this function)
waveshare-raw.c:44: warning: unused variable 'info'
waveshare-raw.c: In function 'waveshare_read_mt':
waveshare-raw.c:158: error: storage size of 'info' isn't known
waveshare-raw.c:182: error: 'HIDRAW_MAX_DEVICES' undeclared (first use in this function)
waveshare-raw.c:200: error: 'HIDIOCGRAWINFO' undeclared (first use in this function)
waveshare-raw.c:158: warning: unused variable 'info'
Makefile:988: recipe for target 'waveshare-raw.lo' failed
make[2]: *** [waveshare-raw.lo] Error 1
make[2]: Leaving directory '/home/wwyc/srv/winShared/qt5/tslib-1.21/plugins'
Makefile:488: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/wwyc/srv/winShared/qt5/tslib-1.21'
Makefile:397: recipe for target 'all' failed
make: *** [all] Error 2

解决方法:搜索 hidraw.h 头文件

在其他版本的tslib中找到了该头文件,将其拷贝到 同目录下

问题2:undefined reference to `EVIOCGPROP'

../src/.libs/libts.so: undefined reference to `EVIOCGPROP'
collect2: ld returned 1 exit status
Makefile:614: recipe for target 'ts_test' failed
make[2]: *** [ts_test] Error 1
make[2]: Leaving directory '/home/wwyc/srv/winShared/qt5/tslib-1.21/tests'
Makefile:488: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/wwyc/srv/winShared/qt5/tslib-1.21'
Makefile:397: recipe for target 'all' failed
make: *** [all] Error 2

解决方法:打开 src/tslib.h,在文件中加入这个

#define EVIOCGPROP(len)  _IOC(_IOC_READ, 'E', 0x09, len)         /* get device properties */

问题3:'SYN_MT_REPORT' undeclared (first use in this function)

ts_uinput.c: In function 'send_touch_events':
ts_uinput.c:299: error: 'SYN_MT_REPORT' undeclared (first use in this function)
ts_uinput.c:299: error: (Each undeclared identifier is reported only once
ts_uinput.c:299: error: for each function it appears in.)
Makefile:436: recipe for target 'ts_uinput.o' failed
make[2]: *** [ts_uinput.o] Error 1
make[2]: Leaving directory '/home/wwyc/srv/winShared/qt5/tslib-1.21/tools'
Makefile:488: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/wwyc/srv/winShared/qt5/tslib-1.21'
Makefile:397: recipe for target 'all' failed
make: *** [all] Error 2

解决方法:

打开内核源码/include/linux/input.h,复制SYN_MT_REPORT相关代码添加到tslib-1.21/src/tslib.h中,代码如下:

/*
* Synchronization events.
*/
#define SYN_MT_REPORT           2

4、测试验证

将交叉编译的tslib移植到板卡上后,运行程序时又遇到了如下问题:

然后参考了如下博客,最终发现是缺少了 libts-1.4.so.0 动态库。原因是在交叉编译qt5源码的时候,使用的是tslib1.4 版本,也就是qt的库是依赖的tslib1.4,但是我这里给升级了,所有找不着了

Ubuntu18.04下,QT5移植到ARM板上运行程序发生异常:could not find or load the Qt platform plugin "linuxfb"原因_chaoshuaihaohao的博客-CSDN博客

解决方式就是 ln -s libts.so.0.10.3 libts-1.4.so.0 创建一个动态库的软链接

其中学会了一个很重要的调试技巧,就是在配置文件/etc/profile后面添加如下调试环境变量,就可以打印出具体的错误信息了

export QT_DEBUG_LUGINS=1

最后终于大功告成!
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32-S3 >>> MicroPython 编程初探

今天买了一个ESP32-S3,打算试试在这上面进行MicroPython的编程(附资料网址)。 首先为了在ESP32上进行mp的编程,需要对其重新烧录固件。这就需要我们电脑安装好CH343驱动,然后找到适用于ESP32-S3的固件,利用…

Diffusion详解及PyTorch代码

首先附上几个大佬的讲解 lilianweng-diffusion-models 这篇博客借鉴了上述博客和视频,同时加上个人的理解整合了一下,整个推导过程非常详细,希望能使每个人都看懂 结合之前讲过的VAE和GAN模型,Diffusion Model和他们的区别就是…

Apache Struts2远程代码执行漏洞(S2-015)复现及修复方案

Apache Struts2远程代码执行漏洞(S2-015)介绍 Apache Struts 2是用于开发JavaEE Web应用程序的开源Web应用框架。Apache Struts 2.0.0至2.3.14.2版本中存在远程命令执行漏洞。远程攻击者可借助带有‘${}’和‘%{}’序列值(可导致判断OGNL代码两次)的请求…

LabVIEW​​共享​变量生命周期

LabVIEW​​共享​变量生命周期 共享​变量​生命​周期 ​所有​共享​变量​都是​项目​库​的​一部分。​SVE​将会​注册​项目​库​和​库​中​包含​的​共享​变量​(当​LabVIEW​需要​调​用​其中​某​个​变量​时)​。​默认​情况​…

AlphaGo简易版MuGo源码解析

文章目录前言源码实现MuGo的输入数据模型的搭建模型的训练参考链接结语前言 自从AlphaGo横空出世,战胜李世石后,AI围棋如雨后春笋一般遍地开花。阅读DeepMind的论文有时还是隔靴搔痒,只有钻到代码里,才能一探究竟。于是&#xff…

Arthas诊断追踪性能案例

文章目录1、什么是Arthas2、安装启动3、追踪流程背景:本次案例使用Windows操作系统进行本地环境演示(生产环境Linux同理) 案例:查询接口性能特别慢,通过Arthas追踪诊断链路中哪个步骤导致性能如此之慢 注意&#xff1a…

code review的思考和实践

使用方式 1.看名称效果图,有没有和自己想要的效果类似的 2.有的话,复制粘贴代码使用 3.也可以自己修改一下 4.css效果并不是特别难,只是有时候我们可能想不到 5.笔者空闲时间,会继续更新的哦,点赞关注不迷路**^_^** …

EMNLP 22:SetGNER: General Named Entity Recognition as Entity Set Generation

SetGNER: General Named Entity Recognition as Entity Set Generation **任务形式:**识别flat、nest和不连续实体。 **任务建模方式:**采用基于pointer的方式实现任务建模,文本序列中的每个word可以用tag表示,具体为&#xff1…

Java算法_LeetCode122:买卖股票的最佳时机II

LeetCode122:买卖股票的最佳时机II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 …

有关于huggingface evaluate的使用

老版本Transformer的from datasets import load_metric,在新版本中被替换成了evaluate。 这个包挺难用的,而且不同版本的接口都有点不太一样,本博客以transformers4.18.0, evaluate0.4.0为例,示范一下如何使用evaluate进行常见的…

【LDF】线性判别函数(一)

基于判别函数的判别准则 对于ccc类分类问题:设 gi(x),i1,2,…,cg_i(\mathbf{x}), i1,2, \ldots, cgi​(x),i1,2,…,c, 表示每个类别对应的判别函数,决策规则为:如果 gi(x)>gj(x),∀j≠ig_i(\mathbf{x})>g_j(\mathbf{x}), \forall j \n…

[机器学习-概念新] 什么是欧式距离、标准化欧式距离、马氏距离、余弦距离

1.欧式距离(Euclidean Distance) 欧式距离源自N维欧氏空间中两点间的距离公式: 代码实践 from scipy import spatial vec1 [1, 2, 3, 4] vec2 [5, 6, 7, 8] euclidean spatial.distance.euclidean(vec1, vec2) print(euclidean) 2.标准化欧式距离(S…

狂揽两千星,速度百倍提升,高性能Python编译器Codon开源

这个高性能 Python 编译器具有支持 Python 众多语法、完美互通其他框架等优点。 众所周知,Python 是一门简单易学、具有强大功能的编程语言,在各种用户使用统计榜单中总是名列前茅。相应地,围绕 Python,研究者开发了各种便捷工具&…

G1垃圾回收

目录一、G1垃圾回收器G1垃圾回收阶段(3个)① Young Collection② Young Collection CM③ Mixed CollectionYoung Collection 跨代引用RemarkG1—垃圾回收器优化字符串去重类卸载巨型对象动态调整阈值一、G1垃圾回收器 定义: Garbage First&…

lanmp环境搭建,你需要一次独立安装来深入了解各个软件

一,安装Apache yum install httpd -y,安装apache,版本为2.4.6,最新为2.4.9。 cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak; vim /etc/httpd/conf/httpd.conf (默认唯一) 端口改为8000,不能与Ngin…

File类的使用

java,File类File类静态成员变量构造方法常用方法用于创建、删除文件/文件夹的方法用于遍历文件/文件目录的方法文件过滤器方法File类 Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。 File对象代表磁盘…

数据分析的大体思路

目录标题数据分析企业数据的分析的三个方向:离线分析(Batch Processing)实时分析(Real Time Processing |Streaming):机器学习(Machine Learning)数据分析的流程明确分析的目的和思路…

JVM调优基本概念

1、jvm组成以工作流程 jvm组成 类装载器、运行时数据区(内存模型)、字节码执行引擎 工作大致流程 首先我们的java类编译成class类文件,当我们的class文件开始执行,我们的虚拟机便开始工作。 类加载器将class加载到运行时数据区…

SSM之Spring(一)

目录 一:Spring简介 1.1 Spring概述 1.2 SpringFrameWork 1.2.1 SpringFrameWork特性 1.2.2 Spring Framework五大功能模块 二:IOC 2.1 IOC容器 2.1.1 IOC思想 2.1.2 IOC容器在Spring中的实现 2.2 基于XML管理bean 2.2.1 入门案例 2.2.2 获取bean…

Golang switch 的使用的注意事项和细节

内容来自:尚硅谷-韩老师教学笔记,链接:尚硅谷 1)case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以) 2)case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致 3…