ymir

ymir

2个粉丝

23

问答

0

专栏

8

资料

ymir  发布于  2015-07-28 00:29:44
采纳率 0%
23个问答
35883

Qt+海思sample基础代码,快速开发必备!!

 

[i=s] 本帖最后由 ymir 于 2019-9-26 22:55 编辑 [/i]

2019-09-26 其实在海思上使用Qt没有必要像该帖子的描述的方法那么复杂,而且使用帖子里描述的方式实施起来也特别的麻烦。从我发这个帖子到现在已经有四年了,我看大家还在关注这个老的帖子,真是过意不去。 Qt4.8的界面实现基于Framebuffer,因此在海思系统中,如果要使用Qt进行界面开发,你必须将Framebuffer初始化好,而初始化Fb,必须先初始化MPI系统。因此比较方便的方式就是使用海思的媒体库,编写一个媒体初始化动态库,此动态库完成MPI系统,FrameBuffer系统的配置,给Qt界面系统的运行创建环境。Qt的界面系统在QApplicatio启动之前都不会去动FrameBuffer,因此在你的QApplication对象调用exce()之前对媒体系统进行初始化动态库即可。 当然这个最终方式我早就发了帖子了,竟然没什么人看。。。 地址 http://bbs.ebaina.com/forum.php?mod=viewthread&tid=10915&extra=&page=1

这是我上一个粗略的过程,记录之前走过的路,大家也可以参考一下。我也是帮助了两个网友后突发的想写这个帖子, 帮助大家在Qt的移植过程中加快步伐! [=http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=8036&extra=page%3D1]我的上个帖子 Qt编译过程可以参看GoodMan大神的编译过程 地址:[=http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=8086&extra=page%3D1]嵌入式Qt编译过 我的Qt库的编译安装路径为/opt/Qt4.8 就是在编译的时候指定 --prefix /opt/Qt4.8 编译完成后的目录大概是这样的 [code][root@bogon:1 opt]# tree Qt4.8/ -L 1 Qt4.8/ ├── bin ├── include ├── lib ├── mkspecs ├── plugins └── translations[/code] 之后将海思sample目录下的东西库拷贝到这里 [code][root@bogon:1 opt]# tree Qt4.8/ -L 1 Qt4.8/ ├── bin ├── hilib // mpp 目录下的lib文件夹的内容都放在这里 ├── hinclude // mpp 目录下的include下的所有文件都放在这里 ├── include ├── lib ├── mkspecs ├── plugins └── translations[/code] 因为我们的目的是在代码中复用sample下的基础代码,然而这部分代码与内核代码,以及外部驱动代码都有一定的联系我之前试着 将这部分代码抽离出来,后来没成功。考虑到可能要做的移植工作很多,最后还是决定将qt工程嵌入到samplke目录下,直接使用其 各个目录下的Makefiel文件,因为他们都已经定义好了编译规则,我们只需要参考其他的工程文件的Makeifle即可定义好我们的规则。 开动: Qt库我就不说了,按照自己的配置也可以,只要将相应的库文件放进去就行了,库文件移植到板子的时候,只需要留下so动态库文 件即可,其余的静态库.a文件什么的,以及工具都删除即可,将库放到板子的同目录就可以了,在指定库搜索路径添加你的的动态 库路径。我之前写了个qt的测试程序,拖了几个控件,在windows上编译通过。之后我们将该工程代码放到sample目录下,大概是 这样的: [code] [root@bogon:1 sample]# tree -L 1 . ├── audio ├── common ├── guiclick //该目录为从测试工程目录,其中存放着代码 ├── hifb ├── LIB ├── Makefile ├── Makefile.param ├── QtBuild //该目录为新建的编译目录。 ├── region ├── tde ├── vda ├── vdec ├── venc ├── vio └── work[/code] 然后在~/.bashrc 中添加一行PATH=$PATH:/opt/Qt4.8.5 运行source ~/.bahrc 使变量生效,之后运行qmake如果有正常的输出,就是配置好了, 若没有检查相应的错误。 之后就开始我们的移植之路 我们将工程文件放到sample目录下。工程目录大概这样的: [code][root@bogon:1 sample]# tree -L 1 guiclick/ guiclick/ ├── guiclick.pro ├── guiclick.pro.user ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h └── mainwindow.ui[/code] 然后我们在sample下新建一个编译目录: mkdir Qtbuild, 进入Qtbuild。 之后使用命令[root@bogon:1 QtBuild]# qmak -r ../guiclick/guiclick.pro生成Makefile 然后修改Makefile文件内容[color=Red],请注意下面变更的内容,尤其注意 “=”号前面是否有”:“,“+”等符号[/color] 修改Makefile内容 变更: [code] 9 ####### Compiler, tools and options 10 include ../Makefile.param // 添加一行: 添加sample目录编译控制文件。 11 CC = arm-hisiv100nptl-linux-gcc

