http://liu1227787871.blog.163.com/blog/static/2053631972012510608298/
一、显示屏上数据的组织格式
一幅图像称为一帧,每帧由多行组成,每行由多个像素组成,每个像素的颜色使用若干位的数据来表示。
显示器从屏幕的左上方开始,一行一行地取得每个像素的数据并显示出来啊,当显示到一行的最右边时,跳到下一行的最左边开始显示下一行;当显示完所有行之后,跳到左上方开始下一帧。这些跳转由信号来控制,HSYNC表示是跳到最左边的时候了,VSYNC表示是跳到最上边的时候了。
在工作中的显示器上,可以在四周看见黑色的边框。上方的黑框是因为发出VSYNC信号时,需要经过若干行后才出现第一行有效数据;下方的黑框是因为显示器还没扫描到最下边(VSYNC信号还没有发出),这时信号已经无效;左边的黑框是因为当发出HSYNC信号时,需要经过若干个像素之后才出现第一列有效数据;右边的黑框是因为,显示完一行数据时,显示器还没有发出扫描到最右边(HSYNC信号还没有发出),这时数据已经无效。显示器只会依据VSYNC、HSYNC信号来取得、显示数据,并不会理会这些数据是否有效,合适发出有效数据由显卡决定。
二、LCD控制器的特性与结构
s3c2440 LCD控制器提供了驱动STN LCD、TFT LCD所需的所有信号,其内部结构如下图所示:
![LCD基础知识 - 小白 - 小白的博客](http://img4.ph.126.net/C1Bl5QyFph3mrOOgTg-axw==/1297599642653741984.jpg)
REGBANK是LCD控制器的寄存器组,含17个寄存器及一块256*16的调色板内存,用来设置各项参数。而LCDCDMA则是LCD控制器专用的DMA通道,可以自动地从系统总线上取得图像数据,这使得显示图像时不需要CPU的干涉。VIDPRCS将LCDCDMA中的数据组合成特定的格式(比如4位单扫、4位双扫、8位单扫等),然后从VD[23:0]发送给LCD屏幕,同时TIMEGEN和LPC3600负责产生LCD屏所需要的控制时序,例如VSYNC、HSYNC、VCLK、VDEN,然后从VIDEO MUX送给LCD屏。其中LPC3600专用于SEC TFT LCD。
LCDCDMA中有两个FIFO:FIFOH容量为16个字(1个字是4个字节),FIFOL容量为12个字。当使用双扫方式时,FIFOH、FIFOL分别用于传输上半屏数据、下半屏数据;当使用单扫模式时,只用到FIFOH。当FIFO为空或者其中的数据已经减少到设定的阀值时,LCDCDMA自动地发起DMA传输从内存中获得图像数据。
三、TFT LCD的操作
先了解TFT LCD的时序,这使得我们在设置各个寄存器时有个形象的概念,每个VSYNC信号表示一帧数据的开始,每个HSYNC信号表示一行数据的开始,无论这些数据是否有效,每个VCLK信号表示正在传输一个像素的数据,无论它是否有效。数据是否有效只是对CPU的LCD控制器来说的,LCD根据VSYNC、HSYNC、VCLK不停地读取、显示总线数据。
1、时序分析
![LCD基础知识 - 小白 - 小白的博客](http://img1.ph.126.net/OmzQ9hjO0RVK6CdhJu-sNw==/93168217308841411.jpg)
(1)VSYNC信号有效时,表示一帧数据的开始
(2)VSPW表示VSYNC信号的脉冲宽度为(VSPW+1)个HSYNC信号周期,即(VSPW+1)行,这(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)个像素,这(HSPW+1)个像素的数据无效。
(3)HSYNC信号脉冲之后,还要经过(HBPD+1)个VCLK信号周期,有效的像素数据才出现。所以,在HSYNC有效之后,总共要经过(HSPW+1+HBPD+1)个无效的像素,它对应左边框,第一个有效的像素才出现。
(4)随后即连续发出(HOZVAL+1)个像素的有效数据。
(5)最后是(HFPD+1)个无效的像素,它对应右边框,完整的一行结束,紧接着就是下一行的数据了。
2、图像数据在内存中的存储
LCD控制器可以支持单色(1BPP)、4级灰度(2BPP)、16级灰度(4BPP)、256色(8BPP)的调色板显示模式,支持16K(16BPP)和16M(24BPP非调色板显示模式。下面只介绍256色(8BPP)、64K(16BPP)和16M(M()24BPP)色显示模式下,图像数据存储格式。
(1)16M(24BPP)色
16M(24BPP)色显示模式就是使用24位的数据来表示一个像素的颜色,每种颜色使用8位。LCD控制器从内存中获得某个像素的24位颜色值后,直接通过VD[23:0]数据线发送给LCD。为了方便DMA传输,在内存中使用4个字节(32位)来表示一个数据,其中的3个字节从高到低分别表示红绿蓝,剩余的1个字节数据无效。是低字节还是高字节无效,是可以选择的,如下图:
![LCD基础知识 - 小白 - 小白的博客](http://img8.ph.126.net/vMxF9aP0mUpQbqBdDoZLsg==/2756202971968357718.jpg)
(2)64K(16BPP)色
64K(16BPP)色的显示模式就是16位的数据来表示一个像素的颜色。这16位数据的格式又分为2种:5:6:5、5:5:5:1,前者使用高5位来表示红色,中间的6位来表示绿色,低5位来表示蓝色;后者的高15位从高到低分成3个5位来表示红色、绿色、蓝色,最低位表示透明度。5:5:5:1的格式也被称为RGBA格式(A表示透明度)。
一个4字节可以可以表示两个16BPP的像素,使用高2字节还是低2字节来表示第一个像素也是可选的。
![LCD基础知识 - 小白 - 小白的博客](http://img5.ph.126.net/5kPcbB_3cTcQu0-kTOAvtQ==/3101291293415625205.jpg)
注意在5:5:5:1模式下,18、10、2位上的值是一样的,表示透明度。
(3)256色(8BPP)
256色(8BPP)的显示模式就是使用8位的数据来表示一个像素的颜色,但是对三种原色平均下来,每个原色只能使用不到3位的数据来表示,即每个原色最多不过8个级别,这不足以表示更丰富的颜色。
为了解决8BPP模式显示能力太弱的问题,需要使用调色板(Palette)。每个像素对应的8位数据不再用来表示RGB三种原色,而是表示他们在调色板中的索引值:要显示这个像素时,使用这个索引值从调色板中取得其RGB颜色值。所谓调色板就是一块内存,可以对每个索引值设置其颜色,可以使用24BPP或16BPP。在s3c2440中,调色板就是一块256*16的内存,使用16BPP的格式来表示256色(8BPP)显示模式下各个索引值的颜色。这样即使使用256色(8BPP)的显示模式,最终出现在LCD数据总线上的仍是16BPP的数据。
一个4字节可以表示4个8BPP的像素,字节与像素的对应顺序是可以选择的,如下图所示:
![LCD基础知识 - 小白 - 小白的博客](http://img3.ph.126.net/ZM_hDowwTJWftCuFor9NWA==/604326775015390913.jpg)
:
调色板中数据存放的格式与上面所描述的16BPP显示模式相似,也分为两种格式:5:6:5、5:5:5:1。调色板中数据的格式及与LCD数据线VD[23:0]的对应关系,如下所示:
![LCD基础知识 - 小白 - 小白的博客](http://img1.ph.126.net/NvMdbcPFJj-1uzXCVNwO5g==/1014154341106111251.jpg)
各个模式下用来传输红、绿、蓝三种原色的颜色值的VD数据线如下表示所示:
![LCD基础知识 - 小白 - 小白的博客](http://img0.ph.126.net/6SK5VgrNBHvZUnukcE1Glg==/2512445642136935940.jpg)
四、使用TFT LCD时LCD控制器的寄存器简介
LCDCON1~LCDCON5 | 用于选择LCD类型、设置各种控制信号的时间 特 性 |
LCDSADDR1~LCDSADDR3 | 用来设置帧内存地址 |
TPAL | 临时调色板寄存器,可以快速地输出一帧单色的 图像 |
LCDINTPND、LCDSRCPND、LCDINTMSK | 用于LCD的中断,在一般应用中无需中断 |
REDLUT、GREENLUT、BLUELUT、DITHMODE | 专用于STNLCK |
TCONSEL | 专用于SEC TFT LCD |
对于TFT LCD,一般情况下只需要设置前两种寄存器;在8BPP模式下,如果想快速地输出一帧的单色的图像,可以借助于TPAL寄存器