UniversityofShanghaiforScienceandTechnology第七章LCD液晶显示器7.1LCD显示器概述LCD它是一种数字显示技术,可以通过液晶和彩色过滤器过滤光源,并在平面面板上产生图像。与传统的阴极射线管(CRT)相比,LCD占用空间小、低功耗、低辐射、无闪烁、降低视觉疲劳,具有很大的发展潜力。UniversityofShanghaiforScienceandTechnology1.LCD显示器的分类扭曲向列型(TN-TwistedNematic);超扭曲向列型(STN-SuperTN);双层超扭曲向列型(DSTN-Double-layerSuper-TwistedNematic);薄膜晶体管型(TFT-ThinFilmTransistor)。UniversityofShanghaiforScienceandTechnology2.LCD的常用指标PPI与分辨率PPI是指每平方英寸所拥有的像素(Pixel)数目。可见,PPI数值越高就意味着显示屏能够以更高的密度显示图像。显示的密度越高,拟真度也就越高。目前通用的TFT液晶显示屏大部分只有100PPI,如果拥有高一倍的显示画质(200PPI),显示效果会更好。UniversityofShanghaiforScienceandTechnology分辨率标准目前市面上的分辨率标准多种多样,主要有VGA、SVGA、UXGA和SXGA+。其中SXGA+所代表的显示分辨率为1400x1050。Quad-VGA是三菱公司的一种新分辨率标准,它所代表的分辨率1280x960,与一般标准XGA的1280x1024显示分辨率比较,Quad-VGA会较为扁平一点。UniversityofShanghaiforScienceandTechnology尺寸标示LCD显示器跟CRT显示器除显示方式不同以外,最大的区别就是尺寸的标示方法不一样。例如,CRT显示器在规格中标为17英寸,但实际可视尺寸达不到17英寸,只有15英寸多些;而对于LCD显示器,如果标示为15.1英寸,那么可视尺寸就是15.1英寸。UniversityofShanghaiforScienceandTechnology解析度LCD液晶显示器不像CRT显示器,它只支持“真实解析度”,通常等价于一般CRT显示器的最高解析度。其主要差别在于,LCD液晶显示器只有在“真实解析度”下才能表现最佳影像效果。解析度低于真实解析度时,影像可以被呈现,但影像无法如真实解析度般得到优化。UniversityofShanghaiforScienceandTechnology7.2嵌入式处理器的LCD控制器7.2.1LCD控制器的接口因为工作原理不同,液晶的显示接口时序可以分为STN和TFT两种。目前,一些嵌入式处理器可以同时支持STN和TFT的LCD显示器。以STN显示为例,从图7.1可以看出片内集成的LCD控制器可以产生必要的控制信号,如VFRAME、VLINE、VCLK和VM等。传输显示数据。LCD控制器的接口定义如表7-1示。UniversityofShanghaiforScienceandTechnology图7.1LCD控制器的结构图UniversityofShanghaiforScienceandTechnology信号描述功能VFRAMELCD控制器和LCD驱动器的帧同步信号控制LCD的帧显示,LCD控制器在一个完整的帧被显示后发送此信号VLINELCD控制器和LCD驱动器的行同步信号LCD控制器通过它将水平移位寄存器中的内容显示到LCD上,LCD控制器一整行数据被传输到LCD驱动器后发送VLINEVCLK刷新时钟它是LCD控制器与LCD驱动器之间的像素时钟信号,LCD控制器在此信号上升沿发送数据,LCD驱动器则在下降沿采样数据VMLCD驱动器的交流信号LCD驱动器用此信号来改变行和列的电压极性以控制像素的显示与否VD[7:0]数据线LCD像素输出端口表7-1LCD控制器的接口UniversityofShanghaiforScienceandTechnology7.2.2LCD控制器的设置LCD驱动编写的主要工作就是正确设置对应于所用LCD屏的CPU寄存器。表7-2所示为嵌入式处理器S3C2410中与LCD相对应的寄存器,表中给出了各个寄存器的简单描述,如果想了解它们的详细设置,请参考S3C2410的用户手册。UniversityofShanghaiforScienceandTechnology寄存器宏定义地址读/写描述复位LCD控制寄存器1LCDCON10x4d000000读/写工作信号控制寄存器0x0LCD控制寄存器2LCDCON20x4d000004读/写LCD水平/垂直尺寸定义0x0LCD控制寄存器3LCDCON30x4d000008读/写LCD控制寄存器30x0LCD控制寄存器4LCDCON40x4d00000c读/写LCD控制寄存器40x0LCD控制寄存器5LCDCON50x4d000010读/写LCD控制寄存器50x0帧缓冲地址寄存器1LCDSADDR10x4d000014读/写液晶类型和扫描模式定义0x0帧缓冲地址寄存器2LCDSADDR20x4d000018读/写设定显示缓冲区信息0x0帧缓冲地址寄存器3LCDSADDR30x4d00001c读/写设定虚拟屏偏移和页面宽度0x0红色设置寄存器REDLUT0x4d000020读/写定义8组红色数据查找表0x0绿色设置寄存器GREENLUT0x4d000024读/写定义8组绿色数据查找表0x0蓝色设置寄存器BLUELUT0x4d000028读/写定义8组蓝色数据查找表0x0抖动模式寄存器DITHMODE0x4d00004c读/写STN抖动模式寄存器0x0临时调色板寄存器TPAL0x4d000050读/写TFT临时调色寄存器,其值在下一帧时将变成视频数据0x0LCD中断挂起寄存器LCDINTPND0x4d000054读/写挂起LCD中断0x0LCD中断源挂起寄存器LCDSRCPND0x4d000058读/写挂起LCD中断源0x0LCD中断屏蔽寄存器LCDINTMSK0x4d00005c读/写屏蔽LCD中断源0x3表7-2LCD控制器相关的设置UniversityofShanghaiforScienceandTechnology1.设置VM、VFRAME、VLINEVM信号通过改变液晶的行列电压的极性来控制像素的显示,VM速率可以配置LCDCON1寄存器的MMODE位及LCDCON2寄存器的MVAL[7:0]。VM速率=VLINE速率/(2×MVAL)UniversityofShanghaiforScienceandTechnologyVFRAME和VLINE信号可以根据液晶屏的尺寸及显示模式,配置LCDCON2寄存器的HOZVAL和LINEVAL值,即:HOZVAL=(水平尺寸/VD数据位)-1彩色液晶屏时:水平尺寸=3×水平像素点数VD数据位:VD=4(4位单/双扫描模式)VD=8(8位单扫描模式)LINEVAL=垂直尺寸一1(单扫描模式)LINEVAL=(垂直尺寸/2)-1(双扫描模式)UniversityofShanghaiforScienceandTechnology2.设定VCLKVCLK是LCD控制器的时钟信号,它的计算需要先计算数据传送速率,由此设定的一个大于数据传送速率的值为VCLKVAL(LCDCONl[21:12])。数据传送速率=水平只寸×垂直尺寸×帧速率×模式值(MV)UniversityofShanghaiforScienceandTechnology3.帧速率帧速率可由以下公式得到:VCLK(Hz)=MCLK/(CLKVAL×2),其中LKVAL大于数据传送速率且不小于2帧速率(Hz)=((1/VCLK)*(HOZVAL+1)+(1/MCLK)*(WLH+WDLY+LINEBLANK))*(LINEVAL+1)]-1•LINEBANK:水平扫描信号LINE持续时间设置(MCLK个数)。•LINEVAL:显示屏的垂直尺寸。VCLK的计算还可以使用以下公式:VCLK(Hz)=(HOZVAL+1)/[(1/(帧速率×(LINEVAL+1)))-((WLH+WDLY+LINEBLANK)/MCLK)]UniversityofShanghaiforScienceandTechnology4.设定数据帧显示控制(LCDBASEU、LCDBASEL、PAGEWIDTH、OFFSIZE、LCDBANK)•LCDBASEU设置显示扫描方式中的开始地址(单扫描方式)或高位缓存地址(双扫描方式)。•LCDBASEL是设置双扫描方式的低位缓存开始地址。可用以下计算公式:LCDBASEL=LCDBASEU+(PAGEWIDTH+OFFSIZE)*(LINEVAL+1)•PAGEWDTH是显示存储区的可见帧宽度(半字数)。•OFFSIZE是显示存储区的前行最后半字和后行第一个半字之间的半字数。•LCDBANK是访问显示存储区的地址A[27:22]值,ENVID=1时该值不能改变。UniversityofShanghaiforScienceandTechnology7.3基于Framebuffer的LCD驱动程序实际上,Linux为显示设备专门提供了一类驱动程序,叫做帧缓冲(Framebuffer)设备驱动程序。UniversityofShanghaiforScienceandTechnology7.3.1Framebuffer驱动结构FrameBuffer的核心是一块供显示使用的内存。由系统中显示机构将显示内存中的内容显示到显示设备上。帧缓冲驱动本质上是一个字符设备的驱动,但是具有自己的框架。Linux下FrameBuffer驱动的结构和逻辑都不复杂,主要需要构建驱动程序帧缓冲操作的数据结构structfb_ops,在其中包含注册显示缓冲实现函数的指计。UniversityofShanghaiforScienceandTechnology1.FrameBuffer驱动的作用在程序设计中、对显示的操作即是对显示内存的操作。在简单的操作系统中,可以直接利用写显示内存的方法,获得显示的效果。在Linux操作系统中,提供了一种普遍的显示接口:FraraeBuffer驱动。使用FrameBuffer驱动可以更方便地完成应用程序的开发和系统的移植。UniversityofShanghaiforScienceandTechnology如果仅仅是需要让系统显示出内容.只需要向显示内存中写入数据,对于Linux,只需要切入到内核态,对显示内存进行操作即可。从这个角度来讲,用户不需要FrameBuffer时驱动也可以操作显示。FrameBuffer驱动的优点在于,它为显示程序的开发提供了一个框架。一方面,它封装了一部分对显示内存的操作,另一方面,它又对上层提供了统一的接口。开发者只需要实观FrameBuffer驱动对硬件的移植,就可以在上层使用FrameBuffer驱动方便的接口。Linux中帧缓冲驱动主要涉及的文件是include/linux目录中的fb.h。UniversityofShanghaiforScienceandTechnology对于FrameBuffer驱动,不仅为用户自己的程序调用,还可以被Linux内核和各种GUI系统调用。由于Linux内核集成了很多对FrameBuffer驱动的操作,很多GUI系统的显示部分也是基于FrameBuffer驱动。Linux下的FrameBuffer驱动结构如图7-2所示。UniversityofShanghaiforScienceandTechnology用户程序GUI系统Linux内核FrameBuffer驱动硬件(LCD控制器)移植层统一调用接口图7-2Linux下的FrameBuffer驱动结构UniversityofShanghaiforScienceandTechnology