Mini2440裸机开发之LCD基础

一、LCD硬件原理

要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440 等。

通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。嵌入式LCD主要以薄膜式晶体管型TFT为主流。

1.1 LCD示意图

下图是LCD示意图,里面的每个点就是一个像素点。它里面有一个电子枪,一边移动,一边发出各种颜色的光。用动态图表示如下:

Mini2440裸机开发之LCD基础

电子枪是如何移动的?

  • 有一条CLK时钟线与LCD相连,每发出一次CLK(高低电平),电子枪就移动一个像素。

颜色如何确定?

  • 由连接LCD的三组线RGB三原色混合而成:R(Red)、G(Green)、B(Blue)确定。

电子枪如何得知应跳到下一行?

  • 有一条HSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到下一行,该信号叫做行同步信号。

电子枪如何得知应跳到原点?

  • 有一条VSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到原点,该信号叫做帧同步信号。

RGB线上的数据从何而来?

  • 内存里面划分一块显存(FrameBuffer),里面存放了要显示的数据,LCD控制器从里面将数据读出来,通过RGB三组线传给电子枪,电子枪再依次打到显示屏上。

前面的信号由谁发给LCD?

  • 有S3C2440里面的LCD控制器来控制发出信号。

工作原理:

  • LCD屏可以看作是由许多象素构成的,比如320*240就是由320*240个象素构成的,每个象素由RGB三色调和,每种颜色又由多个位组成。比如我们的开发板上的LCD,有320*240个象素,每个象素由RGB三色调和,RGB三色位数分别为:565。
  • s3c2440内集成了LCD控制器,LCD控制器外接LCD,每来一个VLCK,就会从左到右在LCD屏幕上显示一个象素的颜色,而这一个个象素的颜色就存放在显存里,在嵌入式领域,一般不会佩戴专门的显存,而是从内存SDRAM中划分出一部分充当显存;
  • VLINE引脚每发出一个行同步信号,HSYNC发出一次脉冲时,表示一行的数据发送完成,就会换行,从上一行的最右边跳到下一行的最左边;
  • VFRAME引脚每发出一个帧同步信号,VSYNC发出一次脉冲时,表示一帧的数据发送完,这时就会跳到屏幕起始位置,开始下一帧数据的发送。

1.2 TFT典型时序图

下图给出了TFT的典型时序图。

Mini2440裸机开发之LCD基础

我们先来理解下面引脚有寄存器中相关参数的意义:

外部引脚信号:

  • VSYNC(帧同步信号):每发出一个脉冲,表示新的一帧图像数据开始传送;
  • HSYNC(行同步信号):每发出一个脉冲,表示新的一行图像数据开始传送;
  • VLINE:发出LCD行扫描信号 —— GPC2 :配置为LCD引脚;
  • VCLK(像素时钟信号):每发出一个脉冲,表示新的一个点图像数据开始传送;—— GPC1引荐 :配置为LCD引脚;
  • VD[3]——VD[7] :LCD数据总线 ——GPC11:GPC15 :配置为LCD引脚;
  • VD[10]——VD[15] :LCD数据总线 ——GPD2:GPD7 :配置为LCD引脚;
  • VD[19]——VD[23] :LCD数据总线 ——GPD11:GPD15 :配置为LCD引脚;
  • VDEN:数据使能信号; ——GPC4 :配置为LCD引脚;
  • LEND:行结束信号;
  • INT_FrSyn:是产生中断信号 ,每传完一帧数据后就会发生一次中断;

寄存器参数:

  • VSPW:帧同步信号的脉宽,单位为1行(Line)的时间;
  • VFPD: 帧同步信号的前肩,单位为1行(Line)的时间;
  • VBPD: 帧同步信号的后肩,单位为1行(Line)的时间;
  • LINEVAL :帧显示尺寸-1,即屏行宽-1;
  • HBPD:行同步信号的后肩,单位为1VCLK的时间;
  • HFPD:行同步信号的前肩,单位为1VCLK的时间;
  • HSPW:行同步信号的脉宽,单位为1VCLK的时间;
  • HOZVAL:行显示尺寸-1,即屏列宽-1;

1.3 LCD硬件原理图

Mini2440采用的LCD为TFT屏,型号为sony ACX502BMU-7(TFT屏)。由240*320个像素组成,每个象素由RGB三色调和,RGB三色位数分别为:565。电路图如下:

Mini2440裸机开发之LCD基础

二、S3C2440 LCD控制器

2.1 LCD控制器特性

