Hi3531D 交叉编译,安装tslib库
环境:Ubuntu-18.04 64位
交叉编译器:arm-hisiv600-linux
tslib版本:tslib-1.4
一、安装tslib库
1、下载tslib源码包
- 链接:https://pan.baidu.com/s/1I4polpLf9dunFh03f4A-fA
- 提取码:pu2i
- 源码包名:tslib-1.4.tar.gz
2、安装交叉编译tslib必须的一些工具
$ sudo apt-get install autoconf
$ sudo apt-get install automake
$ sudo apt-get install libtool
3、拷贝源码包到海思开发平台,并解压源码包
$ sudo tar -xvf tslib-1.4.tar.gz
$ cd tslib
4、生成config文件
$ sudo ./autogen.sh
没有报错则会生成 configure 文件。
5、创建安装目录
$ mkdir -p /home/temp/tslib
6、生成Makefile文件
要 make 编译 tslib,必须要有 Makefile 文件,那么就需要先运行所生成的 ./configure 进行配置,然后再生成 Makefile:
$ sudo ./configure --host=arm-hisiv600-linux --prefix=/home/temp/tslib/ CC=/opt/hisi-linux/x86-arm/arm-hisiv600-linux/target/bin/arm-hisiv600-linux-gcc
--host 指定交叉编译工具链的前缀,--prefix 指定所编译生成Tslib库的执行文件、头文件和动态库的路径,CC 指定交叉编译器的绝对路径。
7、编译
$ sudo make
首次编译报错如下:
ts_test.o: In function `main':
ts_test.c:(.text+0x52c): undefined reference to `rpl_malloc'
fbutils.o: In function `open_framebuffer':
fbutils.c:(.text+0x108): undefined reference to `rpl_malloc'
collect2: ld returned 1 exit status
make[2]: *** [ts_test] 错误 1
make[2]:正在离开目录 `/root/library/tslib/tslib/tests'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/root/library/tslib/tslib'
make: *** [all] 错误 2
出错:编译 tslib,执行 make 时提示undefined reference to rpl_malloc
是因为 config.h.in 文件中有#undef malloc
,需要把#undef malloc
注释掉:
$ sudo vi config.h.in
修改之后,重新make,成功。
8、安装
$ sudo make install
会出现警告信息:
libtool: warning: remember to run 'libtool --finish /home/temp/tslib/lib/ts/'
需要执行:
$ sudo libtool --finish /home/temp/tslib/lib/ts/
然后在安装目录下可见成功安装了,有如下 4 个文件夹:
bin etc include lib
二、移植tslib到ARM开发板
把编译生成的 tslib 库拷贝到开发板上任意路径,我拷贝到 /usr/local 目录下,这里最重要就是设置环境变量,为什么要设置?我前言有提到,运行应用程序需要链接它的依赖库,怎么找它额依赖库,就在环境变量的路径下面寻找。
1、编辑全局环境变量文件:
$ vi /etc/profile
在最后添加上以下几行:
# touchscreen lib - tslib
export TS_ROOT=/usr/local/tslib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TS_ROOT/lib
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FDDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=$TS_ROOT/etc/pointercal
export TSLIB_CONFFILE=$TS_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TS_ROOT/lib/ts
export QWS_MOUSE_PROTO=tslib:/dev/input/event1
- TS_ROOT:设置一个根目录,方便更改
- LD_LIBRARY_PATH:添加共享库的目录
- TSLIB_CONSOLEDEVICE:控制台设备文件名,一般不需要
- TSLIB_FBDEVICE:fb0 为ARM中的一块内存,我们可以理解为 PC 的显存,要显示应用层的图形界面都不能绕过它
- TSLIB_TSDEVICE:指定触摸屏设备(内核支持触摸屏驱动),不确定哪个设备是触摸屏,可执行:
$ cat event0 // 或其他event1 2 3
,然后按下触摸屏,串口有信息输出则是 - TSLIB_CALIBFILE:校准的数据文件,由 ts_calibrate 校准程序生成
- TSLIB_CONFFILE:tslib 的配置文件,一般情况下不需要更改
- TSLIB_PLUGINDIR:插件的目录
- QWS_MOUSE_PROTO:Qt 输入设备的环境变量(不设置此项,校准后光标是准的,鼠标不准)
2、使环境变量生效:
$ source /etc/profile
就可以了,跑 tslib/bin 目录下的几个测试程序试下。
3、出现问题1:
$ ./ts_calibrate
No raw modules loaded.
ts_config: No such file or directory
编辑 tslib/etc/ts.conf 文件, 至少开放一个 module_raw(去掉注释),并删掉该行前面的空格。如下图:
4、出现问题2:
运行 bin 下的可执行文件出现 selected device is not a touchscreen I understand 问题,说明你
的 tslib 中的输入系统和内核 input 系统版本不匹配,当然也有其他原因,这是最常见的情况
- 1. 将内核源代码里的 include/linux/input.h 中的 #define EV_VERSION 0x010001 改为:
#define EV_VERSION 0x010000
- 2. 将 arm 交叉编译工具中的头文件库中的 linux/input.h 中的 #define EV_VERSION 0x010000 改为 #define EV_VERSION 0x010001,然后再编译 tslib 库
本人是修改了交叉编译工具中的 input 文件,命令如下:
sudo vi /home/ljh/hisisdk/Hi3531DV100_SDK_V2.0.4.0/osdrv/opensource/kernel/linux-3.18.y/include/uapi/linux/input.h
查找到宏并修改即可。
5、运行可执行程序:
再次运行---成功,在 ARM 板上有显示了,提示你去校准。过程输出如下:
/usr/local/tslib/bin # ./ts_calibrate
xres = 800, yres = 480
Took 1 samples...
Top left : X = 32 Y = 52
Took 1 samples...
Top right : X = 741 Y = 28
Took 1 samples...
Bot right : X = 738 Y = 431
Took 1 samples...
Bot left : X = 44 Y = 431
Took 1 samples...
Center : X = 398 Y = 242
13.063293 0.997416 -0.011207
3.655334 0.016685 0.970556
Calibration constants: 856116 65366 -734 239556 1093 63606 65536
bin 目录下的其他几个测试程序(ts_calibrate、ts_harvest、ts_print、ts_print_raw ts_test)也可以跑来试下。
三、扩展
1、Tslib ts_calibrate校准原理
Tslib 是触摸屏驱动和应用层之间的适配层,它从触摸屏驱动处取得原始的坐标数据,经过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的装备 坐标转换为相应的屏幕坐标。
通过 tslib/src/tslib.h 文件可以看出,在tslib中为应用层提供了2个主要的接口 ts_open()、ts_close()、ts_read() 和 ts_read_raw(),其中 ts_read() 为正常情况下的接口,ts_read_raw() 为校准情况下使用的接口。从 tslib 默认的 ts.conf 文件中可以看出包括如下基本插件:
- pthres 为 Tslib 提供的触摸屏灵敏度门槛插件;
- variance 为 Tslib提供的触摸屏滤波算法插件;
- dejitter 为 Tslib 提供的触摸屏去噪算法插件;
- linear 为 Tslib 提供的触摸屏坐标变换插件。
tslib 从触摸屏驱动采样到的设备坐标进行处理再提供给应用端的过程大体如下:
raw device --> variance --> dejitter --> linear --> application
module module module module
再来看看 ts_calibrate 主要做了哪些事情,校准情况下,tslib 对驱动采样到的数据进行处理的一般过程如下:
- 读取屏上 5 个点的坐标(Top Left,Top Right,Bottom Left,Bottom Right,Center),在进行一系列的变换,取样的 5 个点,实际上是包含 3 个不同的 X 值,3 个不同的 Y 值。和 scaling 值一共 7 个值,一起保存到 /etc/pointercal 中。
- 这个 /etc/pointercal 文件主要是供 linear 插件使用。而我们每次的触摸的操作都进行多次触摸坐标变换。
在校准触摸屏后只需及时的让 linear 插件再次读取新的/ etc/pointeracal 文件,这样新校准的坐标信息就及时的更新到上层应用。
Tslib配置文件ts.conf介绍
Tslib 的配置文件 ts.conf 同样是个十分重要的部分,在 ts.conf 中配置了需要加载的插件、插件加载顺序以及插件的一些约束参数,这些配置参数对触摸屏的触摸效果具有十分重要的影响。其中:
- pthres 为Tslib 提供的触摸屏灵敏度门槛插件 默认参数为pmin=1;
- variance 为Tslib提供的触摸屏滤波算法插件 默认参数为delta=30;
- dejitter 为Tslib 提供的触摸屏去噪算法插件 默认参数为delta=100;
- linear为Tslib 提供的触摸屏坐标变换插件。
由于各种因素的影响,在不同的硬件平台上,相关参数可能需要调整。以上参数的相互关系为:
- 采样间隔越大,采样点越少,采样越失真,但因为信息量少,容易出现丢笔划等丢失信息情况,但表现出来的图形效果将会越好;
- 去噪算法跟采样间隔应密切互动,采样间隔越大,去噪约束应越小,反之采样间隔越小,去噪约束应越大。
- 去抖算法为相对独立的部分,去抖算法越复杂,带来的计算量将会变大,系统负载将会变重,但良好的去抖算法可以更好的去除抖动,在进行图形绘制时将会得到更好的效果;灵敏度和 ts 门槛值为触摸屏的灵敏指标,一般不需要进行变动,参考参考值即可。
参考:
Qt5.8与触摸Tslib-1.4库ARM-ZYNQ平台的移植(一)
移植tslib库出现selected device is not a touchscreen I understand的解决方法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!