结合IntelPXA270内置的LCD控制器和FG070053DSSWJGT1液晶屏的内部结构以及时序图的分析,设计LCD显示接口电路,主要是把IntelPXA270的控制信号与LCD屏的控制引脚连接起来,如图3所示。通过16位数据线把LCD控制器的数据发送脚与FG070053DSSWJGT1的数据接收脚连接起来,即把(R0—R4,G0—G5,B0—B4)与L_DD0-L_DD15连接起来;把帧时钟,行时钟,像素时钟等与LCD屏连接; ADJ采用电压为0—3.0V、 频率为20KHZ的PWM脉冲,调节液晶屏背光灯的亮度,在满足用户要求的同时还可有效地控制功耗。图3中,网络标号LCLK是行时钟控制信号,FCLK是帧时钟控制信号,PCLK是像素时钟控制信号,OE为数据输出使能信号。VDD由直流5V稳压电源提供,U/D通过电阻拉低后对屏幕提供上下翻转信号,L/R支持屏幕左右翻转控制。
图3 TFT LCD接口电路
3 LCD显示程序的设计
在WindowsCE下LCD驱动程序开发使用基本图形引擎(GPE)类来实现[1] [5]。在使用GPE类编写驱动程序之前,首先分析使用GPE类编写显示驱动时对显示设备的要求,内存布局要求显示设备使用线性帧缓冲区,全部的显示内存是连续的;接下来分析GPE类对内存中数据格式的要求。LCD屏是自顶向下的格式,像素(0,0)在左上角,像素(width-1,height-1)在右下角。 帧缓冲区的步幅,即表示显示设备上一个扫描行在内存中占的字节数,应当是四字节的整数倍,即使在每个扫描行的末尾填充一些无用的字节,CPU不需做“排”选择也可以存取整个帧缓冲区,帧缓冲区不应当使用位面(位面就是每种颜色信道<RGB>在帧缓冲区进行分开存储)。
使用IntelPXA270 内置的LCD控制器,集成了7个通道的DMA,支持像素深度分别为2、4、8、16、18、24位的RGB模式,采用16位RGB模式进行设计。图像数据保存在内存中,使用DMA方式进行帧数据存取,帧的大小及帧地址是指定的,可以满足GPE类的线性帧缓冲区的要求,LCD控制与LCD屏都满足WindowsCE 下使用GPE类来实现显示驱动的硬件要求。
3.1 创建基于GPE类的显示驱动程序
使用GPE类简化了WindowsCE显示设备的开发工作,GPE类代表一个显示设备,是一个纯虚的类,设计显示驱动时必须继承这个基本GPE类。
首先定义一个新的类(class SA2Video)来继承GPE类,根据GPE类的要求,实现以下函数:
NumModes ------返回显示驱动所支持的显示模式。
GetModeInfo ------返回指定显示模式的信息,如显示像素宽度和深度,处理由NumModes()函数返回的显示模式,当SetModes()函数被调用时,总是返回在模式配置列表中的第一个模式值。
SetModes ------设置显示模式。
AllocSurface------分配一个页面,页面仅仅是保存像素数据的RAM或视频RAM,是一个块内存,GPESurf类能用于代表系统显存上的一个页面,保证在视频RAM上分配一个页面。
SetPointerShape------设置光标位图和光标区。
MovePointer------移动光标。
BltPrepare ------在位块传输操作之前调用,如果驱动支持位块传输之前的操作,它就允许驱动建立硬件位块传输(blit)操作,并返回一个实际操作函数去执行位块传输(blit),在GPE类中提供默认的Blit操作函数。
BltComplete------在块传输完成之后执行,如果有必要的话,它允许设备做任何的清除操作。
Line ------在画线操作之前和之后调用,如果在画线之前调用,该函数可以建立硬件的画线操作,然后返回GPE默认的画线操作;如果在画线之后调用,该函数可以做任何画线操作之后的清除。
InVBlank ------标志是否在水平同步周期时显示更新了。
这些函数在GPE类的源代码中为空函数,所以必须在(class SA2Video)中实现函数重载。
3.2 创建LCD控制器接口驱动程序
创建LCD控制器的接口驱动程序主要是完成硬件的配置,包括LCD控制器和IO引脚接口的配置。首先根据LCD显示接口的电路连接,配置IntelPXA270内的IO寄存器,然后根据外接的LCD屏提供的参数配置LCD控制器,主要是配置TFT接口时序,如帧时钟,行时钟,像素时钟,数据输出使能等[6]。在xllp_lcd.c文件中的XllpLCDInit()函数实现硬件的初始化,以下为该函数的关键代码:
XLLP_STATUS_T XllpLCDInit(P_XLLP_LCD_T pXllpLCD)
{ XLLP_STATUS_T status = 0;
// 初始化IO接口,根据LCD连接电路图进行配置
LCDSetupGPIOs(pXllpLCD);
// 初始LCD控制器及帧缓冲区
LCDInitController(pXllpLCD);
// 清除LCD控制器的状态寄存器
LCDClearStatusReg(pXllpLCD);
// 使能LCD 控制器,驱动LCD屏显示数据
LCDEnableController(pXllpLCD);
return status;
}
3.3 LCD控制器显示模式的设置
WindowsCE GDI 支持带有多种颜色灰度和颜色模式的显示设备,从仅用一位表示的颜色到调色板调制出真32位RGB,每一种格式支持几种不同的像素排列方式,这取决于对显示内存的访问是否支持单字节方式、双字节字方式、四字节方式。
使用下列掩码来提取红、绿、蓝数值:每个像素用16位表示的格式是一种掩码格式,并且不被调色,每个像素我们用两字节来存储。结合TFT LCD显示接口的硬件电路图和IntelPXA270 内置的LCD控制器,按照IntelPXA270处理器手册上的说明,需要对控制引脚初始化[7]。在图3中,第14口用来进行帧时钟控制,结合IntelPXA270数据手册,我们配置第14口为L_VSYNC功能,用如下语句实现:
GAFR0_L|=((GAFR0_L&~(1u<<29))|(1u<<28))
所有显示数据线L_DD0—L_DD15都设为输出口,并设为显示器的数据输出,程序设计如下: