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