二. 在終端中輸入"cd /usr/local/arm-elf",進(jìn)入minigui的四個(gè)壓縮文件所在目錄,然后分別執(zhí)行"tar zxvf xxxxx.tar.gz"將這四個(gè)壓縮包解壓縮.解壓后生成libminigui-1.3.3, mde-1.3.0, mg-samples-1.3.0和minigui-res-1.3.3四個(gè)文件夾.
三. 1) 進(jìn)入minigui-res-1.3.3文件夾內(nèi),修改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) 編寫(xiě)交叉編譯minigui函數(shù)庫(kù)的配置腳本domain.sh.
domain.sh的具體內(nèi)容為:
#!/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
編寫(xiě)好后拷貝到libminigui-1.3.3下.
2) cd libminigui-1.3.3
3) sh domain.sh
4) make
5) make install
6) ldconfig
上面六步即完成了用arm-elf-gcc對(duì)minigui的函數(shù)庫(kù)的交叉編譯.可以進(jìn)入/usr/local/arm-elf目錄中,你會(huì)看到新增加了etc和lib兩個(gè)文件夾,這兩個(gè)文件夾就是我們剛才用arm-elf-gcc交叉編譯minigui的函數(shù)庫(kù)所產(chǎn)生的結(jié)果,以后編譯在目標(biāo)板中運(yùn)行的應(yīng)用程序時(shí),就會(huì)對(duì)這兩個(gè)文件夾里的內(nèi)容進(jìn)行編譯,從而產(chǎn)生適合于在arm開(kāi)發(fā)板中運(yùn)行的應(yīng)用程序.
六. 編寫(xiě)測(cè)試minigui的應(yīng)用程序
1) 測(cè)試程序miniguidemo.c其實(shí)就是從mg-samples-1.3.0中拷貝過(guò)來(lái)的helloworld.c程序,不過(guò)要根據(jù)具體的LCD做一點(diǎn)修改,如我的LCD是640x480的256色STN彩色屏,所以要將
#ifdef _LITE_VERSION
SetDesktopRect(0, 0, 1024, 768);
#endif
修改為:
#ifdef _LITE_VERSION
SetDesktopRect(0, 0, 640, 480);
#endif
根據(jù)你的不同的LCD修改這個(gè)參數(shù),還可以修改這個(gè)窗體顯示的位置,根據(jù)你的喜好修改即可.最后將編寫(xiě)好的miniguidemo.c保存到/s3c44b0fu/uClinux-dist/user/guidemo中(注:guidemo是我在user目錄中新建的文件夾)
2) 在/s3c44b0fu/uClinux-dist/user/guidemo中編寫(xiě)Makefile文件,具體內(nèi)容為:
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
為了讓編譯器編譯上述添加的內(nèi)容,在user/Makefile中添加一句(一般按照字母排列):
dir _$(CONFIG_USER_GUIDEMO_MINIGUIDEMO) +=guidemo
4) 修改config/config.in
config/config.in文件中添加的內(nèi)容會(huì)在對(duì)用戶選項(xiàng)進(jìn)行配置時(shí)反映出來(lái)。在文件的最后,增加一條:
###################################################################
mainmenu_option next_comment
comment ‘My MINIGUI Application‘
bool ‘demo‘ CONFIG_USER_GUIDEMO_MINIGUIDEMO
endmenu
###################################################################
七. 現(xiàn)在可以編譯minigui的應(yīng)用程序了,這里羅嗦一點(diǎn),minigui應(yīng)用程序的編寫(xiě)有兩種方法,一種是將應(yīng)用程序添加到uClinux-dist目錄中,在uClinux-dist編譯和鏈接,直至生成最后的映象文件;第二種方法是先單獨(dú)編譯minigui的應(yīng)用程序,生成可執(zhí)行文件,然后放到uClinux-dist的romfs目錄中,執(zhí)行make image命令生成映象文件.很顯然這里采用的是第一種方法, 也正因?yàn)椴捎玫氖堑谝环N方法,所以第五步中交叉編譯得到的配置文件MiniGUI.cfg實(shí)際上在這里沒(méi)有用處;第二種方法我嘗試過(guò),似乎有點(diǎn)問(wèn)題,你可以嘗試嘗試.
編譯步驟:
make mrproper
make menuconfig(記住將FrameBuffer和你的應(yīng)用程序編譯到內(nèi)核去)
make dep
make lib_only
make user_only
make ronfs
make image
make
將編譯生成的映象文件下載到目標(biāo)板中,執(zhí)行程序,出現(xiàn)錯(cuò)誤
/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
這個(gè)錯(cuò)誤恰好和61IC工程師社區(qū)中的“風(fēng)雨”寫(xiě)的一篇文章完全一樣!所以我就按照他的步驟一步一步的修改,網(wǎng)址是 http://www.61ic.com/club/bbs/dispbbs.asp?boardID=26&ID=691&page=1
具體修改步驟是:
經(jīng)過(guò)跟蹤,進(jìn)入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"}; //這是我注釋掉的原來(lái)的, 你們看看程序結(jié)構(gòu),不管我怎么配置NEWGAL,
//這里都將不可避免的進(jìn)入QVFB
static char *SYSTEM_valueS[] = {"fbcon", "dummy", "none", "none"}; //我新加的。
#endif
static char *FBCON_KEYS[] = {"defaultmode"};
static char *FBCON_valueS[] = {"640x480-8bpp"}; //原來(lái)的是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 */
修改后編譯并運(yùn)行。仍然提示錯(cuò)誤。
/bin> helloworld
MAP_SHARED not supported (cannot write mappings to disk) //這條一看就知道在MMAP使用了不適合uClibc庫(kù)的參數(shù), 此項(xiàng)應(yīng)該設(shè)置為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
后來(lái)經(jīng)過(guò)跟蹤。在/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
編譯后運(yùn)行。發(fā)現(xiàn)出現(xiàn)代碼崩潰,
/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
經(jīng)過(guò)艱苦的跟蹤分析。在/home/libminigui-1.3.3/src/kernel/desktop.c中。
將if (!InitSystemRes ()) {
fprintf (stderr, "DESKTOP: Can not initialize system resource!\n");
return FALSE;
}注釋掉。
編譯運(yùn)行。 顯示OK,終于可以顯示出Helloworld的窗體,至此,全部移植完成,可以發(fā)揮自己的想象力,編寫(xiě)漂亮的GUI界面程序了!
聯(lián)系客服