本小节主要介绍Tslib-1.4库的编译与移植,下节主要Qt5.8的移植,以及Qt5.8与Tslib-1.4的对接,实现在Qt上的触摸功能;
一、开发环境以及工具
PC系统:Linux version 4.10.0-38-generic (buildd@lgw01-amd64-059) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #42~16.04.1-Ubuntu SMP Tue Oct 10 16:32:20 UTC 2017
交叉编译器:arm-xilinx-linux-gnueabi-gcc
硬件平台:赛灵思(XILINX)ZYNQ-7000开发板
二、前言
首先介绍下交叉编译器的使用方法,gcc(编译c语言——.c程序)、g++编译器(编译c++——.cpp程序)在PC Linux系统上一般是装好的,用他们编译好的程序只能在X86平台(32位系统,如Windows、Linux)、或者X64平台(64位PC系统)上运行,PC的CPU一般是Intel架构或者AMD架构;而Linux的嵌入式平台,CPU一般是ARM架构;如果需要在嵌入式平台上运行程序,那么就需要用该ARM平台所对应的交叉编译器(arm-linux-gcc或者arm-linux-g++)编译程序源码,然后拷贝到ARM开发板上运行。如果该应用程序还需要依赖某些库文件(比如动态库.So),那么就需要把该库的绝对路径添加到环境变量$LD_LIBRARY_PATH中,程序运行时就会链接到该.So库正常运行了。以上纯属个人在工作中的理解,有错误的地方请大家指正。
工具链下载:https://download.csdn.net/download/psy6653/10493762?utm_source=bbsseo
交叉编译器安装、使用的演示:
原理都一样,我就随便下载一个交叉编译重新安装;cross_compilers.tar.gz(交叉编译器源码包,一般是arm-linux-xxx的压缩包,我的是自己压缩的,再解压演示的)
解压该源码包(我是在/opt目录下解压的)
tar -zxvf cross_compilers.tar.gz
然后进入解压目录的bin目录下,我们可以看到该交叉编译器的许多工具
如何使用该交叉编译器呢?我习惯vim /etc/profile文件,在$PATH路径下增加该交叉编译器bin路径
PATH=PATH=$PATH:/mnt/workspace/qt/cross_compilers/bin/
让刚所修改的环境变量立即生效
source /etc/profile
让后我们在终端terminal中输入arm后,再按Tab键(自动补齐功能),我们就可以看到以arm开头的一些交叉编译器工具的文件,意思是环境变量设置成功,交叉编译器已经成功安装,并能使用。
或者输入命令查看交叉编译器的版本
arm-xilinx-linux-gnueabi-gcc -v
三、Tslib库的安装与编译
在编译Tslib-1.4库文件前,需要添加
解压tslib-1.4库源码
unzip tslib-master.zip
进入解压的tslib-master目录:首先清除源码并运行autogen.sh脚本
./autogen-clean.sh
./autogen.sh
但提示./autogen.sh: 3: ./autogen.sh: autoreconf: not found的错误,可看出缺少autoreconf,度娘说是移植tslib前需要安装的插件,也就是一个准备工具。
1、下载了一个autoconf-2.69.tar.xz包进行安装
需要解压两次,第一次把.tar.xz解压成.tar包,再把所生成.tar解压成目录
xz -d autoconf-2.69.tar.xz
tar -xvf autoconf-2.69.tar
进入解压所得到的autoconf-2.69目录运行配置,--prefix参数为安装路径
./configure --prefix=/usr/local/
但又提示configure: error: no acceptable m4 could be found in $PATH.
2、下载一个m4-1.4.13.tar.gz包进行安装
先解压m4-1.4.13.tar.gz,再进入所解压的m4-1.4.13目录
tar -zxvf m4-1.4.13.tar.gz
cd m4-1.4.13/
在m4-1.4.13目录下,运行./configure配置,再make、make install,其中--prefix参数表示该工具所安装的路径,没提示错误表示安装成功。
./configure --prefix=/usr/local/
make
make install
再回头进入autoconf-2.69,同样运行./configure配置,再make、make install安装,
./configure --prefix=/usr/local/
make
make install
再回到tslib-master目录下运行autogen.sh脚本,提示Can't exec "aclocal": No such file or directory at /usr/local/share/autoconf/Autom4te/FileUtils.pm line 326. autoreconf: failed to run aclocal: No such file or directory错误
3、需安装一个automake工具来解决
下载一个automake-1.16.tar.xz,用同样方法解压再进入automake-1.16解压目录进行安装
./configure --prefix=/usr/local/
make
make install
再回到tslib-master目录下运行autogen.sh脚本,提示configure.ac:64:error:possibly undefined macro: AC_DISABLE_STAT ICIf this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation.
configure.ac:65: error: possibly undefined macro: AC_ENABLE_SHARED
configure.ac:66: error: possibly undefined macro: AC_LIBTOOL_DLOPEN
configure.ac:67: error: possibly undefined macro: AC_PROG_LIBTOOL
autoreconf: /usr/local/bin/autoconf failed with exit status: 1
4、需安装一个libtool工具
下载一个libtool-2.4.tar.gz,用同样方法解压再进入libtool-2.4解压目录进行安装
tar -zxvf libtool-2.4.tar.gz
cd libtool-2.4/
./configure --prefix=/usr/local/
make
make install
5、成功编译Tslib
再回到tslib-master目录下运行autogen.sh脚本,成功运行并没有错误提示,
要make编译tslib,必须要有Makefile文件,那么就需要先运行所生成的./configure进行配置,然后再生成Makefile;--host 指定交叉编译工具链的前缀,--prefix 指定所编译生成Tslib库的执行文件、头文件和动态库的路径。
./configure --host=arm-xilinx-linux-gnueabi --prefix=/home/Arm-tslib CC=/opt/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi/bin/arm-xilinx-linux-gnueabi-gcc
再make、make install,没有报错就表示成功了。
make
make install
cd /home/Arm-tslib目录,生成的bin目录有执行文件,lib有.So、.la库文件,include目录下有.h头文件,etc有配置文件等
总结:
如果需要成功安装和编译Tslib-1.4库,指定交叉编译器(当更换平台时,更换平台的编译器即可),需要安装四个工具(autoconf、mp4、libtool、automake)。如果PC Linux系统能够联网,而且/etc/apt/sources.list源没什么问题,可以用sudo apt-get install automake autoconf libtool libsysfs-dev命令自动安装,效果都一样。这四个工具以及tslib库的源码我已在本平台上传,需要的可以下载(资源名:tslib库及其安装工具)
四、Tslib的移植以及触摸屏的校正
把编译生成的tslib库Arm-tslib拷贝到开发板上任意路径,我拷贝到/sat目录下,并把目录名Arm-tslib改成tslib,这里最重要就是设置环境变量,为什么要设置?我前言有提到,运行应用程序需要链接它的依赖库,怎么找它额依赖库,就在环境变量的路径下面寻找。那么可以自己新建一个脚本,在运行tslib相关应用程序前先执行下脚本;
#!/bin/sh
export TSLIB_ROOT=/sat/tslib
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/li
其中
TSLIB_TSDEVICE //触摸驱动坐标上报的接口名,可以在dev/input/目录下查看,本测试开发板为event0
TSLIB_CALIBFILE //校准的数据文件,由ts_calibrate校准程序生成。
TSLIB_CONFFILE //配置文件名。
TSLIB_PLUGINDIR //插件目录
TSLIB_CONSOLEDEVICE //控制台设备文件名
TSLIB_FBDEVICE //fb0为ARM中的一块内存,我们可以理解为PC的显存,要显示应用层的图形界面都不能绕过它
下面运行Tslib的ts_calibrate应用程序,首先检测显示屏的大小为1024x600分辨率,然后一次点击四个角落和中心点5个光标,判断所点击的位置和坐标打印是否相符和,运行完后之程序会自动退出;
运行程序之前,显示的是串口终端的信息
运行Tslib的ts_calibrate应用程序后,左上角会有一个十字光标,当我们点击下十字光标,串口终端就会打印Topleft X=45 Y=71,其他的四个点同样会打印出所被点击点的坐标,演示结果如下:
运行ts_test程序,点击draw按钮时,就可以随意绘图,点击qiut就会退出该应用程序;
那么tslib的移植以及校准就算完了,下一节介绍Qt5.8与触摸的对接即Qt5.8与触摸Tslib-1.4库在嵌入式ARM-ZYNQ平台的移植(二)。