fuzidage
专注嵌入式、linux驱动 、arm裸机研究

导航

 

1.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控制器主要功能如下:

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

2.数据存储格式

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

24bpp的数据格式:

从图中可以看到24bpp的像素,在lcd控制器的VD[7:0]表示BLUE, VD[15:8]表示GREEN,VD[23:16]表示RED。在内存中的FrameBuffer中每一个像素占据4个字节,当BPP24BL=0时,低24位为颜色数据,当BPP24BL=1时,高24位为颜色数据。

16bpp的数据格式:

也可以看到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的数据格式:

上一节介绍了LCD硬件上只有R1-R5、G0-G5、B1-B5与SOC相连,5+6+5=16BPP,所以LCD上每个像素就只占据16位数据。那么当我们的Frame buffer中是8BPP颜色数据时,是如何把颜色数据填充到LCD上的呢?

用调色板

3.调色板

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)格式相同。

调色板格式如下:(0x4D000400为调色板起始地址)

4.LCD controller相关寄存器

LCD控制寄存器1:

[27:18]为只读数据位,不需要设置;

[17:8]设置CLKVAL(像素时钟频率),我们使用的是TFT屏,因此采用的公式是VCLK = HCLK / [(CLKVAL+1) x 2],其中HCLK为100M。LCD手册里面Clock cycle的要求范围为5-12MHz即可,那么取VCLK=9,根据公式9=100/[(CLKVAL+1)x2],算出CLKVAL≈4.5=5,设置CLKVAL=5。

[7]不用管,默认即可;

[6:5]TFT lcd配置为0b11;

[4:1]设置bpp模式,用户可选

[0]LCD输出使能,先暂时关闭不输出;

LCD控制寄存器2:(垂直方向相关设置)

2440LCD控制器时序图如下:

和上一节LCD硬件原理中的LCD时序图对比发现:

[31:24] : VBPD = tvb - 1 (表示显示完最后一行像素,再过多久Vsync才来,表示上边黑框)
[23:14] : LINEVAL = 每帧有多少行 - 1 
[13:6]  : VFPD = tvf - 1(下边黑框)
[5:0]  : VSPW = tvp - 1 (Vsync信号的脉冲宽度)

LCD控制寄存器3:(水平方向相关设置)

[25:19] : HBPD = thb - 1(左边黑框)
[18:8]  : HOZVAL = 每行有多少列 - 1
[7:0]  : HFPD = thf - 1 (右边黑框)

LCD控制寄存器4:

[7:0]: HSPW = thp - 1 (Hsync信号的脉冲宽度)

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


[12] : BPP24BL(表示24bpp的数据是大端还是小端)
[11] : FRM565 (数据存放格式)
[10] : INVVCLK(时钟是否反转极性,当配置成0时数据在时钟下降沿被锁存)
[9]  : HSYNC是否反转
[8]  : VSYNC是否反转
[7]  : INVVD, rgb是否反转
[6]  : INVVDEN
[5]  : INVPWREN
[4]  : INVLEND
[3]  : PWREN(LCD_PWREN output signal enable/disable)
[2]  : ENLEND
[1]  : BSWP
[0]  : HWSWP

LCDSADDR1:(frame buffer的起始地址寄存器)

[29:21] : LCDBANK, A[30:22] of fb
[20:0]  : LCDBASEU, A[21:1] of fb
即[29:0]表示Frame buffer的起始地址的[30:1]。

LCDSADDR2:(frame buffer的结束地址寄存器)

[20:0] : LCDBASEL,A[21:1] of end addr,即framebuffer的结束地址。
posted on 2020-06-18 18:04  fuzidage  阅读(854)  评论(0编辑  收藏  举报