Minigui在ARM开发板上的移植过程一、题外话:为了感谢国人在开源世界颇具影响力的为数不多Minigui的开发者们的辛勤劳动(希望为数不多这个这个词若干年后我们不再提^_^),也为答谢飞漫公司和魏永明先生对开源项目在中国的运作模式的有意义的探索, 也为自己在感慨、敬佩之余尽一点微波之力,就将借工作之便并参考众多网友的体会,将一点移植心得整理出来,希望公司不介意。
考虑到每个人接触linux的起点不同,所以下文档按步就班说得比较详细(说得不好听点是罗嗦,^_^,如果您熟悉相关部分,请略过,希望不要当面说俺写的罗嗦,呵).二、特别声明:本文的移植过程主要以minigui1.2.3为基础。
本文中提到的注意可能是您容易忽视,而又要引起您注意的地方或者由于理解上的差异而容易造成交叉编译失败的地方。
本文中需要修改的地方以红色字体标注,而添加或者修改的地方以蓝色标注,需要您执行命令的地方以粉红标注(html格式颜色不显,我又懒蛋得写HTML标签,建议您下载附件中的PDF文档)。
另外,本文中提到的脚本编写和修改都请在linux环境下手工编写,不要在windows下或者直接从下面拷贝,免得出现错误。
三、硬件平台:CSB226-PXA250,Cogent ep7312,此文档以CSB226-PXA250参考开发板的移植过程为主来说明.LCD屏幕特性:640x480,支持8bpp.支持标准PC键盘、鼠标四、软件环境:主机:Redhat7.2目标板:采用umon作为boot loader, 开发环境和运行的内核是Montavista Profession Edition 2.1.目标板(以下称为target)采用NFS的方式将根文件系统挂接到开发主机(以下称为host)上,其路径为:/opt/hardhat/devkit/arm/xscale_le/target,目标板上以控制台下的framebuffer 方式运行。
host和target都以root身份登陆。
将minigui库文件原代码libminigui1.2.3.tar.gz,资源文件minigui-fonts.1.2.0.tar.gz, minigui-imetabs-1.1.0.tar.gz, minigui-res-1.2.0.tar.gz放在主机任意目录下,而考虑到演示程序编译后没有相应的安装脚本,将源代码包mde-1.2.3..tar.gz放在了/opt/hardhat/devkit/arm/xscale_le/target/root下面。
首先用类似tar zxf liminigui1.2.3.tar.gz命令将所有的压缩包解开。
五、libminigui1.2.3及资源文件的移植:1、libminigui1.2.3文件的移植:它移植主要定义交叉编译器已经编译后的目标库和头文件的存放路径,参考给出的交叉编译例子编写了交叉编译脚本build-pxa250#!/bin/shrm -f config.cache config.statusCC=xscale_le-gcc ./configure --prefix=/opt/hardhat/devkit/arm/xscale_le/target/usr/local \ --host=i386-linux \--target=arm-linux \--enable-tinyscreen注意:由于minigui现在的版本编译后的库缺省放在了/usr/local/lib下面,故在上面的目前路径中添加了usr/local.根据硬件特性修改libminigui1.2.3/etc/Minigui-3d.cfg和Minigui-flat.cfg文件中的[fbcon]defaultmode=1024x768-16bpp为相应的defaultmode=640x480-8bpp如果没有键盘鼠标,没细看系统能否运行,但资源文件一定会要做相应的修改。
执行以下shell命令:# chmod 777 ./build_pxa250#make distclean#./build_pxa250#make#make install如果编译通过,此时在目标路径/opt/hardhat/devkit/arm/xscale_le/target/usr/local/lib下就会有交叉编译出来的动态库和静态库文件.2、资源文件的移植:上文提及的三个资源文件都只是做一下相同的安装目标路径的改动,修改configure.linux,将TOPDIR= 一行改为:TOPDIR=/opt/hardhat/devkit/arm/xscale_le/target在各自的目录下执行命令,将相应的资源文件安装到目标系统中:# make install六、演示程序mde-1.2.3..tar.gz的移植注意,演示程序也是在host上交叉编译。
转到mde-1.2.3目录下,首先也是编写交叉编译的shell脚本:#!/bin/shCC=xscale_le-gcc ./configure --prefix=/opt/hardhat/devkit/arm/xscale_le/target/usr/local \--host=i386-linux \--target=arm-linux执行以下shell命令:# chmod 777 ./build_pxa250修改configure.in中以下地方:AC_CHECK_HEADERS(minigui/minigui.h, have_libminigui=yes, foo=bar)dnl================================================================= dnl Write Outputif test "$ac_cv_prog_gcc" = "yes"; thenCFLAGS="$CFLAGS -Wall -Wstrict-prototypes -pipe"改为:AC_CHECK_HEADERS($prefix/include/minigui/minigui.h, have_libminigui=yes, foo=bar)dnl====================================================================== ==dnl Write Outputif test x"$ac_cv_prog_gcc" = x"yes"; thenCFLAGS="$CFLAGS -Wall -Wstrict-prototypes -pipe"LDFLAGS="$LDFLAGS -Wl,--rpath -WL,$prefix/lib"fiif test "x$have_libminigui" = "xyes"; thenCFLAGS="$CFLAGS -I$prefix/include"fi如果您移植的是1.2.6以下版本(1.2.6我还没做相应测试,不过在ChangeLog中提及fix了这个BUG),由于PNG图片格式在非X86体系中跑得异常(论坛中孔明有相应得回帖),还需要修改mginit目录下的nr=10一行,改为:nr=8执行以下shell命令:#make distclean# ./build_pxa250# make至此,交叉编译完成,您可以启动target,执行以下命令(第一条命令为第一次在target 运行minigui时需要, 第二条命令为多次执行演示程序用,相关原理请看init.c或者论坛的相关讨论):# su –c ldconfig# rm –f /var/tmp/mginit# /root/mde-1.2.3/mginit/mginit但系统不一定能在目标板上跑起来,另外,下面是我遇到的一下问题以及一些改动意见,仅供参考。
如果在1.2.3中,中文输入法存在读资源文件sysphrase.tab失败的问题,跟踪发现出现在libminigui1.2.3/src/ime/pinyin.c的第576行附近的这部分代码:for(i = 1; i < MAX_PY_NUM; i++) {inmd->sysph[i] = sysph = (SysPhrase*)p;#if MGUI_BYTEORDER == MGUI_BIG_ENDIANsysph->count = ArchSwap16 (sysph->count);#endifp = (char*)sysph->phrase;for(j = 0; j < sysph->count; j++) {kph = (Phrase*)p;p += SizeOfPhrase (kph->len,kph->count); // skip the string}}本想好好看一下,不过在minigui的后期版本中对中文输入法做了比较大的改动,kongming最近又提供了最新版本minigui1.2.6-2的免费下载(如我这样的有福了,又要感谢”党的富民政策好”了,呵呵),我想在移植了minigui1.2.6-2后如果还有问题,再找原因,呵,懒劲使然.另外,vcongui也容易出现异常,我以1.2.3来说, 对vcongui有以下一点看法.1、vcongui使用了/dev下面的两个设备文件(具体我不记得了:(,不过你可以在它出现提示信息时参考PC机上的相应设备文件用mknod名字在目标系统中创建),想把它加到脚本中来创建。
2、在vcongui中以及libmingui中,定义了USE_ASM宏,并有相关的X86汇编代码,我还没细看交叉编译时候是否会编译进出而导致系统异常。
3、vcongui在defaultmap.c中定义了一些功能键来激活菜单,但对我这样的钟情于MC编辑器的man就不是很方便,比喻F10,是否在新版本中去掉它?并修改vcongui的大小,使得缺省的时候占满全屏,便于在minigui编辑,毕竟控制台下就有中文嘛,便于输入汉字^_^。
再说点题外话,这种方法我在EP7312上也进行了测试,改动非常之少,其他平台限于条件和时间所限,没进行测试。
如果您打算不用NFS,要将minigui最终定制在目标系统的FLASH中,您可以将target的静态库、甚至将/usr/local的头文件去掉,将资源文件缩减,论坛里有这方面的讨论,欢迎参考。