蔡 昌,罗小华,邓 娜
(重庆邮电大学 通信与信息工程学院,重庆 400065)
Windows CE是微软开发的专注于嵌入式领域的一款操作系统,它提供了众多强大工具,用户利用它可以快速开发出下一代的智能化小体积设备。特别是在便携式的电子类产品开发过程中,LCD液晶显示屏由于其可视化强,强大的人机友好界面操作等特点,已经逐渐成为工业控制系统、消费电子产品中客户体验(QoE)的重要环节。在基于Windows CE的硬件平台上开发嵌入式产品时,LOGO启动的实现和算法研究就显得非常重要。现在比较流行的做法是在LCD控制器初始化后加入一段完整启动输出画面的代码,以达到在系统启动过程中输出画面的效果。该方法的优点是方法简单,易于实现;而缺点是对图片的大小有严格要求,如果太大,将会引起LCD显示花屏,严重者甚至造成系统的不稳定。在此基础之上,提出一种采用线性插值法改进LOGO的算法。该方法能够对所插入的LOGO图片进行相应放大和缩小,大大降低了对图片大小的限制。同时由于其稳定性好,移植性强,可以适用于多种具有同类操作系统的硬件平台。
该设计的开发平台是基于Platform Builder 6.0操作系统,该工具集成了微软新一代基于ARM的设备仿真器,可以仿真ARMV4I指令集,为开发者的操作系统和应用程序的开发、构建和测试提供了极大方便[1]。Eboot(通过以太网口从开发机下载操作系统镜像得到目标设备与运行于Platform Builder 6.0的开发平台通信,从而进行下载操作系统镜像和配置调试服务[2]。
LOGO启动的具体实现是在系统启动的过程中,在Windows CE内核启动阶段完成对LCD控制器初始化后加入一段完整启动输出画面的代码。或者可以简单地理解为在LCD控制器初始化后直接往LCD的Framebuffer(帧缓存空间)里面写输出画面的数据。这个工作一般在Eboot中进行,如果在OS(操作系统)启动时一般就太晚了,如果不加入人为的延时,启动画面刚一显示,就到了OS画面了,看不到效果。因此,选择在Bootloader中初始化LCD后添加启动LOGO的代码,从而实现开机画面的显示。
Bootloader是建立在操作系统内核运行之前的一小段程序,通过这段小程序,可以初始化硬件设备,建立系统的内存空间映射图,从而将系统的软硬件环境带到一个已知的状态,以便为最终调用操作系统内核准备好正确的环境。最终,Bootloader把操作系统内核映像加载到RAM中,并将系统控制权传递给它[3]。
Bootloader的控制流程如图1所示。
图1 Bootloader的控制流程图Fig.1 Flow chart of Bootloader control
当打开电源或者复位时,CPU首先执行Startup函数,Startup函数通常由汇编语言代码编写,主要用来建立存储器访问和初始化缓存。然后Startup函数跳转到blcommon框架的blcommonMain函数。Blcommon框架被实现为blcommon.lib库,并与平台特定的Bootloader代码进行链接[4]。
BootLoaderMain函数中主要调用OEMDebugInit、OEMPlatformInit、 OEMPreDownLoader、 DownloaderImage 和OEMLaunch等主要函数,其中OEMPlatformInit函数是BootLoader最重要的OEM函数,所有与BootLoader所需硬件功能相关的目标板级外设如以太网接口、Flash存储器等都应该在这里进行初始化,也可以初始化嵌入式CPU芯片内置的外设,这里还涉及到S3C6410内置的LCD控制器[5]。因为BootLoader中LOGO的实现就是通过OEMPlatformInit函数调用InitializeDisplay函数初始化S3C6410的LCD控制器使之在BootLoader启动时显示[6]。
通常的做法是在%_WINCEROOT%Platform
2.3.1 制作Logo.C
首先用软件工具实现图片到数组文件的转换[8],这里使用StartLogo图片制作工具。StartLogoMaker是由Linux Logo制作工具LogoMaker移植而来,是一款“绿色软件”,将其直接复制到Windows XP平台即可运行。它可以把bmp,jpg等格式的图片转换为BSP(板级支持包)所需要的数组文件StartLogo.c,使用新生成的文件替换BSP中的同名文件,即可方便地更换Windows CE的启动画面[9]。StartLogo.c数组的头部内容如下:
生成的默认文件名称为StartLogo.c,将其修改为Logo.c,并将其前两个数组元素(这里是240,320)删除,这样做的目的只是方便代码实现的简化(下同),同时保存该文件到%_WINCEROOT%Platform
2.3.2 Eboot中相关函数的实现
在%_WINCEROOT%Platform
#include
2.3.3 启动调试
将生成的映像文件下载到开发板中,重新启动系统,会发现在系统启动的过程中出现了如图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,导致生成的文件数据丢失。是否会超过了显示缓存的大小呢?再看%_WINCEROOT%PLATFORMSMDK6410Filesconfig.bib有如下定义:
系统定义了一个显存的起始地址为0x86800000,大小为12 MB,显然帧缓存的大小是足够的。因此,可以认为是显示图片过大导致eboot.bin超出规定大小的范围。解决的办法就是用算法将图片进行压缩,然后在Eboot里面用相关代码对缩小的图片进行相应地放大。
在图像进行放大缩小的过程中,一般采用最近邻法和线性插值法。如果采用最近邻法,在把图像放大较大倍数时会产生马赛克形状,放大倍数越大,这种现象越发明显[10]。
本文为了得到更好的放大图像的质量,采用线性插值法。如图3所示,当求出的地址与格子点不一致之时,先求出与其相邻的4个格子点的距离之比,用该比率对近邻4像素的浓度值进行插值处理。计算该浓度值的公式:
其中,[x],[y]分别为不超过 x,y 的整数,d(x,y)表示坐标(x,y)处的浓度值。[x],[y]分别代表不超过它的最大整数。采用线性插值法处理的图像可以在即时放大的场合,没有马赛克形状,也变得比较圆滑柔顺。
图3 线性插值法(从邻近4个点进行线性插值)Fig.3 Linear interpolation(Linear interpolation from the nearest four points)
线性插值法不仅可以采用邻近4点,也可以采用邻近9点或者16点进行高次插值法。在进行严密的缩小处理时,需要预先进行前置滤波处理。
用photoshop等图形处理软件,将图片缩小1倍,由于这里使用的屏幕为 240×320,因此,将图片缩小为 120×160,取名为Logo.jpg。使用StartLogo工具将Logo.jpg转换成相应的数组文件Logo.c。将新生成的文件替换BSP中的同名文件。其他步骤和上述常规做法一致。最后给出在main.c文件中的InitializeDisplay函数中添加采用线性插值法进行图像扩大的主要代码:
重新生成映像并下载到硬件平台中,在系统启动的过程中出现如图4所示的LOGO画面。
经过算法的优化之后,可以清楚地看见图像显示效果明显有了提升,而Eboot.bin的大小却没有超过512 KB,数据也不会因此而丢失。
实验证明,线性插值算法对于缩放比例较小的情况是完全可以接受的。在通常情况下,缩小0.5倍以上或放大3.0倍以下对于任何图像都是可以接受的。
图4 算法优化后的LOGO启动画面Fig.4 LOGO screen after optimized algorithm
本文提出一种普遍适用的基于Windows CE6.0操作系统的启动LOGO画面的制作和优化。该方法具有良好的可读性和移植性,凡是相同系统的产品实现开机启动LOGO画面,均可采用本文提出的方法。该设计方法已在IPTV手持式测试仪中应用,可以非常清晰地显示开机启动LOGO的画面,性能稳定,运行良好。
[1]张冬泉,谭南林.Windows CE开发实例精粹[M].北京:电子工业出版社,2008.
[2]张飞,白瑞林,陆林.WinCE 5.0 Bootloader的设计与实现[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实用开发技术[M].2版.北京:电子工业出版社,2008.
[4]李大为.Windows CE工程实践完全解析[M].北京:中国电力出版社,2008.
[5]周建设.Windows CE设备驱动及BSP开发指南[M].北京:中国电力出版社,2009.
[6]Pavlov S,Belevsky P.Windows Embedded CE 6.0 Fundamentals[M].Microsoft Press,2008.
[7]李昊华,郑文曦.Windows CE中BootLoader启动画面的设计与实现[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].电脑知识与技术,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语言实用数字图像处理[M].白玉林,译.北京:科学出版社,2003.