随着液晶技术的提高、高性能嵌入式处理器的推出及其硬件成本的不断降低,彩色LCD在各嵌入式系统中的应用也越来越广泛。TFT-LCD是一种广泛应用于电视、笔记本电脑、监视器、手机等各个方面的有源矩阵液晶显示器件。与无源的简单矩阵不同,其显示屏的每个像素点上都制作了一个有源薄膜场效应管 TFT,通过对TFT的通断控制而实现对LCD的信号写入与显示控制,可有效克服LCD显示时的串扰,显著提高图像质量。LCD离不开驱动控制,驱动系统通常是由专用LCD控制器、微控制器及其相应软件构成的。PXA270中集成了一个LCD控制模块,在嵌入式系统中将PXA270与LCD结合将使系统的更加优化。本文分析了LCD的驱动控制原理,并以基于PXA270的开发装置XSBase270和Linux操作系统为平台,通过系统的软硬件设计,实现了对TFT-LCD的良好驱动控制。
1 TFT-LCD工作原理及等效
1.1 TFT-LCD彩色显示的基本原理
TFT-LCD是一种广泛应用于电视、笔记本电脑、监视器、手机等各个方面的有源矩阵液晶显示器件。彩色液晶显示器件分单色和多色(全彩色)两种,在全彩色的实现方式中技术成熟的是“微彩色膜”方式。它将点阵像素分割成红、绿、蓝3个子像素,并在其对应位置的器件内表面设置R、G、B三个微型滤色膜,此时液晶显示器件仅仅作为一个光阀,控制每个子像素光阀,就可以控制滤色膜透过光的通断,控制光阀的灰度等级,就可能控制相应滤色膜透过光的多少,利用R、G、B三个子像素透过的不同光量,便可以混合加色实现极为丰富的彩色。如果R、G、B三个子像素均可实现人眼对灰度的分辨能力64级灰度驱动,就可以实现有64*64*64约26万种彩色的“真彩色”。
TFT-LCD每个像素从结构上可以看作像素电极和共同电极之间夹一层液晶。当薄膜场效应管TFT的栅极G与源极S未被选通时,TFT处于截止态,此时Roff的值达3.3×l011Ω,近似绝缘,故液晶像素上不能施加上电压,不能显示。当扫描线栅极G被选通,寻址线源极S也被同步选通时,TFT被打开,此时Ron仅1.4×106Ω左右,显示像素被信号写入。TFT的通断比大于106 ,可以满足液晶像素对通断比的要求,与无源的TN-LCD、STN-LCD的简单矩阵相比,可有效地克服非选通时的串扰。写入的信息电压由于补偿电容CS和像素本身电容CLC的作用,在撤销写入后会自行保持一段时间。
2 PXA270及其嵌入式LCD控制器
Intel公司32位的嵌入式微处理器PXA270采用ARM构架、RISC技术和XScal核心的嵌入式微处理器,采用多级超级流水线,频率最高为624 MHz,低功耗、高性能,集成了众多的诸如LCD、脉宽调制、音频、红外、串口、多媒体无线通信等外设功能控制器与接口,广泛应用于各种嵌入式系统之中[1]。
LCD的寄存器组主要有LCCR0、LCCRl、LCCR2和LCCR3等:LCCR0用于配置彩色/单色、单屏/双屏、被动/主动显示选择等控制;LCCRl用于配置水平方向的扫描,如每行像点数PPL、水平同步时钟宽度HSW、行结束像点时钟等待计数ELW、行开始信号时钟等待计数BLW 等;LCCR2用于配置垂直方向的扫描,如每屏行数LPP、垂直同步脉冲宽度VSW、帧结束行时钟等待计数EFW、帧开始时钟等待计数BFW 等;LCCR3用于配置像素时钟频率以及各种同步脉冲的极性,如像素时钟分频参数PCD、每像素的位数BPP等。在DMA控制器被初始化后,输入FIFO 就会向DMA控制器发出服务请求,后者即从Frame Buffer里提取数据到输入FIFO。当输入像素数据编码位数小于16时,需将其转换为16位颜色编码经调色板输出,等于16位时则绕开调色板直接到输出FIFO。
3 LCD驱动的工作时序
其中L_PCLK为像素时钟,用于把像素数据输入到LCD显示器中的移位寄存器中,针对于TFT- LCD连续跳变;L_LCLK为行扫描时钟,针对于TFT-LCD是水平同步信号,用于LCD显示器行显示的结束和把移位寄存器的行数据送到显示器中,并且行指针加1;L_FCLK为帧扫描时钟,针对于TFT-LCD是垂直同步信号,用于LCD显示器新的帧像素的开始,复位时行指针指向屏幕的顶部;L_BIAS是数据使能信号[2]。
显示驱动硬件主要由嵌入式LCD控制器、微处理器与LCD显示屏的接口等部分构成。
由于PXA270集成了LCD控制单元,这使LCD接口的设计变得十分简单。只须电气连接,无须外扩LCD控制芯片。像素点16位数据线,使用5红、6绿和5蓝实现不同颜色的显示,而TFT-LCD红、绿、蓝均有6个引脚,故将B0、R0接地。LCD的显示效果与功耗在很大程度上决定于背光源,因而需对其进行控制。地址线SA-A[20-22]作为译码输入,基地址为Ox0800_0000 的片选信号nCS2选中74LCXl38译码器,让74LCXl38的输出引脚Y0产生脉冲上升沿,驱动LCX374锁存来自数据总线的低8位数据,只要在数据总线上输出Ox80,则可通过Q7使LCD-BACK-0N/0FF输出高电平,控制LCD背光源打开。
5 软件设计
软件主要由嵌入式操作系统与应用软件两部分构成,在应用软件中完成对LCD的驱动。本文采用Linux-2.4.19作为软件平台,程序的交叉编译使用arm-linux-gcc,其中Linux-2.4.19-rmk6-pxal-cerf1内核能稳定地支持PXA270处理器,因Linux的源代码开放,将其下载后只需根据自己的硬件配置对内核中的现有代码与驱动进行裁剪、修改、移植或编写部分驱动。PXA270对LCD显示屏的驱动分为两个方面:一是对LCD控制器及相关部件的初始化,包括创建Frame Buffer、寄存器组与DMA通道的设置等;二是对Frame Buffer的读、写等操作[3、4、5]。
5.1 定义显示缓冲区
Linux下的LCD驱动属于字符设备驱动范围,PXA270处理器与LCD间数据传输也非常频繁,因而在内存中定义一个“显示缓冲区”Frame Buffer,形成一个虚拟的显示器,具体位置在Linuxdriversvideo下。Frame Buffer的大小=每像素位数*每屏行数*(每行像素+每行需插入的空像素)/8。本系统中LCD分辨率为640*480,16位/像素,单屏幕模式,Frame Buffer理论值为614400个字节,实际设置640KB。
5.2 初始化函数的编写
在linux的/drivers/video/pxafb.c文件中,通过fb_options()和pxafb_setup()函数来获取内核的启动参数并返回pxafb_driver结构,该结构中pxafb_probe是一个函数指针,指向pxafb_probe()函数,在该函数中完成对 LCD控制器和Frame Buffer等的整个初始化过程,初始化函数部分代码如下:
struct pxafb_info * fbi; //数据结构pxafb_info,主要用于Frame Buffer设备及其操作驱动框架的参数定义,如Frame Buffer的物理和虚拟地址、DMA和一些LCD控制寄存器描述参数等
struct pxafb_mach_info * inf; //数据结构pxafb_mach_info,定义运行机器的一些参数,如pixclock、xres、yres等
pxafb_backlight_power = inf->pxafb_backlight_power; //LCD背光
pxafb_lcd_power = inf->pxafb_lcd_power; //LCD电源
fbi = pxafb_init_fbinfo(dev); //完成数据结构pxafb_info和pxafb_mach_info的初始化,设置使用的字体、显示屏的规格等LCD硬件参数并保存到其中
ret = pxafb_map_video_memory(fbi); //根据LCD硬件参数在内存创建显示缓冲区
pxa_set_cken(CKEN16_LCD,1); //时钟使能寄存器CKEN可使能许多外设单元的时钟,其bit16置1使能LCD单元时钟