zoukankan      html  css  js  c++  java
  • s3c2440裸机-LCD编程(二、LCD控制器)

    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的结束地址。
  • 相关阅读:
    SpringBoot基础
    开始一个新的springboot项目checklist
    五项修炼: 终生学习者
    价值流分析-改进方法论
    伯努利方程
    会计语言
    svg蒙版mask
    从svg到计算机图形学
    xflux 调节屏幕色温
    处理器架构
  • 原文地址:https://www.cnblogs.com/fuzidage/p/13158971.html
Copyright © 2011-2022 走看看