分类: LINUX
2009-08-10 15:47:18
MiniGUI-1.3.3在ARM平台上的移植
本文档主要参考《MiniGUI 1.3.3 移植详解》
作者:大漠孤狼 E-Mail:yuqiang0107@126.com
step 1:
配置好2.95.3交叉编译环境
/*MiniGUI 的编译需要一些库文件,缺省我们的 gcc 基本上都有这些库文件,所以不需*/
/*要安装,但是对于交叉编译,交叉编译器不带这些库文件,所以我们首先要编译这些库*/
/*文件安装到交叉编译器中去。 */
step 2: 安装 zlib 库
由于zlib库的configure 脚本不支持交叉编译选项,所以手动临时把gcc修改成指向我们的交叉编译器arm-linux-gcc
# cd /usr/bin
# mv gcc gcc_back
# ln -s /usr/local/arm/2.95.3/bin/arm-linux-gcc ./gcc
# mv ld ld_back
# ln -s /usr/local/arm/2.95.3/bin/arm-linux-ld ./ld
修改完成后回到zlib-1.2.3目录下
#./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --shared
#make
#make install
注意:把gcc、ld改回去!!
step 3: 安装png库
# tar zxf libpng-1.0.10rc1.tar.gz
# cd libpng-1.0.10rc1
Libpng不提供有效的configure脚本,所以手动修改Makefile文件了
# cp scripts/makefile.linux Makefile //把 Scripts 下的一个 makefile 拷出来修改
# 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 //修改这里
保存,编译
#make
#make install
step 4: 安装jpeg库
# tar zxf jpegsrc.v6b.tar.gz
# cd jpeg-6b
# ./configure –help //可以查看它的配置选项
首先在本机上编译一下,主要是它的configure文件设计得有问题,得先用gcc编译一个 dummy.c文件,然后才能后面编译,不然的话就会出现libtool找不到之类的错误
# ./configure --enable-shared --enable-static
本机正常编译通过以后,[user]# make clean 清除掉,然后执行交叉编译
一般情况下用: #./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --host=arm-linux --enable-shared --enable-static
--host=arm-linux来指定交叉编译选项,可是这里死活它不认,所以改用别的方法,如下
#./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ CC=arm-linux-gcc --enable-shared --enable-static
# make
安装前需要在 arm-linux 下建个目录,不然安装会出错
# mkdir –p /usr/local/arm/2.95.3/arm-linux/man/man1
# make install
step 5: 安装libttf库
注意:MiniGUI 的文档说只支持 1.3.1 版本的 ttf 库,不要把版本弄错了
这个库装起来最麻烦,全部自己手动编译安装。
# tar zxf freetype-1.3.1.tar.gz
# cd freetype-1.3.1
# mkdir –p libttf/extend // libttf目录与freetype-1.3.1是同级目录
# cp freetype-1.3.1/lib/* freetype-1.3.1/lib/arch/ansi/* libttf/ //把有用的东西拷出来
# cp freetype-1.3.1/lib/extend/* libttf/extend/ 把 extend 目录下的文件也拷出来
注意cp命令不要用–r选项,因为会把一些没用的东西出拷出来的
拷贝完成了,现在来自己手动编译了
# cd libttf
# arm-linux-gcc -c -fPIC -O2 freetype.c // 只要编译这一个 .c 文件,因为它包括了
// 其它所有的.c文件了
# arm-linux-gcc -c -fPIC -O2 -I./ extend/*.c // 把 extend 下所有的 .c 文件全部编译
# arm-linux-gcc --shared -o libttf.so *.o // 生成最后的动态链接库
现在手动安装,先建立相关目录
mkdir –p /usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
cp *.h extend/*.h /usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
cp libttf.so /usr/local/arm/2.95.3/arm-linux/lib
安装libttf库完成
step 6: 安装libminigui库
经试验发现MiniGUI 1.3.3 版本在链接ljpeg lpng lttf时总是要链接 /usr/lib 下的库,没办法,用老方法
# cd /usr/lib
# mv libjpeg.so libjpeg.so_back
# ln –s /usr/local/arm/2.95.3/arm-linux/lib/libjpeg.so ./libjpeg.so //指向 arm 的库
# mv libpng.so libpng.so_back
# ln –s /usr/local/arm/2.95.3/arm-linux/lib/libpng.so ./libpng.so
# mv libttf.so libttf.so_back
# ln –s /usr/local/arm/2.95.3/arm-linux/lib/libttf.so ./libttf.so
完成以上工作后就可以编译 libminigui 了
# cd libminigui-1.3.3
# make menuconfig //用图形界面来配置
如果在 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 的话,回去检查前面你有哪步做得不对,不然的话编译后的东西可能没法正常执行,切记切记!!!
# make
# make install
注意:我们这里 make install 其实是给交叉编译器安装 libminigui 的库,将来需要编译为 minigui 开发的程序,这个程序需要链接库,这些库因此也需要在交叉编译器中,不然交叉编译的时候编译不过去。
装好后,到/usr/local/arm/2.95.3/arm-linux的include lib目录下去看看,是不是多了相应的 libminigui.so libmgext.so libvcongui.so,在 include 目录下多了一个minigui目录,里面有相应的头文件
step 7: 安装 popt 库,这个库在编译 mde 程序时需要使用,不然编译没法通过.
# tar zxf popt-1.7.tar.gz
# cd popt-1.7
# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --host=arm-linux --enable-shared --enable-static
# make
# make install
step 8: 拷贝相关库文件到根文件系统中去
拷贝/usr/local/arm/2.95.3/arm-linux/lib下的所有.so系列文件到根文件系统的/usr/local/lib下(若根文件系统不支持/usr/local/lib库目录,也可以放在/usr/lib下)。
删除不用的库文件,只保留下列文件:
jpeg相关,libm相关,libmgext相关,libminigui相关,libpng相关,libpopt相关,libttf相关,libvcongui相关,libz相关。
step 9: 拷贝资源文件
把/usr/local/lib/minigui目录整个拷贝到根文件系统的/usr/local/lib目录下。
step 10: 拷贝配置文件
拷贝/usr/local/etc/MiniGUI.cfg 到根文件系统的/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=640x480-16bpp // 根据LCD大小设置,设置错误minigui就启动不了
ial_engine 一开始建议用 dummy ,先让 minigui 跑起来,以后再把 触摸屏 加进去,保证尽可能减少错误的发生
保存,退出。 板子上的系统也搭建完毕了,现在来让真正的图形界面跑起来!
注意:Build嵌入式Linux内核时,在 Console 中一定要先上FrameBuffer,从4位色一直到 16 位色的支持,全选上吧,同时把 VGA TextOut 选项勾掉,不要选它!
step 11: 编译安装mde-1.3.0
Windows 操作系统,左下方是一个 [开始] 按钮,然后是任务条,MiniGUI也提供了类似的界面,这就是一个叫mginit的程序,它启动后就跟widnows的界面很像了,它就在mde包里面。
# tar zxf mde-1.3.0.tar.gz
# cd mde-1.3.0
//先对 mginit 程序做一点修改
# cd mginit ; vi mginit.c
在 297 行处,把下面代码注释掉
/***************
AboutMiniGUI ();
AboutMDE ();
**************/
保存,退出即可。
因为我们没有触摸屏,现在,没法点它的确认按钮,所以把这些About信息去掉。
编译mde-1.3.0
# ./configure --prefix=/根文件系统/usr/local --host=arm-linux
# make
如果发现mginit目录下的程序没有被编译,那就说明你的libminigui配置不正确,记住,必须是配置为 Lite 模式,这个程序才会被编译
# make install
事实上证明,make install,根本没用,它什么都没做,所以还是需要手动来做。
# mkdir –p /根文件系统/usr/local/lib/shared/miniguiapps //据MiniGUI.cfg配置建立该目录
# cp –r –a mde-1.3.0/* /根文件系统/usr/local/lib/shared/miniguiapps
直接全部拷过去,然后到/根文件系统/usr/local/lib/shared/miniguiapps的各个程序目录下去,比如 mginit , bomb , painter之类的,把不用的 .c .h .o Makefile 之类的全删除掉,保留可执行文件和相应的res目录下的资源。
注意,保持目录的结构,mginit.rc 文件不要删了,这个对mginit 程序很重要
step 12: 修改配置文件
在/etc/profile中加上一句,
mknod /dev/ttyp5 c 3 5
mknod /dev/ptyp5 c 2 5
如果没有这两个设备节点,会出现错误提示框,Create Terminal Error,minicom提示如下:
VCOnGUI > can not get master pty!
VCOnGUI > system error -/dev/ptysf: No such file or directory
step 13: 制作cramfs文件系统
step 14:
注意重要的一点:在运行mginit前,先通过挂载ramfs文件系统等方式使/var目录可写,并建立/var/tmp目录,mginit程序会在/var/tmp建立两个文件。否则运行mginit失败,提示:
LoadSharedResource : No such file or directory
Error in step 7: Can not load shared resource!
InitGUI failure when using /usr/local/etc/MiniGUI.cfg as cfg file