最近移植了 MiniGUI 1.3.3 到一个开发板上,中间遇到许多问题,在论坛上发问题,结果也没多少人回我,就算偶尔有回的,基本上回答也没有什么用,网上找不到一个完整的移植文章,所以 就决定把自己这次移植摸出来的一些方法写出来,给像我一样的小菜鸟做个参考吧。本文不教你怎么写驱动,只是教怎么样在最短的时候在你的PC机上搭建起开发 环境,同时在你的板子上跑起MiniGUI 来,这样你就可以在PC上开发好程序,调试完毕,然后交叉编译一下,直接Copy到板子上就可以了。
首 先,你需要下载的MiniGUI 的包:
http://www.minigui.com/download/libminigui-1.3.3.tar.gz
http://www.minigui.com/download/minigui-res-1.3.3.tar.gz
这两个包的下载需要你在www.minigui.com 上注册过才可以下载,免费注册的,自己去下吧
http://www.minigui.com/downloads/minigui13/mde-1.3.0.tar.gz 图形界面程序
http://www.minigui.com/downloads/minigui13/mg-samples-1.3.0.tar.gz 一些小例子
好,首先就下载这几个包吧,后面还有需要下载的包,后面再说
1.PC环境的搭建
首先你需要 一个 Linux 环境,我安装的是 RedHat 9.0 安装时记着选 everything ,这样可以避免到时候编译少了东西。这里搭建的环境是让 MiniGUI 在你的 PC 上可以跑起来,这样以后你开发程序就可以只在 PC 上开发,调试好,最后交叉编译一下放到板子上就行了。后面会讲怎么为板子编译MiniGUI ,耐心的看吧:)
首先建立自己的开发目录
[Root]# mkdir /opt
[Root]# cd /opt
[Root]# mkdir st2410 //这个是我的板子,
[Root]# chmod 777 st2410 //给一般用户操作权限
[user]# cd /opt/st2410 //进到目录中去,在这个目录下工作,用普通用户来工作
把 libminigui-1.3.3.tar.gz 解开
[user]# tar zxf libminigui-1.3.3.tar.gz
[user]# tar zxf minigui-res-1.3.3.tar.gz
编译 libminigui ,这个是 minigui 运行所必需的库文件,必须编译成功
[user]# cd libminigui-1.3.3
[user]# ./configure //最简单的编译方式,让它自己去配置 ,这里采用缺省的Thread 模式而不是Lite模式,因为这种方式在 PC 机上使用最方便,后面移到板子上再改成 Lite 模式即可
注意屏幕上的输出,特别是下面几条
checking for FrameBuffer console support... yes
checking for pthread library... yes
checking for TT_FreeType_Version in -lttf... yes
checking for T1_InitLib in -lt1... no
checking for jpeg_std_error in -ljpeg... yes
checking for png_check_sig in -lpng... yes
其中 –lttf –lpng 必须是 yes ,不然后面你的程序肯定会有问题,如果这里不是 yes 的话,肯定是你的 Redhat 9 安装不对,告诉过你安装时选 everything ,你选了吗???
其中 ttf 库是对 TrueType 字体的支持,png 库是对 png 图形的支持,MiniGui 里都需要这两个,在后面为板子交叉编译的时候也需要这两个,不然你的程序跑不起来,切记切记。
好了,现在通过了,下面是编译了
[user]# make
接来来就是漫长的等待了,让它慢慢的编译吧,呵
[user]# su //切到 Root 用户权限下,不然安装时没法把文件写到你的 /usr/local 目录下
[Root]# make install
好了,库 安装完毕,下面是安装资源
[Root]# cd /opt/st2410/minigui-res-1.3.3
[Root]# make install
OK,基本的安装完成了,现在检查一下
看看在你的目录 /usr/local/lib 下是不是有以下文件
libmgext-1.3.so.3 -> libmgext-1.3.so.3.0.0
libmgext-1.3.so.3.0.0
libmgext.a
libmgext.la
libmgext.so -> libmgext-1.3.so.3.0.0
libminigui-1.3.so.3 -> libminigui-1.3.so.3.0.0
libminigui-1.3.so.3.0.0
libminigui.a
libminigui.la
libminigui.so -> libminigui-1.3.so.3.0.0
libvcongui-1.3.so.3 -> libvcongui-1.3.so.3.0.0
libvcongui-1.3.so.3.0.0
libvcongui.a
libvcongui.la
libvcongui.so -> libvcongui-1.3.so.3.0.0
里面还有一个目录 minigui ,可以进到里面去看,分别为 minigui/res/ [bmp , cursor,icon ,…..] 好几个目录,里面有相应的文件
检查 /usr/local/include 里面是不是多了一个 minigui 目录,/usr/local/include/minigui 时面好多的 .h 文件,如下:
common.h control.h endianrw.h fixedmath.h mgext.h mywindows.h vcongui.h
config.h dti.c filedlg.h gdi.h minigui.h skin.h window.h
如果这里检查没有这些东西的话,那你前面的步骤肯定有问题,自己检查一下吧。
首先,修改你的 /etc/ld.so.conf 文件,在里面最后新加入一行 /usr/local/lib
然后执行 [Root]# ldconfig
OK !
[Root]# vi /usr/local/etc/MiniGUI.cfg
在里面找到
[system]
# GAL engine
#gal_engine=fbcon
gal_engine=qvfb //这里修改
# IAL engine
#ial_engine=console
ial_engine=qvfb //这里修改
mdev=/dev/mouse
mtype=IMPS2
[fbcon]
defaultmode=1024x768-16bpp
[qvfb]
defaultmode=640x480-16bpp //这里修改
display=0
保存一下,OK了!
现在你需要安装一个 qvfb ,因为 Redhat 9 里面没有,从下面地址下载
http://www.minigui.com/downloads/dep-libs/qvfb-1.0.tar.gz
老方法:
[user]# tar zxf qvfb-1.0.tar.gz
[user]# cd qvfb-1.0
[user]# ./configure
[user]# make
[user]# make install
在这个过程中如果出现 error while loading shared libraries: libqt-mt.so.3: cannot open shared object file
说明你的系统少了 libqt-mt.so.3 这个库,还是回去检查一下,你安装时Redhat 时是否选了 everything ,或者在实际操作的过程中,这个库有可以被误删除掉,我就出现过,这时候你可以 google 一下 ,输入 libqt-mt.so.3 redhat 9 ,应该就可以搜到相应的 rpm 包,安装时
[root]# rpm –i --force [你的包名] 就OK了
这里有个下载地址,可以试试,我是用讯雷下载的,别的工具没试过
ftp://ftp.pbone.net/mirror/www-ccrma.stanford.edu/planetccrma/mirror/redhat/linux/planetccrma/9/en/os/i386/qt33-3.3.3-0.1.rh90.ccrma.i386.rpm
注意:在你后面的操作过程中有可能会导致 libqt-mt.so.3 丢失,这时候只要重装一下就OK了
解决了这个 问题后重复安装过程
[user]# ./configure
[user]# make
[user]# make install
OK ,环境搭建好了,下面是测试了:)
还记得前面让你下载的 mg-samples-1.3.0.tar.gz 这个包吧,这个就是一些例子,现在试试吧:)
[user]# tar zxf mg-samples-1.3.0.tar.gz
[user]# ./configure
[user]# make
[user]# cd src
看看 src 目录下是不是已经编译出可执行文件来了
现在来执行一下吧,首先把 qvfb 加到你的可执行路径中去
[user]# cd $HOME
[user]# vi .bashrc
在 .bashrc 最后面加上一句
export PATH="$PATH:/sbin:/usr/local/arm/2.95.3/bin:/usr/local/bin:/usr/local"
保 存退出,这里面有些路径是为以后用的,比如 /usr/local/arm/2.95.3/bin ,先加上吧:)
[user]# source .bashrc //让它执行一下,当然你也可以选择重启一下电脑,效果是一样的,呵
执行例子程序:
[user]# qvfb & //在图形界面下执行,呵,别告诉我你只在命令行工作啊 :)
在 qvfb 中选 File Configure 640x480 VGA 16bit ,这样看起来舒服
[user]# cd /opt/st2410/ mg-samples-1.3.0/src
[user]# ./helloword
OK ,这个时候你应该可以看到在 qvfb 中的执行效果了吧,记住:一定要先运行 qvfb ,并且设置 qvfb ,然后再运行你的程序,而且qvfb 每重启一次就需要重新设置一下,真麻烦
OK 你的 PC 环境搭建完毕了,你现在可以在 PC 上开发你的程序,并且编译,并在 qvfb 中执行,等完全验证它是正确的了,把它交叉编译一下,放到板子上去就可以了,呵呵:)
MiniGUI 还有一种执行方式,就是在 Console 下在 Framebuffer 上执行,这种方式太麻烦,在PC 上不推荐,你还是用 qvfb 执行吧,方便,呵
在FrameBuffer 上执行
修改 /usr/local/etc/MiniGUI.cfg 文件,如下
[system]
# GAL engine
gal_engine=fbcon
//这里修改
# IAL engine
ial_engine=console
// 这里修改
mdev=/dev/mouse
mtype=none //这里改成none,因为经常鼠标不正常
[fbcon]
defaultmode=1024x768-16bpp
[qvfb]
defaultmode=640x480-16bpp
display=0
重启动你的 RedHat 9 ,在出现 Grub 的时候按 E 键,在 kernel =….. 这一行的最后加入 vga=0x317 ,然后 Enter ,然后在 kernel=… 这一行上按 b 就可以了,这时候可以在启动时看到一个小企鹅的图标,OK
进去后,直接在 例子程序的目录下执行 ./helloword 就可以了 :)
2.为你的实验板进行交叉编译
OK,PC机的开发环境已经建立好了,下面就是要移植到我们的板子上去了,这 里不介绍怎么移植 Linux 系统,假设你已经有一个可以在板子上跑的 Linux 系统了,并且已经有一个可以用的根文件系统了,并且已经有了板子相对应的LCD的驱动程序,这里介绍怎么在你的根文件系统里加上 MiniGUI ,使得你的板子有图形界面的显示。
要交叉编译,首先就得有交叉编译器,这里介绍 arm 板的交叉编译。不要自己去编译,直接去下载个就行了。
ftp://ftp.arm.linux.org.uk/pub/linux/arm/toolchain/cross-2.95.3.tar.bz2
记住这个 ftp ,最好的 arm 工具下载站,
下载回来,有35Mb,呵
安装交叉编译工具:
[Root]# mkdir –p /usr/local/arm
[Root]# cd /usr/local/arm
[Root]# tar jxf cross-2.95.3.tar.bz2 //把工具直接解到压缩到这个目录下就安装完成了,简单吧:)
解压缩后生成一个 2.95.3 目录,里面在就是工具
记住,这时候的gcc为 2.95.3/bin/arm-linux-gcc 而它的 include 为 2.95.3/arm-linux/include ,对应的 lib 为 2.95.3/arm-linux/lib
也就是说,你如果 用 arm-linux-gcc 编译程序的话,它缺省的就找 2.95.3/arm-linux/include 2.95.3/arm-linux/lib 两个目录,而不是 /usr/include ,所以如果你要加什么 .h .a .so 文件话,记着一定是加到这两个目录下去,不然编译器会告诉你找不到这些东西的
把可行程序的路径加入到 PATH 中去,还记得前面说过的改 .bashrc 文件吗?
[user]# cd $HOME
[user]# vi .bashrc
在 .bashrc 最后面加上一句
export PATH="$PATH:/sbin:/usr/local/arm/2.95.3/bin:/usr/local/bin:/usr/local"
[user]# source .bashrc
OK ,交叉编译工具安装完了,够简单吧:)
MiniGUI 的编译需要一些库文件,缺省我们的 gcc 基本上都有这些库文件,所以不需要安装,可是现在要交叉编译了,交叉编译器可是不带这些库文件的,所以我们得首先自己编译这些库文件装到交叉编译器中去。
注 意一点:库不一定要装最新的,库版本太新,MiniGUI 有可能不认识,像jpeg 库和 ttf 库就是这样,太新了反而用不了,所以要注意版本,以下的库都是我验证过可以和MiniGUI一起工作的,其它版本的库没试过,不保证能正确通过:)
首 先安装 zlib 库,这个是后面的库的编译基础。
http://www.zlib.net/zlib-1.2.3.tar.gz 400多K,去下载吧,
下载到目录 /opt/st2410 下
[user]# tar zxf zlib-1.2.3.tar.gz
由于 zlib 库的configure 脚本不支持交叉编译选项,只好自己动用了,手动临时把 gcc 修改成指向我们的交叉编译器 arm-linux-gcc
[Root]# cd /usr/bin
[Root]# mv gcc gcc_back
[Root]# ln -s /usr/local/arm/2.95.3/bin/arm-linux-gcc ./gcc
[Root]# mv ld ld_back
[Root]# ln -s /usr/local/arm/2.95.3/bin/arm-linux-ld ./ld
OK ,修改完成后回到 /opt/st2410/zlib-1.2.3 目录下
[user]# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --shared
注意:这里配置指向 /usr/local/arm/2.95.3/arm-linux/ 目录,会自动安装在 /usr/local/arm/2.95.3/arm-linux/ [include,lib] 目录下,千万不要装错目录了,不然后面会找不到这个库的
[user]# make
[Root]# make install
安 装完后检查一下目录 /usr/local/arm/2.95.3/arm-linux/ [include,lib] ,假如 include 中没有 zlib.h 之类的头文件,lib 中没有 libz.so.1.2.3 ,那就自己手动拷到这些目录下去,记着拷的时候把所有的 *.h 都需要拷过去,在拷库的时候用 cp –a libz.* /…./lib 就行,要用上 –a 选项
记着把刚才改过的 gcc 再改回去,不然后面会出错的!!!!!
安装 png 库,这个是用来显示 png 图形的,MiniGUI 里很多图都是 png 的,如果没有这个库,你的 MiniGUI 将无法正常工作,切记切记!
http://superb-east.dl.sourceforge.net/sourceforge/libpng/libpng-1.0.10rc1.tar.gz
还是那句话,库不要用最新的,最新的容易有问题,用这个老一点的就没问题了,呵
[user]# tar zxf libpng-1.0.10rc1.tar.gz
[user]# cd libpng-1.0.10rc1
Libpng 不提供有效的 configure 脚本,所以只好自己动手改 Makefile 文件了
[user]# cp scripts/makefile.linux Makefile //把 Scripts 下的一个 makefile 拷出来自己动手改
[user]# vi Makefile // 自己动手改
CC=arm-linux-gcc //修改这里
# where "make install" puts libpng.a, libpng.so*, png.h and pngconf.h
prefix=/usr/local/arm/2.95.3/arm-linux //修改这里
# Where the zlib library and include files are located
#ZLIBLIB=/usr/local/lib
#ZLIBINC=/usr/local/include
ZLIBLIB=/usr/local/arm/2.95.3/arm-linux/lib //修改这里
ZLIBINC=/usr/local/arm/2.95.3/arm-linux/include //修改这里
好 了,保存,然后去编译吧
[user]# make
[user]# make install
如果有错误,检查 你前面的步骤哪个没做对 :) 尤其是 zlib 的安装
还是前面说的,检查 /usr/local/arm/2.95.3/arm-linux/ [include,lib] 目录中有成功安装否,如果没有安装成功,那就自己把编译出来的东西拷过去。记着,*.h 和 .so 的文件都要拷。
OK,现在 来安装 jpeg 库
ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz 自己去下载,速度暴慢
[user]# tar zxf jpegsrc.v6b.tar.gz
[user]# cd jpeg-6b
[user]# ./configure –help //可以查看它的配置选项
一般情况下用 [cdp@cdpserver jpeg-6b]$ ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --host=arm-linux --enable-shared --enable-static
--host=arm-linux 来指定交叉编译选项,可是这里死活它不认,所以改用别的方法,如下
[user]# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ CC=arm-linux-gcc --enable-shared --enable-static
[user]# make
安装前需要在 arm-linux 下建个目录,不然安装会出错
[Root]# mkdir –p /usr/local/arm/2.95.3/arm-linux/man/man1
[Root]# make install // OK 了
一 样,自己去检查一下安装是否成功 :)
最后安装 libttf 库,这个是 TrueType 字体的支持库,用来显示文字的。
http://nchc.dl.sourceforge.net/sourceforge/freetype/freetype-1.3.1.tar.gz
注意:MiniGUI 的文档说只支持 1.3.1 版本的 ttf 库,不要把版本弄错了 :)
这个库装起来最麻 烦,全部自己手动编译,安装,下面一步一步来做吧:)
[user]# tar zxf freetype-1.3.1.tar.gz //老一套
[user]# cd freetype-1.3.1 //进到目录里去
[user]# mkdir –p /opt/st2410/libttf/extend // 自己另外建立一个目录
[user]# cp freetype-1.3.1/lib/* freetype-1.3.1/lib/arch/ansi/* libttf/ //把有用的东西拷出来
[user]#cp freetype-1.3.1/lib/extend/* libttf/extend/ 把 extend 目录下的文件也拷出来
注 意 cp 命令不要用 –r 选项,因为会把一些没用的东西出拷出来的
拷贝完成了,现在来自己手动编译了
[user]# cd libttf
[user]# arm-linux-gcc -c -fPIC -O2 freetype.c //不要奇怪,对,我们只要编译这一个 .c 文件,因为它包括了其它所有的 .c 文件了,你可以自己查看它的内容
[user]# arm-linux-gcc -c -fPIC -O2 -I./ extend/*.c 把 extend 下所有的 .c 文件全部编译
[user]# arm-linux-gcc --shared -o libttf.so *.o 生成最后的动态链接库,OK了