历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2020年12月06日 | TQ210 —— LCD

2020-12-06 来源:eefocus

一、LCD控制器
1、S5PV210 LCD控制器
要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S5PV210等。通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。

LCD控制器可以通过编程支持不同LCD屏的要求,例如行和列像素数,数据总线宽度,接口时序和刷新频率等。

LCD控制器的主要作用,是将定位在系统存储器中的显示缓冲区中的LCD图像数据传送到外部LCD驱动器,并产生必要的控制信号,例如RGB_VSYNC, RGB_HSYNC, RGB_VCLK等。
  
2、主要特性
(1)支持4种接口类型:RGB/i80/ITU 601(656)/YTU444 
(2)支持单色、4级灰度、16级灰度、256色的调色板显示模式 
(3)支持64K和16M色非调色板显示模式 
(4)支持多种规格和分辨率的LCD 
(5)虚拟屏幕最大可达16MB 
(6)5个256*32位调色板内存

(7)支持透明叠加


3、控制器子模块
(1)、主要由VSFR, VDMA, VPRCS , VTIME和视频时钟产生器几个模块组成:
(2)、VSFR由121个可编程控制器组,一套gamma LUT寄存器组(包括64个寄存器),一套i80命令寄存器组(包括12个寄存器)和5块256*32调色板存储器组成,主要用于对lcd控制器进行配置。
(3)、VDMA是LCD专用的DMA传输通道,可以自动从系统总线上获取视频数据传送到VPRCS,无需CPU干涉。
(4)、VPRCS收到数据后组成特定的格式(如16bpp或24bpp),然后通过数据接口(RGB_VD, VEN_VD, V656_VD or SYS_VD)传送到外部LCD屏上。 
(5)、VTIME模块由可编程逻辑组成,负责不同lcd驱动器的接口时序控制需求。VTIME模块产生 RGB_VSYNC, RGB_HSYNC, RGB_VCLK, RGB_VDEN, VEN_VSYNC等信号。

二、接口信号
FIMD显示控制器信号(我写的word表格怎么成这样了?)
Signal I/O Description LCD Type 
LCD_HSYNC O 水平同步信号 RGB I/F 
LCD_VSYNC O 垂直同步信号
LCD_VDEN O 数据使能
LCD_VCLK O 视频时钟
LCD_VD[23:0] O  LCD像素数据输出
SYS_OE O 输出使能
VSYNC_LDI O Indirect i80接口,垂直同步信号 i80 I/F 
SYS_CS0 O Indirect i80接口,片选LCD0
SYS_CS1 O Indirect i80接口,片选LCD1
SYS_RS O Indirect i80接口,寄存器选择信号
SYS_WE O Indirect i80接口,写使能信号
SYS_VD[23:0] IO  Indirect i80接口,视频数据输入输出
SYS_OE O Indirect i80接口,输出使能信号
VEN_HSYNC O 601接口水平同步信号 ITU 601/656 I/F 
VEN_VSYNC O 601接口垂直同步信号
VEN_HREF O 601接口数据使能
V601_CLK O 601接口数据时钟
VEN_DATA[7:0] O  601接口YUV422格式数据输出
V656_DATA[7:0] O  656接口YUV422格式数据输出
V656_CLK O 656接口数据时钟
VEN_FIELD O 601接口域信号
其中主要的RGB接口信号:
(1)、LCD_HSYNC: 行同步信号,表示一行数据的开始,LCD控制器在整个水平线(整行)数据移入LCD驱动器后,插入一个LCD_HSYNC信号; 
(2)、LCD_VSYNC:  帧同步信号,表示一帧数据的开始,LCD控制器在一个完整帧显示完成后立即插入一个LCD_VSYNC信号,开始新一帧的显示;VSYNC信号出现的频率表示一秒钟内能显示多少帧图像,称为“显示器的频率” 
(3)、LCD_VCLK:像素时钟信号,表示正在传输一个像素的数据;
(4)、LCD_VDEN: 数据使能信号;
(5)、LCD_VD[23:0]: LCD像素数据输出端口

