目录
前言
海思Hi3559AV100平台性能强悍,支持H264、H265 编码,分辨率可达16K,帧率可达120fps,应用于安防、无人机、智能机器人、人工智能、教育、车载设备、会议等诸多行业。但海思官方SDK并没有提供GUI组件,用户开发图形界面应用十分不便。
Qt 是一个跨平台的C++应用程序开发框架。它提供给开发者建立图形用户界面所需的功能,广泛用于开发图形用户界面程序,也可用于开发非图形用户界面(比如命令行界面)程序。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。如果将Qt移植到Hi3559A平台,将极大地方便用户开发图形应用程序。
本系列将以Qt5.9.9为例详细介绍移植Qt全过程,包括:
- 从零搭建海思交叉编译环境;
- 交叉编译Qt5.9.9;
- H3559AV100平台运行Qt程序;
- 如何使Qt支持QML(GPU/EGLFS);
- 如何支持多点触控。
本文是Hi3559AV100移植Qt系列的第三篇,主要介绍交叉编译Qt应用程序,并配置目标板上的Qt运行环境,保证Qt应用程序可以正常运行。
【参考】
- 海思Hi3559av100移植Qt5.9.7https://blog.csdn.net/year12/article/details/96170989
- 海思3559A QT 5.12移植(带webengine 和 opengl es)https://blog.csdn.net/weixin_30273175/article/details/95689400
1 准备
Qt源码:https://download.qt.io/archive/qt/5.9/5.9.9/single/qt-everywhere-opensource-src-5.9.9.tar.xz
需要用到Qt源码中examples,前面下载过的不需要重复下载。
2 编译Qt应用
2.1 编译环境准备
上一篇博文(海思Hi3559AV100移植Qt5.9.9(二))中提到,Qt安装完成之后的目录如下:
/opt/qt5.9.9_hi3559a/
├── bin
├── doc
├── include
├── lib
├── mkspecs
├── plugins
├── qml
└── translations
其中,bin目录下包含了host端交叉编译需要用到的工具,需要把这个目录加入到环境变量PATH中
$ sudo vim /etc/profile
source使能配置生效,运行qmake校测是否配置成功。
xiaoli@xiaoli-virtual-machine:~$ source /etc/profile
xiaoli@xiaoli-virtual-machine:~$
xiaoli@xiaoli-virtual-machine:~$
raigor@xiaoli-virtual-machine:~$ qmake -v
QMake version 3.1
Using Qt version 5.9.9 in /opt/qt5.9.9_hi3559a/lib
xiaoli@xiaoli-virtual-machine:~$
2.2 编译Qt应用
Qt源码中包含很多示例demo,我们以mainwindow的example为例,说明其编译过程。
~~$ cd qtbase/examples/widgets/mainwindows/mainwindow/
~~$ ls
colorswatch.cpp main.cpp mainwindow.h mainwindow.qrc titlebarCenter.png titlebarRight.png toolbar.h
colorswatch.h mainwindow.cpp mainwindow.pro qt.png titlebarLeft.png toolbar.cpp
~~$ qmake
~~$ make
~~$ ls
colorswatch.cpp main.cpp mainwindow.cpp mainwindow.pro Makefile titlebarCenter.png titlebarRight.png toolbar.h
colorswatch.h mainwindow mainwindow.h mainwindow.qrc qt.png titlebarLeft.png toolbar.cpp
编译成功后,将生成可执行程序mainwindow,这个文件后续将拷贝到Hi3559A平台上运行
3 Qt运行环境配置
3.1 运行时文件准备
Qt运行时需要以下库支撑:
- Qt运行库
- TsLib运行库
- 海思平台库
- 字体库
这些库为方便管理,统一放到/mnt/mmc下,当然这个目录不是必须的,可以根据实际情况放到其他目录下。
3.1.1 Qt运行库
上一篇博文(海思Hi3559AV100移植Qt5.9.9(二))中提到,Qt安装完成之后的目录如下:
/opt/qt5.9.9_hi3559a/
├── bin
├── doc
├── include
├── lib
├── mkspecs
├── plugins
├── qml
└── translations
该目录包含了运行时库和host工具,简单的操作是把该目录整体拷贝到单板中,本人拷贝到了/mnt/mmc/lib。
/mnt/mmc/lib # ls
qt5.9.9_hi3559a
3.1.2 Tslib它运行库
上一篇博文(海思Hi3559AV100移植Qt5.9.9(二))中提到,tslib安装在/opt/tslib_hi3559av100下,同上,简单操作操作是把整个目录拷贝到单板中,本人拷贝到了/mnt/mmc。
/mnt/mmc # ls
fonts lib tslib_hi3559av100
使用tslib需要运行ts_calibrate对其进行校准:
运行./ts_calibrate,依次点击屏幕出现的图标即可。
/mnt/mmc/tslib_hi3559av100 # cd bin/
/mnt/mmc/tslib_hi3559av100/bin # ./ts_calibrate
xres = 1920, yres = 1200
Took 1 samples...
Top left : X = 1873 Y = 1160
Took 1 samples...
Top right : X = 34 Y = 1149
Took 1 samples...
Bot right : X = 47 Y = 65
Took 1 samples...
Bot left : X = 1864 Y = 57
Took 1 samples...
Center : X = 946 Y = 625
1909.696777 -0.995569 -0.001831
1213.880493 0.000821 -1.005666
Calibration constants: 125153888 -65245 -120 79552872 53 -65907 65536
/mnt/mmc/tslib_hi3559av100/bin #
3.1.3 海思平台库
海思运行时位于海思的SDK中,具体位置如下:
~~$ pwd
/home/xiaoli/work/Hi3559AV100_SDK_V2.0.2.0/mpp/out/linux/multi-core/lib
~~$ ls
libaacdec.a libdpu_rect.a libhiavslut.a lib_hidehaze.so libhive_ANR.so libive.so libpciv.a libsns_imx290.a libsvpruntime.so
libaacdec.so libdpu_rect.so libhiavslut.so lib_hidrc.a libhive_common.so libmd.a libpciv.so libsns_imx290.so libtde.a
libaacenc.a libdsp.a lib_hiawb.a lib_hidrc.so libhive_EQ.so libmd.so libpos_query.a libsns_imx334.a libtde.so
libaacenc.so libdsp.so lib_hiawb_natura.a libhifisheyecalibrate.a libhive_HPF.so libmfnr_ap.a libpos_query.so libsns_imx334_slave.a libupvqe.a
libdetail_ap.a libhdmi.a lib_hiawb_natura.so libhifisheyecalibrate.so libhive_record.so libmpi.a libsecurec.a libsns_imx334_slave.so libupvqe.so
libdnvqe.a libhdmi.so lib_hiawb.so lib_hildci.a libhive_RES.so libmpi_photo.a libsecurec.so libsns_imx334.so libVoiceEngine.a
libdnvqe.so libhdr_ap.a libhi_cipher.a lib_hildci.so libisp.a libmpi.so libsfnr_ap.a libsns_imx477.a libVoiceEngine.so
libdpu_match.a lib_hiae.a libhi_cipher.so libhive_AEC.so libisp.so libnnie.a libsns_imx277_slvs.a libsns_imx477.so libxml_ap.a
libdpu_match.so lib_hiae.so lib_hidehaze.a libhive_AGC.so libive.a libnnie.so libsns_imx277_slvs.so libsvpruntime.a
~~$ pwd
/home/raigor/work/Hi3559AV100_SDK_V2.0.2.0/mpp/component/gpu/release/lib
~~$ ls
libEGL.so libGLESv1_CM.so libGLESv2.so libmali.so libOpenCL.so libpano2view.so
将该目录所有内容拷贝到单板下的/mnt/mmc/lib和/mnt/mmc/lib/gpulib中:
/mnt/mmc # ls /mnt/mmc/lib/
gpulib libhi_cipher.a libmtdev.so.1
libVoiceEngine.a libhi_cipher.so libmtdev.so.1.0.0
libVoiceEngine.so libhiavslut.a libnnie.a
lib_hiae.a libhiavslut.so libnnie.so
lib_hiae.so libhifisheyecalibrate.a libpciv.a
lib_hiawb.a libhifisheyecalibrate.so libpciv.so
lib_hiawb.so libhive_AEC.so libpos_query.a
lib_hiawb_natura.a libhive_AGC.so libpos_query.so
lib_hiawb_natura.so libhive_ANR.so libqlinuxfb.so
lib_hidehaze.a libhive_EQ.so libsecurec.a
lib_hidehaze.so libhive_HPF.so libsecurec.so
lib_hidrc.a libhive_RES.so libsfnr_ap.a
lib_hidrc.so libhive_common.so libsns_imx277_slvs.a
lib_hildci.a libhive_record.so libsns_imx277_slvs.so
lib_hildci.so libiperf.a libsns_imx290.a
libaacdec.a libiperf.la libsns_imx290.so
libaacdec.so libiperf.so libsns_imx334.a
libaacenc.a libiperf.so.0 libsns_imx334.so
libaacenc.so libiperf.so.0.0.0 libsns_imx334_slave.a
libdetail_ap.a libisp.a libsns_imx334_slave.so
libdnvqe.a libisp.so libsns_imx477.a
libdnvqe.so libive.a libsns_imx477.so
libdpu_match.a libive.so libsvpruntime.a
libdpu_match.so libmd.a libsvpruntime.so
libdpu_rect.a libmd.so libtde.a
libdpu_rect.so libmfnr_ap.a libtde.so
libdsp.a libmpi.a libupvqe.a
libdsp.so libmpi.so libupvqe.so
libhdmi.a libmpi_photo.a libxml_ap.a
libhdmi.so libmtdev.la qt5.9.9_hi3559a
libhdr_ap.a libmtdev.so qt5.9.9_hi3559a_release
3.1.4 字体库
Qt运行时需要使用及字体库,目标版本至少需要中英文两种字体库,否则字符会出现方框。ttf字体网上download即可,下载完成后把字体库放到/mnt/mmc/fonts目录下:
/mnt/mmc # ls fonts/
LiberationMono-Bold.ttf LiberationSerif-Bold.ttf
LiberationMono-BoldItalic.ttf LiberationSerif-BoldItalic.ttf
LiberationMono-Italic.ttf LiberationSerif-Italic.ttf
LiberationMono-Regular.ttf LiberationSerif-Regular.ttf
LiberationSans-Bold.ttf cantarell
LiberationSans-BoldItalic.ttf ttf
LiberationSans-Italic.ttf wenquanyi.ttf
LiberationSans-Regular.ttf
3.2 环境变量配置
修改profile文件:
/mnt/mmc # vi /etc/profile
在profile文件中添加如下内容:
export TSLIB_DIR=/mnt/mmc/tslib_hi3559av100
# 触摸事件节点,需要根据实际情况配置
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_DIR/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export QTDIR=/mnt/mmc/lib/qt5.9.9_hi3559a
#export QTDIR=/mnt/nfs/qt-everywhere-opensource-src-5.9.9/qtbase/
export LD_LIBRARY_PATH=/mnt/mmc/lib:/mnt/mmc/lib/gpulib:$QTDIR/lib:$QTDIR/plugins/imageformats:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/
export QT_QPA_PLATFORM=eglfs:fb=/dev/fb0:offset=0x0:nographicsmodeswitch
export QML2_IMPORT_PATH=$QTDIR/qml
export QT_QPA_EGLFS_WIDTH=1920
export QT_QPA_EGLFS_HEIGHT=1200
export QT_QPA_EGLFS_PHYSICAL_WIDTH=216
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=135
export QT_QPA_FONTDIR=/mnt/mmc/fonts
export QT_QPA_FB_TSLIB=1
export QT_QPA_FB_HIDECURSOR=0
编辑完成后执行 source /etc/profile或者reboot,完成配置
4 运行Qt程序
将编译的Qt应用mainwindow拷贝到单板上运行:
5 总结
以上就是Qt运行环境的搭建过程。需要注意的是ts_calibrate最好校准后使用。当然tslib在电容屏的天下并不适合,后续再多点触控中会使用其他方法替换掉。上述环境中虽然使用了eglfs,但实际上只能运行widget程序,并不能运行qml程序,下一篇会介绍如何支持qml程序运行。