Minigui3在海思Hi3520D/Hi3531平台上运行

Minigui3在海思Hi3520D/Hi3531平台上运行

WORD里直接贴出来的,有图片,看不到哦!!!!可以在这里下载PDF!

完整代码和PDF下载位置:
http://note.youdao.com/share/?id=6eb7262501c051b48680a73b6969e06d&type=note

完整代码下载:
http://note.youdao.com/share/?id=b31289280ea30be69481db72ebfb5c47&type=note

获得Minigui3

http://www.minigui.org/en/download/这里下载 下面的三个文件:

libminigui-gpl-3.0.12.tar.gz MiniGUi3的库

minigui-res-be-3.0.12.tar.gz Minigui3的资源文件

前面这两个文件是必须的

mg-samples-3.0.12.tar.gz Minigui3的示例

获取后解压在一个地方,比如我的目录是: /code/code_2016/mingui3

编译Minigui3

Minigui3很小,真的很小,和QT这样企业级的应用来说,编译起来很轻松,几分钟就完事了,想想编译QT时二,三个小时太可怕了,还时不时的给你报错,真的很Mini,和UcGUI一样小,实现原理也基本是一样的,但对于大部份我们做一般的应用来说都够用了,不过在一个特定的平台,要用好,做出漂亮高效的UI,还真要在这些小的GUI自己定制修改不少的东西。

         我基本是按默认的来编译MiniGui3的。

      编译基本库

解压文件

tar –zxvf libminigui-gpl-3.0.12.tar.gz

         cdlibminigui-gpl-3.0.12

进入MiniGUI3的目录里,会看到有一个build的目录,很多平台的编译脚本已有了,没有海思的,其实配也很简单。在移植前应该了解一下Migui3的GAL和IAL,基本我们做动的地方就是这两块,基它的地方,如果没有用过它,我们也比较难去修改它。

         GAL是UI绘图的接口,IAL是外部设备的接口,打开几个文件了解一下,基本就看明白了,就那么几个struct 接口,不同的平台基本是一样的。

         因为用Linux framebuffer标准的接口,修改的是很少的。

         在根目录下写一个配置的脚本文件,如,下面两个配置 3520d和3531的基本一样:

         #forhi3520D

CFLAGS="-I/home/jhting/minigui3/include-g -O0" ./configure \

         --host=arm-hisiv100nptl-linux  \

         --prefix=/board/minigui3/hi3520d/\

         --disable-screensaver\

         --disable-splash\

         --disable-jpgsupport    \

         --enable-videoqvfb=no\

       --enable-rtosxvfb=no \

       --enable-pcxvfb=no

         #forhi3531

CFLAGS="-I/home/jhting/minigui3/include-g -O0" ./configure \

         --host=arm-hisiv100nptl-linux  \

         --prefix=/board/minigui3/hi3531/\

         --disable-screensaver\

         --disable-splash\

         --disable-jpgsupport    \

         --enable-videoqvfb=no\

       --enable-rtosxvfb=no \

       --enable-pcxvfb=no

        

没有用到qvfb所以把它们相关的关了(打开还会报一个包含头文件的错误,不过对应的修改一下Makefile就好了)。

执行上面的脚本

再:

make install

这样编译完成后,没有报错,比较幸运。

编译安装资源文件

资源文件只要 ./configure 里接定 –prefix 和 –host安装上就行了,如基本这样:

./configure --host=arm-hisiv100nptl-linux  --prefix=/board/minigui3/hi3531/

编译示例程序

         示例程序我没有编译所有的,我用哪个就编译了哪个,如:

#for hi3520D

arm-hisiv100nptl-linux-gcc -o helloworldhelloworld.c -I/board/minigui3/hi3520d/include -L/board/minigui3/hi3520d/lib-L/code/code_2016/mingui3/hisi_hifb/board/hi3520d/lib -I/code/code_2016/mingui3/hisi_hifb/board/hi3520d/include-static  -lminigui_ths -lhifb -lmpi  -laec -lhdmi -lmem -ltde -ljpeg -lVoiceEngine-lresampler -lanr -lvqev2 -ljpeg6b -lpthread -lm -lpthread –ldl

#for hi3531

arm-hisiv100nptl-linux-gcc -o helloworldhelloworld.c  -I/board/minigui3/hi3531/include/-L/board/minigui3/hi3531/lib-L/code/code_2016/mingui3/hisi_hifb/board/hi3531/lib-I/code/code_2016/mingui3/hisi_hifb/board/hi3531/include -static  -lminigui_ths -lhifb -lmpi  -laec -lhdmi -lmem -ltde -ljpeg -lVoiceEngine-lresampler -lanr -lpciv -lvqev2 -ljpeg6b -lpthread -lm -lpthread –ldl

示例程序里有一个libhifb.a的库,这个是用来,初始化海思平台的,在代码修改里有说明

代码修改

