蔡 昌,羅小華,鄧 娜
(重慶郵電大學 通信與信息工程學院,重慶 400065)
Windows CE是微軟開發(fā)的專注于嵌入式領(lǐng)域的一款操作系統(tǒng),它提供了眾多強大工具,用戶利用它可以快速開發(fā)出下一代的智能化小體積設(shè)備。特別是在便攜式的電子類產(chǎn)品開發(fā)過程中,LCD液晶顯示屏由于其可視化強,強大的人機友好界面操作等特點,已經(jīng)逐漸成為工業(yè)控制系統(tǒng)、消費電子產(chǎn)品中客戶體驗(QoE)的重要環(huán)節(jié)。在基于Windows CE的硬件平臺上開發(fā)嵌入式產(chǎn)品時,LOGO啟動的實現(xiàn)和算法研究就顯得非常重要?,F(xiàn)在比較流行的做法是在LCD控制器初始化后加入一段完整啟動輸出畫面的代碼,以達到在系統(tǒng)啟動過程中輸出畫面的效果。該方法的優(yōu)點是方法簡單,易于實現(xiàn);而缺點是對圖片的大小有嚴格要求,如果太大,將會引起LCD顯示花屏,嚴重者甚至造成系統(tǒng)的不穩(wěn)定。在此基礎(chǔ)之上,提出一種采用線性插值法改進LOGO的算法。該方法能夠?qū)λ迦氲腖OGO圖片進行相應(yīng)放大和縮小,大大降低了對圖片大小的限制。同時由于其穩(wěn)定性好,移植性強,可以適用于多種具有同類操作系統(tǒng)的硬件平臺。
該設(shè)計的開發(fā)平臺是基于Platform Builder 6.0操作系統(tǒng),該工具集成了微軟新一代基于ARM的設(shè)備仿真器,可以仿真ARMV4I指令集,為開發(fā)者的操作系統(tǒng)和應(yīng)用程序的開發(fā)、構(gòu)建和測試提供了極大方便[1]。Eboot(通過以太網(wǎng)口從開發(fā)機下載操作系統(tǒng)鏡像得到目標設(shè)備與運行于Platform Builder 6.0的開發(fā)平臺通信,從而進行下載操作系統(tǒng)鏡像和配置調(diào)試服務(wù)[2]。
LOGO啟動的具體實現(xiàn)是在系統(tǒng)啟動的過程中,在Windows CE內(nèi)核啟動階段完成對LCD控制器初始化后加入一段完整啟動輸出畫面的代碼?;蛘呖梢院唵蔚乩斫鉃樵贚CD控制器初始化后直接往LCD的Framebuffer(幀緩存空間)里面寫輸出畫面的數(shù)據(jù)。這個工作一般在Eboot中進行,如果在OS(操作系統(tǒng))啟動時一般就太晚了,如果不加入人為的延時,啟動畫面剛一顯示,就到了OS畫面了,看不到效果。因此,選擇在Bootloader中初始化LCD后添加啟動LOGO的代碼,從而實現(xiàn)開機畫面的顯示。
Bootloader是建立在操作系統(tǒng)內(nèi)核運行之前的一小段程序,通過這段小程序,可以初始化硬件設(shè)備,建立系統(tǒng)的內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個已知的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。最終,Bootloader把操作系統(tǒng)內(nèi)核映像加載到RAM中,并將系統(tǒng)控制權(quán)傳遞給它[3]。
Bootloader的控制流程如圖1所示。
圖1 Bootloader的控制流程圖Fig.1 Flow chart of Bootloader control
當打開電源或者復(fù)位時,CPU首先執(zhí)行Startup函數(shù),Startup函數(shù)通常由匯編語言代碼編寫,主要用來建立存儲器訪問和初始化緩存。然后Startup函數(shù)跳轉(zhuǎn)到blcommon框架的blcommonMain函數(shù)。Blcommon框架被實現(xiàn)為blcommon.lib庫,并與平臺特定的Bootloader代碼進行鏈接[4]。
BootLoaderMain函數(shù)中主要調(diào)用OEMDebugInit、OEMPlatformInit、 OEMPreDownLoader、 DownloaderImage 和OEMLaunch等主要函數(shù),其中OEMPlatformInit函數(shù)是BootLoader最重要的OEM函數(shù),所有與BootLoader所需硬件功能相關(guān)的目標板級外設(shè)如以太網(wǎng)接口、Flash存儲器等都應(yīng)該在這里進行初始化,也可以初始化嵌入式CPU芯片內(nèi)置的外設(shè),這里還涉及到S3C6410內(nèi)置的LCD控制器[5]。因為BootLoader中LOGO的實現(xiàn)就是通過OEMPlatformInit函數(shù)調(diào)用InitializeDisplay函數(shù)初始化S3C6410的LCD控制器使之在BootLoader啟動時顯示[6]。
通常的做法是在%_WINCEROOT%Platform
2.3.1 制作Logo.C
首先用軟件工具實現(xiàn)圖片到數(shù)組文件的轉(zhuǎn)換[8],這里使用StartLogo圖片制作工具。StartLogoMaker是由Linux Logo制作工具LogoMaker移植而來,是一款“綠色軟件”,將其直接復(fù)制到Windows XP平臺即可運行。它可以把bmp,jpg等格式的圖片轉(zhuǎn)換為BSP(板級支持包)所需要的數(shù)組文件StartLogo.c,使用新生成的文件替換BSP中的同名文件,即可方便地更換Windows CE的啟動畫面[9]。StartLogo.c數(shù)組的頭部內(nèi)容如下:
生成的默認文件名稱為StartLogo.c,將其修改為Logo.c,并將其前兩個數(shù)組元素(這里是240,320)刪除,這樣做的目的只是方便代碼實現(xiàn)的簡化(下同),同時保存該文件到%_WINCEROOT%Platform
2.3.2 Eboot中相關(guān)函數(shù)的實現(xiàn)
在%_WINCEROOT%Platform
#include
2.3.3 啟動調(diào)試
將生成的映像文件下載到開發(fā)板中,重新啟動系統(tǒng),會發(fā)現(xiàn)在系統(tǒng)啟動的過程中出現(xiàn)了如圖2所示的畫面。
圖2 啟動中的LOGO畫面Fig.2 LOGO screen in booting
從圖2可以清楚地看出,圖片模糊,失真。造成這個問題的原因是在目錄%_WINCEROOT%PLATFORMSMDK6410SrcBootloaderEboot下的eboot.bib有如下定義:
從上面的MEMORY段可以看出Eboot的大小為512 KB,而Logo.c文件的大小卻是768 KB,加入LOGO后大小超過512 KB,導(dǎo)致生成的文件數(shù)據(jù)丟失。是否會超過了顯示緩存的大小呢?再看%_WINCEROOT%PLATFORMSMDK6410Filesconfig.bib有如下定義:
系統(tǒng)定義了一個顯存的起始地址為0x86800000,大小為12 MB,顯然幀緩存的大小是足夠的。因此,可以認為是顯示圖片過大導(dǎo)致eboot.bin超出規(guī)定大小的范圍。解決的辦法就是用算法將圖片進行壓縮,然后在Eboot里面用相關(guān)代碼對縮小的圖片進行相應(yīng)地放大。
在圖像進行放大縮小的過程中,一般采用最近鄰法和線性插值法。如果采用最近鄰法,在把圖像放大較大倍數(shù)時會產(chǎn)生馬賽克形狀,放大倍數(shù)越大,這種現(xiàn)象越發(fā)明顯[10]。
本文為了得到更好的放大圖像的質(zhì)量,采用線性插值法。如圖3所示,當求出的地址與格子點不一致之時,先求出與其相鄰的4個格子點的距離之比,用該比率對近鄰4像素的濃度值進行插值處理。計算該濃度值的公式:
其中,[x],[y]分別為不超過 x,y 的整數(shù),d(x,y)表示坐標(x,y)處的濃度值。[x],[y]分別代表不超過它的最大整數(shù)。采用線性插值法處理的圖像可以在即時放大的場合,沒有馬賽克形狀,也變得比較圓滑柔順。
圖3 線性插值法(從鄰近4個點進行線性插值)Fig.3 Linear interpolation(Linear interpolation from the nearest four points)
線性插值法不僅可以采用鄰近4點,也可以采用鄰近9點或者16點進行高次插值法。在進行嚴密的縮小處理時,需要預(yù)先進行前置濾波處理。
用photoshop等圖形處理軟件,將圖片縮小1倍,由于這里使用的屏幕為 240×320,因此,將圖片縮小為 120×160,取名為Logo.jpg。使用StartLogo工具將Logo.jpg轉(zhuǎn)換成相應(yīng)的數(shù)組文件Logo.c。將新生成的文件替換BSP中的同名文件。其他步驟和上述常規(guī)做法一致。最后給出在main.c文件中的InitializeDisplay函數(shù)中添加采用線性插值法進行圖像擴大的主要代碼:
重新生成映像并下載到硬件平臺中,在系統(tǒng)啟動的過程中出現(xiàn)如圖4所示的LOGO畫面。
經(jīng)過算法的優(yōu)化之后,可以清楚地看見圖像顯示效果明顯有了提升,而Eboot.bin的大小卻沒有超過512 KB,數(shù)據(jù)也不會因此而丟失。
實驗證明,線性插值算法對于縮放比例較小的情況是完全可以接受的。在通常情況下,縮小0.5倍以上或放大3.0倍以下對于任何圖像都是可以接受的。
圖4 算法優(yōu)化后的LOGO啟動畫面Fig.4 LOGO screen after optimized algorithm
本文提出一種普遍適用的基于Windows CE6.0操作系統(tǒng)的啟動LOGO畫面的制作和優(yōu)化。該方法具有良好的可讀性和移植性,凡是相同系統(tǒng)的產(chǎn)品實現(xiàn)開機啟動LOGO畫面,均可采用本文提出的方法。該設(shè)計方法已在IPTV手持式測試儀中應(yīng)用,可以非常清晰地顯示開機啟動LOGO的畫面,性能穩(wěn)定,運行良好。
[1]張冬泉,譚南林.Windows CE開發(fā)實例精粹[M].北京:電子工業(yè)出版社,2008.
[2]張飛,白瑞林,陸林.WinCE 5.0 Bootloader的設(shè)計與實現(xiàn)[J].計算機工程,2009,35(7):232-234.ZHANG Fei,BAI Rui-lin,LU Lin.Design and implemention of WinCE 5.0 Bootloader[J].Computer Engineering,2009,35(7):232-234.
[3]張東泉,譚南林,王雪梅,等.WINDOWS CE實用開發(fā)技術(shù)[M].2版.北京:電子工業(yè)出版社,2008.
[4]李大為.Windows CE工程實踐完全解析[M].北京:中國電力出版社,2008.
[5]周建設(shè).Windows CE設(shè)備驅(qū)動及BSP開發(fā)指南[M].北京:中國電力出版社,2009.
[6]Pavlov S,Belevsky P.Windows Embedded CE 6.0 Fundamentals[M].Microsoft Press,2008.
[7]李昊華,鄭文曦.Windows CE中BootLoader啟動畫面的設(shè)計與實現(xiàn)[J].自動化與儀表,2008,23(11):8-10.LI Hao-hua,ZHENG Wen-xi.Design and implementation of Boot Logo in Windows CE Boot Loader[J].Automation and Instrumentation,2008,23(11):8-10.
[8]楊霄雪,王力虎,葉佳寧,等.U-Boot啟動logo制作的研究[J].電腦知識與技術(shù),2009,5(3):1731-1733.YANG Xiao-xue,WANG Li-hu,YE Jia-ning,et al.Research on the implementation of U-Boot start Logo[J].Computer Knowledge and Technology,2009,5(3):1731-1733.
[9]友善之臂公司.ARM9 MINI2440用戶手冊[EB/OL].(2010-02-04)[2010-04-29].http://www.arm123.com.cn/mini2440/mini2440-um-20100204.rar.
[10]井上誠喜,八木伸行,林正樹,等.C語言實用數(shù)字圖像處理[M].白玉林,譯.北京:科學出版社,2003.