在ubuntu14.04.1中将qt4.8.6移植到基于hi3520d的nvr上

来源:互联网 发布:如何创建域名 编辑:程序博客网 时间:2024/06/08 18:22

准备工作

在开始之前,你需要有在同一局域网内的一台宿主机(在上面装一台虚拟机)、一台基于hi3520d的nvr。

我的宿主机是win8.1,虚拟机是virtual box+ubuntu:

virtual box安装包(VirtualBox-5.0.10-104061-Win.exe)

ubuntu镜像(ubuntukylin-14.04.1-desktop-i386.iso)

你还要有:

hi3520d交叉编译环境(arm-hisiv100nptl-linux.zip)

mpp头文件及库(mpp.zip)

qt4.8.6源码(qt-everywhere-opensource-src-4.8.6.tar.gz)

qt creator3.5.1安装包(qt-creator-opensource-linux-x86-3.5.1.run)


在ubuntu上mkdir nvr,将宿主机上的arm-hisiv100nptl-linux.zip、mpp.zip拖进去

在ubuntu上mkdir qt,将宿主机上的qt-everywhere-opensource-src-4.8.6.tar.gz、qt-creator-opensource-linux-x86-3.5.1.run拖进去


让ubuntu与宿主机、nvr互通

将ubuntu的网卡改为桥接网卡。先在宿主机、nvr上ping ubuntu,如果ping不通,手动设置ubuntu的ip让他们在同一网段上且子网掩码相同。再在ubuntu上ping宿主机,如果ping不通,把宿主机的防火墙关掉。接着,
sudo apt-get install nfs-kernel-server
sudo gedit /etc/exports
添加/ *(rw,sync,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart
配置好ubuntu上的nfs服务之后,在nvr上

mount -t nfs -o nolock ubuntu的ip:/ /mnt

就可以在nvr上通过/mnt目录访问ubuntu上的根目录了


安装本机编译环境

sudo apt-get install build-essential

安装交叉编译环境

cd nvr
unzip mpp.zip
unzip arm-hisiv100nptl-linux.zip
cd arm-hisiv100nptl-linux
chmod +x cross.install
sudo ./cross.install

安装qt creator

cd qt

chmod +x qt-creator-opensource-linux-x86-3.5.1.run

./qt-creator-opensource-linux-x86-3.5.1.run


编译arm版的qt

cd qt

tar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz

mv qt-everywhere-opensource-src-4.8.6 qt-arm

cd qt-arm/mkspecs/qws/linux-arm-g++

gedit qmake.conf

将所有的arm-linux替换为arm-hisiv100nptl-linux

gedit qplatformdefs.h

添加#undef O_CLOEXEC,防止在编译过程中报找不到accept4的错


cd qt/qt-arm

./configure -prefix /opt/qt-arm -opensource -confirm-license -fast -no-largefile -no-exceptions -no-accessibility -no-qt3support -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -no-declarative-debug -xplatform qws/linux-arm-g++ -qt-gfx-linuxfb -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -qt-zlib -no-gif -no-libtiff -qt-libpng -no-libmng -qt-libjpeg -no-openssl -nomake demos -nomake examples -nomake docs -nomake tools -no-rpath -no-nis -no-cups -no-iconv -no-pch -no-dbus -embedded arm -little-endian

make

sudo make install

这样编译出的libQtCore、libQtGui大小分别是3.6mb、12mb,tgz压缩后6.2mb

我们的nvr,flash只有10mb,不可删除的daemon.exe、nvr_main.tgz、startapp、startapp_t占3071.6kb(2.9mb),也就是说nvr_gui.tgz最大不能超过7168.4kb(7mb),除去qt库所占的6.2mb,留给程序的只有0.8mb!在包含字体文件的情况下,这显然是不够用的,只能继续裁剪libQtGui了,如果工程比较简单的话,除此之外还有一个选择,那就是minigui。如果flash超过16mb的话,qt就是你的不二选择了。

-rw-r--r--    1 root     root        3.0M Oct  7 08:54 WWW.tgz
-rwxr-xr-x    1 root     root      507.2K Apr 24  2015 daemon.exe
drwxr-xr-x    3 root     root           0 Apr 24  2015 hiapp
-rw-r--r--    1 root     root           0 Oct  6 15:29 noreboot
-rw-r--r--    1 root     root        4.2M Nov 18 13:31 nvr_gui.tgz
-rw-r--r--    1 root     root        2.5M Aug 31 11:12 nvr_main.tgz
-rwxr-xr-x    1 root     root        2.2K Apr 24  2015 startapp
-rwxr-xr-x    1 root     root        2.2K Apr 24  2015 startapp_t


编译pc版的qt

cd qt

tar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz

mv qt-everywhere-opensource-src-4.8.6 qt-pc

./configure TODO

make

sudo make install


在nvr上运行chip

chip是qt自带的demo,位于qt/qt-arm/demos/chip目录下

修改chip.pro,添加:

INCLUDEPATH += /home/mynamepfd/nvr/mpp/include

LIBS += -L/home/mynamepfd/nvr/mpp/lib -lmpi

修改main.cpp,头文件部分添加:

#if 1
#include "hi_common.h"
#include "hi_type.h"
#include "hi_comm_vo.h"
#include "mpi_vo.h"
#include "hifb.h"
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#endif

main函数开头添加:

#if 1
    int fd;
    HIFB_POINT_S stPoint = {0, 0};
    VO_PUB_ATTR_S stPubAttr = {0};
    HIFB_ALPHA_S stAlpha;
    HIFB_COLORKEY_S stColorKey;

    struct fb_fix_screeninfo fix;
    struct fb_var_screeninfo var;

    HI_MPI_VO_SetPubAttr(0, &stPubAttr);
    HI_MPI_VO_Enable(0);

    fd = open("/dev/fb0", O_RDWR);
    ioctl(fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint);

    ioctl(fd, FBIOGET_VSCREENINFO, &var);
    var.xres = var.xres_virtual = 1024;
    var.yres = 768;
    var.yres_virtual = 768;

    /* ARGB8888 */
    var.transp= {24, 8, 0};
    var.red = {16, 8, 0};
    var.green = {8, 8, 0};
    var.blue = {0, 8, 0};
    var.bits_per_pixel = 32;

    ioctl(fd, FBIOPUT_VSCREENINFO, &var);

    stAlpha.bAlphaEnable = (HI_BOOL)0;
    stAlpha.bAlphaChannel = (HI_BOOL)0;
    stAlpha.u8Alpha0 = 0xff;
    stAlpha.u8Alpha1 = 0x8f;
    stAlpha.u8GlobalAlpha = 0x80;
    ioctl(fd, FBIOPUT_ALPHA_HIFB,  &stAlpha);

    stColorKey.bKeyEnable = (HI_BOOL)1;
    stColorKey.u32Key = hifb_color2key(&var, 0x00001f);
    ioctl(fd, FBIOPUT_COLORKEY_HIFB,  &stColorKey);
#endif

这段代码是为了打开nvr上的fb0

在nvr上,mount好之后cd到chip所在目录,先export一些chip运行用到的环境变量:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/opt/qt-arm/lib

export QT_QWS_FONTDIR=/mnt/opt/qt-arm/lib/fonts

export QT_QWS_DISPLAY="linuxFB:/dev/fb0"

之后,./chip -qws

0 0