交叉编译主要是用交叉编译器来编译mnigui的库和应用程序。
首先就是交叉编译minigui的库了,
自己参考网上的资料,写了minigui的配置文件:buildlib
#!/bin/sh
rm config.cache config.status -f

CC=arm-elf-gcc \
CFLAGS="-O2 -g -D__linux__ -D__uClinux__ \
-I/usr/local/arm_tools/arm-elf/inc \
-I/root/uclinux/dist/W90P710_PR/uClinux-dist/linux-2.4.x/include \
-I/root/uclinux/dist/W90P710_PR/uClinux-dist/lib/include -fno-builtin " \
LDFLAGS="-Wall -elf2flt -static -L/root/ucliux/dist/W90P710_PR/uClinux-dist/lib/lib \
-L/root/uclinux/dist/W90P710_PR/uClinux-dist/linux-2.4.x/lib -lc" \
./configure \
 --prefix=/usr/local/arm_tools \
 --build=i686-linux \
 --host=arm-elf-linux \
 --target=arm-elf-linux \
 --disable-shared \
 --with-osname=uclinux \
 --disable-thread \
 --enable-lite \
 --enable-standalone \
 --disable-micemoveable \
 --disable-cursor \
 --enable-newgal \
 --enable-nativegal \
 --enable-galfbcon \
 --disable-galqvfb \
 --disable-galecoslcd \
 --disable-fblin4l \
 --disable-fblin8 \
 --enable-fblin16 \
 --disable-fblin32 \
 --disable-textmode \
 --disable-rbfsupport
 --enable-dummyial \
 --disable-videoqvfb \
 --disable-videoecoslcd \
 --disable-nativeial \
 --disable-qvfbial \
 --disable-latin9support \
 --disable-big5support \
 --disable-savebitmap \
 --disable-jpgsupport \
 --disable-pngsupport \
 --disable-imegb2312 \
 --disable-aboutdlg \
 --disable-savescreen \
 --enable-mousecalibrate
#cp buildlib libminigui
#./buildlib
#make
#make install可以查看一下库文件,基本没什么问题,如果有问题,可能是路径的问题
 然后就是编译应用文件:buildsample
#!/bin/sh
 rm config.cache config.status -f

CC=arm-elf-gcc \
CFLAGS="-O2 -g -D__linux__ \
-I/usr/local/arm_tools/include \
-I/root/uclinux/dist/W90P710_PR/uClinux-dist/linux-2.4.x/include \
-I/root/uclinux/dist/W90P710_PR/uClinux-dist/lib/include \
-I/usr/local/arm_tools/arm-elf/inc \
-I/usr/local/arm_tools/include " \
LDFLAGS="-Wall -elf2flt -static -L/usr/local/arm_tools/arm-elf/crt0.o \
-L/root/uclinux/dist/W90P710_PR/uClinux-dist/lib \
-L/usr/local/arm_tools/lib/ -lc" \
./configure \
 --build=i686-linux \
 --host=arm-elf-linux \
 --target=arm-elf-linux \
 --enable-lite \
 --disable-thread \
 --enable-standalone \
 --disable-micemoveable \
 --disable-cursor \
 --enable-newgal \
 --enable-nativegal \
 --disable-galqvfb \
 --disable-galecoslcd \
 --enable-galfbcon \
 --disable-fblin8 \
 --enable-fblin16 \
 --disable-fblin32 \
 --disable-textmode \
 --disable-rbfsupport \
 --disable-rbfgb12 \
 --enable-dummyial \
 --enable-nativeial \
 --disable-qvfbial \
 --disable-videoqvfb \
 --disable-videoecoslcd \
 --disable-latin9support \
 --disable-big5support \
 --disable-savebitmap \
 --disable-jpgsupport \
 --disable-pngsupport \
 --disable-imegb2312 \
 --disable-aboutdlg \
 --disable-savescreen \
 --enable-mousecalibrate

#.buildsample
#make
这里会出现很多错误,在配置的时候必须选择lite模式,否则helloworld不可能通过的
这样的话,我们就把配置文件MiniGUI.cfg和应用文件考到romdisk下的etc 和bin下。
准备的差不多了,我们这里还要修改一下配置文件:
# vi /usr/local/etc/MiniGUI.cfg
[system]
# GAL engine
#gal_engine=fbcon
gal_engine=fbcon //这里修改

# IAL engine
#ial_engine=console
ial_engine=fbcon //这里修改

