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