ARM平臺的Microwindows圖形編程
引言
由于受系統(tǒng)內(nèi)存大小的限制,在運行Linux的ARM平臺上直接運行桌面的X Windows系統(tǒng)不太現(xiàn)實。Microwindows是一個開放源碼的嵌入式GUI軟件,目的是把圖形視窗環(huán)境引入到運行Linux的小型設備和平臺上。作為X Windows系統(tǒng)的替代品,Microwindows可以用更少的RAM和文件存儲空間(100K~600KB)提供相似的功能,允許設計者輕松加入各種顯示設備、鼠標、觸摸屏和鍵盤等。同時,Microwindows的可移植性非常好,現(xiàn)已成功移植到MIPS、ARM等多種平臺上。
Microwindows在ARM平臺的移植
盡管Linux 的arch目錄下有對ARM處理器支持的代碼,但由于Linux是在X86平臺上實現(xiàn)的,很多方面都沒有考慮到ARM平臺的特殊性。將Microwindows移植到運行ARM-Linux操作系統(tǒng)的ARM硬件平臺上,需要如下幾個步驟。
1)替換fork( )系統(tǒng)調(diào)用。由于ARM-Linux不同于標準Linux,所以以標準Linux內(nèi)核為支持目標開發(fā)的Microwindows源代碼也必須作出相應的修改才能適應ARM-Linux系統(tǒng)。最主要的問題是ARM-Linux不提供fork()系統(tǒng)調(diào)用,而以vfork()調(diào)用取代。所以在ARM-Linux代碼中fork()的使用需要進行修改。可利用宏定義簡便地將所有的fork()調(diào)用用vfork()來替代。修改Microwindows的編譯設置文件,并采用ARM交叉編譯器arm-elf-gcc。
2) 確定傳遞給顯示屏驅(qū)動程序的參數(shù)。具體地說,就是需要在打開FrameBuffer設備 /dev/fb0時將顯示屏的基本參數(shù)傳遞給設備驅(qū)動程序。在scr_fb.c中的fb_open(PSD psd)函數(shù)中修改如下:
psd->xres=psd->xvirtres=320;
psd->yres=psd->yvirtres=240;
psd->linelen=40;
psd->size=320×320;
3) 編譯Microwindows。在Red Hat 9.0下建立ARM交叉編譯環(huán)境,修改Makefile文件,將$(CC)編譯參數(shù)指定為交叉編譯環(huán)境安裝目錄下的arm-elf-gcc,重新編譯代碼,就可以生成能夠在ARM平臺下運行的程序。ARM系列處理器的指令系統(tǒng)相互兼容,經(jīng)arm-elf-gcc編譯過的代碼可在基于ARM核的各種處理器上運行。
Microwindows中文化
為了使Microwindows實現(xiàn)對簡體漢字的支持,需要對引擎層的devfont.c做相應修改。在devfont.c文件中定義了Microwindows關于字體操作的核心數(shù)據(jù)結構和操作函數(shù)。由于Microwindows采用面向?qū)ο蟮脑O計方法,因而只要重新定義一系列對簡體中文的數(shù)據(jù)結構和操作函數(shù),并向系統(tǒng)注冊,就可以完成系統(tǒng)的中文化。需要重新定義的數(shù)據(jù)結構和函數(shù)是:
static MWFONTPROCS hzk_procs={
MWTF_ASCII, /*routines expect ASCII */
Hzk_getfontinfo,
Hzk_gettextsize,
NULL,
Hzk_destroyfont,
Hzk_drawtext,
Null,
Null,
};
Microwindows圖形編程機制
Microwindows從原理上采用分層設計的方法,每層次完成特定的功能,并且能夠在不影響其它層次的基礎上針對不同的應用進行改編或者重寫。在最底層,顯示屏、鼠標、觸摸屏等的驅(qū)動程序提供了與交互相關的硬件設備的訪問;中間層是一個精簡的圖形引擎,提供了劃線、區(qū)域填充、多邊形等多種基本的圖形功能;最上層為圖形應用程序提供了豐富的編程接口函數(shù)(API),通過這些接口函數(shù)可以定制桌面和窗口的外觀。目前Microwindows提供兩套API接口,以便能夠更好地適應不同平臺應用程序的移植,即 與Win32/Win CE基本兼容的API以及采用X體系的Nano-X API。
設備驅(qū)動層
設備驅(qū)動程序的接口定義在device.h文件中。中間層提供的與設備無關的圖形引擎例程就是通過調(diào)用設備驅(qū)動程序跟硬件設備交互。這就保證了當平臺硬件設備發(fā)生變化的時候,只需要改寫相應的驅(qū)動程序,而無需修改上層代碼。Microwindows提供基于Linux2.4.X內(nèi)核的FrameBuffer設備驅(qū)動程序。FrameBuffer在Linux系統(tǒng)中通過/dev/fb0設備文件進行工作,通過mmap()系統(tǒng)調(diào)用將顯示緩存映射至系統(tǒng)內(nèi)存中。
評論