三、工作时序
下图是LCD RGB接口工作时序图:

 
上面时序图上各时钟延时参数的含义如下:(这些参数的值,LCD产生厂商会提供相应的数据手册) 
VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数
VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数
VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算
HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数
HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数
HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算
(1)帧的传输过程
<1>、VSYNC信号有效时,表示一帧数据的开始,   信号宽度为 (VSPW + 1)个HSYNC信号周期,即(VSPW + 1)个无效行;
< 2>、VSYNC信号脉冲之后,总共还要经过(VBPD + 1)个HSYNC信号周期,有效的行数据才出现; 所以,在VSYNC信号有效之后,还要经过(VSPW + 1  + VBPD + 1)个无效的行;
<3>、随即发出(LINEVAL + 1)行的有效数据;
<4>、最后是(VFPD + 1)个无效的行;
(2)行中像素数据的传输过程
<1>、HSYNC信号有效时,表示一行数据的开始,信号宽度为(HSPW + 1)个VCLK信号周期,即(HSPW + 1)个无效像素;
<2>、HSYNC信号脉冲之后,还要经过(HBPD + 1)个VCLK信号周期,有效的像素数据才出现;
<3>、随后发出(HOZVAL + 1)个像素的有效数据;
<4>、最后是(HFPD + 1)个无效的像素;
(3)将VSYNC、HSYNC、VCLK等信号的时间参数设置好之后,并将帧内存的地址告诉LCD控制器,它即可自动地发起DMA传输从帧内存中得到图像数据,最终在上述信号的控制下出现在数据总线VD[23:0]上。用户只需要把要显示的图像数据写入帧内存中。 

四、外部接口
S5PV210外部LCD控制器接口图如下:
  
下图是信号的引脚连接描述:
    
(1)16M(24BPP)色的显示模式 
用24位的数据来表示一个像素的颜色,每种颜色使用8位
 LCD控制器从内存中获得某个像素的24为颜色值后,直接通过VD[23:0]数据线发送给LCD;
在内存中,使用4个字节(32位)来表示一个像素,其中的3个字节从高到低分别表示红、绿、蓝,剩余的1个字节无效;   
 (2)64K(16BPP)色的显示模式 
用16位的数据来表示一个像素的颜色;
格式又分为两种:
          5:6:5 ——使用5位来表示红色,6位表示绿色,5位表示蓝色  ;
          5:5:5:1——分别使用5位来表示红、绿、蓝,最后一位表示透明度;  

每种bpp模式下的引脚定义:
     

五、寄存器
主要寄存器如下:(其它参照用户手册S5PV210X_UserManual.pdf)
(1)VIDCON0: 配置视频输出格式,显示使能(VIDCON0,R/W,ADDRESS=0XF800_0000)
        
  VIDCON1: RGB 接口控制信号 
  VIDCON2 : 输出数据格式控制 
  VIDCON3 : 图像增强控制 
  I80IFCONx: i80接口控制信号 
  ITUIFCON : ITU接口控制信号 
  VIDTCONx: 配置视频输出时序及显示大小
  WINCONx: 每个窗口特性设置 
  VIDOSDxA,B : 窗口位置设置 
  VIDOSDxC,D: OSD大小设置

六、LCD配置步骤(S5PV210手册给出了)
1. VIDCON0: Configures video output format and displays enable/disable.
2. VIDCON1: Specifies RGB I/F control signal.
3. VIDCON2: Specifies output data format control.
4. VIDCON3: Specifies image enhancement control.
5. I80IFCONx: Specifies CPU interface control signal.
6. VIDTCONx: Configures video output timing and determines the size of display.
7. WINCONx: Specifies each window feature setting.
8. VIDOSDxA, VIDOSDxB: Specifies window position setting.
9. VIDOSDxC,D: Specifies OSD size setting.
10. VIDWxALPHA0/1: Specifies alpha value setting.
11. BLENDEQx: Specifies blending equation setting.
12. VIDWxxADDx: Specifies source image address setting.
13. WxKEYCONx: Specifies color key setting register.
14. WxKEYALPHA: Specifies color key alpha value setting.
15. WINxMAP: Specifies window color control.
16. GAMMALUT_xx: Specifies gamma value setting.
17. COLORGAINCON: Specifies color gain value setting.
18. HUExxx: Specifies Hue coefficient and offset value setting.
19. WPALCON: Specifies palette control register.
20. WxRTQOSCON: Specifies RTQoS control register.
21. WxPDATAxx: Specifies Window Palette Data of each Index.
22. SHDOWCON: Specifies Shadow control register.
23. WxRTQOSCON: Specifies QoS control register
实际中,我们还需要配置 LCD 相关信号引脚(GPIO),以及背光控制引脚。

