关闭

MiniGUI3移植到Hi3515全过程

318人阅读 评论(0) 收藏 举报
分类:

http://blog.csdn.net/longyue0917/article/details/7882672#comments

DOC文档下载地址:

http://download.csdn.net/detail/longyue0917/4510567

 

经过3周奋战,终于在VGA上显示出了HelloWorld,其中过程,真是一把辛酸泪,现记录如下,也让后来人少走弯路。

 

一、     安装包的下载

http://www.minigui.com/zhcn/download/

各个库说明如下(个人整理,仅供参考)

libmgi       输入法

libmgplus 图形功能,如路径,渐变填充,是平滑的,颜色组成

libmg3d          3D

libmgutils 对话框模板,这些函数模板包括打开/保存文件对话框,颜色选择,字体选择对话框,对话框的信息,等等

libmgp           打印控件,输出到打印机

 

qvfb2        虚拟显存, QT

gvfb          虚拟显存, GTK

 

jpegsrc           JPG

libpng       PNG

freetype    字体

zlib           PNG压缩算法

 

我只安装了里面7个库:freetypezlibjpegsrclibpng,以及res,主库,和sample

 

二、     安装前的准备

先从网上搜索移植资料,最后锁定了这篇作为参考:

http://sgbihu.com/?p=249

 

然后就按要求将库一一解压,为了避免麻烦,我设置的安装路径也和文中提到的一样,在/usr/local/minigui中。

OK,准备工作完成,开始安装。

 

三、     zlib库的安装

根据参考资料提示做。注意修改gcchisi环境的就行,下同,不再累述

 

四、     png库安装

资料一开始就说用libpng1.5.8的版本,我开始也到png网下了最新的版本,结果最后跑sample的时候给我带来了不少的麻烦,因为如果minigui的配置不修改的话,是识别不到太新的png库的,而对于第一次移植的菜鸟们来说,最好是尽量少点麻烦,所以我最后还是换回了libpng-1.2.37

 

按资料上的配置直接编译的话是会报错提示zlib没有安装的,网上BAIDU解决方法五花八门,但都未能解决问题,最后我在GOOGLE上找到一份资料提示才得以解决该问题,参考地址如下:

http://blog.csdn.net/absurd/article/details/646546

 

具体解决方法是,在编译之前(我是在configure之前),手动指定一下参数:

export CFLAGS="-I/usr/local/minigui/include"

export LDFLAGS="-L/usr/local/minigui/lib"

注意IL后面不要有空格,高手当然知道,但俺是菜鸟,所以开始给他们中间加了个空格,结果当然就悲剧了。

注意/usr/local/minigui是我的安装GUI的路径,如果你的路径不同,则注意修改。

 

五、     JPEG库的编译

这个和资料一致

 

六、     freetype库的编译

这个和资料一致

 

七、     minigui资源库的编译

这个和资料一致

 

八、     minigui核心库的编译

好,问题开始来了。

先是按资料上的configure配置和编译,遇到asm问题后,按资料上的方法copy文件是没用的,在下面这份资料上找到的解决办法:

http://zhangjunxin520.blog.163.com/blog/static/30503703201227103553401/

 

具体做法就是修改src/newgal/pcxvfb/Makefile

删掉oldincludedir = /usr/include一句和INCLUDES里面删掉最后一项-I/usr/include

 

如果之前用的png库是最新的版本,那么这里配置过程中lpng会是NO状态(打印信息一闪而过,不留意的话很容易忽略过去),然后运行sample的时候就会提示PNG问题。

 

这样编译虽然能通过,但输出只有FBCON,因为我是要移植到HI3515上,且通过HIFB驱动输出,所以需要打开HI3515的选项(对应在GUI中是HI3510),利用他本身的库进行输出,否则就要自己修改一大堆的东西。

 

开始在头文件中找到有_MGGAL_HI3510,手动打开,编译能过,但是跑sample是不行的。然后查看miniguiconfigure –help,发现了--enable-videohi35xx选项,配置的时候加上,结果编译的时候报错,HI3560缺少头文件,因为我们只需要HI3515,所以

vi mgconfig.h

vi confdefs.h

删掉3560define

再编译,通过,结果继续报错,忘了是编译报错还是运行sample报错了,最后关联是查到用3515需要打开--enable-procs。最后配置如下:

CC=arm-hismall-linux-gcc \

CXX=arm-hismall-linux-g++ \

LD=arm-hismall-linux-ld \

CFLAGS="-I/usr/local/minigui/include \

      -L/usr/local/minigui/lib \

      -I/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/include" \

CPPFLAGS="-g -I/usr/local/minigui/include \

      -L/usr/local/minigui/lib \

      -I/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/include" \

CXXFLAGS="-g -I/usr/local/minigui/include \

      -L/usr/local/minigui/lib \

      -I/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/include" \