14 #CFLAGS := -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES) //因为在上层的Makefile.parram中定义了CFALGS,而我们的编译需要依赖该 //选项,所以这里修改为+= 15 CFLAGS += -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)

16 CXXFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)

16 CXXFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES) 17 INCPATH := -I/opt/Qt4.8/mkspecs/qws/linux-arm-hisiv100nptl-g++ -I../guiclick -I/opt/Qt4.8/include/QtCore -I/opt/Qt4.8/include/QtNetwork -I/ opt/Qt4.8/include/QtGui -I/opt/Qt4.8/include -I. -I. -I../guiclick -I. //这里是添加海思库的头文件支持。 18 INCPATH += -I/opt/Qt4.8/hinclud -I.

21 LIBS := $(SUBLIBS) -L/opt/Qt4.8/lib -lQtGui -L/opt/Qt4.8/lib -lQtNetwork -lQtCore -lpthread //添加海思库文件依赖,为了方便,我们把所有的库文件都指定 22 LIBS += -L/opt/Qt4.8/hilib -lmpi -lhdmi -ltde -lanr -laec -ljpeg -lresampler -lVoiceEngine 23 AR = arm-hisiv100nptl-linux-ar cqs

86 .SUFFIXES: .o .c .cpp .cc .cxx .C 87 88 .cpp.o: 89 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" $(MPI_LIBS) $(AUDIO_LIBA) $(JPEGD_LIBA) // 添加这部分主要是在编译main.cpp的时候需要到这些库的支持,这些库在上层的Makefile.param中定义了 90

104 105 all: Makefile $(TARGET) 106 // 编译的目标文件依赖于公共代码,就是上层的common文件夹下的代码,使用该部分代码可以快速开发 107 $(TARGET): ui_mainwindow.h $(OBJECTS) $(COMM_OBJ) // 添加链接参数,加入海思库文件以及公共代码的编译.o文件 108 $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(COMM_OBJ) $(LIBS)

219 220 main.o: ../guiclick/main.cpp // CFLAG指定了common文件夹的头文件,而我们使用的sample的实例代码主要还是这部分,如果不加CFLAG //会有hi_common.h,以及某些驱动头文件找不到的错误,在编译的时候也需要指定库 221 $(CXX) -c $(CXXFLAGS) $(CFLAGS) $(INCPATH) -o main.o ../guiclick/main.cpp 222 [/code]

之后是guiclick/main.cpp文件内容的更改,主要是在该文件中对相关内容进行初始化。代码在二楼给出 之后就是可以编译了。运行make即可编译出来了。编译出来放到板子上运行就好咯。 PDF下载: [attach]2643[/attach]

易百纳技术社区文件: Qt库移植--基于海思平台.pdf
下载
我来回答
回答133个
时间排序
认可量排序

ymir

2个粉丝

23

问答

0

专栏

8

资料