mdev=/dev/mouse
mtype=IMPS2

[fbcon]
defaultmode=1024x768-16bpp

[qvfb]
defaultmode=640x480-16bpp //这里修改
display=0

把文件系统down到班子上,
错误很多:
MAP_SHARED not supported (cannot write mappings to disk)
 NEWGAL: Does not find matched engine: fbcon.
 GDI: Can not get graphics engine information!
 InitGUI failure when using incore resource.
把这个问题摆渡了一下,按照网上的提示,就是fbvideo.c的问题,按照网上提示修改如下:
在/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
然后运行,同样的效果,无效,真是迷茫阿,还是同样的错误,那就是刚才的改变没有执行了。我在mmap开始和结束处添加了打印信息,发现根本没有输出,最后索性直接MAP_SHARED直接改为了0。改动如下:
mapped_mem = mmap(NULL, mapped_memlen,PROT_READ|PROT_WRITE,
 0, console_fd, 0);

mapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,
 0, console_fd, mapped_memlen);
重新编译,然后运行:./helloworld
出现新的错误如下:
 Cannot find /dev/tty0
 NEWGAL: Does not find matched engine: fbcon.
 GDI: Can not get graphics engine information!
 InitGUI failure when using incore resource.

即找不到/dev/tty0,当时很是郁闷,既然已经出现了小企鹅,framebuffer肯定没有问题了。估计这个还是fbvideo的问题,打开dev,发现没有tty0,我首先新建一个设备,tty0,运行后发现不起作用。晕倒,只能修改fbvideo了,让默认终端就是tty,修改如下:
if (geteuid() == 0)
 tty_dev = "/dev/tty0";
 else /* not a super user, so try to open the control terminal */
 tty_dev = "/dev/tty";
直接修改为:tty_dev = "/dev/tty";
有两处,都要修改,重新编译,NEW_ENGINE终于没有这个错误了,但是又出现新的错误,
找不到video,这里注意一下,--disable-textmode 这个很重要,否则的话是test模式,而非video模式了。添加了这一句以后,出现的错误,都是关于GDI的,按照前面的经验,我查看了gdi/gdi.C,现是资源文件的问题,这下心理踏实了,只要修改cfg就可以了,我把不需要的资源都注释掉了,终于出现了可爱的:helloworld

我手头项目的MiniGui编译移植

MiniGui的交叉编译

1.   编译命令

编译前需要准备内核,把内核的源代码放到/opt/uClinux/uClinux-dist目录下。

进入libminigui目录

[…]#CC=arm-elf-gcc AR=arm-elf-ar RANLIB=arm-elf-ranlib LDFLAGS="-Wl,-elf2flt" ./configure \

--prefix="/opt/usr/local" \

--host=arm-elf-linux \

--build=i386-linux \

--disable-shared \

--enable-lite=yes \

--enable-video-fbcon=yes \

--enable-nativegal=yes \

--enable-nativeial=yes \

--enable-newgal=no \

--enable-timerunitms=no \

--enable-nativegalqvfb=no \

--enable-fblin8=no \

--enable-fblin16=no \

--enable-fblin24=no \

--enable-fblin32=yes \

--enable-dummyial=yes \

--enable-qvfbial=no \

--enable-nativeps2=no \

--enable-nativeimps2=no \

--enable-nativems=no \

--enable-nativems3=no \

--enable-nativegpm=no \

--enable-textmode=no \

--enable-rbfsupport=yes \

--enable-rbfgb12=no \

--enable-vbfsupport=no \

--enable-fontsserif=no \

--enable-fontcourier=no \

--enable-fontsymbol=no \

--enable-fontvgas=no \

--enable-qpfsupport=no \

--enable-ttfsupport=no \

--enable-type1support=no \

--disable-ttfsupport \

--enable-latin2support=no \

--enable-latin3support=no \

--enable-latin4support=no \

--enable-latin9support=yes \

--enable-gbsupport=yes \

--enable-gbksupport=no \

--enable-big5support=no \

--enable-unicodesupport=no \

--enable-savebitmap=yes \

--enable-gifsupport=yes \

--enable-jpgsupport=no \

--enable-pngsupport=no \

--enable-imegb2312=no \

--enable-imegb2312py=no \

--enable-aboutdlg=yes \

--enable-savescreen=no \

--enable-tinyscreen=no \

--enable-extfullgif=no \

--enable-video-dummy=no \

