嵌入式操作系统Windows CE 下的LCD 显示驱动开发
武文斌1,陈先玉1,周竹青2
引言
随着Windows CE 操作系统的不断完善以及Microsoft 的种种“开源”动作,越来越多的嵌入式系统开发工程师开始逐渐冷落Linux 操作系统,而把目光投向了Windows CE。虽然Microsoft 声称Windows CE 与PC 机的Windows 系统全面兼容,但那只是对嵌入式系统使用者而言的,而对于嵌入式系统开发工程师来说,诸如音频、显示等在PC机Windows 系统上都有现成的驱动设备, 但在Windows CE 下却必须针对不同的硬件重新开发。由于显示驱动的作用最为重要,开发难度也较大;因此,笔者对Windows CE 系统下的LCD 显驱动的开发进行探讨。
1 Windows CE 驱动分类
Windows CE 驱动从结构上讲分为本地驱动和流接口驱动。
本地驱动主要用于低级、内置的设备。由于需要针对不同类型的设备进行相应设计,因此没有统一的接口。其开发过程较复杂,没有固定的模式,一般做法是通过移植、定制现有的驱动样例来实现。流接口驱动是最基本的一种驱动结构,它的接口是一组固定的流接口函数,具有很高的通用性,WinCE 的所有驱动程序都可以通过这种方式来实现。流接口驱动程序通过文件系统调用从设备管理器和应用程序接收的命令。该驱动程序封了将这些命令转换为它所控制的设备上的适当操作所需的全部信息。
2 Windows CE 下的显示驱动概述
Windows CE 下的显示驱动属于本地驱动的一种,由GWES.exe 加载和管理。类似的由GWES 加载管理的还有键盘鼠标、触屏、打印机等驱动。因此,开发显示驱动的主要工作就是对OEM 厂商给出的Windows CE BSP 包下的显示驱动样例进行移植[2]。由于OEM厂商给出的Windows CE BSP 包里的显示驱动仅仅是针对某种特定型号CPU 和LCD 的,因此,想要开发专门的LCD 显示驱动,就必须对所选CPU的LCD 接口、LCD 硬件的特性以及WindowsCE BSP 包里面显示驱动的构架这3 个方面进行非常充分的研究。下面,笔者将以三星公司的ARM处理器S3C2440、某型号640Å~480 分辨率LCD 为例,探讨在Windows CE5.0 系统下的LCD 显示驱动的移植方法。
3 Windows CE5.0 的显示驱动构架
Windows CE 下的显示驱动直接由GWES 模块管理,它会直接被GWES 模块管理和调用。显示驱动实际上也是分层的[3],其中包括GPE 库,该库处理一些默认的绘图,相当于驱动的MDD 层。用户只需要开发和硬件相关的PDD 层驱动就可以了。在WinCE 中,整个架构如图1 所示。
图1 Windows CE 的显示驱动构架[4]
其中,PDD 层驱动是和LCD 硬件密切相关的,工程师必须根据LCD 硬件的特性来计算出PDD 层驱动所需的几个重要参数值,这是整个显示驱动移植过程的关键所在。在Windows CE5.0 BSP 包的\Src\Inc 目录下(
OEM 厂商不同给出的目录可能不同) , 有个s3c2440a_lcd.h 文件,这里面定义的驱动LCD 所需的所有控制参数。其中,有以下一段代码:
#if LCD_TYPE == LCD_TYPE_TFT640_480
#define LCD_XSIZE_TFT (640)
#define LCD_YSIZE_TFT (480)
#define LCD_VBPD ((29)&0xff)
#define LCD_VFPD ((11)&0xff)
#define LCD_VSPW ((2) &0x3f)
#define LCD_HBPD ((113)&0x7f)
#define LCD_HFPD ((15)&0xff)
#define LCD_HSPW ((29)&0xff)
#define CLKVAL_TFT (1)
#define LCD_CON5 ((1<<11) | (1<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6) | (0<<3) |(0<<1) | (1))
这段代码定义了驱动640Å~480 分辨率LCD 屏所需XSIZE、YSIZE、VBPD(vertical back porch)、VFPD (vertical frontporch)、VSPW(VSYNC pulsewidth) 、HBPD(horizontal back porch) 、HFPD(horizontal front porch) 、HSPW(HSYNC pulsewidth)、LCD 点时钟以及寄存器CON5 的值。只要正确给出这几个LCD 控制参数的值,这块LCD 屏就能够被WindowsCE5.0 操作系统所驱动了。
4 S3C2440 的LCD 接口
通过S3C2440 的LCD接口来驱动一块LCD屏,在正确连接硬件连线后,最主要的任务就是填写S3C2440 的LCD 接口控制寄存器。
S3C2440 处理器的LCD 接口控制寄存器主要有5 个,分别定义为LCDCON1~LCDCON5,每个寄存器的意义可以参考芯片数据手册。其中,s3c2440a_lcd.h 文件中所定义的LCD 控制参数最终也写进了S3C2440 处理器的LCD 控制寄存器的相应位置。通常情况下,LCD 屏生产厂家不会直接给出VBPD、VFPD 等LCD 控制参数的值,只能根据LCD屏的一些电气特性进行计算。5 LCD 控制参数计算方法要结合S3C2440 的LCD 时序以及LCD 屏的数字接口特性,才能计算出VBPD、VFPD 等LCD 控制参数。图2是S3C2440 芯片数据手册给出的LCD显示时序,明确给出了VBPD、VFPD 等控制参数的相互关系。
图2 S3C2440 的LCD 显示时序
表1 是某型号640Å~480 分辨率的LCD 屏的接口特性。结合图2 给出处理器的LCD 显示时序,可以得到这些LCD 控制参数的值。具体计算过程为:如图2 所示,VSPW+1=VSYNC Pulse width,而由表1 可知,这款LCD 屏的VSYNC Pulse width的典型值是3 个HS 周期。因此, 可以得出VSPW+1=3,即VSPW=2。同样,由图2 可知,(HSPW+1)+(VBPD+1)=VS DEN WIDTH,查表1 得VS DEN WIDTH 为35,可得VBPD 为31。同时,由图2 可知,(HSPW+1)+(VBPD+1)+(LINEVAL+1)+(VPFD+1)=FRAME (1)
又根据S3C2440 的数据手册可知,LINEVAL+1就是V 方向(垂直方向)的像素点数,即480。而在V 方向,FRAME 即VS period,查表1 可知,FRAME为525。将这些数据代入式 (1),得VPFD 的值为10。用同样的方法可以算出H( 水平) 方向上HSPW、HFPD、HBPD 的值。
表1 LCD 屏的接口特性[5]
6 结束语
通过上述计算结果不难看出:Windows CE 下LCD 显示驱动程序的架构相对固定。一般情况下,只需要根据LCD 屏的电气特性对其中某些参数进行调整即可。但这也对开发人员的硬件理解能力提出了较高的要求,若不能很好地理解LCD 屏数据手册中的参数意义,就很难正确得到Windows CE 所需的LCD 显示参数,无法正常驱动LCD 屏。