tslib及QT移植

一、tslib移植

tslib是一款开源软件,用于解决移动设备触摸屏因电磁干扰导致的精度不足和抖动问题 。它能对触摸屏驱动器采集的样本进行过滤、去抖动和校准等处理,常作为触摸屏驱动器适配层,为上层应用程序提供统一接口。在有电磁噪声干扰、触摸屏操作不精准的移动设备场景中,通过tslib的功能可提升触摸屏性能,让操作更准确、稳定。最新版本的tslib已经支持了多点电容触摸屏,可以通过tslib来直观的测试多点电容触摸屏驱动,这个要比观看eventX原始数据方便的多

下载链接

tslib

安装相关的依赖包

cpp 复制代码
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
cpp 复制代码
linux@linux-virtual-machine:~/dev/qt/tslib/tslib-1.22$ ./autogen.sh
cpp 复制代码
linux@linux-virtual-machine:~/dev/qt/tslib/tslib-1.22$ sudo apt-get install pkgconfig
#pkg-config 的主要功能包括:
#检查库的版本号:确保所需库的版本满足要求,避免链接错误版本的库文件。
#获取编译预处理参数:如宏定义、头文件的位置。
#获取链接参数:如库及依赖的其他库的位置、文件名及其他一些链接参数。
#自动加入所依赖的其他库的设置

配置

编译make

安装make install

拷贝tslib库到根文件系统

在tslib中使用脚本添加tslib配置信息tslib_env.sh

cpp 复制代码
#! /bin/bash
#LIB_CONSOLEDEVICE 表示控制台设置,这里不设置,因此为 none。
export TSLIB_CONSOLEDEVICE=none
#TSLIB_FBDEVICE 表示FB设备,也就是屏幕LCD,根据实际情况配置,LCD屏设备为/dev/fb0
export TSLIB_FBDEVICE=/dev/fb0
#TSLIB_TSDEVICE 表示触摸设备文件,这里设置为/dev/input/event1,这个要根据具体情况设置,
#如果你的触摸设备文件为event2那么就应该设置为/dev/input/event2,以此类推。
export TSLIB_TSDEVICE=/dev/input/event1
#tslib的根路径
export T_ROOT=/tslib
#TSLIB_CALIBFILE 表示校准文件,如果进行屏幕校准的话校准结果就保存在这个文件中,
#这里设置校准文件为/etc/pointercal,此文件可以不存在,校准的时候会自动生成。
export TSLIB_CALIBFILE=$T_ROOT/etc/pointercal
#TSLIB_PLUGINDIR 表示 tslib 插件目录位置,目录为/lib/ts。
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
#TSLIB_CONFFILE 表示触摸配置文件,文件为/etc/ts.conf,此文件在移植 tslib 的时候会生成
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
#添加tslib测试程序路径到PATH
export PATH=$T_ROOT/bin:$PATH
#添加tslib库路径到LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$T_ROOT/lib:$LD_LIBRARY_PATH

给tslib_env.sh文件添加可执行权限

在/etc/profile文件中添加执行tslib_env.sh脚本的命令

在开发板上执行tslib的校准程序

二、QT移植

2.1源码下载及解压

Index of /archive/qt

根据自己Qt开发环境下载对应版本的源码移植,课件上使用的Qt 5.12.9版本来做移植。越高版本的Qt源码对编译器的版本也要求越高

交叉编译器版本:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf

2.2 解压源码

cpp 复制代码
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib$ tar -xvf qt-everywhere-src-
5.12.9.tar.xz
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib$ ls
qt-everywhere-src-5.12.9 qt-everywhere-src-5.12.9.tar.xz
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib$ cd qt-everywhere-src-5.12.9/

2.3 更新编译器版本

Ubuntu22.04默认自带较新版本的GCC(如 11.x),而Qt 5.12.9是比较老的版本(发布于2019年),不支持太新的编译器特性。

使用更低版本的GCC:

cpp 复制代码
sudo apt install gcc-9 g++-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90

export CC=gcc-9
export CXX=g++-9

linux@linux-virtual-machine:~/dev/qt_tslib/qtlib$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.5.0-1ubuntu1~22.04'
--with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enablelanguages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gccmajor-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enableshared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --
enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enableclocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-defaultlibstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin
--enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enableobjc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enableoffload-targets=nvptx-none=/build/gcc-9-5Q4PKF/gcc-9-9.5.0/debian/tmp-nvptx/usr,hsa
--without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --
host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-ltolean --enable-link-mutex
Thread model: posix
gcc version 9.5.0 (Ubuntu 9.5.0-1ubuntu1~22.04)

2.4 修改qmake.conf

