ARM架构tslib库的移植以及Qte的移植

1:tslib库的移植

俗话说知其然并知其所以然,工作部门的产品用到了tslib库,虽然目前还没有需要鄙人去做移植适配工作,但是出于浓厚的兴趣使然,鄙人私下对此进行了自学以及实践,在此处将步骤以及踩到的坑做相关记录分享。

  • tslib库概念介绍
    tslib 为触摸屏驱动和应用层之间的适配层,其从驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕坐标。
    需要说明的是在嵌入式中,由于触摸屏的种类多样、质量不一,采用Tslib 的参考配置往往无法获得较好的触摸屏触摸效果,同样需要经过大量的测试才能得到满意的配置参数,恶劣情况下,甚至需要对Tslib 的算法进行进一步的优化。
    Tslib 的配置文件ts.conf 同样是个十分重要的部分,在ts.conf 中配置了需要加载的插件、插件加载顺序以及插件的一些约束参数,这些配置参数对触摸屏的触摸效果具有十分重要的影响。

  • 下载tslib库
    下载地址:https://github.com/libts/tslib/releases
  • 交叉编译tslib库
tar xvf tslib-1.22.tar.bz2
cd tslib-1.22/
./autogen.sh #生成configure文件
./configure --host=arm-linux --prefix=/usr/local/tslib #prefix代表生成库文件的路径
make && make install
  • 将交叉编译后的库文件拷贝到开发板
cp /usr/local/tslib /lib -rf

ex:此处编译时候出现一个问题如下:


../src/.libs/libts.a(ts_setup.o): In function `scan_devices':
ts_setup.c:(.text+0xbc): undefined reference to `EVIOCGPROP'
ts_setup.c:(.text+0x148): undefined reference to `EVIOCGPROP'
ts_setup.c:(.text+0x1c8): undefined reference to `EVIOCGPROP'
ts_setup.c:(.text+0x244): undefined reference to `EVIOCGPROP'
collect2: ld returned 1 exit status

##查看相关资料得到原因可能是由于arm-linux-gcc版本太老,slib版本比较新,但是交叉编译器比较老,也就是版本不匹配的问题。

解决方式是在主机linux中的/usr/include/linux/input.h头文件中找到#define EVIOCGPROP(len) _IOC(_IOC_READ, 'E', 0x09, len) /* get device properties */,直接复制过来粘贴进tslib/src/tslib.h中即可。

  • 配置开发板tslib环境

1:打开/etc/profile文件配置环境变量如下

#tslib库路径
export TSLIB_ROOT=/lib/tslib
#利用hexdump命令查看触摸屏事件
export TSLIB_TSDEVICE=/dev/input/event0
#framebuffer设备路径
export TSLIB_FBDEVICE=/dev/fb0
#配置文件路径
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
#ts插件路径
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
#生成校准文件的路径
export TSLIB_CALIBFILE=/etc/pointercal
#控制台设备名
export TSLIB_CONSOLEDEVICE=none
#链接库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib

2:source /etc/profile使得环境变量生效
3:进入tslib/bin目录下运行ts_calibrate即可进行触摸屏校准。
至此tslib的移植已经完成


2:Qte库的移植

  • qte库介绍

Qte:Qt/Embeded for linux. 它是用于嵌入式 Linux 系统的 Qt 版本,也是一套界面库,Qt/Embeded 也简称 Qte 或 Qt/E,Qte 去掉了 X Lib 的依赖而直接工作在 Framebuffer 上,而且Qte在此基础上实现了自己的窗口管理系统 QWS(Qt Windows System),这是Qte与Qt/X11最大的区别。 因此Qte可以在嵌入式Linux系统中没有 X11库的环境下构建独立的图形用户界面,而且不会占用太多的嵌入式系统资源。. Qte为方便嵌入式Qt应用的开发,还提供qvfb工具和makeqpf工具。

  • 获得Qte库

下载地址:http://download.qt.io/archive/qt/
此处我的qte库是直接拿FriendlyArm光盘中自带的,如下图:
在这里插入图片描述

  • 修改交叉编译器并添加tslib库目录:
    vi qt-everywhere-opensource-src-4.8.5/mkspecs/qws/linux-arm-g++/qmake.conf
    修改后文件如下:
#
# qmake configuration for building with arm-linux-g++
#

include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)

QMAKE_INCDIR = /usr/local/tslib/include/
QMAKE_LIBDIR = /usr/local/tslib/lib/


# modifications to g++.conf
QMAKE_CC                = arm-linux-gcc -lts
QMAKE_CXX               = arm-linux-g++ -lts
QMAKE_LINK              = arm-linux-g++ -lts
QMAKE_LINK_SHLIB        = arm-linux-g++ -lts

# modifications to linux.conf
QMAKE_AR                = arm-linux-ar cqs
QMAKE_OBJCOPY           = arm-linux-objcopy
QMAKE_STRIP             = arm-linux-strip

load(qt_config)

(1)第一点主要是添加了编译生成的tslib头文件和库目录

QMAKE_INCDIR = /usr/local/tslib/include/
QMAKE_LIBDIR = /usr/local/tslib/lib/

(2)第二点修改编译器名称,改成你自己的交叉编译器,并添加-lts选项,目的是链接tslib库。

QMAKE_CC                = arm-linux-gcc -lts
QMAKE_CXX               = arm-linux-g++ -lts
QMAKE_LINK              = arm-linux-g++ -lts
QMAKE_LINK_SHLIB        = arm-linux-g++ -lts
  • 进入源码目录使用configure配置
cd arm-qte-4.8.5
cd qt-everywhere-opensource-src-4.8.5/

在此处为了方便起见创建了配置脚本如下

./configure -prefix /usr/local/qt4.8.5-arm \
-force-pkg-config \
-opensource \
-confirm-license \
-release -shared \
-embedded arm \
-xplatform qws/linux-arm-g++ \
-fast \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-qt-freetype \
-little-endian -host-little-endian \
-no-qt3support \
-no-libtiff -no-libmng \
-no-opengl \
-no-mmx -no-sse -no-sse2 \
-no-3dnow \
-no-pch \
-no-openssl \
-webkit \
-no-qvfb \
-qt-mouse-tslib \

在此处有两个坑:
1:本来加入了配置位深的参数-depth 16,18,24 \结果我的屏是32的位深,运行程序果断报位深相关错误,所以直接取消配置,让其选择默认配置(查看configure文件默认是8,16,32的位深配置了)
在这里插入图片描述
2:编译报错:
cc1: fatal error: .pch/release-shared-emb-arm/QtGui: No such file or directory
处理此错误的方式是configure时候加入参数-no -pch
此错误参考文章如下:https://blog.csdn.net/g457499940/article/details/18699299

  • make -j4 && make install

交叉编译后的qt库安装在上一步指定的prefix目录(编一次qt库真的需要好久啊。。。)

  • 将编译安装好的qt库拷贝到开发板下
cp cp /usr/local/qt4.8.5-arm/* /qte/ -rf
#此处我拷贝到了/qte下
  • 开发板配置Qt相关环境

    1:打开/etc/profile
    2:加入环境变量如下

#显示的字体的大小
export QWS_DISPLAY="LinuxFb:mmWidth300:0"
#触摸屏点击事件
export QWS_MOUSE_PROTO=tslib:/dev/input/event0
#触摸屏分辨率
export QWS_SIZE=1280*800
#qte库路径
export QTDIR=/qte
#库中字体路径
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
#链接库路径
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH

至此Qt的移植操作已经完成,可以运行demos下面的例程了。
在这里插入图片描述
==注意在运行程序后面加入-qws,如./hello -qws

3:利用Qt交叉编译程序运行自己的Qt程序

  • 配置kits相关工具

配置编译工具:
在这里插入图片描述
配置qmake:
在这里插入图片描述

  • 编写程序后重新构建所有项目,在开发板上运行程序。

ps:在使用Qt编写程序时遇到以下问题将解决方案也同时记录在此:

1: error: 'nullptr' was not declared in this scope
原因:nullptr是C++11引入的关键字,这个编译器没有支持C++11。出现这个错误说明你的编译器没有支持C++11,至少没有完整支持C++11
解决方案:将nullptr改为NULL
2: Qt没有被正确安装,请运行make instal
原因:qt.conf不对
解决方案:更改qt.conf并将其移动到编译好的qt库的bin下去。
参考链接:https://blog.csdn.net/danshiming/article/details/109815104

参考文章:
http://www.cjjjs.com/article/20172710153851
https://blog.csdn.net/danshiming/article/details/109815104
https://blog.csdn.net/ms_xk/article/details/41410461
https://blog.csdn.net/qq153471503/article/details/105550434
https://blog.csdn.net/bhniunan/article/details/104324386(隐藏鼠标)
https://blog.csdn.net/qq_33475105/article/details/89401642

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值