关键点解析:
1、 LCD 时钟源的确定(参考 S5PV210 芯片手册时钟部分)
在 VIDCON0 寄存器中的 CLKSEL_F 域指定 LCD 的时钟源可以是 HCLK 和 SCLK_FIMD。S5PV210 由 3 个时钟域组成,其中 DSYS 域为 FIMD 提供时钟,FIMD 就是 Fully Interactive Mobile Display(完全交互式移动显示设备),即我们要操作的 LCD 控制器。所以上面的 HCLK 为 HCLK_DSYS,由 MOUT_DSYS 分频得到,freq(HCLK_DSYS) = MOUT_DSYS / (HCLK_DSYS_RATIO + 1) = 667 / (3 + 1) = 166MHz,而 SCLK_FIMD 由 MOUT_FIMD 分频得到,而 MOUT_FIMD 的时钟源由 SCLK_SRC1 寄存器中的 FIMD_SEL域确定。
2、在 S5PV210 芯片手册 1.3.1 BRIEF DESCRIPTION OF THE SUB-BLOCK 中提到
Using the display controller data, you can select one of the above data paths by setting DISPLAY_PATH_SEL[1:0] (0xE010_7008). For more information, refer to Chapter, "Section 02.03. Clock controller".我们需要配置这个寄存器
3、 VIDCON1 中配置 HSYNC、 VSYNC、 VDEN 的极性是否反转,这要对比 S5PV210 中的 LCD 时序图和LCD 芯片手册中的 LCD 时序图,如果有效信号的电平或上升沿或下降沿相同,则不反转,否则要反转。
4、 S5PV210 显示控制器有 5 个窗口,每个窗口有 3 个视频缓冲区,通过 WINCON0 寄存器 BUFSEL选择哪一个,这在配置帧缓存地址时用到。
添加 lcd 后,代码已经增大至 37kB,而 BL1 最大为 16KB,所以需要重定位, 
初始化时钟、串口、 DDR,设置栈,然后跳转到 DDR 中执行 bl2.bin, 在 bl2.bin 中进行 lcd 初始化,画线、画圆。

部分代码如下:

#ifndef LCD_H_

#define LCD_H_

 

#include "types.h" // 重定义了一些类型

 

#define RED 0xFF0000

#define GREEN 0x00FF00

#define BLUE 0x0000FF

 

void lcd_init();

void backlight_ctl(u8 ctl);

void lcd_enable(u8 enable);

void draw_pixel(int x, int y, u32 color);

void clear_screen();

void draw_line(int x0, int y0, int x1, int y1, u32 color);

void draw_circle(int x, int y, int r, u32 color);

 

#endif

#include "lcd.h"

 

#define GPD0CON *((volatile u32 *)0xE02000A0) // 00000001

#define GPD0DAT *((volatile u32 *)0xE02000A4) // 00000001

 

#define GPF0CON *((volatile u32 *)0xE0200120) // 22222222

#define GPF1CON *((volatile u32 *)0xE0200140) // 22222222

#define GPF2CON *((volatile u32 *)0xE0200160) // 22222222

#define GPF3CON *((volatile u32 *)0xE0200180) // 00002222

 

#define DISPLAY_CONTROL *((volatile u32 *)0xE0107008) // 00000002

 

#define VIDCON0 *((volatile u32 *)0xF8000000) // 41b10133

#define VIDCON1 *((volatile u32 *)0xF8000004) // 01b6c060

#define VIDCON2 *((volatile u32 *)0xF8000008) // 00000000

#define VIDTCON0 *((volatile u32 *)0xF8000010) // 0009150c

#define VIDTCON1 *((volatile u32 *)0xF8000014) // 001a0d13

#define VIDTCON2 *((volatile u32 *)0xF8000018) // 000efb1f

#define VIDTCON3 *((volatile u32 *)0xF800001C) // 00000000

#define WINCON0 *((volatile u32 *)0xF8000020) // 0000802d

#define SHODOWCON *((volatile u32 *)0xF8000034) // 00000001

#define VIDOSD0A *((volatile u32 *)0xF8000040) // 00000000

#define VIDOSD0B *((volatile u32 *)0xF8000044) // 003203bf

#define VIDOSD0C *((volatile u32 *)0xF8000048) // 000bb800

