分类: LINUX
2014-04-26 18:51:28
原文地址:(十一)、LCD控制器 作者:machoe
LCD
LCD 液晶显示器是 Liquid Crystal Display 的简称,LCD 的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。
的分类液晶显示器按照控制方式不同可分为被动矩阵式LCD及主动矩阵式LCD两种。
被动矩阵式LCD
被动矩阵式LCD在亮度及可视角方面受到较大的限制,反应速度也较慢。由于画面质量方面的问题,使得这种显示设备不利于发展为桌面型显示器,但由于成本低廉的因素,市场上仍有部分的显示器采用被动矩阵式LCD。被动矩阵式LCD又可分为TN-LCD(Twisted Nematic-LCD,扭曲向列LCD)、STN-LCD(Super TN-LCD,超扭曲向列LCD)和DSTN-LCD(Double layer STN-LCD,双层超扭曲向列LCD)。
主动矩阵式LCD
目前应用比较广泛的主动矩阵式LCD,也称TFT-LCD(Thin Film Transistor-LCD,薄膜晶体管LCD)。TFT液晶显示器是在画面中的每个像素内建晶体管,可使亮度更明亮、色彩更丰富及更宽广的可视面积。与CRT显示器相比,LCD显示器的平面显示技术体现为较少的零件、占据较少的桌面及耗电量较小,但CRT技术较为稳定成熟。
接口
信号名称 |
描述 |
VSYNC |
垂直同步信号 |
HSYNC |
水平同步信号 |
HCLK |
像素时钟信号 |
VD[23:0] |
数据信号 |
LEND |
行结束信号(非必须) |
PWREN |
电源开关信号 |
S3C2440用LCD控制器向LCD传输图像数据,并提供必要的控制信号:VFRAME、VLINE、VCLK、VM等。
下图为其内部框图。
REGBANK是LCD控制器的寄存器组,包含了17个寄存器和一块256x16的调色板内存。LCDCDMA是LCD专用的DMA通道,使其可以在CPU不参预的状态下传输数据。VIDPRCS将LCDCDMA中的数据组合成特定的格式,然后通过VD发送给LCD屏。
其中LCDCDMA中有两个FIFO:FIFOH容量为16个字,FIFOL为12个。当采用“双扫”的方式时,分别传输上半屏和下半屏的数据。当采取“单扫”时,只采用FIFOH。当FIFO为空或者减少到设定的阈值时,LCDCDMA自动地发起DMA传输从内存中获得图像数据。
、图像显示的原理一幅图像被称为一帧,每帧由多行组成,每行由多个像素组成,每个像素的颜色使用若干位的数据表示。对于单色的显示器,每个像素使用1位表示,称为1BPP;对于256色显示器,每个像素使用8位表示,2^8=256,称为8BPP.
显示器从屏幕的左上方开始,一行一行的取得每个像素的数据并显示出来,当显示到一行的最右边时,跳到下一行的最左边开始显示新的一行;当显示完所有行后,跳到左方方,显示下一帧。我们称这种显示方式为“Z”字行的扫描,使用HSYNC、VSYNC信号来控制扫描路线的跳转,其中HSYNC表示:应该跳到下一行了;VSYNC表示:该跳到最上面了。
VSYNC频率:表示一秒中可以显示多少帧图像,称为垂直频率或场频率;
HSYNC频率:称为水平频率。
在了解对LCD操作之前,先来了解一下,图像数据是如何存储的。
显示器上的每个像素的颜色是由3部分组成:红、绿、蓝。这三种颜色的混合几乎可以表示人眼所能识别的所有颜色。可以根据颜色的浓烈程度按级区别,比如可以分成256个等级(0~255)。
白色:255级的红、255级的绿、255级的蓝三种混合组成;
黑色:0级的红、0级的绿、0级的蓝三种混合组成。
LCD的操作每个HSYNC信号表示一行数据的开始,每个VSYNC信号表示一帧数据的开始,无论数据是否有效。每个VCLK信号都表示正在传输一个像素的数据,无论它是否有效。数据的有效无效是对CPU的LCD控制器来说的,对于LCD,它只管读取数据和控制信号,不管是否有效。
参考下图,来分析一下时序:
(上图的上半部分,帧):
1) VSYNC信号有效时,表示一帧数据的开始。
2) VSPW表示VSYNC信号的脉冲宽度为(VSPW+1)个HSYNC信号的周期,即这个(VSPW+1)行的数据是无效的。
3) VSYNC信号脉冲之后,还要经过(VBPD+1)个HSYNC信号周期,有效的行数据才出现,所以,当VSYNC信号之后,总共有(VSPW+1+VBPD+1)个行的数据之后,有效的数据才行出现。
4) 随后,发送出了(LINEVAL+1)行的有效数据。
5) 最后是(VFPD+1)个无效的行。
(上图的下半部分,行):
1) HSYNC信号有效时,表示一行数据的开始。
2) HSPW表示HSYNC信号的脉冲宽度为(HSPW+1)个VCLK信号周期,即(HSPW+1)个像素是无效的。
3) HSYNC信号脉冲之后,还要经过(HBPD+1)个VCLK信号周期,有效的像素数据才出现。所以,在HSYNC信号有效之后,总共还需经过(HSPW+1+HBPD+1)个无效的像素。
4) 随后连续发出(HOZVAL+1)个有效的像素数据。
5) 最后是(HFPD+1)个无效的像素。
VCLK(Hz) = HCLK / [ ( CLKVAL + 1 ) ]
Frame Rate (Hz)= 1/[ { (VSPW+1) + (VBPD+1) +(LINEVAL+1) + (VFPD+1) } x { (HSPW+1) + (HBPD +1) + (HFPD+1) (HOZVAL+1) } x { 2 x (CLKVAL+1) / (HCLK) } ]
有了以上的知识,我们可以将VSYNC、HSYNC、VCLK等信号时间参数设置好后,并帧内存的地址告诉LCD控制器,它即可自动地发起DMA传输从帧内存中得到图像数据,并最终在上述信号的控制下出现在数据总线VD[23:0]上。
S3C2440控制器支持单色1BPP、4级灰度2BPP、16级灰度4BPP、256色8BPP的调色板显示模式;另外还支持64K色16BPP和16M色24BPP非调色板显示模式。以16M色24BPP为例,下面来介绍一下数据的具体存储格式:
16M色25BPP就是用24位(红、绿、蓝各8位)来表示一个像素的颜色。LCD控制器从内存中获得某个像素的24位颜色值后,直接通过VD[23:0]发送给LCD。为了方便DMA传输,采用4Byte即32位的方式,其中3个Byte从高到低分别表示红、绿、蓝。剩余一个Byte无效,至于哪个无效是可以配置的。
、LCD控制寄存器介绍1) LCDCON1
用于设置LCD类型、设置像素时钟、使能LCD信号的输出等。
这里请注意:[27:18]是只读的。
2) LCDCON2
用于设置垂直方向各种信号的时间参数。其中具体的数值要参考LCD屏的手册。东华3.5`的TFT见手册P18。
3) LCDCON3
与LCDCON2类型,LCDCON3用于水平方向的各种信号的参数。
4) LCDCON4
用于设置脉冲宽度与VCLK的关系,即:脉冲宽度=(HSPW+1)VCLK
5) LCDCON5
其中[16:13]为只读状态,不需设置。
而低12位用于设置各种信号的极性和使能、禁止。第12位用于选择24BPP时有效模式是低地址有效还是高地址有效。第11位用于选择16BPP的格式是5:6:5还是5:5:5:1。
6) LCDSADDR1~3 帧内存地址寄存器
帧内可以很大,而真正的在LCD屏幕显示的区域被称为view port,它处于帧内存之内。这3个寄存器用来配置帧内存的起始地址,view port在帧内存的位置。
l LCDSADDR1
对于本寄存器中的LCDBANK的理解,请大家参考推荐阅读的第3条。
功能 |
位 |
说明 |
LCDBANK |
[29:21] |
用来保存帧内存起始地址A[30:22],帧内存起始地址必须为4MB对齐 |
LCDBASEU |
[20:0] |
对于TFT,用来保存view port所对应的内存起始地址A[21:0],这块内存也称为帧缓冲区,frame buffer |
l LCDSADDR2
LCDBASEL [20:0],对于TFT,用来保存LCD的帧缓冲区结束地址A[21:0],其值计算公式:
LCDBASEL=LCDBASEU+(PAGEWIDTH+OFFSIZE)X(LINEVAL+1)
注意:可以修改LCDBASEU,LCDBASEL的值来实现图像的移动,不过不能在一帧图像的结束阶段(LCDCON1寄存器的LINECNT为0时)进行修改。因为此时LCD控制器会优先取得下一帧的数据,之后才改变这些值,这样的话,这些数据与新的帧缓冲区就不一致了。
l LCDSADDR3
功能 |
位 |
说明 |
OFFSIZE |
[21:11] |
参考上图,表示上一行最后一个数据与下一行第一个数据地址差值的一半,即以半字为单位地址差。 |
PAGEWIDTH |
[10:0] |
View port的宽度,以半字为单位。 |
本章我将为大家提供3个例程,我会打包上传到CSDN上面。包括,LCD-picture、LCD-HZ、LCD-machoe。
其中LCD-picture是画图例程,将其烧写到nand flash中后,会看到在LCD上画出的圆形,该例程是赵春江老师写的,稍候我会将他的博客地址放在推荐阅读部分。
其中LCD-HZ是汉字显示程序,这里我要特别说明:本程序如果在LINUX下编译,千万不要用VIM等编辑器打开源文件,因为fedora10的编辑器对汉字支持不是很好。如果打开,再编译,结果在LCD上会是乱码。如果想更改其中的汉字,方法一:请在WINDOWS下用记事本打开修改。方法二:如果想在LINUX下完成,请先对VIM进行汉字的支持,我会把汉字支持的部分资料贴到推荐阅读部分,但不做讨论。
LCD-machoe是本章讨论的重点,该程序烧写到nand flash中,运行后,在串口和LCD上均输出提示:please input with your keyboard。这时请大家用键盘输入字母或数字,观察LCD上的现象。该程序参考了天嵌的TQ2440_Test、uCOS、赵春江老师的部分源码,再此特别感谢。
、lcd-machoe简要分析整个程序的入口为head.S,在该文件与上一章串口没有变化。工程中的lcd.c文件为新增文件,提供LCD的操作API(初始化、绘制像素点、绘制ASCII码、绘制汉字、绘制背景)等功能。而其相关的定义在s3c24xx.h中完成。
主函数,依次调用初始化串口和LCD的函数,然后打印提示,最后进入死循环。我会尽量在程序中增加注释以提高理解。
本程序只为演示,还有很多不足的地方,希望大家在学习过程中不断完善,实现更多的功能。
1.韦东山 《嵌入式LINUX应用开发完全手册》
2.三星 《S3C2440手册》
3.
4. http://blog.csdn.net/zhaocj/category/653113.aspx
5. http://blog.163.com/cleave@126/blog/static/3547638620108133446840/
6.
7.
8.