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

文章描述了在将Tslib1.4移植到搭载Linux4.0.8内核的正点原子I.MX6ULL开发板上,遇到的电容触摸屏无法正常工作的问题。通过排查硬件驱动和Tslib配置,发现Tslib1.4可能不支持电容屏,改用1.21版本并解决编译过程中遇到的头文件缺失和符号未定义问题,最终使触摸屏恢复正常。同时提到了调试技巧和解决Qt依赖库问题的方法。
摘要由CSDN通过智能技术生成

一、前言

在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。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

最后终于大功告成!
 

### 回答1: 要下载tslib-1.4.tar.gz文件,可以通过CSDN网站进行下载。以下是具体步骤: 1. 打开CSDN网站,并进入其下载页面。 2. 在搜索框中输入tslib-1.4.tar.gz进行搜索。 3. 在搜索结果中找到相关的下载链接,并点击进入。 4. 查看下载页面上的介绍和相关信息,确保下载的文件是正确版本。 5. 点击下载按钮,开始下载tslib-1.4.tar.gz文件。 6. 下载完成后,可以在下载文件的默认保存位置找到该文件。 7. 解压缩下载的tslib-1.4.tar.gz文件。可以使用解压软件,如WinRAR或7-Zip等工具进行解压。 8. 解压后,就可以使用tslib-1.4.tar.gz文件进行相关的操作,如安装、配置等。 需要注意的是,CSDN作为一个开放的技术社区,提供了众多开发者共享的资源,但要注意选择可信的下载链接和源,确保所下载的文件是没有被恶意篡改或携带病毒的。 ### 回答2: tslib-1.4.tar.gz是一个名为tslib的软件包文件,它可能包含了一些用于触摸驱动和应用程序开发的工具和库。CSDN是一个在线技术社区,它为开发者提供了许多技术相关的资源。 如果你想要下载tslib-1.4.tar.gz文件,你可以在CSDN的网站上搜索该文件的下载链接。首先,访问CSDN的官方网站,并输入“tslib-1.4.tar.gz下载”进行搜索。在搜索结果中,你可能会找到一些相关的帖子或文章,其中包含了这个文件的下载链接。 点击下载链接后,你将被重定向到一个下载页面,在该页面上你可以选择下载文件的保存位置。一般来说,大部分的下载页面都会提供一个下载按钮或者链接,你只需点击它即可开始下载。 一旦下载完成,你可以找到你的下载文件夹,其中应该已经有了tslib-1.4.tar.gz文件。你可以使用解压软件(例如7-Zip)来解压或打开这个文件。 总之,要下载tslib-1.4.tar.gz文件,你可以通过访问CSDN的网站并搜索相关链接来实现。希望这个回答对你有所帮助。 ### 回答3: 要下载tslib-1.4.tar.gz,首先需要访问CSDN网站。我们可以在浏览器中输入CSDN的网址(https://www.csdn.net/)进行访问。在CSDN网站上,可以找到各种技术资源和开源软件。在搜索框中输入tslib-1.4.tar.gz,并点击搜索按钮,即可找到相关的下载链接。 在下载链接所在的页面上,我们可以找到tslib-1.4.tar.gz的详细信息,如版本号、文件大小以及更新日期等。通常,下载链接会以文本、图片或按钮的形式展示。点击下载链接后,即可开始下载tslib-1.4.tar.gz文件。 下载过程中,我们可以选择保存文件的路径和名称。一般来说,选择一个易于找到和记忆的文件保存路径是很重要的。下载完成后,我们可以在选择的路径下找到tslib-1.4.tar.gz文件。 tslib-1.4.tar.gz是一个压缩文件,我们需要解压缩才能使用其中的内容。可以使用类似WinRAR或7-Zip等解压工具对文件进行解压。解压完成后,可以得到一个名为tslib-1.4的文件夹,里面包含了tslib-1.4的源代码和其他相关文件。 现在,我们可以根据具体需求,使用tslib-1.4.tar.gz文件中的内容了。如果是进行编程开发,需要将tslib-1.4的源代码导入到项目中,并进行编译和运行。如果是进行研究或学习,可以查看文件中的文档或示例代码,以获取更多关于tslib-1.4的使用说明。 总之,通过在CSDN上下载tslib-1.4.tar.gz,我们可以获取到这个开源软件的压缩文件,并通过解压缩获得源代码和其他资源,从而满足我们对tslib-1.4的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值