s3c2440裸机-LCD编程-2-LCD控制器

发布者:喜悦的38号最新更新时间:2024-07-03 来源: elecfans关键字: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的结束地址。


关键字:LCD编程 引用地址:s3c2440裸机-LCD编程-2-LCD控制器

上一篇:制作 micro2440开机Logo for Linux
下一篇:通用裸机-传感器-1-DHT11温湿度sensor

推荐阅读最新更新时间:2026-03-20 07:30

s3c2440裸机-LCD编程-6-LCD上显示字符
1.字库的移植 字符也是由点构成的,一个个点组成的点阵,其实本质上要显示文字就是把字库移植到对应的自己型号相匹配的board上,字库中的每一个字符都是一些点按照对应格式组合成的集合。 从linux内核源码中随便挑选一个字库文件,比如linux-4.18.16/lib/fonts这个目录下就有对应的很多字库文件。在这里我挑选font_8x16.c,如下图: 其中8x16表示每个字符所占的像素点的大小,表示每个字符占的大小为长*宽=8*16个像素点。 我们来看下一个字符'A'是如何显示的?从font_8x16.c我们找到字符'A'的数据,如下图: 那么我们如何让font_8x16.c这个字
[单片机]
s3c2440裸机-LCD编程(一、LCD硬件原理)
1.LCD示意图 下图是LCD示意图,里面的每个点就是一个像素点。 它里面有一个电子枪,一边移动,一边发出各种颜色的光。用动态图表示如下: 电子枪是如何移动的? 有一条CLK时钟线与LCD相连,每发出一次CLK(高低电平),电子枪就移动一个像素。 颜色如何确定? 由连接LCD的三组线RGB三原色混合而成:R(Red)、G(Green)、B(Blue)确定。 电子枪如何得知应跳到下一行? 有一条HSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到下一行,该信号叫做行同步信号。 电子枪如何得知应跳到原点? 有一条VSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到原点,该信号叫
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-<font color='red'>LCD</font><font color='red'>编程</font>(一、<font color='red'>LCD</font>硬件原理)
s3c2440裸机-LCD编程(三、框架准备和LCD初始化)
1.准备框架 为了让程序更加好扩展,体现出”高内聚、低耦合 的特点,能够兼容各种不同型号的lcd,假如有两款尺寸大小的lcd,如何快速的在两个lcd上切换? 首先我们抽象出lcd_3.5.c和lcd_4.3.c的共同点,比如都有初始化函数init(),我们可以新建一个lcd.c,然后定义一个结构体: struct lcd_opr{ void (*init)(void); }; 用户不接触lcd_3.5.c和lcd_4.3.c,只需要在lcd.c里通过指针访问对应的结构体的函数,也就调用了不同init(),如下图所示: 我们的目的是在LCD显示屏上画线、画圆(geomentry.c)和写字(font.c)其核心是画点
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-<font color='red'>LCD</font><font color='red'>编程</font>(三、框架准备和<font color='red'>LCD</font>初始化)
s3c2440裸机-LCD编程(五、LCD上实现画点、线、圆)
1.画点 无论是何种图形,都是基于点来构成的,因此我们需要先实现画点,其他的都是上层的一些数据处理了,像各种图形、甚至色彩鲜艳的图片无非都是一些由点构造出的数据而已。 我们在在farmebuffer.c实现画点,在geomentry.c实现画线、画圆等几何图形,font.c实现画字。 那么一个像素点要显示到lcd上,我们要知道它的位置坐标,然后还要知道它的颜色值,假设该像素点的坐标为(x,y),那么该像素的地址为: (x,y)= fb_base + (xres*(bpp/8))*y +x*bpp/8; 那么所以在画点前需要先获取lcd参数:fb_base、xres、yres、bpp; static unsigned
[单片机]
S3C2440裸机------LCD_LCD控制器介绍
1.LCD控制器的功能 LCD控制器主要完成两个工作: 取数据:把framebuffer的地址告诉LCD控制器,bpp,分辨率。 发数据: 把时序告诉LCD控制器、设置引脚的极性。 2.LCD控制器框图 我们的LCD控制器中的LCDDMA会从内存中把数据取出来,然后发送给LCD,我们通过设置寄存器来控制LCD控制器发出合适的时序。 3.LCD像素数据格式 如果像素数据使用8bpp,那么会用到一个调色板的概念, 4.LCD控制器时序图
[单片机]
<font color='red'>S3C2440</font><font color='red'>裸机</font>------<font color='red'>LCD</font>_<font color='red'>LCD</font><font color='red'>控制器</font>介绍
S3C2440之IIC裸机驱动
花了两天的时间终于把这个搞定了,其实I2C的原理还是比较简单的,只是几个细节性的东西还是需要特别的注意,主要是需要注意一下几点: 1.rIICCON &= ~0x10; 清中断必须要在rIICDS = slvAddr; 和rIICSTAT = 0xf0; // 主设备,启动 之后 2.延时对于写外部的低速设备来说非常重要,比如while(flag)之后一定要加延时,还有在写数据时发现只能写入基数地址的数据,这也是由于延时导致的 3.开始调试的时候系统总是死在read的函数中,后来发现在数据手册的note中说当读取最后一个数据的时候一定不能返回ACK信号,而我却在程序中使用while(flag)来等待ACK引发中断,这不死才怪呢。。
[单片机]
s3c2440裸机-UART编程-2-UART编程实现
UART编程 1.初始化 我们的2440支持3个UART串口,以uart0为例讲解。 那么我们需要实现以下这几个函数完成串口的最基本功能: (1)uart0_init()用于初始化串口 (2)putchar()用于发送一个字符 (3)getchar()用于接收一个字符 (4)puts()用于发送一串字符 1.uart0_init() 1.配置uart0引脚 (1)根据原理图GPH2,3用于TxD0, RxD0。 (2)查看dataset,配置GPH控制寄存器,让GPH2,3配成uart模式;为了将其保持为高电平,先设置其为上拉。 GPHCON &= ~((3 4) | (3 6)); G
[单片机]
s3c2440裸机-内存控制器2-不同位宽外设与CPU地址总线的连接
不同位宽设备的连接 我们先看一下2440芯片手册上外设rom是如何与CPU地址总线连接的。 8bit rom与CPU地址线的连接 8bit*2 rom与CPU地址线的连接 8bit*4 rom与CPU地址线的连接 16bit rom与CPU地址线的连接 16bit*2 rom与CPU地址线的连接 从上面的图中,我们知道可以对2片位宽为8bit的外设扩展级联成1个16bit的外设,同理可用4片位宽为8bit的外设进行级联成1个32bit的外设... 从上面的图中,我们还看见一个规律: 当外设总线位宽为8bit时, 外设A0接CPU的地址总线ADDR , A - ADDR ...A - AD
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved