第七章LCD液晶显示器_第1页
第七章LCD液晶显示器_第2页
第七章LCD液晶显示器_第3页
第七章LCD液晶显示器_第4页
第七章LCD液晶显示器_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章LCD液晶显示器1.LCD显示器的分类扭曲向列型(TN-TwistedNematic);超扭曲向列型(STN-SuperTN);双层超扭曲向列型(DSTN-Double-layerSuper-TwistedNematic);薄膜晶体管型(TFT-ThinFilmTransistor)。2.LCD的常用指标PPI与分辨率PPI是指每平方英寸所拥有的像素(Pixel)数目。可见,PPI数值越高就意味着显示屏能够以更高的密度显示图像。显示的密度越高,拟真度也就越高。目前通用的TFT液晶显示屏大部分只有100PPI,如果拥有高一倍的显示画质(200PPI),显示效果会更好。分辨率标准目前市面上的分辨率标准多种多样,主要有VGA、SVGA、UXGA和SXGA+。其中SXGA+所代表的显示分辨率为1400x1050。Quad-VGA是三菱公司的一种新分辨率标准,它所代表的分辨率1280x960,与一般标准XGA的1280x1024显示分辨率比较,Quad-VGA会较为扁平一点。尺寸标示LCD显示器跟CRT显示器除显示方式不同以外,最大的区别就是尺寸的标示方法不一样。例如,CRT显示器在规格中标为17英寸,但实际可视尺寸达不到17英寸,只有15英寸多些;而对于LCD显示器,如果标示为15.1英寸,那么可视尺寸就是15.1英寸。解析度LCD液晶显示器不像CRT显示器,它只支持“真实解析度”,通常等价于一般CRT显示器的最高解析度。其主要差别在于,LCD液晶显示器只有在“真实解析度”下才能表现最佳影像效果。解析度低于真实解析度时,影像可以被呈现,但影像无法如真实解析度般得到优化。7.2嵌入式处理器的LCD控制器7.2.1 LCD控制器的接口因为工作原理不同,液晶的显示接口时序可以分为STN和TFT两种。目前,一些嵌入式处理器可以同时支持STN和TFT的LCD显示器。以STN显示为例,从图7.1可以看出片内集成的LCD控制器可以产生必要的控制信号,如VFRAME、VLINE、VCLK和VM等。传输显示数据。LCD控制器的接口定义如表7-1示。图7.1 LCD控制器的结构图信号描述功能VFRAMELCD控制器和LCD驱动器的帧同步信号控制LCD的帧显示,LCD控制器在一个完整的帧被显示后发送此信号VLINELCD控制器和LCD驱动器的行同步信号LCD控制器通过它将水平移位寄存器中的内容显示到LCD上,LCD控制器一整行数据被传输到LCD驱动器后发送VLINEVCLK刷新时钟它是LCD控制器与LCD驱动器之间的像素时钟信号,LCD控制器在此信号上升沿发送数据,LCD驱动器则在下降沿采样数据VMLCD驱动器的交流信号LCD驱动器用此信号来改变行和列的电压极性以控制像素的显示与否VD[7:0]数据线LCD像素输出端口表7-1LCD控制器的接口7.2.2 LCD控制器的设置