#define VIDW00ADD0B0 *((volatile u32 *)0xF80000A0) // 28000000

#define VIDW00ADD1B0 *((volatile u32 *)0xF80000D0) // 28177c80

 

#define VBPD 23

#define VFPD 22

#define VSPW 2

#define HEIGHT 480

 

#define HBPD 46

#define HFPD 210

#define HSPW 2

#define WIDTH 800

#define BPP 24

 

static u32 bytes_per_line;

static u32 frame_buffer_size;

static u32 frame_buffer_addr = 0x28000000;

 

void lcd_init()

{

GPF0CON  = 0x22222222; /* LCD_VD[3:0] LCD_VCLK LCD_VDEN LCD_VSYNC LCD_HSYNC */

GPF1CON  = 0x22222222; /* LCD_VD[11:4] */

GPF2CON = 0x22222222; /* LCD_VD[19:12] */

GPF3CON = 0x00002222; /* LCD_VD[23:20] */

GPD0CON  = (GPD0CON & ~0xF) | (0x1 << 0); /* LCD PWR(backlight) */

DISPLAY_CONTROL = (2 << 0); /* Display path selection:RGB=FIMD I80=FIMD ITU=FIMD */

bytes_per_line = WIDTH;

if (BPP > 16)

bytes_per_line *= 32;

else

bytes_per_line *= BPP;

bytes_per_line /= 8;

frame_buffer_size = bytes_per_line * HEIGHT;

/* Configures video output format and displays enable/disable */

VIDCON0  = (5 << 6) | /* CLKVAL = 4, HCLK(166MHz) / (5 + 1) = 27MHz */

(1 << 4) | /* Selects the clock source as divide using CLKVAL_F */

(0 << 2); /* Selects the video clock source:HCLK=166MHz */

/* Specifies RGB I/F control signal */

VIDCON1  = (0 << 7) | /* Video data is fetched at VCLK falling edge */

(1 << 6) | /* Inverted HSYNC pulse polarity */

(1 << 5) | /* Inverted VSYNC pulse polarity */

(0 << 4); /* Normal VDEN signal polarity ?????*/

/* Specifies output data format control */

VIDCON2  = (0b000 << 19) | /* RGB interface output order(Even line, line #2,4,6,8):RGB */

(0b000 << 16); /* RGB interface output order(Odd line, line #1,3,5,7):RGB */

/* Configures video output timing and determines the size of display */

VIDTCON0 = (VBPD << 16) | /* VBPD */

(VFPD << 8) | /* VFPD */

(VSPW << 0); /* VSPW */

VIDTCON1 = (HBPD << 16) | /* HBPD */

(HFPD << 8) | /* HFPD */

推荐阅读

史海拾趣

Fair Rite公司的发展小趣事

随着电子行业的快速发展,Fair Rite迅速捕捉到新的市场机遇。公司不断推出创新产品,以满足医疗、照明、汽车、通讯、航空、国防、智能能源和工业市场等领域的需求。Fair Rite通过技术创新和品质保证,赢得了客户的信赖和市场的认可。

BVLED公司的发展小趣事

随着公司规模的扩大和业务范围的拓展,BVLED公司开始注重产业链的整合和成本控制。公司通过与上游供应商建立长期稳定的合作关系,确保了原材料的稳定供应和质量保障;同时,公司还加强了对生产过程的监控和管理,通过优化生产流程和降低能耗等方式降低了生产成本。这些措施使得公司在激烈的市场竞争中保持了较强的竞争力。

德索五金(dosinconn)公司的发展小趣事

发展历程:2008年,公司从工程部门中分出研发部门,并设立研发实验室。连接器定制研发从此成为公司的核心业务,创新意识也深入到了企业文化之中。

成果与影响:研发部门的成立和技术创新的推动使德索五金电子在连接器制造领域保持了领先地位,也为公司的长远发展提供了源源不断的动力。

B&B Electronics Manufacturing Company公司的发展小趣事

近年来,电子行业面临着技术更新迅速、市场需求多变等挑战。B&B公司积极应对这些挑战,不断调整和优化产品结构,加强技术创新和人才培养。同时,公司也密切关注行业动态和市场需求变化,为未来的发展做好充分准备。

这些故事虽然无法涵盖B&B公司发展的全部细节,但可以从不同侧面反映出公司在电子行业中的成长轨迹和发展脉络。作为一家在电子行业中具有一定影响力的公司,B&B公司的发展历程无疑是一个充满挑战和机遇的过程。

Fairchild Imaging公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Fairchild Imaging制定了面向未来的战略布局。公司将继续加大在成像技术领域的研发投入,推动技术创新和产品升级。同时,Fairchild Imaging还将积极拓展国际市场,加强与全球客户的合作与交流。此外,公司还将注重人才培养和团队建设,为公司的长期发展提供有力保障。

Arcolectric公司的发展小趣事

随着技术的不断进步和市场需求的日益多样化,Arcolectric开始积极拓展其产品线,并逐渐将产品应用于电脑、电源设备及家用电器等多个领域。公司通过不断创新和研发,成功推出了一系列符合市场需求的新产品,进一步扩大了市场份额。

问答坊 | AI 解惑

映射的意思【经典】

扫地只是我的表面工作,我真实的身份是一位研究憎。    电脑圈圈确实是厉害啊,能够把映射解释的如此贴切,小弟真是佩服。 映射,相当于重定位(remap)的意思 例如,本来我每次去买ARM芯片,都是去找Philips的,所以我从0x00000000路 ...…

查看全部问答>

单相Boost整流电路的仿真设计

大家好。老师要求做一个单相Boost整流电路,由于自己本科学习的是热能与动力工程专业,来此求助。我在网上查到一篇相关论文,望大家看下本人是否可以借鉴。 在此感谢!…

查看全部问答>

基于蓝牙技术的无线数据采集系统设计

摘要:利用蓝牙技术建立一个具有主从网络结构的蓝牙无线数据采集系统。设计采用基于BC219159 蓝牙芯片的蓝牙模块;从设备以AT89C2051为控制器,将采集的工业现场信号处理后送入蓝牙芯片进 行无线发送;主设备选用77E58作为控制器,实现对从设备的自动 ...…

查看全部问答>

内核态驱动和用户态驱动的区别

RT,写wince驱动有一段时间了,但是很惭愧,到现在还没搞清楚内核态驱动和用户态驱动的区别,特来请教…

查看全部问答>

哪位有工作经验的大哥大姐请帮帮忙(可以是任何关于电子或编程开发方面的经验)

       我们老师最近要求写一篇职业生涯规划,由于我选的是关于嵌入式开发方面的,因此必须找一位有工作经验的人来做一个职业访谈。不需要浪费很长时间,问题我已经写好了,只要填完就行了。只要留下邮箱就行,我会把文档给你 ...…

查看全部问答>

客户端安装sqlce3.0出错!

    我要在客户端(三星ARM6410SDB)上安装sqlce3.0,首先拷贝sqlce30.ppc.wce5.armv4i.CAB,sqlce30.repl.ppc.wce5.armv4i.CAB,sqlce.dev.ENU.ppc.wce5.armv4i.CAB三个文件至开发板的NandFlash,点击安装,出现错误:“没有应用程序与“s ...…

查看全部问答>

6410串口COM2,3都不通?

友坚的UT-6410的开发板,GPIO通过驱动初始化后都已经写寄存器配置成串口模式了,但COM2,3用串口调试助手发送都没有信号,更不用说接受了,我用自发自收23脚相连,也没信号,请大侠帮忙看看怎么回事?…

查看全部问答>

急问 LCD和超级终端双显示shell命令

小弟毕设是实验箱的LCD上和超级终端上双显示shell命令。我在移植内核后,如果使用带QT的文件即root-qtopia-china.cramfs-320x240usb.tar.bz2,则可以在超级终端上用exec 1>/dev/tty1命令重定向使LCD上显示shell命令,但是超级终端上不能显示。若用 ...…

查看全部问答>

小女子跪求IXDPG425平台的软件开发工具包

小女子跪求IXDPG425平台的软件开发工具包,有好心的哥哥姐姐能给我么,我是学生,想学下…

查看全部问答>

请问1PG控制伺服回原点没有爬行停止而是立即停止是何原因?

我在用1PG定位模块控制伺服在原点回归时,当到达DOG开关时,伺服没有爬行停止而是立即停止,而PGO信号灯也没有亮,我在程序里已经设置了#BMF 11为500,已经设置了回零爬行速度,况且我其他台也是这样接线而用同一控制程序,都没有问题,只是此台设 ...…

查看全部问答>