S3C2440 中的LCD 控制器由从位于系统存储器的视频缓冲区到外部LCD 驱动器的转移LCD 图像数据逻辑组成。

LCD 控制器支持单色LCD 的单色、2 位每像素(4 阶灰度)或4 位每像素(16 阶灰度)模式,通过使用基 于时间的抖动算法和帧频控制(FRC)方法,其可以连接到8 位每像素(256 色)的彩色LCD 面板和连接到12 位 每像素(4096 色)的STN LCD。

其支持1 位每像素、2 位每像素、4 位每像素和8 位每像素的调色TFT 彩色LCD 面板连接,以及16 位每像素 和24 位每像素的无调色真彩显示。

可以编程LCD 控制器来支持不同涉及屏幕水平和垂直像素数、数据接口的数据线宽度、接口时序和刷新率的需要。

TFT LCD 显示:

  • – 支持TFT 的1、2、4、8 bpp(位每像素)调色显示 ;
  • – 支持彩色TFT 的16、24 bpp 无调色显示 ;
  • – 支持24 位每像素模式下最大16M 色TFT;
  • – 支持多种屏幕尺寸: 

典型实际屏幕尺寸:640×480、320×240、160×160 等

最大虚拟屏幕尺寸为4M 字节

64K 色模式最大虚拟屏幕尺寸: 2048×1024 等

下面是mini2440 LCD模块的系统框图:

Mini2440裸机开发之LCD基础

从上图可知是LCD模块工作的整个流程如下:

  • 图片数据首先是存放在内存中,然后通过一个LCDCDMA将缓存里面的数据运送到LCD控制器;
  • 然后数据通过VD[0~23]从LCD控制器运送到LCD驱动器,而LCD控制器和LCD驱动器之间的数据线,控制线 时钟线 是用来维持LCD控制器和LCD驱动器之间的稳定的;
  • 最后驱动器将数据显示在TFT LCD上面; 

2.2 时序

LCD一般需要三个时序信号:VSYNC、HSYNC和VCLK。

  • VSYNC是垂直同步信号,在每进行一个帧(即一个屏)的扫描之前,该信号就有效一次,由该信号可以确定LCD的场频,即每秒屏幕刷新的次数(单位Hz)。
  • HSYNC是水平同步信号,在每进行一行的扫描之前,该信号就有效一次,由该信号可以确定LCD的行频,即每秒屏幕从左到右扫描一行的次数(单位Hz)。
  • VCLK是像素时钟信号。S3C2440处理LCD的时钟源是HCLK,通过寄存器LCDCON1中的CLKVAL可以调整VCLK频率大小,它的公式为:

$$VCLK=\frac{HCLK}{ (CLKVAL+1)*2}$$

例如,HCLK的频率为100MHz,要想驱动像素时钟信号为6.4MHz的LCD屏,则通过上式计算CLKVAL值:

$$CLKVAL=HCLK/VCLK/2-1=100/6.4/2-1=6.8$$

结果CLKVAL为6.8,取整后(值为6)放入寄存器LCDCON1中相应的位置即可。由于CLKVAL进行了取整,因此我们把取整后的值代入上式,重新计算VCLK,得到$VCLK=7.1MHz$。

按理说,对于一个已知尺寸(即水平显示尺寸HOZVAL和垂直显示尺寸LINEVAL已知)的LCD屏,只要确定了VCLK值,行频和场频就应该知道了。但这样还不行的,因为在每一帧时钟信号中,还会有一些与屏显示无关的时钟出现,这就给确定行频和场频带来了一定的复杂性。如:

  • 在HSYNC信号先后会有水平同步信号前肩(HFPD)和水平同步信号后肩(HBPD)出现;
  • 在VSYNC信号先后会有垂直同步信号前肩(VFPD)和垂直同步信号后肩(VBPD)出现,在这些信号时序内,不会有有效像素信号出现;
  • 另外HSYNC和VSYNC信号有效时,其电平要保持一定的时间,它们分别叫做水平同步信号脉宽HSPW和垂直同步信号脉宽VSPW,这段时间也不能有像素信号。因此计算行频和场频时,一定要包括这些信号。

HBPD、HFPD和HSPW的单位是一个VCLK的时间,而VSPW、VFPD和VBPD的单位是扫描一行所用的时间。

在S3C2440中,所有的这些信号(VSPW、VFPD、VBPD、LINEVAL、HBPD、HFPD、HSPW和HOZVAL)都是实际值减1的结果。这些值是通过寄存器LCDCON2、LCDCON3和LCDCON4来配置,只要把这些值配置成与所要驱动的LCD中相关内容的数据一致即可。

