李慶誠(chéng),劉建志
(南開大學(xué)軟件學(xué)院,天津 300071)
近幾年來,很多廠家紛紛加入電子紙閱讀器領(lǐng)域,推出了許多新的技術(shù)和產(chǎn)品使這個(gè)產(chǎn)業(yè)有了快速的發(fā)展。與紙質(zhì)閱讀相比,電子紙閱讀器具有無輻射、資源豐富、存儲(chǔ)容量大、便于攜帶等特點(diǎn),所以得到了越來越多用戶的關(guān)注和使用。
WinCE是微軟推出的一款通用嵌入式操作系統(tǒng),具有模塊化系統(tǒng)定制、多硬件平臺(tái)支持、強(qiáng)大的開發(fā)工具支持等特點(diǎn)[1]。此外,WinCE平臺(tái)提供了多種格式的閱讀應(yīng)用程序,開發(fā)者只需要添加組件就可以支持多種格式的閱讀。本設(shè)計(jì)采用WinCE操作系統(tǒng)和E-Ink屏幕,實(shí)現(xiàn)了支持多種文檔格式閱讀、屏幕旋轉(zhuǎn)、觸摸屏輸入、PC同步等功能的電子紙閱讀器。
如圖1所示,按照功能層次劃分,WinCE系統(tǒng)架構(gòu)可以分為硬件、板級(jí)支持包(BSP)、操作系統(tǒng)(OS)以及應(yīng)用程序四層結(jié)構(gòu)[2]。
設(shè)計(jì)WinCE系統(tǒng)時(shí),針對(duì)不同硬件平臺(tái)需要按照如下步驟進(jìn)行系統(tǒng)開發(fā):
①開發(fā)系統(tǒng)BSP,包括啟動(dòng)程序(Bootloader)、設(shè)備驅(qū)動(dòng)和OAL,使WinCE在硬件平臺(tái)上運(yùn)行;
②根據(jù)應(yīng)用需求,選擇合適的OS組件構(gòu)建系統(tǒng)映像;
③使用定制OS的SDK開發(fā)應(yīng)用程序。
按上述步驟實(shí)現(xiàn)電子紙閱讀器過程中,開發(fā)電子紙顯示驅(qū)動(dòng)和閱讀器應(yīng)用程序開發(fā)是實(shí)現(xiàn)閱讀器的兩個(gè)關(guān)鍵問題。
WinCE顯示驅(qū)動(dòng)由 GWES.exe加載管理,通過WinCE內(nèi)核的一個(gè)組件GDI(Graphics Device Interface)加載調(diào)用顯示驅(qū)動(dòng)。應(yīng)用程序通過GDI組件調(diào)用顯示驅(qū)動(dòng),并在電子紙上顯示。
圖1 WinCE系統(tǒng)架構(gòu)
微軟公司提供了一系列與顯示驅(qū)動(dòng)相關(guān)的C++代碼來簡(jiǎn)化WinCE顯示驅(qū)動(dòng)開發(fā)。這些類中最重要的是純虛類(Graphics Primitive Engine,GPE)。通過繼承該類實(shí)現(xiàn)GPE的虛函數(shù),可以完成顯示驅(qū)動(dòng)MDD層的開發(fā)[3]。
此外,微軟提供了多種不同顯示設(shè)備的驅(qū)動(dòng)源代碼。其中,NOPDISP是一個(gè)簡(jiǎn)單的顯示驅(qū)動(dòng)框架,實(shí)現(xiàn)了顯示驅(qū)動(dòng)GPE類的虛函數(shù)[4]。在NOPDISP簡(jiǎn)單清晰的驅(qū)動(dòng)框架基礎(chǔ)上添加電子紙控制器設(shè)備相關(guān)代碼,即可實(shí)現(xiàn)本設(shè)計(jì)電子紙的WinCE顯示驅(qū)動(dòng)。
WinCE電子紙顯示驅(qū)動(dòng)主要包括設(shè)備初始化、刷屏機(jī)制和旋轉(zhuǎn)支持3個(gè)部分。
2.1.1 設(shè)備初始化
在生成GPE類派生對(duì)象Wrap2bpp構(gòu)造函數(shù)中完成初始化工作,設(shè)置GPE相關(guān)成員變量,包括顯示寬度、顯示高度、像素點(diǎn)存儲(chǔ)位數(shù)以及顯存等變量。通過調(diào)用PDD層接口DispDrvrInitialize完成初始化電子紙控制器與CPU相連的GPIO端口,設(shè)置時(shí)鐘中斷,分配顯存空間的工作[5]。
在PDD層生成顯存空間buffer,并在MDD層將GPE成員變量m_pVirtualFrameBuffer賦值為buffer。這樣應(yīng)用程序的繪圖請(qǐng)求通過MDD層在顯存地址空間保存顯示數(shù)據(jù)內(nèi)容,當(dāng)PDD層確定繪圖區(qū)域進(jìn)行刷屏?xí)r,向電子紙控制器送入顯存相應(yīng)位置和大小的數(shù)據(jù)進(jìn)行顯示。
2.1.2 刷屏機(jī)制
顯示驅(qū)動(dòng)被GWES.exe加載后,當(dāng)應(yīng)用程序第一次有繪圖請(qǐng)求時(shí),調(diào)用DispDrvrDirtyRectDump函數(shù)。具體流程如圖2所示。
首先,清除Bootloader啟動(dòng)界面殘影,創(chuàng)建刷屏事件 freshEvent1、freshEvent2,創(chuàng)建刷屏狀態(tài)state并初始化為 state0;然后,創(chuàng)建刷屏線程,調(diào)用 file Rect函數(shù)填充本次繪圖區(qū)域。
當(dāng)應(yīng)用程序再次有繪圖請(qǐng)求時(shí),根據(jù)顯示驅(qū)動(dòng)保存的繪圖區(qū)域和應(yīng)用程序的繪圖請(qǐng)求區(qū)域兩個(gè)參數(shù)創(chuàng)建新的繪圖區(qū)域。顯示驅(qū)動(dòng)刷屏線程會(huì)根據(jù)當(dāng)時(shí)刷屏狀態(tài)采取不同動(dòng)作。
圖2 電子紙顯示驅(qū)動(dòng)創(chuàng)建刷屏線程流程
圖3 刷屏狀態(tài)轉(zhuǎn)換圖
圖3為顯示驅(qū)動(dòng)刷屏過程 中 state0、state1、state2三個(gè)刷屏狀態(tài)的轉(zhuǎn)換圖。當(dāng)狀態(tài)為 state0時(shí),會(huì)等待刷屏請(qǐng)求;狀態(tài)為state1時(shí),設(shè)置等待時(shí)間為50 ms,刷屏線程直到應(yīng)用程序沒有刷屏請(qǐng)求后轉(zhuǎn)到state2狀態(tài)再進(jìn)行刷屏;狀態(tài)為state2時(shí),進(jìn)行刷屏操作,同時(shí)記錄此時(shí)應(yīng)用程序的刷屏請(qǐng)求、刷屏數(shù)據(jù)以及區(qū)域信息。這樣減少了刷屏次數(shù),起到了緩沖作用,解決了不斷刷屏所造成的應(yīng)用程序響應(yīng)時(shí)間慢以及實(shí)用性差的問題。
2.1.3 旋轉(zhuǎn)支持
屏幕旋轉(zhuǎn)包括圖像旋轉(zhuǎn)和坐標(biāo)系旋轉(zhuǎn)兩個(gè)部分:設(shè)置電子紙控制器相關(guān)寄存器的值,通過控制器提供的旋轉(zhuǎn)功能對(duì)顯存中的數(shù)據(jù)進(jìn)行旋轉(zhuǎn),完成圖像旋轉(zhuǎn);修改GPE的成員變量m_iRotate為改變后的角度,完成坐標(biāo)系的旋轉(zhuǎn)。
電子閱讀器的主要功能主要包括兩部分應(yīng)用程序:不同文檔格式的閱讀程序;書架程序,用來顯示存儲(chǔ)介質(zhì)中的文檔,并調(diào)用格式對(duì)應(yīng)的閱讀程序進(jìn)行顯示。
本文設(shè)計(jì)的電子紙閱讀器除了具有基本的文檔閱讀功能外,還包括瀏覽器、應(yīng)用程序擴(kuò)展、系統(tǒng)設(shè)置等功能。如圖4所示,應(yīng)用程序主要包括主界面、書架、應(yīng)用、瀏覽器,以及系統(tǒng)設(shè)置等程序。
圖4 應(yīng)用程序
2.2.1 主界面程序
主界面程序是電子閱讀器啟動(dòng)時(shí)首先調(diào)用的程序,根據(jù)用戶點(diǎn)擊位置調(diào)用書架、瀏覽器、應(yīng)用、系統(tǒng)設(shè)置四個(gè)不同的程序。
本文通過修改配置文件實(shí)現(xiàn)主界面程序隨內(nèi)核啟動(dòng)自動(dòng)運(yùn)行:
①修改桌面任務(wù)欄,使任務(wù)欄不在最前面并自動(dòng)隱藏,這樣應(yīng)用程序全屏顯示就會(huì)覆蓋任務(wù)欄;
②去掉注冊(cè)表中桌面存在的快捷方式,并將桌面背景修改為主界面背景;
③添加主界面程序到注冊(cè)表,實(shí)現(xiàn)啟動(dòng)自動(dòng)運(yùn)行。
這樣,就可以在系統(tǒng)啟動(dòng)時(shí)先調(diào)用exploere.exe,啟動(dòng)背景為首頁程序界面的WinCE桌面,而后調(diào)用首頁應(yīng)用程序。
2.2.2 書架程序
WinCE 提供 txt、html、pdf、doc、ppt等多種格式的閱讀程序,在系統(tǒng)內(nèi)核定制中通過添加組件將這些閱讀程序編譯到WinCE內(nèi)核鏡像中。在書架程序中,讀取Flash和SD卡存儲(chǔ)設(shè)備中存儲(chǔ)的文件信息,對(duì)于支持的文件格式將文件名及文件大小等信息顯示在書架界面上;用戶點(diǎn)擊書架上顯示的文檔,根據(jù)擴(kuò)展名調(diào)用對(duì)應(yīng)的閱讀程序閱讀文檔。
在啟動(dòng)閱讀程序時(shí),會(huì)同時(shí)創(chuàng)建一個(gè)進(jìn)程,啟動(dòng)一個(gè)旋轉(zhuǎn)按鈕,附著于閱讀應(yīng)用窗口用來控制屏幕的旋轉(zhuǎn)。圖5為旋轉(zhuǎn)應(yīng)用程序的流程。通過Change-DisplaySettingsEx函數(shù)來調(diào)用顯示驅(qū)動(dòng)的DrvEscape函數(shù)完成屏幕旋轉(zhuǎn);在進(jìn)程中,同時(shí)創(chuàng)建一個(gè)線程用來檢測(cè)閱讀程序狀態(tài),當(dāng)閱讀程序退出時(shí)把屏幕旋轉(zhuǎn)到豎屏顯示,保證書架程序正常顯示。
2.2.3 應(yīng)用擴(kuò)展
WinCE內(nèi)核定制后導(dǎo)出的SDK可以提供給用戶或者其他程序開發(fā)人員,使用微軟公司的Visual studio或者Embedded Visual C++開發(fā)工具開發(fā)自己的應(yīng)用程序。在主界面中的“應(yīng)用”就是用來提供給用戶進(jìn)行應(yīng)用程序擴(kuò)展的程序。本設(shè)計(jì)在SD卡配置文件中添加應(yīng)用程序的名稱、路徑、參數(shù)等信息。應(yīng)用擴(kuò)展程序被調(diào)用時(shí),讀取該配置文件顯示擴(kuò)展的應(yīng)用。
圖5 閱讀器旋轉(zhuǎn)應(yīng)用程序流程
本文驗(yàn)證平臺(tái)采用S3C2416主控制器。S3C2416是三星公司推出的基于ARM926EJ內(nèi)核的32位RISC嵌入式控制器。其運(yùn)行頻率可以達(dá)到400 M Hz,片上集成指令和數(shù)據(jù)分開的16 KBCache、定時(shí)器、看門狗以及外圍設(shè)備控制器等;使用6寸電子紙顯示屏,分辨率為 600×800,支持16級(jí)灰度和屏幕旋轉(zhuǎn)。
基于硬件平臺(tái)開發(fā)對(duì)應(yīng)的BSP,包括Bootloader、設(shè)備驅(qū)動(dòng)和OAL層。按照設(shè)計(jì)需求定制內(nèi)核生成WinCE鏡像,然后導(dǎo)出平臺(tái)SDK開發(fā)閱讀器應(yīng)用程序,而后下載到硬件平臺(tái)測(cè)試運(yùn)行。圖6為應(yīng)用程序顯示效果,左圖為書架程序,右圖為閱讀程序。
圖6 書架和閱讀程序顯示效果
此外,通過實(shí)驗(yàn)計(jì)算了系統(tǒng)啟動(dòng)時(shí)間、刷600×800圖片以及旋轉(zhuǎn)屏幕所需的時(shí)間。
如圖7所示,系統(tǒng)從上電到顯示主界面程序需要25.07s左右。除了硬件初始化、WinCE系統(tǒng)啟動(dòng)時(shí)間以外,用Bootloader從NAND Flash中加載WinCE內(nèi)核到內(nèi)存中將近消耗了14 s。
本設(shè)計(jì)中定制的組件較多,包括Viewer應(yīng)用程序、中文字庫支持、瀏覽器等組件.鏡像大小在26.3MB左右,可以通過生成MultiBin的方法,首先加載WinCE系統(tǒng)必需的組件,其他組件在需要時(shí)或者系統(tǒng)啟動(dòng)后再加載,以改善系統(tǒng)啟動(dòng)時(shí)間。
圖7 系統(tǒng)啟動(dòng)時(shí)間
如圖8所示,通過應(yīng)用程序繪制600×800的圖片,刷屏?xí)r間大約為739 ms,進(jìn)行屏幕旋轉(zhuǎn)操作大概需要1 558 ms。其中,屏幕旋轉(zhuǎn)操作時(shí)間包括坐標(biāo)系的旋轉(zhuǎn)、應(yīng)用程序接收到重繪消息進(jìn)行重新繪圖,以及電子紙控制器對(duì)顯存數(shù)據(jù)旋轉(zhuǎn)刷屏的時(shí)間,所以時(shí)間相對(duì)較長(zhǎng)。
圖8 系統(tǒng)刷屏?xí)r間
本文詳細(xì)介紹了實(shí)現(xiàn)電子紙閱讀器過程中電子紙顯示驅(qū)動(dòng)和應(yīng)用程序開發(fā)兩個(gè)關(guān)鍵問題,并在硬件平臺(tái)實(shí)現(xiàn)了基于WinCE操作系統(tǒng)的電子紙閱讀器。該電子紙閱讀器支持多種格式閱讀、觸摸屏輸入、PC文件同步傳輸、多種存儲(chǔ)介質(zhì)等功能,具有一定的應(yīng)用價(jià)值。
[1]何宗健.WinCE嵌入式系統(tǒng)[M].北京:北京航空航天大學(xué)出版社,2006.
[2]辛雁峰,夏海寶,易春海.基于S3C2440移動(dòng)終端的WinCE開發(fā)[J].微計(jì)算機(jī)信息,2009,25(3-2):71-73.
[3]Introduction to WinCE display driver[EB/OL].[2010-04].http://www.xgdown.com/article/175/51890_3.htm.
[4]Microsoft Corporation.Platform Builder for Microsoft Window CE 5.0 Help,2004.
[5]Samsung.S3C2416 User's Manual,2008-10.