--enable-extskin=no

[…]#make

[…]#make install

最后libminigui被安装在/opt/usr/local/目录下

上面配置的yesno根据实际需要进行最优设置。

2.   资源安装

进入minigui-res目录

编辑config.linux文件大概在11行,把 TOPDIR=改为TOPDIR=/opt

[…]#make install

最后资源也被安装在/opt/usr/local/目录中

3.   输入引擎

引擎的入口代码:

src/ial.c 中有数组static INPUT inputs [],初始存放了所以输入引擎名称及其初始化函数和退出函数的入口,两个函数分别是InitNativeInputTermNativeInput

其他函数介绍:(主要介绍键盘相关的函数)

wait_event Minigui系统采用定时查询来获得输入设备的输入情况,wait_event就是一个定时运行的函数,返回事件类型,主要是检查输入句柄是否有新的数据输入。

keyboard_update 事件判断完毕后,若是有键盘输入,则调用该函数,主要功能就是判断那个按键有输入。数组atic unsigned char state [NR_KEYS] 存储了128个字符的状态,输入哪个字符,这个字符的状态就被置1

keyboard_getstate 直接返回状态数组

keyboard_suspend

keyboard_resume

移植内容,主要是按键码查表转化

具体移植代码:在Minigui中采用一个比较通用的输入引擎,在内核的键盘驱动中去实现按键的输出来适应Minigui的通用驱动。

4.   输出引擎(New

具体看framebuffer驱动是如何实现的,FrameBuffer中的数据格式如何。

真彩32bit

Minigui的象素输出格式0x00rrggbb

基于视频芯片的输入要求格式:0xaarrggbb

问题:对于Minigui中的格式高一字节永远是0x00,对该字节不进行处理的。

            但视频芯片的高一字节是定义透明度的,若为0x00则全透明,因此没有进行修改的Minigui程序是没有任何屏幕显示的。

解决:需要在Minigui的最终输出部分把高位修改为0xff

具体代码:待续

二、MiniGui的文件部署

1.   开发环境文件的部署

有上面的安装命令可以看出系统所有的文件都在/opt/usr/local

/opt/usr/local/

            >etc

                     >(MiniGUI.cfg)

            >include

                     >minigui

                               >(*.h)

            >lib

                     >(*.a)

                     >minigui

                              >res

                                        >bmp

                                                 >(系统位图文件)

                                        >cursor

                                                 >(系统光标文件)

                                        >font

                                                 >(系统字体文件)

                                        >icon

                                                 >(系统图标文件)

                                        >imetab

                                                 >(输入法文件)

  

2.   Romfs中文件的部署

/opt/usr/local/

            >bin

                     >(应用程序)

>lib

                     >minigui

                               >res

                                        >bmp

                                                 >(系统位图文件)

                                        >cursor

                                                 >(系统光标文件)

                                        >font

                                                 >(系统字体文件)

                                        >icon

                                                 >(系统图标文件)

                                        >imetab

                                                 >(输入法文件)

 

3.    

三、 MiniGui的配置文件(/usr/local/etc/MiniGUI.cfg)

1.   输入输出引擎

IAL= console

uClinux的输入驱动若是基于tty的就可以这么配置

该引擎的源代码主要在目录\src\ial\native中的native.c native.h文件中。

GAL = fbcon

基于Framebuffer的输出引擎可以这样配置

2.   字库配置

Mingui共支持五种字体分别是:等宽字体( rawbitmap)、变宽字体(varbitmap)qpfttftype1。因此在配置文件中有五个配置段分别来配置五种字体。

3.    

四、Minigui的裁剪

1.   在编译的时候适当的关闭一些不需要的功能

2.   资源的裁剪

主要是系统无用字库、无用图标、图片、光标的删除。

3.    

五、应用程序的编译(New

1.        mde例子程序的编译交叉编译

make CC=arm-elf-gcc LDFLAGS="-elf2flt -L/opt/usr/local/lib" \

CFLAGS="-I/opt/usr/local/include "

2.         

3.        应用程序运行前处理

设置内容:主要就是堆栈大小的设置。

设置原因:若堆栈太小,程序的函数调用又非常复杂,则容易出现堆栈溢出,从而导致运行错误。

设置方法:使用arm-elf-flthdr –s 16384 pro_name

                     16384就是堆栈的大小即16×1024 16K

                     使用arm-elf-flthdr –p pro_name 可以查看有关信息

4.         

六、