LCD驱动程序详细讲解(一)
平台:JZ2440V3
CPU:三星S3C2440A芯片
LCD:4.3寸液晶屏手册_AT043TN24
LCD介绍:
LCD,即液晶显示器,是一种采用了液晶控制透光技术来实现色彩的显示器。LCD有很多种类型,比如STN、TFT、LTPS、OLED等。各有优缺点。
由于JZ2440V3开发板上面配置的是TFT类型液晶显示器,所以本文主要针对TFT-LCD进行讲解;
TFT(Thin Film Transistor,薄膜晶体管)可以大大缩短屏幕的响应时间,其响应时间已经小于80ms,并改善了连续显示时屏幕模糊闪烁,有效提高了动态画面的播放力,呈现画面色彩饱和度、真实效果和对比度都非常不错,只是功耗稍高,是目前最为主流的液晶显示器。
LCD的接口:
CPU或显卡发出的图像数据是TTL信号,LCD本身接收的也是TTL信号。由于TTL信号在高速率的长距离传输时性能不佳,抗干扰能力也比较差,后来又提出了多种接口来解决这种问题,比如LVDS、TDMS、GVIF、DVI和DFP等。它们实际上只是将CPU或显卡发出的TTL信号编码成各种信号以便传输,在LCD那边将接收到的信号进行解码得到TTL信号。
由于数字接口标准尚未统一,所以使用LCD时需要根据其手册了解具体接口定义。也是基于数字接口标准尚未统一的原因,市场上大多LCD都采用模拟信号接口,LCD需要先通过ADC将模拟信号转换为数字信号才能显示。
但是,不管采用何种数字接口,本质的TTL信号是一样的。
TFT-LCD的数据传输方式有2种,单扫:指的是对于一整屏的数据,从上到下,从左到右,一个一个地发送出来,双扫:是指将一整屏的数据分为上下两部分,同时的从上到下,从左到右,一个一个的发送出来。
其中,TFT-LCD其数据信号多达24根,对应像素值中的每一位。
TFT-LCD的TTL信号:
信号名称 | 描述 |
VSYNC | 垂直同步信号 |
HSYNC | 水平同步信号 |
VD[23:0] | 数据信号 |
HCLK | 时钟信号 |
LEND | 行结束信号 |
PWREN | 电源开关信号 |
S3C2440 LCD控制器的特性和结构:
S3C2440 LCD控制器被用来向LCD传输图像数据,并提供必要的控制信号,比如VFRAME、VLINE、VCLK、VM等。可以支持STN-LCD和TFT-LCD,其特性如下(BPP表示bit per pixel,即每个像素用多少位来表示其颜色)。
S3C2440 LCD控制器的内部结构如下图1所示:
图 1
其中,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屏。
显示器上数据的组织格式:
对于屏幕上的一整幅图像,他的数据是如何组织的?无论是CRT显示器还是LCD显示器,他们都有相同的概念。
一幅图像被称为一帧(frame),每帧由多行组成,每行由多个像素组成,每个像素的颜色使用若干位的数据来表示。对于单色显示器,每个像素使用1位来表示,称为1BPP;对于256色显示器,每个像素使用8位来表示,被称为8BPP。
显示器从屏幕的左上方开始,一行一行的取得每个像素的数据并显示出来,当显示到一行的最右边时,跳到下一行的最左边开始显示下一行;当显示完所有行后,跳到左上方开始下一帧。显示器沿着“Z”字型的路线进行扫描,使用HSYNC、VSYNC信号来控制扫描路线的跳转,HSYNC表示“是跳到最左边的时候了”,VSYNC表示“是跳到最上边的时候了”。
在工作中的显示器上,可以在四周看见黑色的边框。上方的黑框是因为当发出VSYNC信号时,需要经过若干行之后第一行数据才有效;下方的黑框是因为显示完所有行的数据时,显示器还没有扫描到最下边(VSYNC信号还没有发出),这时数据是无效的;左边的黑框是因为当发出HSYNC信号时,需要经过若干像素之后第一列数据才有效;右边的黑框是因为显示完一行数据时,显示器还没扫描到最右边(HSYNC信号还没有发出),这时数据已经无效。显示器只会依据VSYNC、HSYNC信号来取得、显示数据,并不理会该数据是否有效,何时发出有效的数据由显卡或LCD控制器决定。
VSYNC信号出现的频率表示一秒钟内能显示多少帧图像,称为垂直频率或场频率,这就是我们常说的“显示器频率”;HSYNC信号出现的频率称为水平频率,表示一秒钟能显示多少个像素的数据。
显示器上,一帧数据的存放位置与VSYNC、HSYNC信号的关系如下图2所示:
图 2
有效数据的行数、列数,即分辨率,它与VSYNC、HSYNC信号之间的距离等,都是可以设置的,这由LCD控制器来完成。
TFT-LCD的操作:
先了解TFT-LCD的时序,这使得我们在设置各个寄存器时有个形象的概念。每个VSYNC信号表示一帧数据的开始;每个HSYNC信号表示一行数据的开始,无论这些数据是否有效;每个VCLK信号表示正在传输一个像素的数据,无论它是否有效。数据是否有效只是对CPU的LCD控制器来说的,LCD根据VSYNC、HSYNC、VCLK不停的读取总线数据并显示。
下面讲解时序图,请参考下图3所示:
图 3
1、VSYNC信号有效时,表示一帧数据的开始;
2、VSPW表示表示VSYNC信号的脉冲宽度(VSPW+1)个HSYNC信号周期,即(VSPW+1)行,这个(VSPW+1)行的数据无效;
3、VSYNC信号脉冲之后,还要经过(VBPD+1)个HSYNC信号周期,有效的行数据才出现。所以,在VSYNC信号之后,总共还要经过(VSPW+1+VBPD+1)个无效的行,它对应图2中上方的黑色边框,第一个有效的行才出现。
4、随后连续发出(LINEVAL+1)行的有效数据。
5、最后是(VFPD+1)个无效的行,它对应图2下方的黑色边框,完整的一帧数据结束,紧接着就是下一个帧的数据了(即下一个VSYNC信号)。
现在深入到一行中像素数据的传输过程,它与上面行数据的传输过程相似。
1、HSYNC信号有效时,表示一行数据的开始。
2、HSPW表示HSYNC信号的脉冲宽度为(HSPW+1)个VCLK信号周期,即(HSPW+1)个像素,这(HSPW+1)个像素的数据是无效的。
3、HSYNC信号脉冲之后,还要经过(HBPD+1)个VCLK信号周期,有效的像素数据才出现。所以,在HSYNC信号有效之后总共还要经过(HSPW+1+HBPD+1)个无效的像素,它对应图2左边黑色边框,第一个有效的像素才出现。
4、随后即连续发出(HOZVAL+1)个像素的有效数据。
5、最后(HFPD+1)个无效的像素,它对应图2右边的黑色边框,完整的一行结束,紧接着就是下一行的数据了(即下一个HSYNC信号)。
时序图中个信号的时间参数都可以在LCD控制寄存器中设置,VCLK作为时序图的基准信号,它的频率可以如下计算:
VCLK(Hz) = HCLK/[(CLKVAL+1)*2]
VSYNC信号的频率又称为帧频率、垂直频率、场频率、显示器的频率,它可以如下计算:
FrameRate=1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x{(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)} x {2x (CLKVAL+1) / (HCLK )}]
将VSYNC、HSYNC、VCLK等信号的时间参数设置好之后,并将帧内存的地址告诉LCD控制器,它即可自动地发出DMA传输从帧内存中得到图像数据,最终在上述信号的控制下出现在数据总线VD[23:0]上。用户只需要把要显示的图像数据写入帧内存中,在这之前,先了解一下各种格式的图像数据在内存中如何存储。
显示器上每个像素的颜色由3部分组成:红(Red)、绿(Green)、蓝(Blue)。它们被称为三基色,这三者的混合几乎可以表示人眼所能识别的所有颜色。比如可以根据颜色的浓烈程度将三基色都分为256个级别,则可以使用255级的红色、255级的绿色、255级的蓝色组合成白色,可以使用0级红色、0级的绿色、0级的蓝色组合成黑色。
LCD控制器可以支持单色(1BPP)、4级灰度(2BPP)、16级灰度(4BPP)、256色(8BPP)的调色板显示模式,支持64K(16BPP)和16M(24BPP)非调色板显示模式。下面只介绍64K(16BPP)色显示模式下,图像数据的存储格式。
64K(16BPP)色的显示模式就是使用16位的数据来表示一个像素的颜色。这16位数据的格式又分为两种:5:6:5、5:5:5:1,前者使用高5位来表示红色,中间的6位来表示绿色,低5位来表示蓝色;后者的高15从高到低分成3个5位来表示红、绿、蓝色,最低位来表示透明度。5:5:5:1的格式也被称为RGBBA格式(A:Alpha,表示透明度)。
一个4字节可以表示两个16BPP的像素,使用高2字节还是低2字节来表示第一个像素,这也是可以选择的。
显示模式为16BPP时,内存数据与像素位置的关系如下图,图4中的NC表示没有连接:
图 4
使用TFT-LCD时LCD控制器的寄存器设置:
LCD控制器中REGBANK的17个寄存器可以分为6种,如下表所示。
REGBANK寄存器组分类:
名称 | 说明 |
LCDCON1~LCDCON5 | 用于选择LCD类型,设置各类控制信号的时间特性等 |
LCDSADDR1~LCDSADDR5 | 用于设置帧内存的地址 |
TPAL | 临时调色板寄存器,可以快速的输出一帧单色的图像 |
LCDINTPND | 用于LCD的中断,在一般应用中无需中断 |
LCDSRCPND | 用于LCD的中断,在一般应用中无需中断 |
LCDINTMSK | 用于LCD的中断,在一般应用中无需中断 |
REDLUT | 专用于STN-LCD |
GREENLUT | 专用于STN-LCD |
BLUELUT | 专用于STN-LCD |
DITHMODE | 专用于STN-LCD |
TCONSEL | 专用于SEC TFT-LCD |
对于TFT-LCD,一般情况下只需要设置前两种寄存器;下面分别介绍:
1、LCD控制寄存器LCDCON1:
主要用于选择LCD类型、设置像素时钟、使能LCD信号的输出等,格式如下表所示。
LCDCON1寄存器格式
功能 | 位 | 说明 |
LINECNT | [27:18] | 只读,每输出一个有效行其值减一,从LINEVAL减到0; |
CLKVAL | [17:8] | 用于设置VCLK(像素时钟); |
MMODE | [7] | 设置VM信号的反转效率,专用于STN-LCD; |
PNRMODE | [6:5] | 设置LCD类型,对于TFT-LCD设置0b11; |
BPPMODE | [4:1] | 设置BPP,对于TFT-LCD:0b1100 = 16BPP; |
ENVID | [0] | LCD信号输出使能位,0:禁止,1:使能; |
2、LCD控制寄存器LCDCON2:
用于设置垂直方向各信号的时间参数,格式如下表所示。
LCDCON2寄存器格式
功能 | 位 | 说明 |
VBPD | [31:24] | VSYNC信号脉冲之后,还要经过(VBPD+1)个HSYNC信号周期,有效的行数据才出现; |
LINEVAL | [23:14] | LCD的垂直宽度,(LINEVAL+1)行; |
VFPD | [13:6] | 一帧中的有效数据完结后,到下一个VSYNC信号有效前的无效行数目:VFPD+1行; |
VSPW | [5:0] | 表示VSYNC信号的脉冲宽度位(VSPW+1)个HSYNC信号周期,即(VSPW+1)行,这个(VSPW+1)行的数据是无效的; |
3、LCD控制寄存器LCDCON3:
用于设置水平方向各信号的时间参数,格式如下表所示。
LCDCON3寄存器格式
功能 | 位 | 说明 |
HBPD | [25:19] | HSYNC信号脉冲之后,还要经过(HBPD+1)个VCLK信号周期,有效的像素数据才出现; |
HOZVAL | [18:8] | LCD的水平宽度,(HOZVAL+1)类(像素); |
HFPD | [7:0] | 一行中的有效数据完结后,到下一个HSYNC信号有效前的无效像素个数,HFPD+1个像素; |
4、LCD控制寄存器LCDCON4:
对于TFT-LCD,这个寄存器只用来设置HSYNC信号的脉冲宽度,位[7:0]的数值称为HSPW,表示脉冲宽度位(HSPW+1)个VCLK周期。
5、LCD控制寄存器LCDCON5:
用于设置各个控制信号的极性,并可从中读到一些状态信息,格式如下表所示:
LCDCON5寄存器格式
功能 | 位 | 说明 |
VSTATUS | [16:15] | 只读,垂直状态; 00:正处于VSYNC信号脉冲期间; 01:正处于VSYNC信号结束到行有效之间; 10:正处于有效行期间; 11:正处于行有效结束到下一个VSYNC信号之间; |
HSTATUS | [14:13] | 只读,水平状态; 00:正处于HSYNC信号脉冲期间; 01:正处于HSYNC信号结束到像素有效之间; 01:正处于像素有效期间; 11:正处于像素有效结束到下一个HSYNC信号之间; |
BPP24BL | [12] | 设置TFT-LCD的显示模式为24BPP时,一个4字节中的哪3个字节有效,0:LSB有效,1:MSB有效(高地址的3个字节); |
FRM565 | [11] | 设置TFT-LCD的显示模式为16BPP时,使用的数据格式,0表示5:5:5:1格式,1表示5:6:5格式; |
INVVCLK | [10] | 设置VCLK信号有效沿极性: 0表示在VCLK的下降沿读取数据;1表示在VCLK的上升沿读取数据; |
INVVLINE | [9] | 设置VINE/HSYNC脉冲的极性; 0表示正常极性,1表示反转的极性; |
INVVFRAME | [8] | 设置VFRAME/VSYNC脉冲的极性; 0表示正常极性,1表示反转的极性; |
INVVD | [7] | 设置VD数据线表示数据的极性; 0表示正常极性,1表示反转的极性; |
INVVDEN | [6] | 设置VDEN信号的极性; 0表示正常进行,1表示反转的极性; |
INVPWREN | [5] | 设置PWREN信号的极性; 0表示正常进行,1表示反转的极性; |
INVLEND | [4] | 设置LEND信号的极性; 0表示正常进行,1表示反转的极性; |
PWREN | [3] | LCD_PWREN信号输出使能; 0表示禁止,1表示使能; |
ENLEND | [2] | LEND信号输出使能; 0表示禁止,1表示使能; |
BSWP | [1] | 字节交换使能;参考图4 0表示禁止,1表示使能; |
HWSWP | [0] | 半字(2字节)交换使能,参考4 0表示禁止,1表示使能; |
6、帧内存地址寄存器LCDSDRR1~LCDSDRR3:
帧内存可以很大,而真正要显示的区域被称为视口(view point),它处于帧内存之内,这个3个寄存器用于确定帧内存的起始地址,定位视口在帧内存中的位置。
图5给出了帧内存和视口的位置关系:
图 5
下面分别介绍各个帧内存寄存器;
LCDSADRR1寄存器格式:
功能 | 位 | 说明 |
LCDBANK | [29:21] | 用于保存帧内存起始地址A[30:22],帧内存起始地址必须为4MB对齐; |
LCDBASEU | [20:0] | 对于TFT-LCD,用于保存视口所对应的内存起始地址A[21:1],这块内存也被称为LCD的帧缓冲区(frame buffer); |
LCDSADRR2寄存器格式:
功能 | 位 | 说明 |
LCDBASEL | [20:0] | 对于TFT-LCD,用来保存LCD的帧缓冲区结束地址A[21:1],其值可如下计算: LCDBASEL=LCDBASEU+(PAGEWIDTH+OFFSIZE)*(LINEVAL+1) |
注意:可以修改LCDBASEU、LCDBASEL的值来实现图像的移动,不过不能在一帧图像的结束阶段进行修改;
LCDSADRR3寄存器格式:
功能 | 位 | 说明 |
OFFSIZE | [21:11] | 参考图5,表示上一行最后一个数据与下一行第一个数据之间地址差值的半字节,即以半字位单位的地址差;0表示两行数据是紧接着的,1表示它们之间相差2个字节,以此类推; |
PAGEWIDTH | [10:0] | 视口的宽度,以半字位为单位; |
7、临时调色板寄存器TPAL:
如果要输出一帧单色的图像,可以在TPAL寄存器中设定这个颜色值,然后使能TPAL寄存器,这种方法可以避免修改整个调色板或帧缓冲区。
TPAL寄存器格式:
功能 | 位 | 说明 |
TPALEN | [24] | 调色板寄存器使能位,0禁止,1使能; |
TPALVAL | [23:0] | 颜色值; TPALVAL[23:16]:红色 TPALVAL[15:8]:绿色 TPALVAL[7:0]:蓝色 |
注意:临时调色板寄存器TPAL可以用在任何显示模式下,并非只能用在8BPP模式下。
备注:本文的主要内存来自韦东山老师的书籍;
转载于:https://my.oschina.net/cht2000/blog/1014947