./configure --prefix=/usr/local/minigui \

--host=arm-linux \

--target=arm-linux \

--build=i386-linux \

--with-osname=linux \

--with-style=classic \

--with-targetname=fbcon \

--enable-autoial \

--enable-rbf16 \

--disable-vbfsupport \

--enable-videohi35xx \

--enable-procs

 

编译通过了,然后就是修改代码来初始化HIFB,否则VGA上是没有输出的:

修改文件是src/newgal/hisi/Hi3510_fbvideo.c

 

1

先在HI3510_Available函数中,将

if ( hi3510_console >= 0 ) {

        close(hi3510_console);

}

close打开(之前是//注解掉的),因为后面需要初始化HIFB,所以这里需要先关闭。

 

2

HI3510_VideoInit函数中,参考HI3515SDKmpp/sample/hifb中的代码,在函数刊头做如下初始化:

/////////////////////////////////////////////

      const char *GAL_fbdev;

      HIFB_POINT_S stPoint = {0, 0};   //原点坐标

      HIFB_ALPHA_S stAlpha;                   //透明属性

 

      //

    GAL_fbdev = getenv("FRAMEBUFFER");

    if ( GAL_fbdev == NULL ) {

        GAL_fbdev = "/dev/fb0";

    }

 

      /*1 enable Vo device HD first*/

      //初始化MPP

      if(HI_SUCCESS != MppSysInit())

           return -1;

 

      //启动HD输出(VGA, 1024*768)

      if(HI_SUCCESS != EnableVoDev(HD))

      {

           MppSysExit();

           return -1;

      }

 

      /* 1. open framebuffer device overlay 0 */

      //打开驱动

      hi3510_console = open(GAL_fbdev, O_RDWR, 0);

      if(hi3510_console < 0)

    {

        printf("open %s failed!\n",GAL_fbdev);

        return -1;

    }

 

      /* 2. set the screen original position */

      //设置叠加层坐标原点

    if (ioctl(hi3510_console, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0)

    {

        printf("set screen original show position failed!\n");

        close(hi3510_console);

        return -1;

    }

 

      /* 3.set alpha */

      //设置透明属性

      stAlpha.bAlphaEnable = 0; //透明叠加属性关

      stAlpha.bAlphaChannel = 0;     //透明通道属性关

      stAlpha.u8Alpha0 = 0xff;

      stAlpha.u8Alpha1 = 0x8f;              //透明值

    stAlpha.u8GlobalAlpha = 0x80;         //全部透明值

    //设置叠加层的透明属性

      if (ioctl(hi3510_console, FBIOPUT_ALPHA_HIFB,  &stAlpha) < 0)

      {

          printf("Set alpha failed!\n");

        close(hi3510_console);

        return -1;

      }

 

      /* 4. get the variable screen info */

      //获取屏幕信息

    if (ioctl(hi3510_console, FBIOGET_VSCREENINFO, &vinfo) < 0)

    {

             printf("Get variable screen info failed!\n");

        close(hi3510_console);

        return -1;

    }

 

      /* 5. modify the variable screen info

          the screen size: IMAGE_WIDTH*IMAGE_HEIGHT

          the virtual screen size: VIR_SCREEN_WIDTH*VIR_SCREEN_HEIGHT

          (which equals to VIR_SCREEN_WIDTH*(IMAGE_HEIGHT*2))

          the pixel format: ARGB1555

    */

    //修改屏幕信息

    vinfo.xres_virtual = 1024;  //虚拟屏幕尺寸(显存大小)

      vinfo.yres_virtual = 768;

      vinfo.xres = 1024;                //可见屏幕尺寸

    vinfo.yres = 768;

 

    vinfo.transp= g_a16;

    vinfo.red = g_r16;

    vinfo.green = g_g16;

    vinfo.blue = g_b16;            //颜色分量中ARGB的位置,这里是ARGB1555的设置

    vinfo.bits_per_pixel = 32;  //一个点16    

    vinfo.activate = FB_ACTIVATE_FORCE;          //强制设置生效

 

      /* 6. set the variable screeninfo */

      //设置屏幕信息

    if (ioctl(hi3510_console, FBIOPUT_VSCREENINFO, &vinfo) < 0)

    {

             printf("Put variable screen info failed!\n");

        close(hi3510_console);

        return -1;

    }

      /////////////////////////////////////////////

     

3、将HI3515SDK中,mpp/sample/common/Vo_open.c文件中的内容搬过来,你要知道怎么包含的话就直接包含,你要不知道包含就像我一样,用最笨的方法,将open.c中的代码全部复制到本文件的开头处,别忘了头文件。

 

4、在HI3510_VideoQuit函数的最后加上以下代码:

//关闭视频输出

      DisableVoDev(HD);

      MppSysExit();

 

5、复制MPPincludeLIB中的文件到minigui3的安装路径对应的位置。因为HIFB用到了这些文件。

 

6、到目前为止,编译能成功,但运行sample会提示段错误,因为HI3515不支持2D加速,所以需要在HI3510的头文件里屏蔽_USE_2D_ACCEL选项,不使用hi_tde

 

OK,编译,安装,完工。

别忘了复制头文件和库文件到设备根文件系统的usr/local/

 

九、     sample的编译

不说了,反正配合minigui的主库不知道让我来回折腾了多少次了。直接上菜并做说明。

CC=arm-hismall-linux-gcc \

CXX=arm-hismall-linux-g++ \

LD=arm-hismall-linux-ld \

CFLAGS="-I/usr/local/minigui/include \

      -L/usr/local/minigui/lib \

      -I/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/include" \

CPPFLAGS="-g -I/usr/local/minigui/include \

      -L/usr/local/minigui/lib \

      -I/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/include" \

CXXFLAGS="-g -I/usr/local/minigui/include \

      -L/usr/local/minigui/lib \

      -I/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/include" \

./configure --prefix=/usr/local/minigui \

--build=i386-linux \

--host=arm-linux \

--target=arm-linux

 

然后make,会报错,哪个文件报错就进哪个Makefile中:

找到LIBS,然后修改为:

LDFLAGS = -L/usr/local/minigui/lib

MYLIBS = -lm -lc \

/usr/local/minigui/lib/libmpi.a

LIBS = -lminigui_procs -ljpeg -lm -lpthread -ldl -lz -lpng ${MYLIBS}

 

1、          由于minigui主程序配置的时候用了proc,所以这里生成的是libminigui_procs文件,而不是ths文件,

2、          由于png库依赖zib库,所以在-lpng之前要加上-lz

3、          由于HIFB用到了SDK中的libmpi.a静态库,所以用-lm –lc指定了库的路径。后面如果用到其他的库,则要在这里依次添加。

 

注意dbufctrl两个DEMO因为依赖了其他的资源,我们没有安装,所以在sample的根目录的makefile中的COMMON_SUBDIRS下将这两个文件删除。

 

最后进入mginit文件夹,做同样的修改,然后make生成mginit可执行文件。

注意,在sample编译完成之后在sample根路径下会生成一个mginit可执行文件,但是因为有一个同名的mginit文件夹,所以这个可执行文件我是不知道该怎么执行的。

 

然后在设备的根文件系统的var文件夹下mkdirtmp文件夹,给权限777

 

最后一步,修改设备根文件系统的下/usr/local/etc/MiniGUI.cfg

[system]

# GAL engine and default options

gal_engine=hi3510

defaultmode=1024x768-32bpp

 

# IAL engine

#ial_engine=dummy

#mdev=/dev/input/mice

ial_engine=console

#ial_engine=dummy

mdev=/dev/mice

mtype=IMPS2

 

十、     USB鼠标

HI3515提供的SDK中的内核默认是不支持USB鼠标的,需要重新配置一下,make xconfig

Device Driver

      HID Devices

           USB Human Interface Device (full HID) support(勾选)

                 /dev/hiddev raw HID device support(勾选)

 

Input device support

      Mouse interface(勾选)

           Provide legacy /dev/psaux device(勾选)

      Mice

           Mice(勾选)

 

OK,先跑mginit,然后运行same,玩球球吧。

 

十一、HIFB驱动的加载

直接进mpp/ko/,然后运行./load3515就行了。

如果VGA的分辨率设置太大,就修改一下vram0_size的大小,这些SDKPDF都有说明。

 

十二、VGA分辨率的修改

1、          EnableVoDev函数的开头,

      static VO_PUB_ATTR_S s_stPubAttrDflt[3]的第一项,

      .enIntfSync = VO_OUTPUT_1024x768_60,    改为你需要的分辨率

 

2、          刚才移植到HI3510_VideoInit函数中的初始化代码里面,

      找到:

      //修改屏幕信息

    vinfo.xres_virtual = 1024;  //虚拟屏幕尺寸(显存大小)

      vinfo.yres_virtual = 768;

      vinfo.xres = 1024;                //可见屏幕尺寸

vinfo.yres = 768;

这里修改为对应的尺寸。

 

3、          Minigui.cfg里面

      defaultmode=1024x768-32bpp

      修改为对应的大小。

      注意这里的32bpp,如果和屏幕信息不对应,也会提示出错。

      32bppARGB8888

 

0
0

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:569361次
    • 积分:7823
    • 等级:
    • 排名:第2663名
    • 原创:53篇
    • 转载:1094篇
    • 译文:0篇
    • 评论:32条
    文章分类
    最新评论