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个库: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);
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、将HI3515的SDK中,mpp/sample/common/Vo_open.c文件中的内容搬过来,你要知道怎么包含的话就直接包含,你要不知道包含就像我一样,用最笨的方法,将open.c中的代码全部复制到本文件的开头处,别忘了头文件。
4、在HI3510_VideoQuit函数的最后加上以下代码:
//关闭视频输出
DisableVoDev(HD);
MppSysExit();
5、复制MPP的include和LIB中的文件到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指定了库的路径。后面如果用到其他的库,则要在这里依次添加。
注意dbuf和ctrl两个DEMO因为依赖了其他的资源,我们没有安装,所以在sample的根目录的makefile中的COMMON_SUBDIRS下将这两个文件删除。
最后进入mginit文件夹,做同样的修改,然后make生成mginit可执行文件。
注意,在sample编译完成之后在sample根路径下会生成一个mginit可执行文件,但是因为有一个同名的mginit文件夹,所以这个可执行文件我是不知道该怎么执行的。
然后在设备的根文件系统的var文件夹下mkdir个tmp文件夹,给权限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的大小,这些SDK的PDF都有说明。
十二、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,如果和屏幕信息不对应,也会提示出错。
32bpp为ARGB8888。