李庆诚,刘建志
(南开大学软件学院,天津 300071)
近几年来,很多厂家纷纷加入电子纸阅读器领域,推出了许多新的技术和产品使这个产业有了快速的发展。与纸质阅读相比,电子纸阅读器具有无辐射、资源丰富、存储容量大、便于携带等特点,所以得到了越来越多用户的关注和使用。
WinCE是微软推出的一款通用嵌入式操作系统,具有模块化系统定制、多硬件平台支持、强大的开发工具支持等特点[1]。此外,WinCE平台提供了多种格式的阅读应用程序,开发者只需要添加组件就可以支持多种格式的阅读。本设计采用WinCE操作系统和E-Ink屏幕,实现了支持多种文档格式阅读、屏幕旋转、触摸屏输入、PC同步等功能的电子纸阅读器。
如图1所示,按照功能层次划分,WinCE系统架构可以分为硬件、板级支持包(BSP)、操作系统(OS)以及应用程序四层结构[2]。
设计WinCE系统时,针对不同硬件平台需要按照如下步骤进行系统开发:
①开发系统BSP,包括启动程序(Bootloader)、设备驱动和OAL,使WinCE在硬件平台上运行;
②根据应用需求,选择合适的OS组件构建系统映像;
③使用定制OS的SDK开发应用程序。
按上述步骤实现电子纸阅读器过程中,开发电子纸显示驱动和阅读器应用程序开发是实现阅读器的两个关键问题。
WinCE显示驱动由 GWES.exe加载管理,通过WinCE内核的一个组件GDI(Graphics Device Interface)加载调用显示驱动。应用程序通过GDI组件调用显示驱动,并在电子纸上显示。
图1 WinCE系统架构
微软公司提供了一系列与显示驱动相关的C++代码来简化WinCE显示驱动开发。这些类中最重要的是纯虚类(Graphics Primitive Engine,GPE)。通过继承该类实现GPE的虚函数,可以完成显示驱动MDD层的开发[3]。
此外,微软提供了多种不同显示设备的驱动源代码。其中,NOPDISP是一个简单的显示驱动框架,实现了显示驱动GPE类的虚函数[4]。在NOPDISP简单清晰的驱动框架基础上添加电子纸控制器设备相关代码,即可实现本设计电子纸的WinCE显示驱动。
WinCE电子纸显示驱动主要包括设备初始化、刷屏机制和旋转支持3个部分。
2.1.1 设备初始化
在生成GPE类派生对象Wrap2bpp构造函数中完成初始化工作,设置GPE相关成员变量,包括显示宽度、显示高度、像素点存储位数以及显存等变量。通过调用PDD层接口DispDrvrInitialize完成初始化电子纸控制器与CPU相连的GPIO端口,设置时钟中断,分配显存空间的工作[5]。
在PDD层生成显存空间buffer,并在MDD层将GPE成员变量m_pVirtualFrameBuffer赋值为buffer。这样应用程序的绘图请求通过MDD层在显存地址空间保存显示数据内容,当PDD层确定绘图区域进行刷屏时,向电子纸控制器送入显存相应位置和大小的数据进行显示。
2.1.2 刷屏机制
显示驱动被GWES.exe加载后,当应用程序第一次有绘图请求时,调用DispDrvrDirtyRectDump函数。具体流程如图2所示。
首先,清除Bootloader启动界面残影,创建刷屏事件 freshEvent1、freshEvent2,创建刷屏状态state并初始化为 state0;然后,创建刷屏线程,调用 file Rect函数填充本次绘图区域。
当应用程序再次有绘图请求时,根据显示驱动保存的绘图区域和应用程序的绘图请求区域两个参数创建新的绘图区域。显示驱动刷屏线程会根据当时刷屏状态采取不同动作。
图2 电子纸显示驱动创建刷屏线程流程
图3 刷屏状态转换图
图3为显示驱动刷屏过程 中 state0、state1、state2三个刷屏状态的转换图。当状态为 state0时,会等待刷屏请求;状态为state1时,设置等待时间为50 ms,刷屏线程直到应用程序没有刷屏请求后转到state2状态再进行刷屏;状态为state2时,进行刷屏操作,同时记录此时应用程序的刷屏请求、刷屏数据以及区域信息。这样减少了刷屏次数,起到了缓冲作用,解决了不断刷屏所造成的应用程序响应时间慢以及实用性差的问题。
2.1.3 旋转支持
屏幕旋转包括图像旋转和坐标系旋转两个部分:设置电子纸控制器相关寄存器的值,通过控制器提供的旋转功能对显存中的数据进行旋转,完成图像旋转;修改GPE的成员变量m_iRotate为改变后的角度,完成坐标系的旋转。
电子阅读器的主要功能主要包括两部分应用程序:不同文档格式的阅读程序;书架程序,用来显示存储介质中的文档,并调用格式对应的阅读程序进行显示。
本文设计的电子纸阅读器除了具有基本的文档阅读功能外,还包括浏览器、应用程序扩展、系统设置等功能。如图4所示,应用程序主要包括主界面、书架、应用、浏览器,以及系统设置等程序。
图4 应用程序
2.2.1 主界面程序
主界面程序是电子阅读器启动时首先调用的程序,根据用户点击位置调用书架、浏览器、应用、系统设置四个不同的程序。
本文通过修改配置文件实现主界面程序随内核启动自动运行:
①修改桌面任务栏,使任务栏不在最前面并自动隐藏,这样应用程序全屏显示就会覆盖任务栏;
②去掉注册表中桌面存在的快捷方式,并将桌面背景修改为主界面背景;
③添加主界面程序到注册表,实现启动自动运行。
这样,就可以在系统启动时先调用exploere.exe,启动背景为首页程序界面的WinCE桌面,而后调用首页应用程序。
2.2.2 书架程序
WinCE 提供 txt、html、pdf、doc、ppt等多种格式的阅读程序,在系统内核定制中通过添加组件将这些阅读程序编译到WinCE内核镜像中。在书架程序中,读取Flash和SD卡存储设备中存储的文件信息,对于支持的文件格式将文件名及文件大小等信息显示在书架界面上;用户点击书架上显示的文档,根据扩展名调用对应的阅读程序阅读文档。
在启动阅读程序时,会同时创建一个进程,启动一个旋转按钮,附着于阅读应用窗口用来控制屏幕的旋转。图5为旋转应用程序的流程。通过Change-DisplaySettingsEx函数来调用显示驱动的DrvEscape函数完成屏幕旋转;在进程中,同时创建一个线程用来检测阅读程序状态,当阅读程序退出时把屏幕旋转到竖屏显示,保证书架程序正常显示。
2.2.3 应用扩展
WinCE内核定制后导出的SDK可以提供给用户或者其他程序开发人员,使用微软公司的Visual studio或者Embedded Visual C++开发工具开发自己的应用程序。在主界面中的“应用”就是用来提供给用户进行应用程序扩展的程序。本设计在SD卡配置文件中添加应用程序的名称、路径、参数等信息。应用扩展程序被调用时,读取该配置文件显示扩展的应用。
图5 阅读器旋转应用程序流程
本文验证平台采用S3C2416主控制器。S3C2416是三星公司推出的基于ARM926EJ内核的32位RISC嵌入式控制器。其运行频率可以达到400 M Hz,片上集成指令和数据分开的16 KBCache、定时器、看门狗以及外围设备控制器等;使用6寸电子纸显示屏,分辨率为 600×800,支持16级灰度和屏幕旋转。
基于硬件平台开发对应的BSP,包括Bootloader、设备驱动和OAL层。按照设计需求定制内核生成WinCE镜像,然后导出平台SDK开发阅读器应用程序,而后下载到硬件平台测试运行。图6为应用程序显示效果,左图为书架程序,右图为阅读程序。
图6 书架和阅读程序显示效果
此外,通过实验计算了系统启动时间、刷600×800图片以及旋转屏幕所需的时间。
如图7所示,系统从上电到显示主界面程序需要25.07s左右。除了硬件初始化、WinCE系统启动时间以外,用Bootloader从NAND Flash中加载WinCE内核到内存中将近消耗了14 s。
本设计中定制的组件较多,包括Viewer应用程序、中文字库支持、浏览器等组件.镜像大小在26.3MB左右,可以通过生成MultiBin的方法,首先加载WinCE系统必需的组件,其他组件在需要时或者系统启动后再加载,以改善系统启动时间。
图7 系统启动时间
如图8所示,通过应用程序绘制600×800的图片,刷屏时间大约为739 ms,进行屏幕旋转操作大概需要1 558 ms。其中,屏幕旋转操作时间包括坐标系的旋转、应用程序接收到重绘消息进行重新绘图,以及电子纸控制器对显存数据旋转刷屏的时间,所以时间相对较长。
图8 系统刷屏时间
本文详细介绍了实现电子纸阅读器过程中电子纸显示驱动和应用程序开发两个关键问题,并在硬件平台实现了基于WinCE操作系统的电子纸阅读器。该电子纸阅读器支持多种格式阅读、触摸屏输入、PC文件同步传输、多种存储介质等功能,具有一定的应用价值。
[1]何宗健.WinCE嵌入式系统[M].北京:北京航空航天大学出版社,2006.
[2]辛雁峰,夏海宝,易春海.基于S3C2440移动终端的WinCE开发[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.