LCD驱动编写的主要工作就是正确设置对应于所用LCD屏的CPU寄存器。表7-2所示为嵌入式处理器S3C2410中与LCD相对应的寄存器,表中给出了各个寄存器的简单描述,如果想了解它们的详细设置,请参考S3C2410的用户手册。寄存器宏定义地址读/写描述复位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-2 LCD控制器相关的设置1.设置VM、VFRAME、VLINEVM信号通过改变液晶的行列电压的极性来控制像素的显示,VM速率可以配置LCDCON1寄存器的MMODE位及LCDCON2寄存器的MVAL[7:0]。VM速率=VLINE速率/(2×MVAL)VFRAME和VLINE信号可以根据液晶屏的尺寸及显示模式,配置LCDCON2寄存器的HOZVAL和LINEVAL值,即:HOZVAL=(水平尺寸/VD数据位)-1彩色液晶屏时:水平尺寸=3×水平像素点数VD数据位:VD=4(4位单/双扫描模式) VD=8(8位单扫描模式)LINEVAL=垂直尺寸一1(单扫描模式)LINEVAL=(垂直尺寸/2)-1(双扫描模式)2.设定VCLKVCLK是LCD控制器的时钟信号,它的计算需要先计算数据传送速率,由此设定的一个大于数据传送速率的值为VCLKVAL(LCDCONl[21:12])。数据传送速率=水平只寸×垂直尺寸×帧速率×模式值(MV)3.帧速率帧速率可由以下公式得到: 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)]4.设定数据帧显示控制(LCDBASEU、LCDBASEL、PAGEWIDTH、OFFSIZE、LCDBANK)•LCDBASEU设置显示扫描方式中的开始地址(单扫描方式)或高位缓存地址(双扫描方式)。 •LCDBASEL是设置双扫描方式的低位缓存开始地址。可用以下计算公式:LCDBASEL=LCDBASEU+(PAGEWIDTH+OFFSIZE)*(LINEVAL+1)•PAGEWDTH是显示存储区的可见帧宽度(半字数)。 •OFFSIZE是显示存储区的前行最后半字和后行第一个半字之间的半字数。 •LCDBANK是访问显示存储区的地址A[27:22]值,ENVID=1时该值不能改变。7.3 基于Framebuffer的LCD驱动程序实际上,Linux为显示设备专门提供了一类驱动程序,叫做帧缓冲(Framebuffer)设备驱动程序。7.3.1Framebuffer驱动结构FrameBuffer的核心是一块供显示使用的内存。由系统中显示机构将显示内存中的内容显示到显示设备上。帧缓冲驱动本质上是一个字符设备的驱动,但是具有自己的框架。Linux下FrameBuffer驱动的结构和逻辑都不复杂,主要需要构建驱动程序帧缓冲操作的数据结构structfb_ops,在其中包含注册显示缓冲实现函数的指计。1.FrameBuffer驱动的作用在程序设计中、对显示的操作即是对显示内存的操作。在简单的操作系统中,可以直接利用写显示内存的方法,获得显示的效果。在Linux操作系统中,提供了一种普遍的显示接口:FraraeBuffer驱动。使用FrameBuffer驱动可以更方便地完成应用程序的开发和系统的移植。如果仅仅是需要让系统显示出内容.只需要向显示内存中写入数据,对于Linux,只需要切入到内核态,对显示内存进行操作即可。从这个角度来讲,用户不需要FrameBuffer时驱动也可以操作显示。FrameBuffer驱动的优点在于,它为显示程序的开发提供了一个框架。一方面,它封装了一部分对显示内存的操作,另一方面,它又对上层提供了统一的接口。开发者只需要实观FrameBuffer驱动对硬件的移植,就可以在上层使用FrameBuffer驱动方便的接口。Linux中帧缓冲驱动主要涉及的文件是include/linux目录中的fb.h。对于FrameBuffer驱动,不仅为用户自己的程序调用,还可以被Linux内核和各种GUI系统调用。由于Linux内核集成了很多对FrameBuffer驱动的操作,很多GUI系统的显示部分也是基于FrameBuffer驱动。Linux下的FrameBuffer驱动结构如图7-2所示。用户程序GUI系统Linux内核FrameBuffer驱动硬件(LCD控制器)移植层统一调用接口图7-2Linux下的FrameBuffer驱动结构2.FrameBuffer驱动结构Linux的FrmneBuffer驱动从本质上,还是一种字符设备驱动程序,但是它不直接使用字符设备驱动程序的框架(file_operations),而是有自己的另外一套框架。fb_info是一个描述FrameBuffer属性的数据结构,以linux2.6内核为例,其定义如下:structfb_info{intnode;intflags;structfb_var_screeninfovar;/*显示屏变量*/structfb_fix_screeninfofix:/*显示屏固定量*/structfb_monspecsmonspecs;/*当前监视器规格*/structwork_structqueue;/*帧缓冲事件队列*/structfb_pixmappixmap;/*图像硬件映射*/structfb_pixmapsprite;/*硬件光标映射*/structfb_cmapcmap;/*当前cmap*/structlist_headmodelist;/*模式列表*/structfb_ops*flops;structdevice*device;#ifdefCONFIG_FB_TILEBLITTINGstruetfb_tile_ops*tileops;/*帧缓冲tile操作*/#endifchar__iomem*screen_base;/*虚拟地址*/unsignedlongscreen_size;/*IO重映射VRAM或者0*/void*pseudo_palene;/*为16位颜色的调色板*/#defineFBINFO_STATE_RUNNING0#defineFBINFO_STATE_SUSPENDED1u32state;/*硬件状态,例如:挂起*/void*fbcon_par:/*fbcon使用的私有区域*//*以下为硬件相关的*/void*par;};在这个数据结构中.最主要的成员为数据结构structfb_var_screeninfo,它描述了屏幕的状态,例如可见显示分辨率(visibleresolution)、虚拟显示分辨率(virtualfesolution),虚拟显示偏移、像索深度等参数。其定义如下所示:structfb_vat_screeninfo{__u32xres;/*可见分辨率*/__u32yres;__u32xres_virtual;/*虚拟分辨率*/__u32yres_virtual;__u32xoffset;/*虚拟到可见的偏移量*/__u32yoffset;__u32bits_per_pixel;__u32grayscale;/*如果不为0灰度级代替彩色*/structfb_bitfiedred;/*如果为真色彩代表帧缓冲的位域*/__u32grayscale;/*如果不为0灰度级代替彩色*/structfb_bitfiedred;/*如果为真色彩代表帧缓冲的位域*/structfb_bitfiedgreen;/*否则只有长度有意义*/structfb_bitfiedblue;structfb_bitfiedtransp;/*透明度*/__u32nonstd;/*!=0非标准像素格式*/__u32activate;__u32height;/*画面内存映射的高*/__u32width;/*画面内存映射的宽*/__u32accel_flags;/*(废弃)*/__u32pixclock;/*每秒的像素时钟*/__u32left_margin;/*画面事件同步的值*/__u32right_margin;__u32upper_margin;一u32lower_margin;__u32hsync_len;/*水平同步的长度*/__u32vsync_len;/*垂直同步的长度*/__u32sync;__u32vmode;__u32rotate:/*顺时针转动角度*/__u32reserved[5];/*为兼容保留*/};在structfb_var_screeninfo中,支持虚拟显示屏,其概念为,显示内存比实际可见区域要大。可见区域实际上是显示内存中的一个部分,它是实际在LCD上显示的区域。在显示内存中,涉及的显示属性包括虚拟显存宽度、虚拟显存高度、定义偏移量x,偏移量y,可见区域宽度、可见区域高度。虚拟显示屏的概念如图11-6所示。虚拟显存X虚拟显存Y可见区域X可见区域Y偏移量X偏移量Y图11-6虚拟显示屏的概念注意:structfb_var_screeninfo定义了一个功能较为全面的显示信息,在一般的LCD控制器中,不是每种功能都具有,或者即使LCD控制器有这种功能,但是不实现也可以完成基本的操作。fb_info的成员structfb_fix_screeninfo定义了显示输出设备的各种属性,包括显示缓冲的起始地址、显示缓冲长度、显示缓冲类型等。这参数在设置完成后,一般都是只读的。structfb_fix_screeninfo{charid[16];/*辨识字符串,例如:“TTBuiltin”*/unsignedlongsmem_start;/*帧缓冲起始地址*//*物理地址*/__u32smem_len;/*帧缓冲内存的长度*/__u32type;__u32type_aux;/*隔行扫描位平面的插入值*/__u32visual;__u16xpanstep;__u16ypanstep;__u16ywrapstep;__u32line_length;/*每行字节数*/unsignedlongmmio_start;/*内存映射I/0起始地址(物理地址)*/__u32mmio_len;/*内存映射I/O的长度*/__u32accel;/*表示驱动的细节*/__u16reserved[3];/*为兼容保留*/};structfb_ops是fb_info另外一个重要的成员.它定义了各种对显示缓冲的操作,这个数据结构由一系列的函数指针组成。struetfb_ops{/*open/releaseandusagemarking*/structmodule*owner;int(*fb_open)(structfb_info*info,intuser);int(*fb_release)(structfb_info*info,intuser);ssize_t(*fb_read)(structfile*file,char_use*bur,size_tcount,loff_t*ppos);ssize_t(*fb_write)(structfile*file,constcharuser*bur,size_tcount,loff_t*ppos);int(*fb_check_var)(structfb_var_screeninfo*var.structfb_info*info);int(*fb_set_par)(structfb_info*info);int(*fb_setcolreg)(unsignedregno,unsignedred,unsignedgreen,unsignedblue.unsignedtransp,structfb_info*info):int(*fb_blank)(intblank,structfb_info*info);int(*fb_pan_display)(structfb_var_screeninfo*var,structfb_info*info);void(*fb_fillrect)(structfb_info*info,conststructfb_fillrect*rect);void(*fb_copyarea)(structfb_info*info,conststructfb_copyarea*region);void(*fb_imageblit)(structfb_info*info,conststructfb_image*image);int(*fb_cursor)(structfb_info*info,structfb_cursor*cursor);void(*fb_rotate)(structfb_info*info,intangle);int(*fb_sync)(structfb_info*info);int(*fb_iocfl)(strectinode*inode.structfile*file,unsignedintcmd,unsignedlongarg,structfb_info*info);int(*fb_compatioctl)(structfile*f,unsignedcmd,unsignedlongarg,structfb_info*infoint(*fb_mmap)(structfb_info*info,structfile*file,structvm_area_struct*vma);};在struetfb_ops主要的成员包括.缓冲的打开fb_open、缓冲的关闭fb_release、读fb_read、写fb_write、控制fb_ioctl、内存映射fb_mmap,这些和一般字符设备驱动程序是对应的。其他操作还包括调整显示fb_pan_display、填允矩形fb_fillrect、区域复制fb_copyarea等。在应用程序中,一种常用的方式是使用mmap操作映射FrameBuffer到内存。例如:#defineWidth640#defineHejgIlt480intfd;unsignedchar*FrameBuffer;fd=open(“/dev/fb0”,O_RDWR);FrameBuffer=mmap(NULL,Width*Height,-PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);/*显示区域操作*//*……*/close(fd);以上程序是在应用程序中清空屏幕,首先将FrameBuffer作为文件打开,接下来,使用库函数mmap将FrameBuffer映射到内存,mmap在内部会调用驱动程序fb_ops。数据结构的成员fb_mmap完成内存映射。内存映射完成后,可以使用各种针对内存的操作控制显示缓冲区。显然,对显示区域的操作还需要知道显示区域的像素格式(PixelFormat)。知识小结1.FrameBuffer驱动本质上是一个字符驱动程序。2.FrameBuffer驱动的核心数据结构是fb_info,它主要提供对显示内存映射的功能。7.3.2虚拟显示缓冲驱动分析在Linux内核中.最为基本的FrameBuffer驱动是虚拟显示缓冲驱动(vfb),它并不针对具体的现实硬件,而是利用内存中开辟的虚拟显示内存.模拟对显示的操作。因此,实际上它并不可能完成显示的功能。vfb实际上可以作为一个显示驱动程序的模块,利用对它的更改,可以完成对显示硬件的移植。1.虚拟帧缓冲的数据结构及初始化在Linux中,“drivers/video目录的vfb.c文件是vfb驱动程序。其中定义vfb_driver为虚拟帧缓冲的驱动程序结构体,vfb_device是显示设备结构体。staticstructdevice_drivervtb_driver={.name=“vfb”,.bus=&platform_bus_type,.probe=vfb_probe,.remove=vfb_remove,};slaticstructplatform_devicevfb_device={.name=“vfb”,.id=0,.dev={.release=vfb_platform_release,}};int__initvfb_init(void){introt=0;#ifndefMODULEchar*option=NULL;if(fb_get_options(“vfb”,&option))return-ENODEV;vfb_setup(option);#endif

if(!vfb_enable)return-ENXI0;ret=driver_register(&vfb_driver);if(!ret){ret=platform_device_register(&rfb_device);if(rot)driver_unregister(&vfb_driver);}returnret;}moduleinit(vib—init);在虚拟显示缓冲中,vfb_init被注册为系统的初始化函数,完成系统的初始化工作。其中,vfb_driver是显示的驱动,vfb_device是显示的设备,driver_register()是linux2.6内核中对设备驱动自动注册的函数,它调用设备驱动数据结构(structdevice_driver)中的probe成员完成对设备的注册。如果注册成功,则调用platform_device_register把平台设备注册到平台中。!提示在linux2.6中,设备驱动(对应结构structdevice_driver)的注册调用函数driver_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论