查看: 10086|回复: 15

[求助] 海思3519开发板上移植Qt5.7遇到问题

[复制链接]
发表于 2016-6-29 18:03:58 | 显示全部楼层 |阅读模式
环境:
HOST: Ubuntu 14.04.1
板卡:hi3519评估板
SDK:Hi3519_SDK_V1.0.2.0
Qt版本: 5.7

我是Qt新人,目的是在3519板子上用Qt作界面。因为3519 SDK里面gcc版本太新,编译Qt4有问题(我试过4.6),因此索性用最新的5.7

目前情况:Qt交叉编译完成,用静态编译生成的控制台(console)Qt程序可以在3519板子上运行并打印出hello world。因此Qt本身的交叉编译,生成的静态库应当都没有问题。

进一步尝试界面程序(就是一个窗体空壳),步骤如下:

1. 参照论坛nfswfx兄的帖子 http://www.ebaina.com/bbs/forum. ... &extra=page%3D2 ,把他的两个.h和.cpp文件添加到程序文件夹编译,目的是能在hifb输出
1. 把拨码开关拨到HDMI输出
2. 运行load3519,包括hifb在内的各模块加载正常
3. 命令行下运行界面程序
/ # ./test0629
显示错误
This application failed to start because it could not find or load the Qt platform plugin "xcb" in "".

如果运行
/ # ./test0629 -platform linuxfb
或者
/ # ./test0629 -platform hsfb
则提示类似错误,表示没有包含linuxfb和hsfb

我的configure设置 (写的可能有问题,不知道怎么把那些不需要的模块去掉,所以逐条no或者skip):

./configure \
        -prefix /usr/local/qt5.7_static \
        -confirm-license \
        -opensource \
        -static \
        -release \
        -xplatform linux-arm-hisiv500-g++ \
        -qt-libjpeg \
        -no-opengl \
        -no-xcb \
        -no-largefile \
        -no-accessibility \
        -no-sse2 \
        -nomake tests \
        -nomake examples \
        -nomake tools \
        -no-openssl \
        -no-nis \
        -no-cups \
        -no-dbus \
        -no-sql-sqlite \
        -skip qt3d \
        -skip qtactiveqt \
        -skip qtandroidextras \
        -skip qtcanvas3d \
        -skip qtcharts \
        -skip qtconnectivity \
        -skip qtdatavis3d \
        -skip qtdeclarative \
        -skip qtdoc \
        -skip qtgamepad \       
        -skip qtgraphicaleffects \
        -skip qtimageformats \
        -skip qtlocation \
        -skip qtmacextras \
        -skip qtmultimedia \
        -skip qtpurchasing \
        -skip qtquickcontrols \
        -skip qtquickcontrols2 \
        -skip qtscript \
        -skip qtscxml \
        -skip qtsensors \
        -skip qtserialbus \
        -skip qtserialport \
        -skip qtsvg \
        -skip qttools \
        -skip qttranslations \
        -skip qtvirtualkeyboard \
        -skip qtwayland \
        -skip qtwebchannel \
        -skip qtwebsockets \
        -skip qtwebview \
        -skip qtwinextras \
        -skip qtx11extras \
        -skip qtxmlpatterns \
        -no-qpa-platform-guard

我的qmake.conf

#
# qmake configuration for building with arm-hisiv500-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)

# leilc added
QT_QPA_DEFAULT_PLATFORM = hifb #eglfs  

QMAKE_CFLAGS_RELEASE   += -O2   

# QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7

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

# modifications to linux.conf
QMAKE_AR                = arm-hisiv500-linux-ar cqs
QMAKE_OBJCOPY           = arm-hisiv500-linux-objcopy
QMAKE_NM                = arm-hisiv500-linux-nm -P
QMAKE_STRIP             = arm-hisiv500-linux-strip
load(qt_config)

目前我有两个问题:
1. 怎样让程序运行不报错,或者是跟hifb对接上。
2. 如何能在外接的hdmi屏幕上显示界面

请大家赐教,十分感谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2016-12-26 16:12:58 | 显示全部楼层
学习下,支持
发表于 2016-6-29 18:48:50 | 显示全部楼层
本帖最后由 ngswfx 于 2016-6-29 18:50 编辑

我的那个方法,你需要先执行一个基于海思的程序,把VO以及HDMI都开启,并且要开启HIFB,自己能叠加一张图片,并且已经在HDMI显示的情况下,再开启QT程序。这时候,QT程序就可以利用HIFB显示界面了。

