MiniGUI3 移植到 Hi3515 全过程
经过 3 周奋战,终于在 VGA 上显示出了 HelloWorld,其中过程,真
是一把辛酸泪,现记录如下,也让后来人少走弯路。
一、 安装包的下载
http://www.minigui.com/zhcn/download/
各个库说明如下(个人整理,仅供参考)
libmgi 输入法
libmgplus 图形功能,如路径,渐变填充,是平滑的,颜色组成
libmg3d
3D
libmgutils 对话框模板,这些函数模板包括打开/保存文件对话框,颜
色选择,字体选择对话框,对话框的信息,等等
libmgp 打印控件,输出到打印机
qvfb2
gvfb
虚拟显存, QT
虚拟显存, GTK
jpegsrc
JPG 库
libpng
PNG 库
freetype 字体
zlib
PNG 压缩算法
我只安装了里面 7 个库:freetype,zlib,jpegsrc,libpng,以及 res,
主库,和 sample。
二、 安装前的准备
先从网上搜索移植资料,最后锁定了这篇作为参考:
http://sgbihu.com/?p=249
然后就按要求将库一一解压,为了避免麻烦,我设置的安装路径也和
文中提到的一样,在/usr/local/minigui 中。
OK,准备工作完成,开始安装。
三、 zlib 库的安装
根据参考资料提示做。注意修改 gcc 为 hisi 环境的就行,下同,不再
累述
四、 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"
注意 I 和 L 后面不要有空格,高手当然知道,但俺是菜鸟,所以开始
给他们中间加了个空格,结果当然就悲剧了。
注意/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 是不行的。然后查看 minigui 的 configure –help,发现了
--enable-videohi35xx 选项,配置的时候加上,结果编译的时候报错,
HI3560 缺少头文件,因为我们只需要 HI3515,所以
vi mgconfig.h
vi confdefs.h
删掉 3560 的 define。
再编译,通过,结果继续报错,忘了是编译报错还是运行 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 函数中,参考 HI3515 的 SDK 中 mpp/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);