环境:Ubuntu-18.04 64位
交叉编译器:arm-hisiv600-linux
tslib版本:tslib-1.4
【注意】本文中使用 Hi3531D 的 V600 编译器
1、解压海思SDK
$ sudo unzip -xvf "Hi3531D V100R001C02SPC040.zip"
2、进入到交叉编译工具目录
$ cd "Hi3531D V100R001C02SPC040"
3、解压交叉编译工具
$ sudo tar -xvf arm-hisiv600-linux.tgz
4、安装交叉编译工具
$ sudo ./cross.v600.install
5、更新 shell 的环境变量
$ source /etc/profile
1、下载tslib源码包
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 库拷贝到开发板上任意路径,我拷贝到 /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
$ cat event0 // 或其他event1 2 3
,然后按下触摸屏,串口有信息输出则是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 系统版本不匹配,当然也有其他原因,这是最常见的情况
#define EV_VERSION 0x010000
本人是修改了交叉编译工具中的 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 文件中可以看出包括如下基本插件:
tslib 从触摸屏驱动采样到的设备坐标进行处理再提供给应用端的过程大体如下:
raw device --> variance --> dejitter --> linear --> application
module module module module
再来看看 ts_calibrate 主要做了哪些事情,校准情况下,tslib 对驱动采样到的数据进行处理的一般过程如下:
在校准触摸屏后只需及时的让 linear 插件再次读取新的/ etc/pointeracal 文件,这样新校准的坐标信息就及时的更新到上层应用。
Tslib配置文件ts.conf介绍
Tslib 的配置文件 ts.conf 同样是个十分重要的部分,在 ts.conf 中配置了需要加载的插件、插件加载顺序以及插件的一些约束参数,这些配置参数对触摸屏的触摸效果具有十分重要的影响。其中:
由于各种因素的影响,在不同的硬件平台上,相关参数可能需要调整。以上参数的相互关系为:
参考:
Qt5.8与触摸Tslib-1.4库ARM-ZYNQ平台的移植(一)
移植tslib库出现selected device is not a touchscreen I understand的解决方法
原文:https://www.cnblogs.com/linuxAndMcu/p/13097520.html