///一定要确保VO和HDMI开启成功,显示正常,并且HIFB也正常,你可以尝试叠加点东西,画个黑框框也行。

//由于我是在我前期的基础上调试的,这2点都可以保证,所以QT直接就出来了。

//一定先把基于海思的程序先调试通,可以在VO和HIFB 相关的demo基础上修改集成一下,贴一个bmp图也可以。对于FB0图像层,是可以几个程序都访问的,可以这么干。之不过图像会有点乱,都调试好了以后,禁止海思应用程序绘制即可。但是VO以及HIFB一定保证正常才行。

我现在写的程序,就是2个独立的程序,一个和海思SDK很紧密,就是负责解码显示等工作,另外一个就是QT的设置程序。

只要先执行解码程序,在解码程序内部,当HIFB开启成功后,我再调用QT界面程序,就可以配置参数了。
发表于 2016-6-29 18:53:44 | 显示全部楼层
本帖最后由 ngswfx 于 2016-6-29 19:03 编辑

你现在的这个报错,明显是少了插件,并且显示设备没打开,也就是VO没开启,HDMI没开启,到QT SDK里面找找plugin,也放到板子上去,然后注意使用:

export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/root
export QWS_SIZE='1024X768'
export QT_QWS_FONTDIR=/root/fonts
#export QWS_USB_KEYBOARD=/dev/event0
#export QWS_USB_MOUSE=/dev/event0


这一类命令把lib以及plugin目录指定一下,不同QT版本可能不同,你可以看看其他资料。


////////另外如果你不是考虑做通用程序的话,倒是可以考虑直接在QT里面直接调用海斯的SDK,开启VO以及HIFB,这样总内存占用还会小一点。我当时之所以界面和海斯SDK剥离,主要为了让QT界面程序,能编译一次,可以运行在各个海斯芯片上,无需再次编译。
 楼主| 发表于 2016-6-30 09:08:57 | 显示全部楼层
ngswfx 发表于 2016-6-29 18:53
你现在的这个报错,明显是少了插件,并且显示设备没打开,也就是VO没开启,HDMI没开启,到QT SDK里面找找pl ...

多谢兄弟。你的回复帮我理清了概念。

3519本身是BT1120输出,HDMI是用9024a芯片转接的。我在开发包里面没有找到如何使用这个9024a的参考设计,有可能仅仅是我没有找到而已。请问在3516上是否HDMI也是转接出来的,如何去使能它,多谢。
发表于 2016-6-30 09:17:40 | 显示全部楼层
ngswfx 发表于 2016-6-29 18:53
你现在的这个报错,明显是少了插件,并且显示设备没打开,也就是VO没开启,HDMI没开启,到QT SDK里面找找pl ...

Qt5+以上版本已经没有QWS了。
发表于 2016-6-30 09:22:18 | 显示全部楼层
建议你用Qt4.8.6的,新的编译器编译Qt4.8.6绝对没有问题。V500的编译器是gcc5.0的?

等我抽个时间调试下Qt5.6弄个教程上来。。Qt5上的东西很多已经换了,库也大了不少。
 楼主| 发表于 2016-6-30 15:20:45 | 显示全部楼层
本帖最后由 leilc 于 2016-6-30 15:30 编辑

goodman兄: 找了半天没找到你的库,汗。。。我直接在论坛里面搜你名字

目前Qt我暂时放一边,想先用海思的sample程序点亮HDMI输出,然后再弄Qt输出到hifb。3519的输出cvbs和BT1120,  HDMI是通过9024a芯片转的

我的步骤:

1. 把load3519脚本中加上
insmod extdrv/sil9024.ko norm=12

同时修改hifb.ko的参数为
insmod hifb.ko viedo="hifb:vram0_size:16200"  # 1080p x 4 x 2

2. 运行mpp_big-little/sample/hifb下面的sample_hifb,出来两个选项:
0)vo cvbs output, default
1) vo BT1120 output

我修改代码,把这句
g_enVoIntfType = VO_INTF_BT1120
改成了
g_enVoIntfType = VO_INTF_HDMI

本来CVBS输出时候,运行程序打印信息正常,仅仅是HDMI无输出(本来就应该无输出,此时输出是BT1120)。改了这一句之后,运行出错,输出:

**********************************************************
[SAMPLE_COMM_VO_StartDev] -189: failed with 0xa00f8008!
[SAMPLE_HIFB_DoubleBufMode] -1999: start vo dev failed with -1!

对应代码段:

HI_S32 SAMPLE_COMM_VO_StartDev(VO_DEV VoDev, VO_PUB_ATTR_S* pstPubAttr)
{
    HI_S32 s32Ret = HI_SUCCESS;
    //printf("-----------------dev:%d\n", VoDev);
    s32Ret = HI_MPI_VO_SetPubAttr(VoDev, pstPubAttr);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("failed with %#x!\n", s32Ret);
        return HI_FAILURE;
    }

    s32Ret = HI_MPI_VO_Enable(VoDev);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("failed with %#x!\n", s32Ret);
        return HI_FAILURE;
    }



    s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret);
        goto SAMPLE_HIFB_DoubleBufMode_0;
    }

通过lsmod,看到9024模块已经加载了。不知道什么原因导致VO_INTF_HDMI参数传下去之后运行出错。但目前还没找到解决方案。有哪位兄弟碰到过这个问题,多谢。

 楼主| 发表于 2016-6-30 15:27:58 | 显示全部楼层
本帖最后由 leilc 于 2016-6-30 16:36 编辑

在pinmux_3519里面,

看到

#i2c3 -> aic31/9024
i2c3_pin_mux()
{
        himm 0x1204009c 0x1;        #0:GPIO6_3        1:I2C3_SDA
        himm 0x120400a0 0x1;        #0:GPIO6_4        1:I2C3_SCL
}

设置也没有问题,9024需要I2C。

修改了hifb_sample.c程序。例程本来是rgba1555格式,修改为rgba8888格式之后运行不再报错,但仍然在HDMI显示器上没有输出。
发表于 2016-7-5 01:03:08 | 显示全部楼层
本帖最后由 ngswfx 于 2016-7-17 02:55 编辑

刚发现一个问题,我把tde驱动的默认参数弄成320 *240 qt界面就显示不出来了,你设置时候也注意一下,少走弯路:

//////////////////////////////////////
注意:  下面2个最好都配置好,tde也要配置的大一些,否则QT打开容易失败,我弄成320 *240就不行
insmod hi3520D_tde.ko g_u32TdeTmpBufW=1920 g_u32TdeTmpBufH=1080
insmod hifb.ko video="hifb:vram0_size:8100,vram1_size:32,vram2_size:32,vram3_size:32" softcursor="off" u32VcmpBufNum=2



//////////////////////后续的测试表明,这里无需管tde问题,当时估计牵扯其他改动,所以异常了
 楼主| 发表于 2016-7-5 22:25:32 | 显示全部楼层
ngswfx 发表于 2016-7-5 01:03
刚发现一个问题,我把tde驱动的默认参数弄成320 *240 qt界面就显示不出来了,你设置时候也注意一下,少走弯 ...

多谢。我再试试。

 楼主| 发表于 2016-7-12 10:17:03 | 显示全部楼层
goodman 发表于 2016-6-30 09:22
建议你用Qt4.8.6的,新的编译器编译Qt4.8.6绝对没有问题。V500的编译器是gcc5.0的?

等我抽个时间调试下 ...

goodman兄好:

v500的编译器是gcc 4.9.4
忘了ngswfx兄还是谁提到你有裁剪好的Qt4.8.6的库,请问能分享不?
多谢。
 楼主| 发表于 2016-7-12 10:19:03 | 显示全部楼层
ngswfx 发表于 2016-6-29 18:53
你现在的这个报错,明显是少了插件,并且显示设备没打开,也就是VO没开启,HDMI没开启,到QT SDK里面找找pl ...

前两周做别的事情的耽误了。HDMI有输出了。
是我太挫了,3519的板子的HDMI是用9024芯片转的,我没执行pinmux那个脚本,因此i2c没有配置给9024。。。
发表于 2019-8-9 08:22:19 | 显示全部楼层
请问移植完之后你的环境变量怎么配置的,我运行qt程序移植提示没有linuxfb插件
发表于 2019-8-13 10:52:47 | 显示全部楼层
xcb 这个问题是plugin 吗? 为什么我把这个放在开发板上  还是xcb 报错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

© 2008-2017 当前位置 易百纳技术社区论坛 返回 易百纳技术社区 ( 苏ICP备14036084 )   Powered by Discuz! X3.1
快速回复 返回顶部 返回列表