Minigui V1.3.3在uClinux中的移植经验总结 [转]经过一个星期的努力,终于将Minigui移植到我的ARM7开发板上了,在这个过程中我遇到了很多困难和问题网络,通过以前很多前辈在网络上分享的经验,终于取得成功,也让我更加体会到只有大家都互相帮助,才能使大家都受益。
所以基于这一点,我将我的移植过程分享给大家,并且写得尽量详细点,希望给大家后来者少走一些弯路。
有不对的地方,欢迎大家板砖!首先说明一下我的开发平台,我用的是Samsung S3C44B0X芯片的开发板,已经移植好的uClinux操作系FrameBuffer驱动。
我的uClinux安装在"/s3c44b0fu/uClinux-dist"目录下,交叉编译工具安装在"/usr/local/a 下。
具体步骤:一. 从网站下载 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.g 件,并将这四个文件保存到交叉编译环境的目录下,因为我的arm-elf-gcc交叉编译工具安装在"/usr/local/arm-以将minigui的四个压缩包同样拷贝到"/usr/local/arm-elf"目录下.二. 在终端中输入"cd /usr/local/arm-elf",进入minigui的四个压缩文件所在目录,然后分别执行"tar zxvf xxxx 四个压缩包解压缩.解压后生成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.33) make install四. cd mde-1.3.0./configuremakecd mg-samples-1.3.0./configuremake五. 1) 编写交叉编译minigui函数库的配置脚本domain.sh.domain.sh的具体内容为:#!/bin/shrm config.cache config.status -fCC=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/s3c44b 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.33) sh domain.sh4) make5) make install6) ldconfig上面六步即完成了用arm-elf-gcc对minigui的函数库的交叉编译.可以进入/usr/local/arm-elf目录中,你会看和lib两个文件夹,这两个文件夹就是我们刚才用arm-elf-gcc交叉编译minigui的函数库所产生的结果,以后编译运行的应用程序时,就会对这两个文件夹里的内容进行编译,从而产生适合于在arm开发板中运行的应用程序六. 编写测试minigui的应用程序1) 测试程序miniguidemo.c其实就是从mg-samples-1.3.0中拷贝过来的helloworld.c程序,不过要根据具体的改,如我的LCD是640x480的256色STN彩色屏,所以要将#ifdef _LITE_VERSIONSetDesktopRect(0, 0, 1024, 768);#endif修改为:#ifdef _LITE_VERSIONSetDesktopRect(0, 0, 640, 480);#endif根据你的不同的LCD修改这个参数,还可以修改这个窗体显示的位置,根据你的喜好修改即可.最后将编写好的miniguidemo.c保存到/s3c44b0fu/uClinux-dist/user/guidemo中(注:guidemo是我在user目录中新建的文件夹2) 在/s3c44b0fu/uClinux-dist/user/guidemo中编写Makefile文件,具体内容为:EXEC = miniguidemoOBJS = miniguidemo.oLDFLAGS=-L/s3c44b0fu/uClinux-dist/uClibc/liball: $(EXEC)$(EXEC): $(OBJS)$(CC) $(LDFLAGS) -o $@ $(OBJS) -lminigui -lmgext $(LIBPTHREAD) $(LIBM) $(LDLIBS) -elf2fltromfs:$(ROMFSINST) /bin/$(EXEC)clean:-rm -f $(EXEC) *.elf *.gdb *.o3) 修改user/Makefile为了让编译器编译上述添加的内容,在user/Makefile中添加一句(一般按照字母排列):dir _$(CONFIG_USER_GUIDEMO_MINIGUIDEMO) +=guidemo4) 修改config/config.inconfig/config.in文件中添加的内容会在对用户选项进行配置时反映出来。
在文件的最后,增加一条:###################################################################mainmenu_option next_commentcomment 'My MINIGUI Application'bool 'demo' CONFIG_USER_GUIDEMO_MINIGUIDEMOendmenu###################################################################七. 现在可以编译minigui的应用程序了,这里罗嗦一点,minigui应用程序的编写有两种方法,一种是将应用程序uClinux-dist目录中,在uClinux-dist编译和链接,直至生成最后的映象文件;第二种方法是先单独编译minigui的成可执行文件,然后放到uClinux-dist的romfs目录中,执行make image命令生成映象文件.很显然这里采用的也正因为采用的是第一种方法,所以第五步中交叉编译得到的配置文件MiniGUI.cfg实际上在这里没有用处我尝试过,似乎有点问题,你可以尝试尝试.编译步骤:make mrpropermake menuconfig(记住将FrameBuffer和你的应用程序编译到内核去)make depmake lib_onlymake user_onlymake ronfsmake imagemake将编译生成的映象文件下载到目标板中,执行程序,出现错误/bin> helloworldNo 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工程师社区中的“风雨”写的一篇文章完全一样!所以我就按照他的步骤一步一步是 /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_RESstatic char *SYSTEM_KEYS[] = {"gal_engine", "ial_engine", "mdev", "mtype"};#ifdef __ECOSstatic char *SYSTEM_valueS[] = {"ecoslcd", "ipaq", "/dev/ts", "none"};#else//static char *SYSTEM_valueS[] = {"qvfb", "qvfb", "/dev/ts", "none"}; //这是我注释掉的原来的, 你们看看管我怎么配置NEWGAL,//这里都将不可避免的进入QVFBstatic char *SYSTEM_valueS[] = {"fbcon", "dummy", "none", "none"}; //我新加的。