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

一、前言

在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。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-1.4在I.MX6ULL开发板上电容屏不能触摸问题_第1张图片

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

tslib-1.4在I.MX6ULL开发板上电容屏不能触摸问题_第2张图片

最后都快放弃了,突然想起来,会不会是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-1.4在I.MX6ULL开发板上电容屏不能触摸问题_第3张图片

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

tslib-1.4在I.MX6ULL开发板上电容屏不能触摸问题_第4张图片

问题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 创建一个动态库的软链接

tslib-1.4在I.MX6ULL开发板上电容屏不能触摸问题_第5张图片

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

export QT_DEBUG_LUGINS=1

最后终于大功告成!
 

你可能感兴趣的:(#,移植,linux,qt5,tslib)