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

电子枪是如何移动的?

  • 有一条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中划分出一部分充当显存;
  • HSYNC引脚每发出一个脉冲,表示一行的数据开始发送;
  • VSYNC引脚每发出一个冒充,表示一帧的数据开始发送。

上面者这张图需要结合TFT典型时序图一起来。

1.2 TFT典型时序图

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

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

外部引脚信号:

  • VSYNC(帧同步信号):每发出一个脉冲,表示新的一帧图像数据开始传送; ——VFRAME(GPC3):配置为LCD引脚;
  • HSYNC(行同步信号):每发出一个脉冲,表示新的一行图像数据开始传送;—— VLINE( 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:数据使能信号; —— VM(GPC4) :配置为LCD引脚;
  • LEND:行结束信号;——GPC0 :配置为LCD引脚;
  • INT_FrSyn:是产生中断信号 ,每传完一帧数据后就会发生一次中断;

寄存器参数:

  • VSPW:帧同步信号的脉宽,单位为1行(Line)的时间;
  • VFPD: 帧同步信号的前肩,单位为1行(Line)的时间;
  • VBPD: 帧同步信号的后肩,单位为1行(Line)的时间;
  • LINEVAL :LCD的垂直宽度-1;
  • HBPD:行同步信号的后肩,单位为1VCLK的时间;
  • HFPD:行同步信号的前肩,单位为1VCLK的时间;
  • HSPW:行同步信号的脉宽,单位为1VCLK的时间;
  • HOZVAL:LCD的水平宽度-1;

1.3 LCD硬件原理图

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

其中LCD_PWR是背光控制信号。

另外,37、38、39、40为四线触摸屏接口,它们可以直接连接触摸屏使用。

LCD_PWR对应的引脚,所以设置GPG4就可以控制LED背光电源了。

二、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 等

2.2 LCD控制器框图

从上图看出,S3C2440 LCD控制器用于传输视频数据并且生成必要的控制信号,如VFRAME,VLINE,VCLK,VM等。除了控制信号,S3C2440还有视频数据端口,即VD [23:0]。

通过设置REGBANK(寄存器组),LCDCDMA会自动(无需CPU参与)把内存上FrameBuffer里的数据,通过VIDPRCS发送到引脚VD[23:0]数据总线上,再配合VIDEOMUX引脚的控制信号,正确的显示出来。

  • REGBANK:具有17个可编程寄存器组和256x16调色板存储器,用于配置LCD控制器。
  • TIMEGEN:产生控制信号,例如 VSYNC、HSYNC、VCLK等信号
  • LCDCDMA:可以自动从FrameBuff中把数据copy出来。
  • VIDPRCS:从LCDCDMA接收视频数据,将数据输出到VD[23:0]数据总线上。

那么总结LCD控制器主要功能如下:

  • 取:从内存(FrameBuffer)取出某个像素的数据(之后需要把FrameBuffer地址、BPP、分辨率告诉LCD控制器);
  • 发:配合其它信号把FrameBuffer中的数据发给LCD;(那么需要设置LCD控制器时序、设置引脚极性);

LCD模块工作的整个流程如下:

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

2.3 Framebuff数据存储格式

我们可以配置寄存器的BSWP、HWSWP来设置Framebuff中的像素存储格式。

每像素24位数据格式(24BPP):

BSWP = 0,HWSWP = 0,BPP24BL = 0

  D[31:24] D[23:0]
000H 空位 P1
004H 空位 P2
008H 空位 P3
...    

BSWP = 0,HWSWP = 0,BPP24BL = 1 

  D[31:24] D[23:0]
000H P1 空位
004H P2 空位
008H P3 空位
...    

24位下的VD引脚描述:

VD 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
R 7 6 5 4 3 2 1 0                                
G                 7 6 5 4 3 2 1 0                
B                                 7 6 5 4 3 2 1 0

从图中可以看到24位的像素,在LCD控制器的VD[7:0]表示BLUE, VD[15:8]表示GREEN,VD[23:16]表示RED。

在内存中的FrameBuffer中每一个像素占据4个字节,当BPP24BL=0时,低24位为颜色数据,当BPP24BL=1时,高24位为颜色数据。

每像素16位数据格式(16BPP):

BSWP = 0,HWSWP = 0

  D[31:16] D[16:0]
000H P1 P2
004H P3 P4
008H P5 P6
...    

BSWP = 0,HWSWP = 1

  D[31:16] D[15:0]
000H P2 P1
004H P4 P3
008H P6 P5
...    

16位下的VD引脚描述:

5:6:5

VD 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
R 4 3 2 1 0 NC             NC             NC  
G               5 4 3 2 1 0                
B                              4 3 2 1 0  

5:5: 5:1

VD 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
R 4 3 2 1 0 I NC             NC              NC  
G               4 3 3 2 1 0                 
B                              4 3 2 1 0 I  

也可以看到16BPP的像素,在内存中的FrameBuffer中每一个像素占据2个字节,HWSWP用来设置像素数据的存放方式。

再看下LCD控制器的VD引脚输出情况,可以看到16BPP时分5:6:5和5:5:5:i两种数据格式。

  • 当5:6:5模式时,VD[7:3]表示BLUE, VD[15:10]表示Green数据,VD[23:19]表示RED。
  • 当5:5:5:i模式时,VD[7:3]表示BLUE, VD[15:11]表示Green,VD[23:19]表示RED。其中i表示透明度。

8BPP、4BPP、2BPP

那么当我们的Frame buffer中是8/4/2BPP颜色数据时,是如何把颜色数据填充到LCD上的呢?

采用调色板。S3C2440A 中的 TFT LCD 控制器支持 1、2、4 或 8BPP调色显示(伪彩色)和16、24BPP无调色显示(真彩色)。S3C2440A 可以支持 256 色调色板给各种色彩映射的选择,以提供灵活操作给用户。

假如是16BPP的数据,LCD控制器从FB取出16bit数据,显示到LCD上,如下图所示:

那么当8BPP的数据时,就需要用到调色板,调色板里存放了256个16bit的数据,FB(frame buffer)只存放每个像素的索引,根据索引去调色板找到对应的数据传给LCD控制器,比如从FB中的第0个元素拿到调色板中的第0个16bit数据,再通过电子枪显示出来,如下图所示:

调色板支持 5:6:5(R:G:B)格式和 5:5:5:I(R:G:B:I)格式。当用户使用5:5:5:I格式时,I表示强度,也就是透明度。I是用作每个RGB 数据的共用 LSB 位,因此 5:5:5:I与R(5+I):G(5+I):B(5+I)格式相同。

调色板的具体使用这里就不介绍了。有兴趣查看芯片使用手册。

2.4 显示缓冲区(FrameBuffer)

只要把所要显示的数据放入显示缓存区内,就可以在屏幕上呈现内容。该缓存区是我们自己编程时开辟的一段内存区。

一般我们是通过定义一个与屏幕尺寸大小相同的二维数组来开辟该空间的,这样控制屏幕内容会方便一些,如当屏幕的尺寸为320×240时,可以定义该缓存区为LCD_BUFFER[240][320]。

由于S3C2440支持16位和24位的非调色板真彩色的TFT型LCD模式,而24位颜色模式是用32位数据来表示的,所以前面定义的那个二维数据的数据类型应该是半字整型或全字整型的。

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

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

例如,我们想要在尺寸为320×240的屏幕上显示16位颜色,采用16BPP数据格式,定义的显示缓存区数组为u16 LCD_BUFFER[240][320],则:

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

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

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

2.5  LCD控制器时序参数

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

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

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

按理说,对于一个已知尺寸(即水平显示尺寸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中相关内容的数据一致即可。

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

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

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

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

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

参数计算:

Mini2440自带的LCD -P35,参考ZQ3506_V0 LCD数据手册上的参数性能,见下表:

LCD 大小为320×240,16BPP数据格式,则:

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

水平同步信号的脉宽、前肩和后肩分别取2、13和6,则:

$$HSPW=2-1=1,HFPD=13−1=12,HBPD=6−1=5$$

垂直同步信号的脉宽、前肩和后肩分别取3、2和10,则:

$$VSPW=3-1=2,HFPD=13−1=12,HBPD=6−1=5$$

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

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

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

/*  LCD P35参数设定 */
#define     LCD_WIDTH   320             /* LCD面板的行宽 */
#define     LCD_HEIGHT  240             /* LCD面板的列宽 */

#define         VSPW        2                /* 通过计算无效行数垂直同步脉冲宽度决定VSYNC脉冲的高电平宽度 */
#define     VBPD        9                /* 垂直同步周期后的无效行数 */
#define     LINEVAL     (LCD_HEIGHT-1)  /* LCD的垂直宽度-1 */
#define     VFPD        1                /* 垂直同步周期前的的无效行数 */

#define     CLKVAL      7              /* VCLK = HCLK / [(CLKVAL  + 1)  × 2] */

#define     HSPW        1                /* 通过计算VCLK的数水平同步脉冲宽度决定HSYNC脉冲的高电平宽度 */
#define     HBPD        5               /* 描述水平后沿为HSYNC的下降沿与有效数据的开始之间的VCLK周期数 */
#define     HOZVAL      (LCD_WIDTH-1)    /* LCD的水平宽度-1 */
#define     HFPD        12                /* 水平后沿为有效数据的结束与HSYNC的上升沿之间的VCLK周期数 *

三、寄存器

3.1 LCD控制1寄存器

主要用于选择LCD类型、设置像素时钟、使能LCD信号的输出等。

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

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:禁止,1:使能;

 0

根据我们之前的分析,参数设置:

  • CLKVAL;
  • PNRMODE设置为0b11;
  • BPPMODE设置为0b1100;
  • LCD输出使能,先暂时关闭不输出;
LCDCON1 = CLKVAL<<8 | 3 << 5 | 12 < 1 | 0 < 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

根据我们LCD型号,参数设置:

  • VBPD
  • LINEVAL
  • VFPD
  • VSPW
 LCDCON2 = (VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);

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

根据我们LCD型号,参数设置:

  • HBPD
  • HOZVAL
  • HFPD
LCDCON3 = (HBPD<<19)|(HOZVAL<<8)|(HFPD);

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

根据我们LCD型号,参数设置:

  • HSPW
    LCDCON4 = (HSPW);

3.5 LCD控制5寄存器(用来设置引脚极性,BPP,数据存放格式)

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

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 格式   1= 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

根据芯片手册:

参数设置:

  • FRM565:设置为1
  • INVVCLK: 设置为·1
  • INVVLINE:设置为1
  • INVVFRAME:设置为1
  • HWSWP:设置为1
 LCDCON5 = ((1<<11) | (1<<10)| (1 << 9) | (1 << 8) | (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

在内存设置FrameBuffer:

    /* [29:21] LCDBANK:存放帧缓冲起始地址的[30:22]
     * [20:0] LCDBASEU: 存放帧缓冲起始地址的[21:1]
     */   
    LCDSADDR1 = ((LCD_ADDR >> 22) << 21) | (M5D(LCD_ADDR >> 1)) ;

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

 0x00

设置:

    /* 存放帧结束地址[21:1] */
    LCDSADDR2 = M5D((LCD_ADDR + (LCD_WIDTH * LCD_HEIGHT * 2 )) >> 1); 

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

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDSADDR3

0X4D00001C

R/W

STN/TFT:虚拟屏地址设置

0x00000000

寄存器位信息:

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

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

 00000000000
PAGEWIDTH [10:0]

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

 000000000

设置:

    /* [21:11] OFFSIZE:表示虚拟屏偏移尺寸  即上一行最后像素点到下一行第一个像素点之间间隔多少个像素点
    *  [10:0] PAGEWIDTH:表示行的宽度(半字为单位 16bit)
    */
    LCDSADDR3 = (0<<11) | LCD_WIDTH;

3.9 临时调色板寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

TPAL

0X4D000050

R/W

TFT:临时调色板寄存器。
此寄存器的值将为下帧的视频数据

0x00000000

寄存器位信息:

TPAL 描述 初始状态
TPALEN [24]

临时调色板寄存器使能位

0 = 禁止 1 = 开始

 0
TPALVAL [23:0]

临时调色板值寄存器。
TPALVAL[23:16] :红色
TPALVAL[15:8] :绿色

TPALVAL[7:0] :蓝色

 0x000000

3.10 LCD 中断屏蔽寄存器

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

LCDINTMSK

0X4D00005C

R/W

决定屏蔽哪个中断源。
被屏蔽的中断源将不会被服务

0x3

寄存器位信息: 

LCDINTMSK 描述 初始状态
FIWSEL [2]

决定LCD FIFO 的触发深度。
0 = 4 字 1 = 8 字

 0
INT_FrSyn [1] 屏蔽LCD 帧同步中断。
0 = 中断服务可用 1 = 屏蔽中断服务
1
INT_FiCnt  [0]  

屏蔽LCD FIFO 中断
0 = 中断服务可用 1 = 屏蔽中断服务

 1

屏蔽中断:

 LCDINTMSK |= 3;

2.11 TCONSEL

寄存器信息:

寄存器名

地址

是否读写

描述

复位值

TCONSEL

0X4D000060

R/W

此寄存器控制LPC3600/LCC3600 模式

0xF84

寄存器位信息(只介绍了两个使用到的位):

TCONSEL 描述 初始状态
LCC_EN [4]

决定LCC3600 使能/禁止
0 = LCC3600 禁止 1 = LCC3600 使能

 0
LPC_EN [0]

决定LPC3600 使能/禁止
0 = LPC3600 禁止 1 = LPC3600 使能

0

因为使用的不是使用三星LPC3600/LCC3600 LCD,所以禁止LPC3600/LCC3600模式(写入0到TCONSEL位4、0)。

参考文章

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

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

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

[4]mini2440硬件篇之LCD

[5]s3c2440裸机-LCD编程(二、LCD控制器)

[6]s3c2440裸机-LCD编程(三、框架准备和LCD初始化)

[7]Mini2440--P35屏幕,写LCD驱动程序时遇到的硬件问题

原文地址:https://www.cnblogs.com/zyly/p/15407570.html