查看: 16799|回复: 89

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

    [复制链接]
发表于 2015-7-28 00:29:44 | 显示全部楼层 |阅读模式
本帖最后由 ymir 于 2015-7-28 00:53 编辑

这是我上一个粗略的过程,记录之前走过的路,大家也可以参考一下。我也是帮助了两个网友后突发的想写这个帖子,
帮助大家在Qt的移植过程中加快步伐!
我的上个帖子
Qt编译过程可以参看GoodMan大神的编译过程
地址:嵌入式Qt编译过程
我的Qt库的编译安装路径为/opt/Qt4.8
就是在编译的时候指定 --prefix /opt/Qt4.8
编译完成后的目录大概是这样的
  1. [root@bogon:1 opt]# tree Qt4.8/ -L 1
  2. Qt4.8/
  3. ├── bin
  4. ├── include
  5. ├── lib
  6. ├── mkspecs
  7. ├── plugins
  8. └── translations
复制代码

之后将海思sample目录下的东西库拷贝到这里
  1. [root@bogon:1 opt]# tree Qt4.8/ -L 1
  2. Qt4.8/
  3. ├── bin
  4. ├── hilib           // mpp 目录下的lib文件夹的内容都放在这里
  5. ├── hinclude    // mpp 目录下的include下的所有文件都放在这里
  6. ├── include
  7. ├── lib
  8. ├── mkspecs
  9. ├── plugins
  10. └── translations
复制代码

因为我们的目的是在代码中复用sample下的基础代码,然而这部分代码与内核代码,以及外部驱动代码都有一定的联系我之前试着
将这部分代码抽离出来,后来没成功。考虑到可能要做的移植工作很多,最后还是决定将qt工程嵌入到samplke目录下,直接使用其
各个目录下的Makefiel文件,因为他们都已经定义好了编译规则,我们只需要参考其他的工程文件的Makeifle即可定义好我们的规则。
开动:
Qt库我就不说了,按照自己的配置也可以,只要将相应的库文件放进去就行了,库文件移植到板子的时候,只需要留下so动态库文
件即可,其余的静态库.a文件什么的,以及工具都删除即可,将库放到板子的同目录就可以了,在指定库搜索路径添加你的的动态
库路径。我之前写了个qt的测试程序,拖了几个控件,在windows上编译通过。之后我们将该工程代码放到sample目录下,大概是
这样的:

  1. [root@bogon:1 sample]# tree -L 1
  2. .
  3. ├── audio
  4. ├── common
  5. ├── guiclick        //该目录为从测试工程目录,其中存放着代码
  6. ├── hifb
  7. ├── LIB
  8. ├── Makefile
  9. ├── Makefile.param
  10. ├── QtBuild           //该目录为新建的编译目录。
  11. ├── region
  12. ├── tde
  13. ├── vda
  14. ├── vdec
  15. ├── venc
  16. ├── vio
  17. └── work
复制代码

然后在~/.bashrc 中添加一行PATH=$PATH:/opt/Qt4.8.5
运行source ~/.bahrc 使变量生效,之后运行qmake如果有正常的输出,就是配置好了,
若没有检查相应的错误。
之后就开始我们的移植之路
我们将工程文件放到sample目录下。工程目录大概这样的:
  1. [root@bogon:1 sample]# tree -L 1 guiclick/
  2. guiclick/
  3. ├── guiclick.pro
  4. ├── guiclick.pro.user
  5. ├── main.cpp
  6. ├── mainwindow.cpp
  7. ├── mainwindow.h
  8. └── mainwindow.ui
复制代码

然后我们在sample下新建一个编译目录: mkdir Qtbuild,
进入Qtbuild。
之后使用命令[root@bogon:1 QtBuild]# qmak -r ../guiclick/guiclick.pro生成Makefile
然后修改Makefile文件内容,请注意下面变更的内容,尤其注意 “=”号前面是否有”:“,“+”等符号
修改Makefile内容 变更:
  1. 9 ####### Compiler, tools and options
  2. 10 include  ../Makefile.param
  3.             // 添加一行: 添加sample目录编译控制文件。
  4. 11 CC            = arm-hisiv100nptl-linux-gcc

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

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

  10. 16 CXXFLAGS      = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
  11. 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.
  12. //这里是添加海思库的头文件支持。
  13. 18 INCPATH         += -I/opt/Qt4.8/hinclud -I.

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

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

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

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


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

本帖子中包含更多资源

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

x
楼主热帖
 楼主| 发表于 2015-7-28 00:31:15 | 显示全部楼层