/home/linux/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9/qtbase/mkspecs/linux-arm-gnueabig++/qmake.conf

cpp 复制代码
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
#自己移植的平台添加,我们的芯片是imx6ull,采用的cortex-A7核,使用armv7指令集
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard
QMAKE_CXXFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
#修改成自己的交叉编译工具链
# modifications to g++.conf
QMAKE_CC = arm-linux-gnueabihf-gcc
QMAKE_CXX = arm-linux-gnueabihf-g++
QMAKE_LINK = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
QMAKE_NM = arm-linux-gnueabihf-nm -P
QMAKE_STRIP = arm-linux-gnueabihf-strip
load(qt_config)

2.5 配置Qt

2.5.1 添加配置脚本

在qt源码目录下添加一个config.sh文件,内容如下:

/home/linux/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9/config.sh

which qmake

把它的名字修改成qmake-x86,否则它默认使用的是Ubuntu自带的qmake

2.5.2 进行配置

cpp 复制代码
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9$ chmod 777
config.sh
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9$
./config.sh
Resource Policy (libresourceqt5) ....... no
Windows Audio Services ................. no
DirectShow ............................. no
Windows Media Foundation ............... no
Note: Also available for Linux: linux-clang linux-icc
Note: -optimized-tools is not useful in -release mode.
WARNING: Cross compiling without sysroot. Disabling pkg-config
Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into '/home/linux/Qt/qt5.12.9-install'.
Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

清理

cpp 复制代码
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9$ make clean
-j6

提示没有python,ubuntu上有python3,进行软链接

cpp 复制代码
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9$ which
python3
/usr/bin/python3
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9$ sudo ln -s
/usr/bin/python3 /usr/bin/python
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9$ which
python
/usr/bin/python

编译

cpp 复制代码
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9$ gmake -j6
1>/dev/null

安装

cpp 复制代码
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib/qt-everywhere-src-5.12.9$ gmake
install -j6 1>/dev/null
Makefile:5115: 警告:覆盖关于目标"../../qml/QtQuick/Controls/qmldir"的配方
Makefile:5112: 警告:忽略关于目标"../../qml/QtQuick/Controls/qmldir"的旧配方
arm-linux-gnueabihf-strip: /home/linux/Qt/qt5.12.9-
install/examples/webchannel/qwclient/qwclient.js: file format not recognized
gmake[4]: [Makefile:626:install_exampleassets] 错误 1 (已忽略) 【此处错误不影响】

三、移植Qt库到根文件系统

在根文件系统rootfs添加Qt库

在rootfs目录下新建子目录qtlib,并将Qt源码编译之后的Qt库拷贝到rootfs/Qt目录下

cpp 复制代码
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib$ cp
/home/linux/Qt/qt5.12.9-install/lib ./ -a
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib$ cp
/home/linux/Qt/qt5.12.9-install/plugins ./ -a
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib$ cp
/home/linux/Qt/qt5.12.9-install/qml ./ -a
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib$ ls
lib plugins qml

删除rootfs文件系统的Qt库中不需要的文件

linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib/lib$ rm -rf *.prl *.a *.la

3.1 添加字体库让Qt支持中文

下载中文字体
请稍候...

3.1.1 解压

cpp 复制代码
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib$ ls
qt-everywhere-src-5.12.9 wqy-zenhei-0.9.45.tar.gz
linux@linux-virtual-machine:~/dev/qt_tslib/qtlib$ tar -xvf wqy-zenhei-0.9.45.tar.gz

3.1.2 拷贝中文字体到rootfs根文件系统

cpp 复制代码
inux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib$ cp
/home/linux/dev/qt_tslib/qtlib/wqy-zenhei/wqy-zenhei.ttc ./fonts/
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib$ cd fonts/
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib/fonts$ ls
wqy-zenhei.ttc

3.1.3 添加qt相关的环境变量

/home/linux/imx6ull_dev/nfs/rootfs/qtlib/qtlib_env.sh

cpp 复制代码
#qt 库所在的路径
export TS_ROOT=/tslib
export QT_ROOT=/qtlib
#指定触摸设备
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
#qt 字库的目录
export QT_QPA_FONTDIR=$QT_ROOT/fonts
#qt 插件的目录
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
#指定LCD帧缓冲设备/dev/fb0
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
#qt 插件的目录
export QT_PLUGIN_PATH=$QT_ROOT/plugins
#指定qml
export QML2_IMPORT_PATH=$QT_ROOT/qml
#使用 tslib 库
export QT_QPA_FB_TSLIB=1
#打开应用程序运行的时候输出的log信息
export QT_DEBUG_PLUGINS=1
#运行Qt程序之前先加载ts库
export LD_PRELOAD=$TS_ROOT/lib/libts.so
#添加Qt库到系统环境变量
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms:$LD_LIBRARY_PATH
cpp 复制代码
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib$ chmod 777 qtlib_env.sh
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qtlib$ ls
fonts lib plugins qml qtlib_env.sh
cpp 复制代码
#添加qtlib的配置信息
source /qtlib/qtlib_env.sh

