Hi3536移植QT5.9.7

摘要:QT在嵌入式平台上使用非常广泛,这次将QT5.9.7移植到Hisi3536平台,在此记录下移植过程,方便以后需要的时候回顾。

搭建交叉编译环境

这一部分,海思的SDK已经写得很清楚了,只需要根据文档执行相对应的脚本就可以部署好环境。

修改平台配置目录

cd qt-everywhere-opensource-src-5.9.7/qtbase/mkspecs
复制linux-arm-gnueabi-g++为linux-hi3536-g++
cp -ar linux-arm-gnueabi-g++ linux-hi3536-g++
修改 qmake.conf,配置如下

-------------------------------------------------------
#
# qmake configuration for building with arm-linux-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

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

include(../devices/common/linux_device_pre.conf)

DEFINES += EGL_FBDEV

# gpu  注意路径为Hi3536的SDK目录
QMAKE_INCDIR_EGL += /home/oscar/workspace/Hi3536_SDK_V2.0.6.0/mpp_single/component/gpu/release/include
QMAKE_LIBDIR_EGL += /home/oscar/workspace/Hi3536_SDK_V2.0.6.0/mpp_single/component/gpu/release/lib
QMAKE_LIBS_EGL   += -lmali
QMAKE_INCDIR_OPENGL_ES2 += /home/oscar/workspace/Hi3536_SDK_V2.0.6.0/mpp_single/component/gpu/release/include
QMAKE_LIBDIR_OPENGL_ES2 += /home/oscar/workspace/Hi3536_SDK_V2.0.6.0/mpp_single/component/gpu/release/lib
QMAKE_LIBS_OPENGL_ES2 += -lmali

# modifications to g++.conf
QMAKE_CC                = /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-gcc -march=armv7-a -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations
QMAKE_CXX               = /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-g++ -march=armv7-a -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations
QMAKE_LINK              = /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-g++
QMAKE_LINK_SHLIB        = /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-g++

# modifications to linux.conf
QMAKE_AR                = /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-ar cqs
QMAKE_OBJCOPY           = /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-objcopy
QMAKE_NM                = /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-nm -P
QMAKE_STRIP             = /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-strip

EGLFS_DEVICE_INTEGRATION = eglfs_mali

include(../devices/common/linux_arm_device_post.conf)

load(qt_config) 

配置QT

说明:
-prefix: 安装目录
-xplatform: 平台选择
-eglfs: 启用eglfs, OpenGL依赖
-opengl es2: 启用openGL ES 2.0
-tslib: 启用tslib

./configure -prefix /opt/qt597_Hi3536 -opensource -confirm-license -release \
-strip -linuxfb -qt-zlib -no-gif -qt-libpng -qt-libjpeg -qt-freetype \
-no-rpath -no-pch -no-avx -no-openssl -no-cups -no-dbus -no-pkg-config \
-xplatform linux-arm-hisiv400-g++ -make libs -eglfs -opengl es2 -no-glib \
-nomake examples -nomake tools -tslib -qt-sqlite \
-I/usr/local/arm3536/tslib-1.4/include \
-L/usr/local/arm3536/tslib-1.4/lib

增加-no-iconv否则运行出错:
QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed
修改如下:

./configure -prefix /opt/qt597_Hi3536 -opensource -confirm-license -release \
-strip -linuxfb -qt-zlib -no-gif -qt-libpng -qt-libjpeg -qt-freetype \
-no-iconv -no-rpath -no-pch -no-avx -no-openssl -no-cups -no-dbus -no-pkg-config \
-xplatform linux-arm-hi3536-g++ -make libs -eglfs -opengl es2 -no-glib \
-nomake examples -nomake tools -tslib -qt-sqlite \
-I/usr/local/arm3536/tslib-1.4/include \
-L/usr/local/arm3536/tslib-1.4/lib

编译

make -j4      # -j4: 启用4线程同时编译,提升编译速度
make install

移植

在目标板上/lib目录下创建Qt文件夹
将安装文件夹下的lib、plugins、和qml拷贝到目标板的/lib/Qt文件夹下
配置/etc/profile

#Qt配置
# 将/lib/Qt/lib添加到目标板的LD_LIBRARY_PATH环境变量中
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib:/lib/Qt/lib:/lib/Qt597/lib:/home/app/lib"