例如,我们所要显示的LCD屏大小为320×240,因此:

$$HOZVAL=320-1,LINEVAL=240-1$$

  • 水平同步信号的脉宽、前肩和后肩分别为30、20和38,则:

$$HSPW=30-1,HFPD=20-1,HBPD=38-1$$

  • 垂直同步信号的脉宽、前肩和后肩分别为3、12和15,则:

$$VSPW=3-1,VFPD=12-1,VBPD=15-1$$

HSYNC(行同步信号)是一行数据开始传输的信号,一行数据要经过以下几个步骤:HSPW+1(行的肩宽)+HBPD+1(后消隐)+ 有效数据传输HOZVAL+1(240)+HFPD+1(前消隐)。行频(HSF):

$$HSF=\frac{VCLK}{(HSPW+1)+(HSPD+1)+(HFPD+1)+(HOZVAL+1)}$$

$$=\frac{7.1}{408}=17.5kHz$$

VSYNC(场同步信号) 是一帧数据开始刷新的信号,一帧数据的传输要经过以下流程:VSPW+1(场的肩宽)+VBPD+1(后消隐)+有效数据传输(LINEVAL+1)+VFPD+1(前消隐)而这些是以行为单位的。场频(VSF):

$$VSF=\frac{HSF}{(VSPW+1)+(VBPD+1)+(VFPD+1)+(LINEVAL+1)}$$

$$=\frac{17.5kHz}{270}=64.8Hz$$

在有些情况下,S3C2440的LCD时钟信号的默认极性与所控制的LCD时钟信号的极性相反,这时可以通过寄存器LCDCON5的相关位来改变某些时钟信号的极性。

2.4 显示缓冲区

只要把所要显示的数据放入显示缓存区内,就可以在屏幕上呈现内容。该缓存区是我们自己编程时开辟的一段内存区。一般我们是通过定义一个与屏幕尺寸大小相同的二维数组来开辟该空间的,这样控制屏幕内容会方便一些,如当屏幕的尺寸为320×240时,可以定义该缓存区为LCD_BUFFER[240][320]。

由于S3C2440支持16位和24位的非调色板真彩色的TFT型LCD模式,而24位颜色模式是用32位数据来表示的,所以前面定义的那个二维数据的数据类型应该是半字整型或全字整型的。例如,在24位颜色模式下,我们想要在尺寸大小为320×240屏幕的中心处设置为白色像素,则:LCD_BUFFER[120][160]=0xffffffff。

在S3C2440中,寄存器LCDSADDR1和LCDSADDR2用于设置显示缓存区,即把我们定义的那个二维数组告诉S3C2440。

  • 其中LCDBANK的9位数据指定LCD的BANK,即显示缓存区的第30位到第22位地址;
  • LCDBASEU的21位数据指定了LCD的基址,即显示缓存区开始地址的第21位到第1位;
  • LCDBASEL的21位数据指定了LCD的尾址,即显示缓存区结束地址的第21位到第1位。