ymir 2015-07-28 00:31:15
认可0
这部分代码分为VGA和HDMI输出,通过修改宏控制即可。[code]#include "mainwindow.h"
#include
#include
#include "sample_comm.h"
#include
#include "hifb.h"
#include
#include
static VO_DEV VoDev = SAMPLE_VO_DEV_DHD0;

static struct fb_bitfield g_r16 = {10, 5, 0};
static struct fb_bitfield g_g16 = {5, 5, 0};
static struct fb_bitfield g_b16 = {0, 5, 0};
static struct fb_bitfield g_a16 = {15, 1, 0};
// #define MPP_HDMI


int main(int argc, char *argv[])
{
        VO_PUB_ATTR_S stPubAttr;
        VB_CONF_S stVbConf;
        HI_S32 s32Ret = HI_SUCCESS;
    HI_S32 i;
#ifdef MPP_HDMI
    SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_1_D1;
#else
        SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_1_720P;
#endif

        SAMPLE_VO_MODE_E stVoMode = VO_MODE_1MUX;
        HI_BOOL bExtendedMode;
        HI_CHAR ch;
       
        memset(&stVbConf, 0, sizeof(VB_CONF_S));
    stVbConf.u32MaxPoolCnt             = 16;
#ifdef MPP_HDMI
        stVbConf.astCommPool[0].u32BlkSize = 720*576*2;
#else
        stVbConf.astCommPool[0].u32BlkSize = 576*480*2;
#endif
        stVbConf.astCommPool[0].u32BlkCnt  = 16;
       
        stPubAttr.u32BgColor = 0xff00ff00;
#ifdef MPP_HDMI
        stPubAttr.enIntfType = VO_INTF_HDMI;
#else
        stPubAttr.enIntfType = VO_INTF_VGA;
#endif
    //stPubAttr.enIntfSync = VO_OUTPUT_720P50;
    stPubAttr.enIntfSync = VO_OUTPUT_800x600_60;

        stPubAttr.bDoubleFrame = HI_FALSE;
       
   
        if(HI_SUCCESS != SAMPLE_COMM_SYS_Init(&stVbConf))
        {
                printf("func:%s,line:%d\n", __FUNCTION__, __LINE__);
                return -1;       
        }


    s32Ret = SAMPLE_COMM_VI_Start(enViMode, VIDEO_ENCODING_MODE_PAL);
    if (HI_SUCCESS != s32Ret)
    {
        printf("%s: Start Vi failed!\n", __FUNCTION__);
                SAMPLE_COMM_SYS_Exit();
        return -1;
    }
       
        s32Ret = SAMPLE_COMM_VO_StartDevLayer(VoDev,&stPubAttr,25);                        
        if (HI_SUCCESS != s32Ret)
        {       
                printf("%s: Start DevLayer failed!\n", __FUNCTION__);
                SAMPLE_COMM_SYS_Exit();
                return -1;
        }

          
    if(HI_SUCCESS != SAMPLE_COMM_VO_StartChn(VoDev, &stPubAttr, stVoMode))
        {       
                printf("%s: Start VOChn failed!\n", __FUNCTION__);
                SAMPLE_COMM_SYS_Exit();
                return -1;
        }
        printf("Start HDMI\n");
         
#ifdef MPP_HDMI
    if (HI_SUCCESS != SAMPLE_COMM_VO_HdmiStart(stPubAttr.enIntfSync))
    {
         printf("%s: Start HDMI failed!\n", __FUNCTION__);
                    SAMPLE_COMM_SYS_Exit();
            return -1;
        }
#endif
   
        for(i=0; i<4; i++)
        {
        s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, i, i);
                if (HI_SUCCESS != s32Ret)
                {       
                        printf("%s: VI Bind to VO failed!\n", __FUNCTION__);
                        SAMPLE_COMM_SYS_Exit();
                        return -1;
                }
        }

    char file[12] = "/dev/fb0";
    int fd = -1;
        HI_BOOL g_bCompress = HI_FALSE;
    HI_BOOL bShow;

    struct fb_fix_screeninfo fix;
    struct fb_var_screeninfo var;
    unsigned char *pShowScreen;
    HIFB_ALPHA_S stAlpha;
    HIFB_POINT_S stPoint = {40, 112};

        HIFB_COLORKEY_S stColorKey;

       
    fd = open(file, O_RDWR, 0);
    if(fd < 0)
        {
        printf("open %s failed!\n",file);
        return HI_NULL;
    }

  
    if (ioctl(fd, FBIOPUT_COMPRESSION_HIFB, &g_bCompress) < 0)
        {
                printf("Func:%s line:%d FBIOPUT_COMPRESSION_HIFB failed!\n",\
                __FUNCTION__, __LINE__);
            close(fd);
                return HI_NULL;
        }

    bShow = HI_FALSE;
    if (ioctl(fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
    {
        printf("FBIOPUT_SHOW_HIFB failed!\n");
        return HI_NULL;
    }

    stPoint.s32XPos = 0;
    stPoint.s32YPos = 0;
    if (ioctl(fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0)
    {
        printf("set screen original show position failed!\n");
                close(fd);
        return HI_NULL;
    }

    stAlpha.bAlphaEnable = HI_FALSE;
    stAlpha.bAlphaChannel = HI_FALSE;
    stAlpha.u8Alpha0 = 0x0;
    stAlpha.u8Alpha1 = 0xff;
    stAlpha.u8GlobalAlpha = 0x80;
    if (ioctl(fd, FBIOPUT_ALPHA_HIFB,  &stAlpha) < 0)
    {
        printf("Set alpha failed!\n");
                close(fd);
        return HI_NULL;
    }

        stColorKey.bKeyEnable = HI_TRUE;
        stColorKey.u32Key = 0x0;
        if (ioctl(fd, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
        {
            printf("FBIOPUT_COLORKEY_HIFB!\n");
            close(fd);
            return HI_NULL;
        }          

    if (ioctl(fd, FBIOGET_VSCREENINFO, &var) < 0)
    {
        printf("Get variable screen info failed!\n");
                close(fd);
        return HI_NULL;
    }

    var.xres_virtual = 1280;
    var.yres_virtual = 720*2;
    var.xres = 1280;
    var.yres = 720;
    var.transp= g_a16;
    var.red = g_r16;
    var.green = g_g16;
    var.blue = g_b16;
    var.bits_per_pixel = 16;
    var.activate = FB_ACTIVATE_NOW;
   
    if (ioctl(fd, FBIOPUT_VSCREENINFO, &var) < 0)
    {
        printf("Put variable screen info failed!\n");
                close(fd);
        return HI_NULL;
    }
        printf("GUI init");

    bShow = HI_TRUE;
    if (ioctl(fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
    {
        printf("FBIOPUT_SHOW_HIFB failed!\n");
        return HI_NULL;
    }

    /*
    if (ioctl(fd, FBIOGET_FSCREENINFO, &fix) < 0)
    {
        printf("Get fix screen info failed!\n");
                close(fd);
        return HI_NULL;
    }

    pShowScreen = mmap(HI_NULL, fix.smem_len, PROT_READ|PROT_WRITE, MAP_SHARED, pstInfo->fd, 0);
    if(MAP_FAILED == pShowScreen)
    {
        printf("mmap framebuffer failed!\n");
                close(pstInfo->fd);
        return HI_NULL;
    }

    memset(pShowScreen, 0x00, fix.smem_len);
    bShow = HI_TRUE;
    if (ioctl(fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
    {
        printf("FBIOPUT_SHOW_HIFB failed!\n");
        munmap(pShowScreen, fix.smem_len);
        return HI_NULL;
    }
    */

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
[/code]

ecomsbz

1个粉丝

22

问答

0

专栏

36

资料

ecomsbz 2015-07-28 12:44:27
认可0
这个必须顶起来。。

jp1017

0个粉丝

78

问答

0

专栏

9

资料

jp1017 2015-07-30 10:25:28
认可0
CVBS不能用的吧,默默帮顶。。。。。:)

ymir

2个粉丝

23

问答

0

专栏

8

资料

ymir 2015-07-31 18:25:10
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=18639&ptid=8217]jp1017 发表于 2015-7-30 10:25[/url]
CVBS不能用的吧,默默帮顶。。。。。[/quote]

不清楚咯,按照这个思路也值得一试。

dong_abc

0个粉丝

0

问答

0

专栏

0

资料

dong_abc 2015-08-22 14:39:27
认可0
谢谢楼主                               .

colson

0个粉丝

2

问答

0

专栏

0

资料

colson 2015-08-24 11:15:08
认可0
好帖必须顶起来

david

41个粉丝

368

问答

253

专栏

229

资料

david 2015-08-24 16:44:05
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=18506&ptid=8217]ymir 发表于 2015-7-28 00:31[/url]
这部分代码分为VGA和HDMI输出,通过修改宏控制即可。[/quote]

感谢分享。顶LZ 。

ymir

2个粉丝

23

问答

0

专栏

8

资料

ymir 2015-08-26 10:32:37
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=19560&ptid=8217]david 发表于 2015-8-24 16:44[/url]
感谢分享。顶LZ 。[/quote]

版主大大都来顶我了,好开心!

xsjqqq123

0个粉丝

9

问答

0

专栏

0

资料

xsjqqq123 2015-09-10 21:11:10
认可0
问下,Qt颜色位说是要用argb8888,这是怎么回事?

我按网上一些教程改后,界面颜色很不对。 用argb1555则没法透明……

hzj_jason

0个粉丝

5

问答

0

专栏

0

资料

hzj_jason 2015-09-12 00:20:13
认可0
顶起来,学习了

ymir

2个粉丝

23

问答

0

专栏

8

资料

ymir 2015-09-14 08:31:57
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=20092&ptid=8217]xsjqqq123 发表于 2015-9-10 21:11[/url]
问下,Qt颜色位说是要用argb8888,这是怎么回事?

我按网上一些教程改后,界面颜色很不对。 用argb1555 ...[/quote]

可以看看这个,虽然移植了,但是公司不准备用Qt了。准备研究研究minigui
[url=http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=8512&highlight=qt]http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=8512&highlight=qt[/url]

9527

0个粉丝

3

问答

0

专栏

0

资料

9527 2015-11-01 15:11:20
认可0
参照楼主,已初步显示出来了。

joel

0个粉丝

0

问答

0

专栏

0

资料

joel 2015-11-01 17:59:44
认可0
謝謝分亨成功經驗

chuqingwu

0个粉丝

4

问答

0

专栏

0

资料

chuqingwu 2015-11-13 12:32:58
认可0
这个必须顶

liujiaqi13

0个粉丝

2

问答

0

专栏

0

资料

liujiaqi13 2015-11-23 14:12:06
认可0
学习学习,mark

z12oo

0个粉丝

5

问答

0

专栏

0

资料

z12oo 2015-11-27 13:53:28
认可0
必须顶起来,谢谢楼主的分享。

一直未离开

0个粉丝

0

问答

0

专栏

0

资料

一直未离开 2015-12-04 10:09:44
认可0
支持一下,向前辈学习。

lejianz

0个粉丝

1

问答

0

专栏

1

资料

lejianz 2016-03-06 21:05:24
认可0
谢谢楼主分享,正学习中

Bingo403

0个粉丝

1

问答

0

专栏

0

资料

Bingo403 2016-03-15 17:00:01
认可0
好东西,支持

wchp314

0个粉丝

2

问答

0

专栏

0

资料

wchp314 2016-03-31 16:07:43
认可0
楼主好帅,谢谢分享
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区