摘 要:分析了TFT-LCD与PXA270内嵌的LCD控制器的基本原理与时序,根据它们的特点与时序要求,设计了TFT-LCD的硬件驱动接口电路,基于Linux-2.4.19内核设计了相应的驱动程序,软硬件在目标板上工作良好。该设计对于驱动TFT-LCD具有通用性,由于Linux驱动程序移植性强,因而该设计可适用于工业控制领域多种嵌入式系统。 关键词: Linux;嵌入式系统;TFT-LCD;显示驱动;PXA270
随着液晶技术的提高、高性能嵌入式处理器的推出及其硬件成本的不断降低,彩色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是一种广泛应用于电视、笔记本电脑、监视器、手机等各个方面的有源矩阵液晶显示器件。彩色液晶显示器件分单色和多色(全彩色)两种,在全彩色的实现方式中技术成熟的是“微彩色膜”方式。TFT-LCD彩色显示原理如图1所示。它将点阵像素分割成红、绿、蓝3个子像素,并在其对应位置的器件内表面设置R、G、B三个微型滤色膜,此时液晶显示器件仅仅作为一个光阀,控制每个子像素光阀,就可以控制滤色膜透过光的通断,控制光阀的灰度等级,就可能控制相应滤色膜透过光的多少,利用R、G、B三个子像素透过的不同光量,便可以混合加色实现极为丰富的彩色。如果R、G、B三个子像素均可实现人眼对灰度的分辨能力64级灰度驱动,就可以实现有64*64*64约26万种彩色的“真彩色”。
1.2 TFT-LCD显示单元的等效

TFT-LCD每个像素从结构上可以看作像素电极和共同电极之间夹一层液晶,显示单元等效电路如图2所示。当薄膜场效应管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驱动的工作时序
图4所示为LCD驱动主动模式下的工作时序图。其中L_PCLK为像素时钟,用于把像素数据输入到LCD显示器中的移位寄存器中,针对于TFT-LCD连续跳变;L_LCLK为行扫描时钟,针对于TFT-LCD是水平同步信号,用于LCD显示器行显示的结束和把移位寄存器的行数据送到显示器中,并且行指针加1;L_FCLK为帧扫描时钟,针对于TFT-LCD是垂直同步信号,用于LCD显示器新的帧像素的开始,复位时行指针指向屏幕的顶部;L_BIAS是数据使能信号[2]。
4 微处理器与LCD显示屏的接口
显示驱动硬件主要由嵌入式LCD控制器、微处理器与LCD显示屏的接口等部分构成。
图5所示为PXA270微处理器与LCD接口原理图。由于PXA270集成了LCD控制单元,这使LCD接口的设计变得十分简单。只须电气连接,无须外扩LCD控制芯片。
L_DD[15:O]:像素点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,形成一个虚拟的显示器,具体位置在Linux\drivers\video下。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单元时钟
pxafb_check_var(&fbi->fb.var,&fbi->fb); //为控制设备驱动的高层提供一个驱动Frame Buffer的界面
pxafb_set_par(&fbi->fb); //配置用户定义的显示控制台,并进一步调用pxafb_activate_var()函数,将fb_var_screeninfo数据结构中的参数写到PXA270 LCD控制器,来生成LCCR0~LCCR3等多个相关寄存器映像,从而达到设置LCDC寄存器的目的
ret = register_framebuffer(&fbi->fb); //注册Frame Buffer使其与控制台设备驱动的高层连接
5.3 显示缓冲区的访问操作
在用户程序中对显示缓冲区设备/dev/fb的访问是通过调用文件层的操作函数来实现。首先用Linux\drivers\video\fbmem.c中的fb_open()打开代表Frame Buffer的/dev/fb设备文件;然后通过fb_ioctl()操作获取LCD显示屏的分辨率屏长、屏宽和每个像素点的位数bpp值等,进而计算得到Frame Buffer的大小并通过fb_mmap()将其映射到用户空间;最后即可通过fb_read()、fb_write()直接对Frame Buffer进行读、写操作,显示相应图像。
驱动程序经编译和连接,定位后加载到kernel,烧到目标板,实现PXA270对TFT-LCD的显示驱动。
6 结论
本文作者创新点:提出了一种基于PXA270和Linux-2.4.19内核的TFT-LCD嵌入式驱动方案,通过分析TFT-LCD与PXA270内嵌的LCD控制器的工作原理与时序,设计了TFT-LCD的驱动硬件电路和相应软件,实现了PXA270 对LCD的驱动,经在目标板上运行效果显示,各个信号的时序完全满足TFT-LCD的要求。本设计应用于工控领域作为显示输出设备,具有硬件紧凑简单、软件可裁剪和移植、便携性、可视化等优点。
参考文献:
[1] 宁志刚,汪仁煌. 基于PXA270的PDA交通管理系统在Linux环境下的实现[J].电子技术应用,2004,(4):15-17
[2] Intel Corporation. Intel® PXA270 Processor Developer’s Manual[R].2004.1
[3] 郑灵翔.嵌入式系统设计与应用开发[M].北京:北京航空航天大学出版社,2006.2
[4] 安吉宇,等.基于Intel PXA270的TFT-LCD驱动设计[J].液晶与显示,2006,21(6):279-282
[5] 兰立荣,陆以勤,吕锦.基于ARM系统高分辨率彩屏设计方法[J].微计算机信息,2006,22(9-2):122-123
|