例如,我们想要在尺寸为320×240的屏幕上显示24位颜色,定义的显示缓存区数组为LCD_BUFFER[240][320],则:

  • LCDBANK等于LCD_BUFFER的第30位到第22位数据值(因为LCD_BUFFER表示的就是数组的首地址;
  • LCDBASEU等于LCD_BUFFER的第21位到第1位数据值;
  • 由于是用32位数据表示24为颜色,因此每个像素值是4个字节,所以LCDBASEL等于(LCD_BUFFER+(240×320×4))结果的第21位到第1位的数据值。

另外寄存器LCDSADDR3有两个内容:OFFSIZE和PAGEWIDTH:

  • OFFSIZE用于虚拟屏幕的偏移长度,如果我们不使用虚拟屏幕,就把它置为0;
  • PAGEWIDTH定义了视口的宽,单位是半字,如在上面的例子中,PAGEWIDTH应该为320×32÷16;

三、寄存器

3.1 LCD控制1寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDCON1

0x4D000000

R/W

LCD 控制1 寄存器

0x00000000

寄存器位信息:

LCDCON1 描述 初始状态
LINECNT(只读) [27:18]

提供行计数器的状态。从LINEVAL 递减计数到0。

 0000000000
CLKVAL [17:8]

决定VCLK 的频率和CLKVAL[9:0]。

STN:VCLK = HCLK / (CLKVAL × 2) (CLKVAL≥2)

TFT:VCLK = HCLK / [(CLKVAL + 1) × 2] (CLKVAL≥0)

 0000000000
MMODE [7]

决定VM 的触发频率

0 = 每帧 1 = 由MVAL 定义此频率

 0
PNRMODE [6:5]

选择显示模式

00 = 4 位双扫描显示模式   01 = 4 位单扫描显示模式(STN)
10 = 8 位单扫描显示模式   11 = TFT LCD 面板

 00
BPPMODE [4:1]

选择BPP(位每像素)模式

0000 = STN 的1 bpp,单色模式 0001 = STN 的2 bpp,4 阶灰度模式
0010 = STN 的4 bpp,16 阶灰度模式 0011 = STN 的8 bpp,彩色模式(256 色)
0100 = STN 的封装12 bpp,彩色模式(4096 色)
0101 = STN 的未封装12 bpp,彩色模式(4096 色)
0110 = STN 的封装16 bpp,彩色模式(4096 色)
1000 = TFT 的1 bpp 1001 = TFT 的2 bpp
1010 = TFT 的4 bpp 1011 = TFT 的8 bpp
1100 = TFT 的16 bpp 1101 = TFT 的24 bpp

 0000
ENVID [0]

LCD 视频输出和逻辑使能/禁止。
0 = 禁止视频输出和LCD 控制信号 1 = 允许视频输出和LCD 控制信号

 0

3.2 LCD控制2寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDCON2

0x4D000004

R/W

LCD 控制2寄存器

0x00000000

寄存器位信息:

LCDCON2 描述 初始状态
VBPD [31:24]

TFT:垂直后沿为帧开始时,垂直同步周期后的的无效行数

STN:STN LCD 时应该设置此位为0

 0x00
LINEVAL [23:14]

TFT/STN:此位决定了LCD 面板的垂直尺寸

 0000000000
VFPD [13:6]

TFT:垂直前沿为帧结束时,垂直同步周期前的的无效行数
STN:STN LCD 时应该设置此位为0

 00000000
VSPW [5:0]

TFT:通过计算无效行数垂直同步脉冲宽度决定VSYNC 脉冲的高电平
宽度
STN:STN LCD 时应该设置此位为0

 000000

3.3 LCD控制3寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDCON3

0x4D000008

R/W

LCD 控制3寄存器

0x00000000

寄存器位信息:

LCDCON3 描述 初始状态
HBPD(TFT) [25:19]

TFT:水平后沿为HSYNC 的下降沿与有效数据的开始之间的VCLK 周
期数

 0000000
WDLY(STN)

STN:WDLY[1:0]位通过计数HCLK 数来决定VLINE 与VCLK 之间的延迟。保留WDLY[7:2]

00 = 16 HCLK 01 = 32 HCLK 10 = 48 HCLK 11 = 64 HCLK

HOZVAL [18:8]

TFT/STN:此位决定了LCD 面板的水平尺寸。必须决定HOZVAL 来
满足1 行的总字节为4n 字节。如果单色模式中LCD 的x 尺寸为120
个点,但不能支持x=120,因为1 行是由16 字节(2n)所组成。LCD
面板驱动器将舍弃额外的8 个点

 00000000000
HFPD(TFT) [7:0]

TFT:水平后沿为有效数据的结束与HSYNC 的上升沿之间的VCLK 周
期数

 0X00

LINEBLANK
(STN)

 STN:此位表明一次水平行持续时间中的空时间。此位微调VLINE 的

频率。LINEBLANK 的单位为HCLK×8。
例子) 如果LINEBLANK 的值为10,则在80 个HCLK 期间插入空时间
到VCLK

3.4 LCD控制4寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDCON4

0x4D00000C

R/W

LCD 控制4寄存器

0x00000000

寄存器位信息:

LCDCON4 描述 初始状态
MVAL [15:8]

STN:此位定义如果MMODE 位被置位为逻辑’1’的VM 信号将要触发
的频率

 0x00
HSPW(TFT) [7:0]

TFT:通过计算VCLK 的数水平同步脉冲宽度决定HSYNC 脉冲的高电
平宽度

0x00
WLH(STN)

STN:通过计算HCLK的数WLH[1:0]位决定VLINE脉冲的高电平宽度
保留WLH[7:2]

00 = 16 HCLK 01 = 32 HCLK 10 = 48 HCLK 11 = 64 HCLK

3.5 LCD控制5寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDCON5

0x4D000010

R/W

LCD 控制5寄存器

0x00000000

寄存器位信息:

LCDCON5 描述 初始状态
保留 [31:17]

保留此位并且应该为’0’

 0
VSTATUS [16:15]

TFT:垂直状态(只读)