直接就按上面的来,当然是跑不出来什么东西的,也就是在运行程序时, 示例程序里编译时我们有一个libhifb.a的库,这个是用来初始化海思平台的,要初始化海思的MPI系统和VO输出,设置一些必要的参数,这部分我把它单独做了一个库,这样在MiniGUI里加一些必要的调用libhifb.a这个库,在不同的海思芯片平台上的修改都在libhifb.a这个库里搞定了,这样不会把UI的代码搞得太乱。

初始化海思的代码

我们用 Minigui3里的fbcon接口来对接海思的fb接口,看一下minigui3里的fbcon接口,基本实现sysvideo.h里的 GAL_VideoDevice结构体的方法就行了,fbcon 里的fbvideo.c都实现了,我们要做的就是对接上海思平台的hifb就OK,改的地方不过几行而已。

基本的思路就是在GAL_VideoDevice里也有初始化的操作,把海思mpp,vo的初始化放这里就行了,有一个 SetVideoMode 的操作把设置hifb的参数放这里面就行了。

为了方便,在fbvideo.c里定义一个 HISI_FB的宏,把相对于海思平台的代码修改用它来控制。

这样根据基本的需求,定义一个头文件hisi_hifb.h,定义如下的方法:

 

int HIFB_VO_Start(void);

int HIFB_VO_Stop(void);

 

int HIFB_SetVideoMode(int fd, int width, int height, int bpp, intflags);

 

这些方法在libhifb.a的一个库里实现。Minigui3只要在 fbvideo.c里合适的地方调用就行了。

 

写一个libhifb.a的工程,它的目录是这样的

Board目录包括不同的平台头文件和lib

同级目录里有不同平台的代码 如src_hi3520d/src_hi3531/src_hi3536

不过海思不同平台的 hifb和tde基本是一致的,也完全可以写在同一份代码里,没必要搞得这么细.

在根目录里有一个Makefile.param内容如下:

exportBOARD?=hi3531

exportINSTALL_PREFIX?=/board/minigui3/$(BOARD)

exportLIBTARGET?=libhifb.a

exportCROSS_COMPILE?= arm-hisiv100nptl-linux-

export CROSS?=arm-hisiv100nptl-linux-

exportCC:=$(CROSS)gcc

exportAR:=$(CROSS)ar

export CFLAGS +=-g -O0 -Wall -Werror

ifeq($(HIARCH),hi3531)

CFLAGS +=-march=armv7-a -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=vfpv3-d16

CXXFlAGS+=-march=armv7-a -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=vfpv3-d16

endif

exportPWD_PATH?=/code/code_2016/mingui3/hisi_hifb

exportMPP_LIB?=$(PWD_PATH)/board/$(BOARD)/lib

exportMPP_INCLUDE?=$(PWD_PATH)/board/$(BOARD)/include

CFLAGS +=-I$(MPP_INCLUDE)

如果编译不同的平台的,修改一下里面的 BOARD参数,当然做为参数传进来也许更方便一点。

在不同的芯片的目录里有一个Makefile,都一样的:

include../Makefile.param

SRC  := $(wildcard *.c)

OBJ  := $(SRC:%.c=%.o)

        

all:$(OBJ)

         $(AR) rv $(LIBTARGET) $(OBJ)

         cp $(LIBTARGET) $(INSTALL_PREFIX)/lib/

         cp hisi_hifb.h$(INSTALL_PREFIX)/include/

%.o:%.c

         $(CC) $(CFLAGS) -c $< -o $@

        

.PHONY:clean 

clean:

         @rm -f $(OBJ)

在代码里我是直接用,操作我是直接把海思mpp里的 sample代码拷来的,如src_hi3531里的文件:

改一点点东西就好了!

接上面的东西,实现了一个libhifb.a的库来初始化海思的东西,在Minigui3里的 fbcon 里的fbvideo.c里的合适地方调用就OK,基本上就这样,再编对Minigui3的库和helloworld程序,跑一下就行了。

配置运行

         配置也就修改一点点,把GAL指定为fbcon,分辩率改改,IAL指对对应的鼠标就行了。

一些问题

1:在做上面的过程里,遇到的一个问题就是,按上面的东西,在hi3515/hi3520D上是跑是OK了,能输出了,但在hi3531,hi3536上跑,死活没有输出,搞了一天也没有结果,最后发现是fbcon里的一些其它ioctl操作后,hi3531/hi3536的fb就不行了,关了一些ioctl操作就OK了.

         2:鼠标有残影,这个之前在用ucgui时也有,看来最好还是用海思的鼠标层来实现了。

基本就上面这些了,如果要实现好的话,还是得要用hifb里的TDE这些东西,不然画面效果不行,大屏必须了。

太晚了,文档中如果有坑,只挖不填,自己甄别啊!!!只供参考!!!

猜你喜欢

转载自blog.csdn.net/jhting/article/details/51059484