3.1.4 测试

将Qt库安装路径的 /home/linux/Qt/qt5.12.9-install/examples/widgets/widgets 下所有内容拷贝到根文件系统 rootfs/qt_examples 目录

cpp 复制代码
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs$ mkdir qt_examples
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs$ ls
bin etc lib mnt qt_examples root smart_vehicle_app test tslib
dev fonts linuxrc proc qtlib sbin sys tmp usr
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs$ cd qt_examples/
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qt_examples$ cp
/home/linux/Qt/qt5.12.9-install/examples/widgets/widgets/* ./ -a
linux@linux-virtual-machine:~/imx6ull_dev/nfs/rootfs/qt_examples$ ls
analogclock calendarwidget codeeditor elidedlabel icons lineedits
movie scribble sliders styles tablet tooltips widgets.pro
windowflags
calculator charactermap digitalclock groupbox imageviewer mousebuttons
README shapedclock spinboxes stylesheet tetrix validators wiggly

重启开发板,在开发板上运行digitalclock程序,效果如下:

cpp 复制代码
[root@smart_vehicle root]# cd /
[root@smart_vehicle ]# ls
bin linuxrc root tmp
dev mnt sbin tslib
etc proc smart_vehicle_app usr
fonts qt_examples sys
lib qtlib test
[root@smart_vehicle ]# cd qt_examples/
[root@smart_vehicle qt_examples]# cd digitalclock/
[root@smart_vehicle digitalclock]# ls
digitalclock digitalclock.h main.cpp
digitalclock.cpp digitalclock.pro
[root@smart_vehicle digitalclock]# ./digitalclock

四、Qt交叉开发环境搭建

4.1 在ubuntu22.04 linux系统中安装Qt

sudo apt install -y build-essential libgl1-mesa-dev cmake

sudo apt install qt6-base-dev qt6-tools-dev

下载在开发板上移植Qt库对应版本
https://www.qt.io/zh-cn/

linux@linux-virtual-machine:~/Qt/qt_creator$ chmod +x qt-online-installer-linux-x64- 4.9.0.run

linux@linux-virtual-machine:~/Qt/qt_creator$ ls -l

总计 71520

-rwxrwxr-x 1 linux linux 73230234 5月 22 14:42 qt-online-installer-linux-x64- 4.9.0.run

linux@linux-virtual-machine:~/Qt/qt_creator$ ./qt-online-installer-linux-x64- 4.9.0.run --mirror https://mirrors.ustc.edu.cn/qtproject

打开安装界面,进行安装

安装完成后,打开QT

选择构建方式

4.2 交叉编译Qt工程

cpp 复制代码
linux@linux-virtual-machine:~/Qt/qt5.12.9-install/bin$ ls
canbusutil moc qdbusxml2cpp qmake qmlcachegen qmllint
qmlpreview qmltestrunner rcc uic
fixqt4headers.pl qdbuscpp2xml qlalr qml qmlimportscanner qmlmin
qmlscene qvkgen syncqt.pl

临时导出bin目录中的命令

进入项目所在路径

使用qmake生成平台对应的构建文件(Makefile)

手动修改生成的Makefile,将 -std=gnu++1z 替换为 -std=c++11

如果单击按钮一次,出现了多次槽函数调用,这种现象是由于抖动原因产生的,我们可以修改tslib的ts.conf文件,打开去抖动功能

相关推荐
IOT-Power2 小时前
Qt 输入框: 数字/浮点/十六进制数值输入处理
qt
神仙别闹6 小时前
基于QT(C++)实现宠物小精灵对战游戏
c++·qt·宠物
小尧嵌入式7 小时前
音视频入门基础知识
开发语言·c++·qt·算法·音视频
蓑衣夜行7 小时前
QtWebEngine 自动重启方案
开发语言·c++·qt·web·qwebengine
Source.Liu7 小时前
【LibreCAD】点实体源码解析
c++·qt·cad
乌托邦2号8 小时前
Qt5之中文字符串转换
开发语言·qt
IOT-Power8 小时前
QT QSerialPort 串口不稳定,串口是否使用独立线程
qt
IOT-Power9 小时前
QT的解耦方式
qt
定义小花10 小时前
c++ cmake qt
开发语言·c++·qt