00 = VSYNC 01 = 后沿 10 = ACTIVE 11 = 前沿

00
HSTATUS 14:13]

TFT:水平状态(只读)

00 = VSYNC 01 = 后沿 10 = ACTIVE 11 = 前沿

00

BPP24BL [12]

TFT:此位决定24 bpp 视频存储器的顺序

0 = LSB 有效 1 = MSB 有效

0

FRM565 [11]

TFT:此位选择16 bpp 输出视频数据的格式

0 = 5:5:5:1 格式 0 = 5:6:5 格式

0
INVVCLK [10]

STN/TFT:此位控制VCLK 有效沿的极性

0 = VCLK 下降沿取视频数据 1 = VCLK 上升沿取视频数据

0
INVVLINE [9]

STN/TFT:此位表明VLINE/HSYNC 脉冲极性

0 = 正常 1 = 反转

0
INVVFRAME [8]

STN/TFT:此位表明VFRAME/VSYNC 脉冲极性

0 = 正常 1 = 反转

0
INVVD [7]

STN/TFT:此位表明VD(视频数据)脉冲极性

0 = 正常 1 = 反转VD

0
INVVDEN [6]

TFT:此位表明VDEN 信号极性

0 = 正常 1 = 反转

0
INVPWREN [5]

STN/TFT:此位表明PWREN 信号极性

0 = 正常 1 = 反转

0
INVLEND [4]

TFT:此位表明LEND 信号极性

0 = 正常 1 = 反转

 
PWREN [3]

STN/TFT:LCD_PWREN 输出信号使能/禁止

0 = 禁止PWREN 信号 1 = 允许PWREN 信号

0
ENLEND [2]

TFT:LEND 输出信号使能/禁止

0 = 禁止LEND 信号 1 = 允许LEND 信号

0
BSWP [1]

STN/TFT:字节交换控制位

0 = 交换禁止 1 = 交换使能

0
HWSWP [0]

STN/TFT:半字节交换控制位

0 = 交换禁止 1 = 交换使能

0

3.6 帧缓冲器开始地址1 寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDSADDR1

0X4D000014

R/W

STN/TFT:帧缓冲器开始地址1 寄存器

0x00000000

寄存器位信息:

LCDSADDR1 描述 初始状态
LCDBANK [29:21]

这些位表明系统存储器中视频缓冲器的bank 位置的A[30:22]。即使当
移动视口时也不能改变LCDBANK 的值。LCD 帧缓冲器应该在4MB
连续区域内,以保证当移动视口时不会改变LCDBANK 的值。因此应
该谨慎使用malloc()函数

 0x00
LCDBASEU [20:0]

对于双扫描LCD:这些位表明递增地址计数器的开始地址的A[21:1],
它是用于双扫描LCD 的递增帧存储器或单扫描LCD 的帧存储器。
对于单扫描LCD:这些位表明LCD 帧缓冲器的开始地址的A[21:1]

 0x000000

3.7 帧缓冲器开始地址2 寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDSADDR2

0X4D000018

R/W

STN/TFT:帧缓冲器开始地址2寄存器

0x00000000

寄存器位信息:

LCDSADDR2 描述 初始状态
LCDBASEL [20:0]

对于双扫描LCD:这些位表明递减地址计数器的开始地址的A[21:1],
它是用于双扫描LCD 的递减帧存储器。
对于单扫描LCD:这些位表明LCD 帧缓冲器的结束地址的A[21:1]。
$$LCDBASEL = ((帧结束地址) >> 1) + 1$$
$$= LCDBASEU +(PAGEWIDTH+OFFSIZE) × (LINEVAL+1)$$

 0x00

3.8 帧缓冲器开始地址13寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDSADDR3

0X4D00001C

R/W

STN/TFT:虚拟屏地址设置

0x00000000

寄存器位信息:

 

LCDSADDR3 描述 初始状态
OFFSIZE [21:11]

虚拟屏偏移尺寸(半字数)
此值定义了显示在之前LCD 行的最后半字的地址与要在新LCD 行中
显示的第一半字的地址之间的差

 00000000000
PAGEWIDTH [10:0]

虚拟屏页宽度(半字数)
此值定义了帧中视口的宽度

 000000000

参考文章

[1] s3c2440裸机-LCD编程(一、LCD硬件原理)

[2]Linux LCD配置与驱动学习

[3]Mini2440裸机液晶屏TD35驱动

[4]mini2440硬件篇之LCD

上一篇:02 Spark架构与运行流程


下一篇:02 Spark架构与运行流程