第十九章 LCD显示屏
本章代码,查看我的github网站:https://github.com/weiqi7777/...
1、RGB接口详解
1) VD[23:0] 24根数据线,用来传输图像信息
2) HSYNC(水平同步信号)
3) VSYNC(垂直同步信号):时序信号线,为了让LCD能够正常显示给的控制信号
4) HCLK(像素时钟),LCD工作时需要给主板控制器给LCD模板一个工作时钟信号,就是VCLK
5) VDEN(数据有效标志):时序信号,和HSYNC,VSYNC组合使用。
6) LEND(行结束标志,不是必须的):时序信号,非必须,如x210接口就没有
2、LCD如何显示图像
2.1、像素(pixel)
像素就是组成图像的最基本元素,或者说显示中可以被控制的最小单位,整个图像就是由很多个像素组成的。
每个像素可以被单独控制,或控制其亮或不亮(单色屏)。或控制其亮度的强弱(灰度屏,黑白电视机)。或控制其显示一定的颜色(彩色显示屏)。
总结:像素很重要,整个显示图像是由一个个的像素组成的。要在显示器上显示一个图像,就把这个图像离散成一个一个的点,然后把各个点的颜色对应在显示器的像素上。
2.2、扫描
扫描是一个动作,扫描就是依次将颜色数值放入屏幕中所有的像素的这个过程。
按照固定间隔时间,从左到右,从上到下,依次填充每个像素的颜色。当全部像素填充结束后,一幅图像就出来了。
显示器的扫描显示原理依赖于人眼的视觉暂留。只要显示器扫描频率大于人眼的显示频率,人眼看到的图像就是恒定的。如果扫描频率偏小人眼就会看到闪动。(扫描频率的概念就叫做刷新率)
2.3、驱动器&控制器
LCD驱动器驱动LCD显示。输出是模拟信号。驱动器一般和LCD面板集成在一起。(本来是分开的,做面板的只做面板,如三星、LG、台湾的友达、奇美;驱动器也由专门的IC厂商生产;集成厂商买来面板和驱动器后集成在一起做LCD屏幕),面板只负责里面的液晶分子旋转透光,面板需要一定的模拟电信号来控制液晶分子;LCD驱动器芯片负责给面板提供液晶分子的模拟电信号,驱动器的控制信号(数字信号)来自于外部的数字接口,这个接口就是LCD屏幕的外部接口。
LCD控制器是发数字信号给控制LCD驱动器,实现LCD显示内容。LCD控制器一般集成在soc内部。负责通过数字接口向外部的LCD驱动器提供控制像素显示的数字信号。LCD控制器的关键在于时序,必须按照一定的时序和LCD驱动器通信。LCD控制器受soc控制器,soc会从内存中拿像素数据给LCD控制器并最终传给LCD驱动器。
LCD控制器和LCD驱动器之间的接口就是RGB接口。
2.4、显示内存(简称显存)
Soc从外部flash读取显示图片的数据到内存中进行解析,然后通过LCD控制器发送给LCD驱动器来使LCD显示。
Soc在内存中挑选一段内存(一般来说随意挑选,也就是可以使用软件配置。但是挑选的地址有要求),然后通过配置将LCD控制器和这段内存(之后称为显存)连接起来,构成一个映射关系。一旦关系建立之后,LCD控制器就会自动从显存中读取像素数据传输给LCD驱动器。
Soc配置完毕后,显示就是自动的。Soc不用干预,LCD就能显示。
显示体系建立起来后,CPU就不用再管LCD控制器、驱动器、面板这些东西;以后CPU就只关心显存了,因为CPU只要把要显示的图像的像素数据放到显存中,硬件就会自动操作(屏幕就能自动显示图像)。
总结:
LCD显示分为2个阶段:
第一个阶段就是建立显示体系的过程,目的就是CPU初始化LCD控制器使其和显存,联系起来构成映射。
第二个阶段就是建立映射建立之后,将要显示的图像放到显存中去。
3、LCD的六个主要时序参数
3.1、LCD显示单位:帧(frame)
显示器上一整个画面的内容成为一个帧(frame),整个显示器工作时是一帧一帧的在显示。如电影就是以每秒24帧的速度在播放图片。
帧内数据:一帧分为多行,一行分为多个像素。因此一帧图像其实就是多个像素组成的矩阵。
帧外数据:整个视频由很多个帧构成,最终播放视频的时候逐个的播放各个图片帧即可。
3.2、LCD显示一帧图像的过程
首先把帧分为行,然后再把行分为像素,然后逐个像素去显示。(显示像素:其实就是LCD驱动器按照接收到的LCD控制器给的显示数据,驱动一个像素的液晶分子旋转,让这个像素显示出相应的颜色值的过程)
关键点:LCD控制器和LCD驱动器之间一次只能传一个像素点的显示数据。即传输一个像素,显示一个像素。所以一帧图像在屏幕上其实是串行的依次被显示上去的,不是同一时间显示出来的。只是显示时间比较快,因此我们感觉是一起显示的。
为了向前兼容出现的六个时序参数
HSPW 水平同步信号脉宽
HBPD 水平同步信号前肩 , t1
HFPD 水平同步信号后肩, t2
VSPW 垂直同步信号脉宽
VBPD 垂直同步信号前肩, t3
VFPD 垂直同步信号后肩, t4
显示时序
红色部分是显示一行的时序。
VDEN决定HSPW,HBPD,HFPD三个时序参数。VDEN为高时,VD的数据时显示有效的。其他时候决定三个时序参数。
一行的通信过程:LCD控制器先发送HSYNC高电平脉冲(脉冲宽度由HSPW决定),脉冲高速驱动器后面的信息是一行信息,然后开始这一行信息。这一行信息包括三部分:HBPD+有效行信息+HFPD。其中前肩和后肩都属于时序信息(和LCD屏幕具体有关),有效行信息(HOZVAL)就是横向的分辨率(九鼎开发板是800)。所以可认为一行总共包括4部分:HSPW+HPBD+有效行信息+HFPD。
一帧图像其实就是一列,一列图像由多个行组成,每行都由上面的时序组成。
图中红色部分是一列的时序。
一帧图像的通信过程是这样的:整个帧图像分为4部分:VSPW+VBPD+帧有效信号+VFPD。VSPW是帧同步信号宽度,用来告诉LCD驱动器一帧图像要开始了,VBPD和VFPD分别是垂直同步信号前后肩。
其实这6个参数对于LCD显示器是没有用,这些信号是CRT显示器需要的。因此这些参数是向前历史兼容而使用。
这几个时序参数是LCD屏幕的参数,与LCD控制器无关。因此要查阅所使用LCD的手册来确定以上参数。
这些参数的来源一般是:
1.厂家会直接给出,一般以实例代码的形式给出。
2.来自于LCD的数据手册。
第一种方式。查看九鼎的210逻辑教程(x210裸机开发教程\src\template-framebuffer-font\source\handware\s5pc210-fb.c的第774行)
.timing = {
.h_fp = 210, //160-210-354
.h_bp = 38, //46
.h_sw = 10, //1-40
.v_fp = 22, //7-22-147
.v_fpe = 1,
.v_bp = 18, //23
.v_bpe = 1,
.v_sw = 7, //1-20
},
第二种方式:查看数据手册AT070TN92.pdf
补充:
1) 参数的单位。H开头的三个参时序数单位是以DCLK(像素时钟)为单位。V开头的三个时序单位是TH。这样设置的好处是改变了像素时钟的设置时,不用改变这里的时序参数。
2) 这些时序参数没有设置好会影响什么?会影响图片的显示平移。因此需要调这6个时序参数来对显示进行校准。
4、LCD显示的主要相关概念
4.1、像素(pixel)
整个图像是由一个个像素组成的,像素就是一个显示点。
4.2、像素间距(pitch)
Pitch是连续两个像素的像素中心的距离。一般的像素是方形的,所以横向pitch和纵向的pitch一样的。但是也有不一样的。
像素间距会影响屏幕的最佳观看距离。像素间距大的适合远距离看(LED广告屏),像素间距小的适合近距离看(手机)。
4.3、分辨率(resolution)
整个屏幕的横向和纵向的像素个数就叫做分辨率。如x210开发板用的屏幕就是800*480。屏幕尺寸和分辨率是无关的。屏幕尺寸的单位是英寸,指对角线的尺寸长度。如7寸,指纯屏幕对角线尺寸是7英寸。
屏幕尺寸和分辨率和像素间距三者之间有关联。可以进行换算。
4.4、清晰度
清晰度是一个主观概念,是人眼对显示效果的一个主观判断。也就是人看起来感觉清晰还是不清晰。
客观来说,清晰度由分辨率和像素间距共同决定。一般来说,屏幕尺寸固定时,分辨率越高越清晰,分辨率越低越不清晰。分辨率固定下,屏幕尺寸越小越清晰,越大越不清晰。
清晰度还由其他很多因素共同决定。
4.5、像素深度(bits per pixel, 简称bpp)
一个像素在计算机中由多少个字节数据来描述。计算机中用二进制位来表示一个像素的数据,用来表示一个像素的数据位越多,则这个像素的颜色更加丰富,分得更细,颜色深度就更深。
一般来说,像素深度有这么几种:1位、8位、16位、24位、32位。
5、颜色在计算机中的表示
5.1、颜色的本质
颜色是主观存在,颜色其实是自然光在人的眼睛中和大脑中产生的一种映像。颜色的本质决定于光的波长。
5.2、自然光的颜色是连续的
光的波长是连续的,导致颜色也是连续的。理论上只要眼睛分辨能力足够好,可以在自然界中发现无数种颜色。
5.3、计算机中的颜色是离散的
计算机中不可能存储无数种颜色,所以必须将颜色有限话,所以就用有限种颜色来代表自然界中的无限种颜色。
这种离散化表达颜色的缺点是不够真实,漏掉了很多种颜色。因此计算机中所能表达的颜色没有自然界中丰富。
计算机所能表达的颜色种类个数,这个参数叫:像素深度bpp。
5.4、常见像素深度:1位、8位、16为、24位、32位
1位:用1个二进制位来表示颜色,这种叫做单色显示。示例就是LED屏。
8位:用8个二进制位来表示颜色,此时能表示256种颜色。这种叫灰度显示。这时候是黑白的,将纯黑和纯白之间分为256份,对应0到255。中间的数值对应不同的灰度。示例黑白电视机。
16位:用16个二进制位来表示颜色,此时能表示的颜色有2^16=65536种。这时候可以彩色显示。一般是是RGB565的颜色分布。即5位二进制表示红色,6位二进制位表示绿色,5位二进制位表示蓝色。这种红绿蓝都有的颜色表示法就是一种模拟自然界中所有颜色的表示方式。但是因为RGB的颜色表达本身二进制位数不够多。所以这样显示的彩色失真比较重,人眼能明显看到显示得不真实。
24位:用24个二进制位来表示颜色,此时能够表示2^24=16777216种颜色。这种表示方法和16位色原理是一样的,只是RGB三种颜色各自的精度更高了(RGB各8位),叫RGB888。此时颜色比RGB565更真实细腻。虽然比自然界无数种颜色还是少了很多,不过由于人眼的不理想性,所以人眼几乎不能区分这么多种颜色和无数种颜色的区别。于是把这种RGB888表示方法叫真彩色。(RGB565就是假彩色)
32位:总共有32位二进制来表示颜色,其中24位来表示RGB三种颜色(还是RGB888),剩下8位表示透明度。这种显色方式就叫ARGB(A是α,表示透明度)。现在PC机种一般都用ARGB表示颜色。
6、S5PV210的LCD控制器
6.1、FIMD结构框图
210的LCD控制器叫FIMD。FIMD是210内部和图像处理相关的一些部件,在摄像头和图像处理有关的部分都有关联。
输出有三条路可以走。WB_YUV,RGB_VD,SYS_VD。
FIMD在内部与AHB总线等相连接,在外部提供RGB接口、I70接口、YUV接口与外部相连接,这里使用RGB接口。
6.2、虚拟屏幕叠加(数据手册P1194)
虚拟屏幕的意思是,平时看到的屏幕上显示出来的画面实际上是很多画面显示叠加在一起的效果。
如S5PV210的LCD控制器有5个虚拟屏幕,window0到window4,虚拟屏幕不存在真实,而是存在于内存中。(LCD显示时,实际是显示的是显存区域的数值)。每个window对应一个显存,可以设置哪一个window在前面,哪一个在后面。从而实现画面的叠加显示。
虚拟屏幕其实就是一个内存中的显存区域,有几个显存取悦就有几个虚拟屏幕,但是这些虚拟屏幕都被映射到一个真实的显示屏上面,所以将来真实的现实效果实际是这几个虚拟屏幕的显示内容的叠加。(叠加式要注意上面一层灰覆盖下面一层,所以要注意谁在前谁在后,设置寄存器时有这个选项)
使用虚拟屏幕而不是整个LCD使用一个显存是有一定好处的:第一,可以保证不污染源图像,方便程序处理;第二,可以减少屏幕的刷新,提高效率,减小CPU工作量。
Window0显示一幅图像,window1显示另一个画面,将window0叠加window1,就显示合成的图片。
6.3、虚拟显示(手册P1206)
如何实现在小分辨率的屏幕上(真实)显示大分辨率的图像。
细节上,需要屏幕上看到不同图像时,需要对显存区域进行刷新。即使只需要屏幕显示移动一点点,整个屏幕对应的显存空间也需要整个重新刷新,工作量和完全重新显示一幅图像时一样的。这个显然不好,这样CPU刷新屏幕的工作量太大了,效率很低。
如何能够在显示一个大图片的不同地方区域时让CPU刷新工作量减少?方法就是虚拟现实。具体做法就是在内存中建立缓存的时候实际建立一个很大的区域,然后让LCD去对应其中的一部分区域作为有效的显示区域。将来要显示大图像时,直接将大图像全部一次性加载入显示缓存区,然后通过移动有效显示区域就可以显示大图像的不同区域,使CPU不用刷新。
如图所以,CPU加载图像到内存的缓存中,然后改变有效显示区域,就可以实现显示不同的图像内容。而CPU不需要刷新显存区域。
6.4、控制器的寄存器
控制
时序控制
5个虚拟屏幕有关的寄存器
影子寄存器,设置5个虚拟屏幕的叠加方式
设置第0个虚拟屏幕的虚拟显示区,也就是设定显存。
设置第1个虚拟屏幕的虚拟显示区,也就是设定显存。
设置第2个虚拟屏幕的虚拟显示区,也就是设定显存。
设置第3个虚拟屏幕的虚拟显示区,也就是设定显存。
设置第4个虚拟屏幕的虚拟显示区,也就是设定显存。
和window0相关的设置
7、LCD编程实战-LCD初始化
参考代码lcd_init函数
要想LCD工作,必须给LCD屏幕和显存之间,建立一个映射(映射时在CPU初始化LCD控制器来完成的)。本部分就是在完成这个过程(这也是LCD显示的2个阶段的第一阶段,第二阶段中只需要给显存中丢入响应的数据,LCD屏幕就会自动显示相应内容)。
7.1、初始化GPIO
原理图中使用的是GPF管脚。
查看GPFCON的寄存器,将管脚设置为00×10,为LCD功能管脚。
7.2、打开背光
查看原理图。背光的正极接VDD_5V,负极接PWMTOUT0。通过调整PWMTOUT0的占空比,可以实现调整背光亮度。也可以直接接0,让LCD屏常量。
PWMTOUT0用的是GPD0_0管脚。
7.3、显示路径选择
DISPLAY_CONTROL寄存器设置,将FIMD和RGB连接起来,设置2或者3。
7.4、VID0CON
设置为1,RGB为并行接口
设置对像素时钟源进行分频,所以像素时钟
= HCLK_DSYS / (CLKVAL_F + 1) =166M/5 = 33M。
设置像素时钟的来源,设置0,选择HCLK_DSYS。
ENVID为使能LCD控制器,ENVID_F为当前帧结束后,才使能LCD控制器。
7.5、VID1CON
查看LCD的数据手册,得出VSYNC和HSYNC是低脉冲有效,而210的LCD控制器是高脉冲有效,所以需要反转。
将IHSYNC和IVSYNC设置为1,进行反转。
7.6、时序设置
设置关键的6个时序参数
7.7、设置有效显示屏幕大小
对于x210来说
7.8、设置window0,也就是虚拟屏幕
设置像素数据分布,谁在前,谁在后。即颜色分布式RGB,还是BGR。
设置BPP模式,设置为1011, 24bpp。RGB888。
使能window0的显示
7.9、设置window0的虚拟显示位置
设置和LCD屏幕大小一样的虚拟显示屏幕
设置黑框的坐标和大小。
设置左上角的X,Y坐标
设置右下角的X,Y坐标
设置虚拟显示的大小。
7.10、设置显存的起始地址
7.11、使能传输
至此,整个S5PV210的裸机系列的博客就结束了。当初也是跟着朱有鹏大神,学习物联网,才学习到的整个S5PV210的裸机知识,并总结了这些多的文档。基本上覆盖了210的各个裸机部分。
大家如果想更深入的学习物联网的知识,可以自己去联系朱有鹏大神。
汇总的文档,也放到了我的github网站上:https://github.com/weiqi7777/...
系列其他篇
原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。