其他分享
首页 > 其他分享> > Mini2440裸机开发之LCD基础

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

电子枪是如何移动的?

颜色如何确定?

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

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

RGB线上的数据从何而来?

前面的信号由谁发给LCD?

工作原理:

1.2 TFT典型时序图

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

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

外部引脚信号:

寄存器参数:

1.3 LCD硬件原理图

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

二、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 显示:

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

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

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

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

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

2.2 时序

LCD一般需要三个时序信号:VSYNC、HSYNC和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值,行频和场频就应该知道了。但这样还不行的,因为在每一帧时钟信号中,还会有一些与屏显示无关的时钟出现,这就给确定行频和场频带来了一定的复杂性。如:

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$$

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

$$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。

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

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

三、寄存器

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

标签:VCLK,STN,Mini2440,裸机,LCD,信号,寄存器,TFT
来源: https://www.cnblogs.com/zyly/p/15407570.html