Microwindows是由Gregory Haerr組織的一個(gè)開(kāi)放源碼項目,是嵌入式系統中廣泛應用的一種圖形用戶(hù)接口(GUI),該項目的目標是在嵌入式Linux平臺上提供與普通個(gè)人電腦類(lèi)似的圖形用戶(hù)界面。作為X_Windows的替代品,Microwindows提供了和X_Windows類(lèi)似的功能,但是卻占用很少的內存,根據用戶(hù)的配置,Microwindows占用的內存資源只有100KB"600KB左右。Microwindows的核心是基于顯示設備接口的,可移植性較強,其本身提供了多種嵌入式系統常見(jiàn)的顯示設備驅動(dòng)程序。目前新版本的Microwindows已經(jīng)內建了FrameBuffer,因此可以不局限于Linux的開(kāi)發(fā)平臺,在eCos、FreeBSD、MINIX等操作系統上都可以運行。在基于Linux的開(kāi)發(fā)平臺上,可以使用FrameBuffer機制直接讀寫(xiě)顯存,也可以調用SVGALib庫。在基于Linux的FrameBuffer機制中,Microwindows支持每像素1位、2位、4位、8位、16位、32位的色彩/灰度,并通過(guò)調色板技術(shù)將RGB格式的顏色空間轉換為目標機上的顏色進(jìn)行顯示。Microwindows系統可以圖形方式支持在主機平臺上的仿真目標平臺開(kāi)發(fā),因此Microwindows應用程序就可以直接在臺式機上進(jìn)行編寫(xiě)和開(kāi)發(fā),通過(guò)交叉編譯就可在目標平臺上運行。 本文論述了在基于S3C44B0X的嵌入式開(kāi)發(fā)平臺上,移植了?CLinux操作系統,并通過(guò)修改內核、編寫(xiě)FrameBuffer幀緩沖設備驅動(dòng)程序,使?CLinux內核能夠支持幀緩沖設備,在此基礎上移植Microwindows的方法與過(guò)程。 MicroWindows的體系結構 針對嵌入式系統的特性,Microwindows采用了層次化結構,每一層完成特定的功能,如圖1所示。 圖1 Microwindows體系結構 設備驅動(dòng)層 設備驅動(dòng)程序的接口函數定義在device.h中,其中包括了屏幕驅動(dòng)程序、鼠標驅動(dòng)程序和鍵盤(pán)驅動(dòng)程序。圖形引擎層提供的與設備無(wú)關(guān)的圖形引擎例程通過(guò)調用設備驅動(dòng)程序跟硬件設備交互,這就保證了當平臺硬件設備發(fā)生變化的時(shí)候,只需要改寫(xiě)相應的驅動(dòng)程序即可,無(wú)需修改上層代碼。Microwindows 提供基于Linux2.2.X內核的幀緩沖設備驅動(dòng)程序,通過(guò)/dev/fb0 設備文件,利用mmap()系統調用將顯示緩存映射至系統內存中。 圖形引擎層 Microwindows系統中的核心函數是在圖形引擎層通過(guò)調用下層硬件設備驅動(dòng)程序來(lái)實(shí)現的。這些函數對屏幕、鼠標、鍵盤(pán)等驅動(dòng)程序進(jìn)行了封裝,為API提供了服務(wù),用戶(hù)調用最上層提供的編程接口,而不需要直接調用引擎層的例程。在Microwindows的源代碼中,核心的例程包括: devdraw.c: 主要的圖形繪制操作,描畫(huà)和填充、圓、多邊形、文本與位圖的顯示,顏色轉換相關(guān)的代碼; devclip.c: 剪裁操作; devmouse.c:處理鼠標操作的信息; devkbd.c: 處理鍵盤(pán)操作的信息; devpalX.c: 與調色板相關(guān)的代碼; devimage.c: 實(shí)現對GIF、BMP、JPEG、PPM 等格式圖形的顯示操作; fongt_xxxx.c: 對不同字體的顯示操作 API Microwindows提供了兩種類(lèi)型的API,以便更好地適應在不同平臺上應用程序的移植。一種是與Win32/Win CE 基本兼容的API,支持大多數的圖形操作,它的API是基于消息機制的。另一種是采用X體系的Nano-X API,它是Client/Server模式的,在客戶(hù)端的API函數以nx……( )命名,在服務(wù)端的API函數以Gr……( )命名。 具體實(shí)現 下面具體論述Microwindows在PC機和S3C44B0X開(kāi)發(fā)板上的實(shí)現。首先,需要下載相應的安裝包,本文下載的是0.90版本的Microwindows和相應的字庫文件。同時(shí),由于Microwindows需要使用FreeType庫函數產(chǎn)生TrueType字體,因此還需要下載安裝FreeType,這里使用的的是1.3.1版本的FreeType。 PC機上實(shí)現 解壓縮相關(guān)的安裝包,安裝FreeType之后,就可以開(kāi)始運行Microwindows。在解壓縮目錄中輸入命令:./xconfigure,就會(huì )出現相應的配置菜單,由于是在PC機上運行,應根據具體的參數配置Microwindows。具體的參數配置如下: (1) 點(diǎn)擊Compiling Option ,進(jìn)入編譯選項。在隨后彈出的子窗口中選中Optimize,點(diǎn)擊OK 返回即可。 (2) 點(diǎn)擊Platform,進(jìn)入開(kāi)發(fā)平臺選項。由于是在PC機上運行,選擇“Linux(Native)”選項。在其后的“Option”選項中,按如下配置:“Screen Driver”選項中,由于是在PC機上運行,選擇“X11”;在“Mouse Driver”鼠標選項中,選擇“GPM mouse”;在“Keyboard Driver”鍵盤(pán)選項中,選擇“TTY”。 (3) 點(diǎn)擊“Libraries to Compile”,進(jìn)入鏈接庫配置選項。其中有NanoX庫和Microwindows 庫,在“NanoX”的“Option”選項中,選擇“Link app into Server”和“compile demos”選項。 關(guān)于其他的參數配置,包括字庫、文件格式支持等應根據具體的情況進(jìn)行配置。至此,Microwindows在PC機上運行的配置工作已經(jīng)完成,存盤(pán)退出,屏幕顯示配置成功。輸入命令:make,完成編譯工作。當編譯完成后,在SRC的bin目錄下有很多演示程序,一些是基于Nano—X API 的,一些是基于win32 API 的,運行即可。 以上簡(jiǎn)單論述了Microwindows在PC機上運行的方法與過(guò)程,PC機上的運行過(guò)程相對簡(jiǎn)單,只需要按照實(shí)際情況進(jìn)行配置,編譯即可。 嵌入式開(kāi)發(fā)板上的實(shí)現 下面論述Microwindows在以S3C44B0X為主控芯片的嵌入式開(kāi)發(fā)板中運行的步驟與方法。首先需要建立交叉編譯開(kāi)發(fā)環(huán)境,這里建立的編譯器是arm-elf-gcc,匯編器是arm-elf-as,鏈接器為arm-elf-ld和庫管理器arm-elf-ar。接著(zhù),移植相應的?CLinux,關(guān)于此類(lèi)的文章已經(jīng)較多,在此就不贅述了。最后,在CLinux內核中將S3C44B0X的幀緩沖設備驅動(dòng)打開(kāi),并需要建立/dev/fb0設備節點(diǎn),關(guān)于S3C44B0X的幀緩沖設備驅動(dòng)程序的開(kāi)發(fā)已另文發(fā)表。至此,已經(jīng)做好Microwindows移植的基礎工作,下面具體論述實(shí)現的步驟與方法。 在Microwindows的配置過(guò)程中,可以利用./xconfigure命令進(jìn)入菜單配置界面,當然也可以通過(guò)直接修改配置文件“src/config”對Microwindows進(jìn)行配置。這里采用的是后者,其中幾個(gè)比較關(guān)鍵的選項包括體系結構、交叉編譯器、每像素位數、幀緩沖等,具體的配置參數如下: (1) 關(guān)于體系結構和編譯器選項 (2) 每像素位數SCREEN_PIXTYPE= MWPF_TRUECOLOR332對于S3C44B0X,在彩色模式下,1個(gè)字節8位(3位紅色、3位綠色、2位藍色)的圖像數據對應一個(gè)像素點(diǎn),即像素點(diǎn)字節在存儲器中保存的格式為332位。因此在設定Microwindows的每像素位數時(shí)將其格式設置為332,根據頭文件的定義設定為MWPF_TRUE COLOR332。 (3) 幀緩沖設備由于是在嵌入式開(kāi)發(fā)平臺上運行,有別于在PC機上,此時(shí)Microwindows應該是基于幀緩沖驅動(dòng),即需要調用/dev/fb0設備,因此參數的配置應該為: 還有其他某些相關(guān)的配置參數,應根據實(shí)際情況進(jìn)行配置。至此,完成了對Microwindows的配置工作,下面需要根據?CLinux的特性,對Microwindows的源代碼進(jìn)行相應修改。具體需要修改的地方包括三個(gè)方面: 在打開(kāi)幀緩沖設備時(shí),需要調用void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize)函數,將屏幕緩沖區映射到用戶(hù)地址空間。在基于PC機開(kāi)發(fā)時(shí),由于在Linux系統下,參數flags默認為MAP_SHARED,即對映射區域的寫(xiě)入數據會(huì )復制回文件內,而且允許其他映射該文件的進(jìn)程共享。由于?CLinux是沒(méi)有MMU(內存管理單元)的,因此參數flags應為MAP_FIXED ,即如果參數start所指的地址無(wú)法成功建立映射時(shí),則放棄映射,不對地址做修正。因此,應該修改文件/SRC/drivers/scr_fb.c,將mmap()函數中的flags參數改為MAP_FIXED。 如果此時(shí)直接編譯經(jīng)過(guò)配置和修改源代碼的Microwindows,會(huì )提示出現“undefined reference to ‘_ _CTOR_LIST’”和“undefined reference to ‘_ _DTOR_LIST’”的錯誤。這是由于原來(lái)在libgcc中是有_ _CTOR_LIST和_ _DTOR_LIST參數定義的,但在?CLinux的交叉編譯鏈中,該符號被刪掉。在elf2flt的link script中提供了這兩個(gè)符號的定義,使用CLinux的交叉編譯鏈編譯可執行程序就必須用-elf2flt選項。因此應在編譯的選項里加上“-elf2flt”,修改的文件包括demos文件夾下各個(gè)相關(guān)文件夾的Makefile文件。 由于CLinux缺少MMU硬件的支持,無(wú)法實(shí)現fork( )函數,而只能使用vfork( )函數,因此在含有fork( )函數的文件中應加入相應的條件編譯指令,用vfork( )來(lái)代替fork( )。 以上3個(gè)修改是比較重要,至此已完成了整個(gè)Microwindows在S3C44B0X嵌入式開(kāi)發(fā)板中的移植,編譯即可。最后,將編譯好的演示程序復制到CLinux內核中,再編譯內核,將編譯好的內核映像文件下載至RAM中,即可運行演示。 結語(yǔ) 本文主要論述了Microwindows的體系結構,并且介紹了在PC機上和基于S3C44B0X的嵌入式開(kāi)發(fā)板上運行的步驟和方法,指出了在開(kāi)發(fā)過(guò)程應該注意的問(wèn)題。下面就可以利用相應的開(kāi)發(fā)工具開(kāi)發(fā)Microwindows的應用程序,從而實(shí)現相應的功能。 |