这部分代码分为VGA和HDMI输出,通过修改宏控制即可。
  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. #include <stdio.h>
  4. #include "sample_comm.h"
  5. #include <linux/fb.h>
  6. #include "hifb.h"
  7. #include <fcntl.h>
  8. #include <sys/ioctl.h>
  9. static VO_DEV VoDev = SAMPLE_VO_DEV_DHD0;

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


  15. int main(int argc, char *argv[])
  16. {
  17.         VO_PUB_ATTR_S stPubAttr;
  18.         VB_CONF_S stVbConf;
  19.         HI_S32 s32Ret = HI_SUCCESS;
  20.     HI_S32 i;
  21. #ifdef MPP_HDMI
  22.     SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_1_D1;
  23. #else
  24.         SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_1_720P;
  25. #endif

  26.         SAMPLE_VO_MODE_E stVoMode = VO_MODE_1MUX;
  27.         HI_BOOL bExtendedMode;
  28.         HI_CHAR ch;
  29.        
  30.         memset(&stVbConf, 0, sizeof(VB_CONF_S));
  31.     stVbConf.u32MaxPoolCnt             = 16;
  32. #ifdef MPP_HDMI
  33.         stVbConf.astCommPool[0].u32BlkSize = 720*576*2;
  34. #else
  35.         stVbConf.astCommPool[0].u32BlkSize = 576*480*2;
  36. #endif
  37.         stVbConf.astCommPool[0].u32BlkCnt  = 16;
  38.        
  39.         stPubAttr.u32BgColor = 0xff00ff00;
  40. #ifdef MPP_HDMI
  41.         stPubAttr.enIntfType = VO_INTF_HDMI;
  42. #else
  43.         stPubAttr.enIntfType = VO_INTF_VGA;
  44. #endif
  45.     //stPubAttr.enIntfSync = VO_OUTPUT_720P50;
  46.     stPubAttr.enIntfSync = VO_OUTPUT_800x600_60;

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


  55.     s32Ret = SAMPLE_COMM_VI_Start(enViMode, VIDEO_ENCODING_MODE_PAL);
  56.     if (HI_SUCCESS != s32Ret)
  57.     {
  58.         printf("%s: Start Vi failed!\n", __FUNCTION__);
  59.                 SAMPLE_COMM_SYS_Exit();
  60.         return -1;
  61.     }
  62.        
  63.         s32Ret = SAMPLE_COMM_VO_StartDevLayer(VoDev,&stPubAttr,25);                        
  64.         if (HI_SUCCESS != s32Ret)
  65.         {       
  66.                 printf("%s: Start DevLayer failed!\n", __FUNCTION__);
  67.                 SAMPLE_COMM_SYS_Exit();
  68.                 return -1;
  69.         }

  70.           
  71.     if(HI_SUCCESS != SAMPLE_COMM_VO_StartChn(VoDev, &stPubAttr, stVoMode))
  72.         {       
  73.                 printf("%s: Start VOChn failed!\n", __FUNCTION__);
  74.                 SAMPLE_COMM_SYS_Exit();
  75.                 return -1;
  76.         }
  77.         printf("Start HDMI\n");
  78.          
  79. #ifdef MPP_HDMI
  80.     if (HI_SUCCESS != SAMPLE_COMM_VO_HdmiStart(stPubAttr.enIntfSync))
  81.     {
  82.          printf("%s: Start HDMI failed!\n", __FUNCTION__);
  83.                     SAMPLE_COMM_SYS_Exit();
  84.             return -1;
  85.         }
  86. #endif
  87.    
  88.         for(i=0; i<4; i++)
  89.         {
  90.         s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, i, i);
  91.                 if (HI_SUCCESS != s32Ret)
  92.                 {       
  93.                         printf("%s: VI Bind to VO failed!\n", __FUNCTION__);
  94.                         SAMPLE_COMM_SYS_Exit();
  95.                         return -1;
  96.                 }
  97.         }

  98.     char file[12] = "/dev/fb0";
  99.     int fd = -1;
  100.         HI_BOOL g_bCompress = HI_FALSE;
  101.     HI_BOOL bShow;

  102.     struct fb_fix_screeninfo fix;
  103.     struct fb_var_screeninfo var;
  104.     unsigned char *pShowScreen;
  105.     HIFB_ALPHA_S stAlpha;
  106.     HIFB_POINT_S stPoint = {40, 112};

  107.         HIFB_COLORKEY_S stColorKey;

  108.        
  109.     fd = open(file, O_RDWR, 0);
  110.     if(fd < 0)
  111.         {
  112.         printf("open %s failed!\n",file);
  113.         return HI_NULL;
  114.     }

  115.   
  116.     if (ioctl(fd, FBIOPUT_COMPRESSION_HIFB, &g_bCompress) < 0)
  117.         {
  118.                 printf("Func:%s line:%d FBIOPUT_COMPRESSION_HIFB failed!\n",\
  119.                 __FUNCTION__, __LINE__);
  120.             close(fd);
  121.                 return HI_NULL;
  122.         }

  123.     bShow = HI_FALSE;
  124.     if (ioctl(fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
  125.     {
  126.         printf("FBIOPUT_SHOW_HIFB failed!\n");
  127.         return HI_NULL;
  128.     }

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

  137.     stAlpha.bAlphaEnable = HI_FALSE;
  138.     stAlpha.bAlphaChannel = HI_FALSE;
  139.     stAlpha.u8Alpha0 = 0x0;
  140.     stAlpha.u8Alpha1 = 0xff;
  141.     stAlpha.u8GlobalAlpha = 0x80;
  142.     if (ioctl(fd, FBIOPUT_ALPHA_HIFB,  &stAlpha) < 0)
  143.     {
  144.         printf("Set alpha failed!\n");
  145.                 close(fd);
  146.         return HI_NULL;
  147.     }

  148.         stColorKey.bKeyEnable = HI_TRUE;
  149.         stColorKey.u32Key = 0x0;
  150.         if (ioctl(fd, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
  151.         {
  152.             printf("FBIOPUT_COLORKEY_HIFB!\n");
  153.             close(fd);
  154.             return HI_NULL;
  155.         }          

  156.     if (ioctl(fd, FBIOGET_VSCREENINFO, &var) < 0)
  157.     {
  158.         printf("Get variable screen info failed!\n");
  159.                 close(fd);
  160.         return HI_NULL;
  161.     }

  162.     var.xres_virtual = 1280;
  163.     var.yres_virtual = 720*2;
  164.     var.xres = 1280;
  165.     var.yres = 720;
  166.     var.transp= g_a16;
  167.     var.red = g_r16;
  168.     var.green = g_g16;
  169.     var.blue = g_b16;
  170.     var.bits_per_pixel = 16;
  171.     var.activate = FB_ACTIVATE_NOW;
  172.    
  173.     if (ioctl(fd, FBIOPUT_VSCREENINFO, &var) < 0)
  174.     {
  175.         printf("Put variable screen info failed!\n");
  176.                 close(fd);
  177.         return HI_NULL;
  178.     }
  179.         printf("GUI init");

  180.     bShow = HI_TRUE;
  181.     if (ioctl(fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
  182.     {
  183.         printf("FBIOPUT_SHOW_HIFB failed!\n");
  184.         return HI_NULL;
  185.     }

  186.     /*
  187.     if (ioctl(fd, FBIOGET_FSCREENINFO, &fix) < 0)
  188.     {
  189.         printf("Get fix screen info failed!\n");
  190.                 close(fd);
  191.         return HI_NULL;
  192.     }

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

  200.     memset(pShowScreen, 0x00, fix.smem_len);
  201.     bShow = HI_TRUE;
  202.     if (ioctl(fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
  203.     {
  204.         printf("FBIOPUT_SHOW_HIFB failed!\n");
  205.         munmap(pShowScreen, fix.smem_len);
  206.         return HI_NULL;
  207.     }
  208.     */

  209.     QApplication a(argc, argv);
  210.     MainWindow w;
  211.     w.show();
  212.     return a.exec();
  213. }
复制代码
发表于 2015-7-28 12:44:27 | 显示全部楼层
这个必须顶起来。。
发表于 2015-7-30 10:25:28 | 显示全部楼层
CVBS不能用的吧,默默帮顶。。。。。
 楼主| 发表于 2015-7-31 18:25:10 | 显示全部楼层
jp1017 发表于 2015-7-30 10:25
CVBS不能用的吧,默默帮顶。。。。。

不清楚咯,按照这个思路也值得一试。
发表于 2015-8-22 14:39:27 | 显示全部楼层
谢谢楼主                               .
发表于 2015-8-24 11:15:08 | 显示全部楼层
好帖必须顶起来
发表于 2015-8-24 16:44:05 | 显示全部楼层
ymir 发表于 2015-7-28 00:31
这部分代码分为VGA和HDMI输出,通过修改宏控制即可。

感谢分享。顶LZ 。
 楼主| 发表于 2015-8-26 10:32:37 | 显示全部楼层
david 发表于 2015-8-24 16:44
感谢分享。顶LZ 。

版主大大都来顶我了,好开心!
发表于 2015-9-10 21:11:10 | 显示全部楼层
问下,Qt颜色位说是要用argb8888,这是怎么回事?

我按网上一些教程改后,界面颜色很不对。 用argb1555则没法透明……
发表于 2015-9-12 00:20:13 | 显示全部楼层
顶起来,学习了
 楼主| 发表于 2015-9-14 08:31:57 | 显示全部楼层
xsjqqq123 发表于 2015-9-10 21:11
问下,Qt颜色位说是要用argb8888,这是怎么回事?

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

可以看看这个,虽然移植了,但是公司不准备用Qt了。准备研究研究minigui
http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=8512&highlight=qt
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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