MiniGUI 1.3.3 移植详解
作者:大漠孤狼 E-Mail:yuqiang0107@126.com
最近移植了 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了
现在手动安装,得自己建立一下目录
[Root] mkdir –p /usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
[Root] cp *.h extend/*.h /usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
[Root] cp libttf.so /usr/local/arm/2.95.3/arm-linux/lib
安装库完成,哈!
经过试验发现 MiniGUI 1.3.3 版本在链接 ljpeg lpng lttf 时老是要链接 /usr/lib 下的库,没办法,用老方法
[Root]# cd /usr/lib
[Root]# mv libjpeg.so libjpeg.so_back
[Root]# ln –s /usr/local/arm/2.95.3/arm-linux/lib/libjpeg.so ./libjpeg.so //指向 arm 的库
[Root]# mv libpng.so libpng.so_back
[Root]# ln –s /usr/local/arm/2.95.3/arm-linux/lib/libpng.so ./libpng.so
[Root]# mv libttf.so libttf.so_back
[Root]# ln –s /usr/local/arm/2.95.3/arm-linux/lib/libttf.so ./libttf.so
完成以上工作后就可以编译 libminigui 了
[user]# cd libminigui-1.3.3
[user]# make menuconfig //就用图形界面来配置就好了,不要用一堆 –enable-xxx 之类的,太麻烦
如果在 make menuconfig 出错,去检查一下你的 gcc ,前面我们把它指向 arm-linux-gcc ,问一下,你改回来没有???????
下面是配置libminigui
在 System Wide Options 里如下:
[*] Build MiniGUI-Lite //用 Lite 方式编译,不是Thread 方式,这里适用于 PDA
[ ] Stand-Alone
[ ] Use incore (built-in) resource //建议不要选这个,老有问题
[*] Unit of timer is 10ms
[*] Cursor support
[ ] User can move window with mouse //建议别选这个,可以移动蛮烦人的
[*] Mouse button can do double click
[*] Build with debugging messages
[ ] Trace messages of MiniGUI //不要选这个,出来的Trace太多,看不过来
[*] Include symbol name of messages
在 GAL engine Options 里
(NEWGAL) GAL and its engines
[*] NEWGAL engine on Linux FrameBuffer console
[ ] NEWGAL engine on Qt Virtual FrameBuffer //建议不要选这个,不然老让你用qvfb
[ ] NEWGAL engine on eCos LCD interface
[*] Dummy NEWGAL engine
[*] Have console on Linux FrameBuffer
在 IAL engine options 里
[ ] EP7211-based board
[ ] ADS Graphics Client
[ ] iPAQ H3600 (also H3800)
[ ] MPC823
[ ] PX255B
[ ] NEC VR4181
[ ] Helio Touch Panel
[ ] MT T800
[*] SMDK2410 Touch Screen
[ ] uClinux Touch Screen Palm/MC68EZ328
[*] Dummy IAL engine
[*] Native (console) input engine
--- Native IAL engine subdriver options
[ ] PS2 mouse
[ ] IntelligentMouse (IMPS/2) mouse
[ ] MS mouse
[ ] MS3 mouse
[*] GPM daemon
在 Font Option 里
[*] Raw bitmap font
[ ] Var bitmap font //千万不要选这个,不然会出现 unreferenced vfb_Courier8x8() 之类的错误
[*] Incore font sansserif
[*] Incore font courier
[*] Incore font symbol
[*] Incore font vgas
[*] Qt Prerendered Font
[*] TrueType font
[ ] Adobe Type1 font
在 Image Options 里
[*] Includes SaveBitmap-related functions
[ ] PCX file support
[ ] LBM/PBM file support
[ ] TGA file support
[*] GIF file support
[*] JPG file support
[*] PNG file support
在 Input Medthold Option 里
[*] IME (GB2312) support
[ ] IME (GB2312) Intelligent Pinyin module //千万不要选这个,不然后面你的 mginit 程序一启动就崩溃了(Abort ,有点像 OOP 一样,显示所有的寄存器的值,然后Abort),暴不爽
在 Development Environment Option 里
(Linux) Platform
(arm-linux-gcc) Compiler //注意这里
(glibc) Libc //注意这里
--- Installation options
Path prefix: "/usr/local/arm/2.95.3/arm-linux" //注意这里,我们把库装到交叉编译器的目录下
--- Additonal Compiler Flags
CFLAGS: ""
LDFLAGS: ""
其它的用缺省的选项就可以了,好了,现在退出,保存你的设置吧,然后它就开始检测你的系统了,注意下面的输出:
checking for FrameBuffer console support... yes
checking for TT_FreeType_Version in -lttf... yes //True Type字体
checking for jpeg_std_error in -ljpeg... yes // jpeg 支持
checking for png_check_sig in -lpng... yes //png 图形支持,重要!!!
checking for pow in -lm... yes
这里的库应该都是显示为 yes 了,如果有 no 的话,回去检查前面你有哪步做得不对,不然的话编译后的东西可能没法正常执行,切记切记!!!
如果这里通过了,那就OK了
[user]# make //又是一个漫长的等待,呵
[Root]# make install
注意:我们这里 make install 其实是给交叉编译器安装 libminigui 的库,你想,将来你需要编译为 minigui 开发的程序,这个程序总是需要链接库的吧,这些库因此也需要在交叉编译器中,不然你交叉编译的时候编译不过去 :)
装好了,到 /usr/local/arm/2.95.3/arm-linux 的 include lib 目录下去看看,是不是多了相应的 libminigui.so libmgext.so libvcongui.so 在 include 目录下多了一个 minigui 目录,里面有相应的头文件
最后,安装 popt 库,这个库在编译 mde 程序时需要使用,不然编译没法通过 :)
http://gd.tuwien.ac.at/utils/rpm.org/dist/rpm-4.1.x/popt-1.7.tar.gz 我是从这里下载的
[user]# tar zxf popt-1.7.tar.gz
[user]# cd popt-1.7
[user]# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --host=arm-linux --enable-shared --enable-static
[user]# make
[Root]# make install
一切很顺利,搞定了。
交叉编译环境设置好了!
MiniGUI 1.3.3 移植详解2 [转]
OK ,下面是把 minigui 移植到你的板子上去了。
我在 /opt 目录下建立了一个 rootfs 目录,即 /opt/rootfs ,用来建立我的嵌入式系统的根目录,现在我需要把 minigui 的库文件放到里面去,
建立目录
[Root]# mkdir –p /opt/rootfs/usr/local/[lib,etc]
把 /usr/local/arm/2.95.3/arm-linux/lib 中相应的库拷到 /opt/rootfs/usr/local/lib 目录下去
下面是我拷的库文件:
libjpeg.a libmgext-1.3.so.3 libminigui.a libpng.so.2 libttf.a libz.so
libjpeg.la libmgext-1.3.so.3.0.0 libminigui.la libpng.so.2.1.0.10rc1 libttf.so libz.so.1
libjpeg.so libmgext.a libminigui.so libpopt.a libvcongui-1.3.so.3 libz.so.1.2.3
libjpeg.so.62 libmgext.la libm.so libpopt.la libvcongui-1.3.so.3.0.0 minigui
libjpeg.so.62.0.0 libmgext.so libm.so.6 libpopt.so libvcongui.a shared
libm-2.2.3.so libminigui-1.3.so.3 libpng.a libpopt.so.0 libvcongui.la
libm.a libminigui-1.3.so.3.0.0 libpng.so libpopt.so.0.0.0 libvcongui.so
其中一些 .a 的静态库是不需要拷过去的,我图方便,一起拷了,呵,懒人的做法
同时修改 /opt/rootfs/etc/ld.so.conf ,在里面最后新加入一行 /usr/local/lib
然后执行 [Root] ldconfig –r /opt/rootfs //把 rootfs 当成根目录,执行
OK,库文件准备完毕
下面把资源文件也拷过来,还记得吗,在前面 搭建 PC 环境中讲过安装资源文件,它被装在了 /usr/local/lib 目录下,一个叫 minigui 的目录,我们要做的就是把它拷过来
[Root]# cp –r –a /usr/local/lib/minigui /opt/rootfs/usr/local/ 连目录一起拷过来,目录结构和主机一样
把配置文件也拷过来
[Root]# cp /usr/local/etc/MiniGUI.cfg /opt/rootfs/usr/local/etc/ 记住,保持目录结构的一致
修改 MiniGUI.cfg ,如下
[system]
# GAL engine
gal_engine=fbcon //这里修改
# IAL engine
ial_engine=dummy // 这里修改,我不知道你会用什么触摸屏,所以就用dummy肯定不会错
mdev=/dev/touchscreen/0raw //解摸屏,如果前面是 dummy ,则这里改不改无所谓
mtype=none
[fbcon]
defaultmode=240x320-16bpp // 根据你的LCD大小自己设置,设置错误minigui 就启动不了
ial_engine 一开始建议用 dummy ,先让 minigui 跑起来,以后再把 触摸屏 加进去,保证尽可能减少错误的发生
保存,退出。 OK ,你的板子上的系统也搭建完毕了,现在来让真正的图形界面跑起来!:)
注意:你Build 你的 嵌入式 Linux 内核时,在 Console 中一定要先上 FrameBuffer ,从4位色一直到 16 位色的支持,全选上吧,同时把 VGA TextOut 选项勾掉,不要选它!!!!!!!!!!
内核启动时就要激活 FrameBuffer ,不然 minigui 没法启动起来,激活的方法就是给它传内核参数 vga=xxx 之类的。
3.启动你的 MiniGUI 的图形界面
看看你的 Windows 操作系统,左下方是一个 [开始] 按钮,然后是 任务条 ,MiniGUI 也提供了类似的界面,这就是一个叫 mginit 的程序,它启动后就跟widnows的界面很像了,它就在 mde 包里面,还记得最初让你下载的那个程序包吗?? 现在我们就来安装它!!:)
[user]# tar zxf mde-1.3.0.tar.gz
[user]# cd mde-1.3.0
//我们先对 mginit 程序做一点小修改,呵
[user]# cd mginit ; vi mginit.c
在 297 行处,把下面代码注释掉
/***************
AboutMiniGUI ();
AboutMDE ();
**************/
保存,退出即可。
因为我们没有 触摸屏 现在,没法点它的 确认 按钮,所以把这些 About 信息去掉:)
好了,现在来编译吧,在mde-1.3.0 目录里
[user]# ./configure --prefix=/opt/rootfs/usr/local --host=arm-linux
[user]# make
如果你发现 mginit 目录下的程序没有被编译,那就说明你的 libminigui 配置不正确,记住,你必须是配置为 Lite 模式,这个程序才会被编译
[user]# make install
事实上证明,make install,根本没用,它什么都没做,do nothing
所以还是我们自己动手来做吧,呵
[Root]# mkdir –p /opt/rootfs/usr/local/lib/shared/miniguiapps //建立了一个我们自己的目录,好长,呵
[Root]# cp –r –a mde-1.3.0/* /opt/rootfs/usr/local/lib/shared/miniguiapps
直接全部拷过去,然后到 /opt/rootfs/usr/local/lib/shared/miniguiapps 的各个程序目录下去,比如 mginit , bomb , painter 之类的,把不用的 .c .h .o Makefile 之类的全删除掉,保留 可执行文件和相应的 res 目录下的资源
注意,保持目录的结构,mginit.rc 文件不要删了,这个对mginit 程序很重要
OK,最后一步了,修改配置文件
[Root]# vi /opt/rootfs/linuxrc 文件
一般你配置嵌入式系统的时候都会有这个文件,用来执行一些系统的初始化工作,如果没有,就在你相应的初始化脚本(例如 etc/inittab)中加入下面的语句
mknod /dev/ttyp5 c 3 5
mknod /dev/ptyp5 c 2 5
cd /usr/local/lib/shared/miniguiapps/mginit
./mginit
注意:最后执行 mginit 命令的方式,先进入到它所在的目录,然后再执行,千万不要只写成
/usr/local/lib/shared/miniguiapps/mginit/mginit
因为 mginit 执行时在“当前目录”的res文件夹下搜索显示的资源,这种写法则“当前目录”为 / 根目录,所以会找不到 res 文件夹,于是显示错误
“ Can not create taskbar! ” 就退出了!
如果运行时显示没有 mknod 命令,请检查一下你的 busybox 的配置 :)
切记切记!
好了,一切成功了,现在放到你的板子上去试试吧:)
[Root]# cd /opt
[Root]# mkcramfs rootfs root.cramfs 制作根文件系统镜像,把 root.cramfs 烧到你的板子里面就OK了,启动,就可以看到 minigui 的图形界面启动了 :)
注意: 因为你的 minigui 是按 Lite 模式编译的,如果必须 mginit 首先运行起来,你其它的程序(比如 bomb ,或是 helloword)才能执行,如果 mginit 没有运行起来你就执行 helloword 的话,就会显示错误
“ Can not attach shared resource ! ”
4.为 minigui 开发程序
环境配好了,现在是开发自己的程序了,呵呵,写个简单的 Helloword 程序
/*
** $Id: helloworld.c,v 1.7 2003/06/13 07:15:49 weiym Exp $
**
** Listing 2.1
**
** helloworld.c: Sample program for MiniGUI Programming Guide
** The first MiniGUI application.
**
** Copyright (C) 2003 Feynman Software.
**
** License: GPL
*/
#include <stdio.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (message) {
case MSG_PAINT:
hdc = BeginPaint (hWnd);
TextOut (hdc, 100, 100, "Hello, world!");
EndPaint (hWnd, hdc);
return 0;
case MSG_CLOSE:
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
int MiniGUIMain (int argc, const char* argv[])
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
#ifdef _LITE_VERSION
SetDesktopRect(0, 0, 1024, 768);
#endif
CreateInfo.dwstyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
CreateInfo.dwExstyle = WS_EX_NONE;
CreateInfo.spCaption = "Hello, world";
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = HelloWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 320;
CreateInfo.by = 240;
CreateInfo.iBkColor = COLOR_lightwhite;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow(hMainWnd, SW_SHOWNORMAL);
while (GetMessage(&Msg, hMainWnd)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
MainWindowThreadCleanup (hMainWnd);
return 0;
}
#ifndef _LITE_VERSION
#include <minigui/dti.c>
#endif
首先在 PC 上编译,验证通过!
[user]# gcc -o helloword helloword.c -lminigui –lmgext
如果没有错误,运行 qvfb ,按前面说的设置好,然后执行 [user]# ./helloword
一切正常,没有错误,现在就要把它放到我们的 板子上去跑了
[user]# arm-linux-gcc –O2 –o helloword helloword.c –lminigui –lmgext
编译完后,把它烧到板子的某个目录下,就可以在 板子上跑了!
所以这里就是说,minigui 提供了让你在 PC 上就可以调试和运行程序的方法(使用qvfb ),等你保证程序正确了以后,只需要把它重新编译一下,放到板子上去就行了!
5.一些常见的问题
这几天遇到不一些问题,发现论坛上也基本上没人回答我,所以只好自己解决了,这里把一些问题写出来,方便有需要的人:
问题1:在板子上跑的程序都显示 can not find qvfb … 之类,可是我只是想让它在板子上跑在 FrameBuffer 之上啊?
解决:在编译 libminigui 的时候,把
[ ] Use incore (built-in) resource //建议不要选这个,老有问题
[ ] NEWGAL engine on Qt Virtual FrameBuffer //建议不要选这个,不然老让你用qvfb
问题2:编译的时候老出现 unreferenced to vbf_Courier8x8() 之类的问题
解决:
[ ] Var bitmap font //千万不要选这个,不然会出现 unreferenced vfb_Courier8x8() 之类的错误
问题3:一切都搞定了,可是执行 mginit() 的时候就崩溃了,把所有的寄存器值打印了出来,然后显示了个 Abort() 就退出了!
解决:
[ ] IME (GB2312) Intelligent Pinyin module //千万不要选这个,不然后面你的 mginit 程序一启动就崩溃了
问题4: 为什么我执行 helloword 就显示 “Can not attach shared resource!”
解决:
注意: 因为你的 minigui 是按 Lite 模式编译的,如果必须 mginit 首先运行起来,你其它的程序(比如 bomb ,或是 helloword)才能执行,如果 mginit 没有运行起来你就执行 helloword 的话,就会显示错误
“ Can not attach shared resource ! ”
问题5:怎么把自己的程序加到 minigui 的 taskbar 上去,并且排在前面??
解决:
查看 mginit 目录下的 mginit.rc 文件,里面就是配置,我想你能看明白的 :)
问题6:为什么我的程序显示 can not find libminigui.so ??
解决:你是否忘了在 etc/ld.so.conf 中加入 /usr/local/lib ,并且执行 ldconfig 程序? 看前面说的方法
好了,就写这么多吧,希望对新手有所帮助!
Singlewolfyu (大漠孤狼) 写于 清华 FIT 4-305
2006-11-7
yuqiang0107@126.com
Minigui V1.3.3在uClinux中的移植经验总结 [转]
经 过一个星期的努力,终于将Minigui移植到我的ARM7开发板上了,在这个过程中我遇到了很多困难和问题,但是通过网络,通过以前很多前辈在网络上分 享的经验,终于取得成功,也让我更加体会到只有大家都互相帮助,互相分享经验才能使大家都受益。所以基于这一点,我将我的移植过程分享给大家,并且写得尽 量详细点,希望给大家一些帮助,使后来者少走一些弯路。有不对的地方,欢迎大家板砖!
首先说明一下我的开发平台,我用的是Samsung S3C44B0X芯片的开发板,已经移植好的uClinux操作系统和FrameBuffer驱动。我的uClinux安装在 "/s3c44b0fu/uClinux-dist"目录下,交叉编译工具安装在"/usr/local/arm-elf"目录下。
具体步骤:
一. 从网站下载 libminigui-1.3.3.tar.gz, mde-1.3.0.tar.gz, mg-samples-1.3.0.tar.gz和minigui-res-1.3.3.tar.gz四个压缩文件,并将这四个文件保存到交叉编译环境的 目录下,因为我的arm-elf-gcc交叉编译工具安装在"/usr/local/arm-elf"目录下,所以将minigui的四个压缩包同样拷贝 到"/usr/local/arm-elf"目录下.
二. 在终端中输入"cd /usr/local/arm-elf",进入minigui的四个压缩文件所在目录,然后分别执行"tar zxvf xxxxx.tar.gz"将这四个压缩包解压缩.解压后生成libminigui-1.3.3, mde-1.3.0, mg-samples-1.3.0和minigui-res-1.3.3四个文件夹.
三. 1) 进入minigui-res-1.3.3文件夹内,修改config.linux,在prefix = $(TOPDIR)/usr/local/后添加我们的交叉编译安装目录arm-elf,即prefix = $(TOPDIR)/usr/local/arm-elf.
2) cd minigui-res-1.3.3
3) make install
四. cd mde-1.3.0
./configure
make
cd mg-samples-1.3.0
./configure
make
五. 1) 编写交叉编译minigui函数库的配置脚本domain.sh.
domain.sh的具体内容为:
#!/bin/sh
rm config.cache config.status -f
CC=arm-elf-gcc /
CFLAGS="-I/s3c44b0fu/uClinux-dist/uClibc/include -Dlinux -D__linux__ -D__uClinux__ -Dunix " /
LDFLAGS="-Wl,-elf2flt -static -Wl,-move-rodata -Wl,-L/s3c44b0fu/uClinux-dist/lib/uClibc/lib -Wl,-L/s3c44b0fu/uClinux-dist/linux-2.4.x/lib -Wl,-lc -Wl,-lm" /
./configure --prefix=/usr/local/arm-elf /
--build=i686-pc-linux-gnu /
--host=arm-elf-linux /
--target=arm-elf-linux /
--disable-shared /
--disable-lite /
--disable-standalone /
--enable-incoreres /
--disable-flatstyle /
--enable-newgal /
--disable-nativegal /
--disable-galcommlcd /
--enable-galfbcon /
--enable-adsial /
--disable-micemoveable /
--disable-cursor /
--disable-fblin1r /
--enable-fblin8 /
--disable-fblin16 /
--disable-fblin32 /
--disable-textmode /
--enable-dummyial /
--disable-mc68x328ial /
--disable-nativeial /
--disable-qvfbial /
--disable-qpfsupport /
--disable-ttfsupport /
--disable-type1support /
--disable-latin9support /
--disable-gbksupport /
--disable-big5support /
--disable-unicodesupport /
--disable-savebitmap /
--disable-imegb2312 /
--disable-imegb2312py /
--disable-aboutdlg /
--disable-savescreen /
--disable-grayscreen /
--enable-tinyscreen /
--enable-video-fbcon /
--disable-video-qvfb /
--disable-nativegalqvfb /
--with-osname=uclinux
编写好后拷贝到libminigui-1.3.3下.
2) cd libminigui-1.3.3
3) sh domain.sh
4) make
5) make install
6) ldconfig
上面六步即完成了用arm-elf-gcc对minigui的函数库的交叉编译.可以进入/usr/local/arm-elf目录中,你会看到新增加 了etc和lib两个文件夹,这两个文件夹就是我们刚才用arm-elf-gcc交叉编译minigui的函数库所产生的结果,以后编译在目标板中运行的 应用程序时,就会对这两个文件夹里的内容进行编译,从而产生适合于在arm开发板中运行的应用程序.
六. 编写测试minigui的应用程序
1) 测试程序miniguidemo.c其实就是从mg-samples-1.3.0中拷贝过来的helloworld.c程序,不过要根据具体的LCD做一点修改,如我的LCD是640x480的256色STN彩色屏,所以要将
#ifdef _LITE_VERSION
SetDesktopRect(0, 0, 1024, 768);
#endif
修改为:
#ifdef _LITE_VERSION
SetDesktopRect(0, 0, 640, 480);
#endif
根 据你的不同的LCD修改这个参数,还可以修改这个窗体显示的位置,根据你的喜好修改即可.最后将编写好的miniguidemo.c保存到 /s3c44b0fu/uClinux-dist/user/guidemo中(注:guidemo是我在user目录中新建的文件夹)
2) 在/s3c44b0fu/uClinux-dist/user/guidemo中编写Makefile文件,具体内容为:
EXEC = miniguidemo
OBJS = miniguidemo.o
LDFLAGS=-L/s3c44b0fu/uClinux-dist/uClibc/lib
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) -lminigui -lmgext $(LIBPTHREAD) $(LIBM) $(LDLIBS) -elf2flt
romfs:
$(ROMFSINST) /bin/$(EXEC)
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
3) 修改user/Makefile
为了让编译器编译上述添加的内容,在user/Makefile中添加一句(一般按照字母排列):
dir _$(CONFIG_USER_GUIDEMO_MINIGUIDEMO) +=guidemo
4) 修改config/config.in
config/config.in文件中添加的内容会在对用户选项进行配置时反映出来。在文件的最后,增加一条:
###################################################################
mainmenu_option next_comment
comment 'My MINIGUI Application'
bool 'demo' CONFIG_USER_GUIDEMO_MINIGUIDEMO
endmenu
###################################################################
七. 现在可以编译minigui的应用程序了,这里罗嗦一点,minigui应用程序的编写有两种方法,一种是将应用程序添加到uClinux-dist目录 中,在uClinux-dist编译和链接,直至生成最后的映象文件;第二种方法是先单独编译minigui的应用程序,生成可执行文件,然后放到 uClinux-dist的romfs目录中,执行make image命令生成映象文件.很显然这里采用的是第一种方法, 也正因为采用的是第一种方法,所以第五步中交叉编译得到的配置文件MiniGUI.cfg实际上在这里没有用处;第二种方法我尝试过,似乎有点问题,你可 以尝试尝试.
编译步骤:
make mrproper
make menuconfig(记住将FrameBuffer和你的应用程序编译到内核去)
make dep
make lib_only
make user_only
make ronfs
make image
make
将编译生成的映象文件下载到目标板中,执行程序,出现错误
/bin> helloworld
No available video device.
NEWGAL: Does not find matched engine: qvfb.
GDI: Can not get graphics engine information!
InitGUI failure when using incore resource.
pid 30: failed 256
这个错误恰好和61IC工程师社区中的“风雨”写的一篇文章完全一样!所以我就按照他的步骤一步一步的修改,网址是 http://www.61ic.com/club/bbs/dispbbs.asp?boardID=26&ID=691&page=1
具体修改步骤是:
经过跟踪,进入sysres/mgedt.c
#include "common.h"
typedef struct _ETCSECTION
{
int key_nr; /* key number in the section */
char *name; /* name of the section */
char **keys; /* key string arrays */
char **values; /* value string arrays */
} ETCSECTION;
typedef ETCSECTION* PETCSECTION;
typedef struct _ETC_S
{
int section_nr; /* number of sections */
PETCSECTION sections; /* pointer to section arrays */
} ETC_S;
#ifdef _INCORE_RES
static char *SYSTEM_KEYS[] = {"gal_engine", "ial_engine", "mdev", "mtype"};
#ifdef __ECOS
static char *SYSTEM_valueS[] = {"ecoslcd", "ipaq", "/dev/ts", "none"};
#else
//static char *SYSTEM_valueS[] = {"qvfb", "qvfb", "/dev/ts", "none"}; //这是我注释掉的原来的, 你们看看程序结构,不管我怎么配置NEWGAL,
//这里都将不可避免的进入QVFB
static char *SYSTEM_valueS[] = {"fbcon", "dummy", "none", "none"}; //我新加的。
#endif
static char *FBCON_KEYS[] = {"defaultmode"};
static char *FBCON_valueS[] = {"640x480-8bpp"}; //原来的是240X320-16bpp
static char *QVFB_KEYS[] = {"defaultmode", "display"};
static char *QVFB_valueS[] = {"640x480-16bpp", "0"};
static char *SYSTEMFONT_KEYS[] =
{"font_number", "font0", "font1", "font2", "default", "wchar_def", "fixed", "caption", "menu", "control"};
static char *SYSTEMFONT_valueS[] =
{
"3","rbf-fixed-rrncnn-6-12-ISO8859-1", "*-fixed-rrncnn-*-12-GB2312", "*-SansSerif-rrncnn-*-12-GB2312",
"0", "1", "1", "1", "1", "1"
};
static char *CURSORINFO_KEYS[] = {"cursornumber"};
static char *CURSORINFO_valueS[] = {"2"};
static char *ICONINFO_KEYS[] = {"iconnumber"};
static char *ICONINFO_valueS[] = {"5"};
static char *BITMAPINFO_KEYS[] = {"bitmapnumber"};
static char *BITMAPINFO_valueS[] = {"3"};
/*
static char *BGPICTURE_KEYS[] = {"position"};
static char *BGPICTURE_valueS[] = {"center"};
static char *MOUSE_KEYS[] = {"dblclicktime"};
static char *MOUSE_valueS[] = {"300"};
static char *EVENT_KEYS[] = {"timeoutusec", "repeatusec"};
static char *EVENT_valueS[] = {"300000", "50000"};
*/
static ETCSECTION mgetc_sections [] =
{
{4, "system", SYSTEM_KEYS, SYSTEM_valueS},
{1, "fbcon", FBCON_KEYS, FBCON_valueS},
{2, "qvfb", QVFB_KEYS, QVFB_valueS},
{10,"systemfont", SYSTEMFONT_KEYS, SYSTEMFONT_valueS},
{1, "cursorinfo", CURSORINFO_KEYS, CURSORINFO_valueS},
{1, "iconinfo", ICONINFO_KEYS, ICONINFO_valueS},
{1, "bitmapinfo", BITMAPINFO_KEYS, BITMAPINFO_valueS},
/* optional sections */
/*
{1, "bgpicture", BGPICTURE_KEYS, BGPICTURE_valueS},
{1, "mouse", MOUSE_KEYS, MOUSE_valueS},
{2, "event", EVENT_KEYS, EVENT_valueS},
*/
};
ETC_S MGETC = { 7, mgetc_sections };
#endif /* _INCORE_RES */
修改后编译并运行。仍然提示错误。
/bin> helloworld
MAP_SHARED not supported (cannot write mappings to disk) //这条一看就知道在MMAP使用了不适合uClibc库的参数, 此项应该设置为0
NEWGAL: Does not find matched engine: fbcon. GDI: Can not get graphics engine information!
InitGUI failure when using incore resource.
Unable to memory map the video hardwarepid 30: failed 256
后来经过跟踪。在/libminigui-1.3.3/src/newgal/fbcon/fbvideo中找到OPEN及MMAP引用。
将mapped_mem = mmap(NULL, mapped_memlen,
PROT_READ|PROT_WRITE, MAP_SHARED, console_fd, 0);
改为
#ifdef __uClinux__
mapped_mem = mmap(NULL, mapped_memlen,
PROT_READ|PROT_WRITE, 0, console_fd, 0);
#else
mapped_mem = mmap(NULL, mapped_memlen,
PROT_READ|PROT_WRITE, MAP_SHARED, console_fd, 0);
#endif
将mapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,
MAP_SHARED, console_fd, mapped_memlen);
改为
#ifdef __uClinux__
mapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,
0, console_fd, mapped_memlen);
#else
mapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,
MAP_SHARED, console_fd, mapped_memlen);
#endif
编译后运行。发现出现代码崩溃,
/bin/helloworld
Unhandled fault: external abort on linefetch (F4) at 0x00000001
fault-common.c(97): start_code=0xcd00040, start_stack=0xcdfff84)
pid 32: failed 7
经过艰苦的跟踪分析。在/home/libminigui-1.3.3/src/kernel/desktop.c中。
将if (!InitSystemRes ()) {
fprintf (stderr, "DESKTOP: Can not initialize system resource!/n");
return FALSE;
}注释掉。
编译运行。 显示OK,终于可以显示出Helloworld的窗体,至此,全部移植完成,可以发挥自己的想象力,编写漂亮的GUI界面程序了!