#Qt配置
export QT_ROOT=/lib/Qt
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
export QT_QPA_PLATFORM=eglfs    // 指定QPA平台
export QT_QPA_EGLFS_FB=/dev/fb0   //指定QPA的framebuffer
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_EGLFS_WIDTH=1280
export QT_QPA_EGLFS_HEIGHT=720      # 测试验证貌似长宽需为16:9;设置为800时,eglfs创建surface失败0x300b
export QT_QPA_EGLFS_PHYSICAL_WIDTH=216
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=135
export QT_QPA_EGLFS_DEPTH=16
export QT_QPA_EGLFS_INTEGRATION=eglfs_mali
export QT_QPA_EGLFS_ALWAYS_SET_MODE=1
export QT_QPA_GENERIC_PLUGINS=tslib
export QML_IMPORT_PATH=$QT_ROOT/qml
export QML2_IMPORT_PATH=$QT_ROOT/qml
#调试信息开关
#export QT_QPA_EGLFS_DEBUG=1
#export QT_LOGGING_RULES=qt.qpa.*=true

export LD_LIBRARY_PATH

改完记得执行source /etc/profile来生效

配置Hisi平台

  1. 按照《HIFB开发指南.pdf》 说明加载hifb.ko驱动,这里需要说明的是,如果QT程序运行在fb0上,分辨率为19201080,颜色格式为ARGB8888,1buffer模式下,则需要vram0_size = 192010804=8100K
    如果为2 buffer模式下则需要vram0_size=1920
    108042=16200K
    说明:为什么要使用ARGB8888而不用ARGB1555,是因为我们QT编译使用的是32位framebuffer。不然的话会做不了透明处理。
  2. 使能fb0,前提是VO设备已初始化完毕

遇见的错误:

1、bash: /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-gcc: 没有那个文件或目录。
解决:
这是因为宿主机是64 位 而交叉编译器是针对32位的开发板制作的。所以要安装对应的32位库。
我的linux宿主机是ubuntu 16.04 64位。
安装命令:
sudo apt install lib32z1-dev

2、demo程序运行时出现错误提示

QIconvCodec::convertToUnicode: using Latin-1 for conversion,iconv_open failed
QIconvCodec::convertFromUnicode: using Latin-1 for conversion,iconv_open failed

解决:
./configure 后添加编译 -no-iconv

3、报错module "***" is not installed

QQmlApplicationEngine failed to load component
qrc:/main.qml:1 module "QtQuick" is not installed
qrc:/main.qml:2 module "QtQuick.Window" is not installed
qrc:/main.qml:1 module "QtQuick" is not installed
qrc:/main.qml:2 module "QtQuick.Window" is not installed

在/etc/profile文件中加入

export QML_IMPORT_PATH=$QT_ROOT/qml
export QML2_IMPORT_PATH=$QT_ROOT/qml

4、字库找不到

报错如下:

Note that Qt no longer ships fonts. Deploy some (from http://dejavu-fonts.org for example) or switch to fontconfig.
QFontDatabase: Cannot find font directory /lib/Qt/lib/fonts.

解决:说的比较清楚了,就是没找到/lib/Qt/lib/fonts,把fonts放到下面就好。

5、没有加在GPU相关KO

报错:

ERROR: The DDK is not compatible with any of the Mali GPUs on the system.
The DDK was built for 0x720 r1p1 status range [0..15], but none of the GPUs matched:
Could not initialize egl display
Aborted

解决:《GPU 开发用户指南.pdf》加载相关驱动

/home/app/komod/ko # ls
hi_dbe.ko      kds.ko         loadgpu        mali_kbase.ko
/home/app/komod/ko # ./loadgpu  -i

6、/dev/fb0 打开失败问题

报错:

EGLFS: Failed to open /dev/fb0
EGLFS: Can't continue without a display

解决:
由于海思在操作Framebuffer需要进行相应的配置,如果没有进行相应的配置,那么去打开/dev/fb0是会报错的。
具体进行了如下两个操作步骤:
(1)、初始化MPP
(2)、使能输出设备VO
经过了以上两个步骤以后,打开/dev/fb0才不会出错

7、QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT

报错:

Unable to query physical screen size, defaulting to 100 dpi.
To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters).
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
qml: background.x:0background.y:0
qml: background.width:1280background.height:800

解决:
设置profile文件中的QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT,液晶面板显示区域长宽(mm),液晶说明书查。

8、嵌入式linux下使用qt virtualkeyboard崩溃
报错:

qml: background.width:1280background.height:800
EGLFS: OpenGL windows cannot be mixed with others.
Aborted

解决:

其它问题:

1、 虚拟机无法上网了
linux手动配置网卡:

auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.1.87
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 223.5.5.5
auto eth0 #开机自动连接
iface eth0 inet static #static表示使用固定ip,dhcp表示使用动态ip