一、LCD控制原理
S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口。
类型:
- STN(超扭曲向列),它的特点是功耗低,但亮度不足,响应时间长;(1602那种类型的)
- TFT(薄膜晶体管),它的特点是响应时间短,画面清晰,但功耗稍高,(自己实验用的应该是这个类型的,这个类型当作计算机液晶显示设备)。
- LTPS(低温多晶硅),各方面性能优越,但技术要求高;
- OLED(有机发光二极管),各方面性能优越,但技术要求高。
LCD驱动接口支持 3 种接口:
- RGB 接口:((并行 24 位,串行 8 位)自己用的使这种)
- indirect-i80 接口
- UV 接口
SoC如何控制LCD显示原理:
LCD驱动器:LCD驱动器一般与LCD面板集成在一起,面板需要一定的模拟电信号来控制液晶分子,LCD驱动器芯片负责给面板提供控制液晶分子的模拟电信号,驱动器的控制信号(数字信号)来自于LCD控制器的提供的接口。
LCD控制器:LCD控制器集成在SoC内部,它负责通过数字接口向外部的LCD驱动器提供要显示的像素数字信号。它必须按照一定的时序和LCD驱动器通信,LCD控制器受SoC控制,SoC会从内存中拿出像素数据给LCD控制器并最终传给LCD驱动器。
显存:SoC在内存中选一段内存,用来存放颜色数据,然后通过配置将LCD控制器和这一段内存连接起来,构成一个映射关系,一旦这个关系建立以后,LCD控制器就会自动从显存中读取像素数据传给LCD驱动器,LCD驱动器会自动的控制每个像素点的液晶分子,以形成最终的图像,建立这个映射以后就不需要SoC在来参与任何行为了。
总结一下:SoC控制LCD液晶显示的过程分为两个部分:
(1) SoC的LCD控制器引出一定的引脚与LCD驱动器连接,按照标准设置一定的时序;
(2) 把LCD要显示的像素信息放入内存中,在通过设置LCD控制器中的寄存器,与LCD控制器建立映射;之后过程就是LCD控制器芯片与驱动器芯片自动完成的事情了,整个LCD图像的显示过程就是这样。
S5PV210 的 LCD 控制器支持多种颜色格式,例如
- RGB (1BPP 到 24BPP)
- YCbCr 4:4:4 (只有本地总线)
1:显示屏跟内存的关系。
我们都买过显卡,知道买独立显卡的好,那么为什么独显好?
独显跟集显的区别又在哪里?
独显的特点:有独立内存
- 可以独立复制内容(DMA控制器)
集显的特点:跟主板共用内存
- 可以独立复制内容(DMA控制器)
2:屏幕为什么能显示?(集显)
- 在初始化的时候,在内存开辟的一片空间作为显存
- 将要显示的内容写到显存上
- lcd控制器对显存进行读取,然后写入显示屏里。
A DMA完成显示数据的传输,不需要CPU执行COPY函数
B LCD控制器向显示屏提供时序信号、视频数据、.....
二、LCD显示原理
如果需要显示一满屏的数据,则数据的大小:80048024bits
-
帧同步信号:液晶屏的刷新频率、垂直同步信号的频率、场频率
帧同步信号= 50Hz~70Hz,典型值:60Hz
-
行同步信号的频率:一帧中有多少行?
行同步信号的频率 = ( 480 +回扫的行数(45) )* 帧同步信号的频率
- 像素时钟的频率:扫描像素点的频率
像素时钟频率 = (800+一行中回扫的像素点(256))*行同步信号的频率
注意:
- 液晶屏的分频率越大,则VCLK的频率越高
- VCLK的频率的最大上限:HCLK_DSYS=166MHz
- 思考:S5PV210最大可以接多大的液晶屏?
计算:
在800*480的LCD中,VCLK的频率值:
VCLK = (800+256)(480+45) 60Hz = 33.264MHz
三、LCD的描述参数(液晶屏的选型)
-
分辨率
行和列像素点的个数
-
尺寸
有效的显示区对角线的长度,单位英寸。
-
色位
一个像素点用多少位数据来描述----24bits
-
响应时间
刷新时间---->60Hz(16ms)
响应时间---->几ms -
亮度 cd/m**2
高亮屏:600
一般屏:250 -
对比度
白色的亮度/黑色的亮度。
-
寿命
单位:小时 5万小时
当液晶屏的亮度降低到出厂亮度的一半的时候,认为寿命到了。
-
可视角度
四个方向的可视角度是不对称的,一般有一个方向是比较差的
四、硬件的设计接口
1、S5PV210 LCD控制器的接口
看一下核心板原理图:LCD接线为24条VD数据输出线,用来传输RGB888 24位颜色数据,VCLK时钟线,HSYNC:水平同步信号线;VSYNC:垂直同步信号线,VDEN:数据使能线;
RGB接口信号:
LCD_HSYNC:
行同步信号,表示一行数据的开始,LCD控制器在整个水平线(整行)数据移入LCD驱动器后,
插入一个LCD_HSYNC信号;
LCD_VSYNC:
帧同步信号,表示一帧数据的开始,LCD控制器在一个完整帧显示完成后立即插入一个LCD_VSYNC信号,
开始新一帧的显示;VSYNC信号出现的频率表示一秒钟内能显示多少帧图像,称为“显示器的频率”
LCD_VCLK:
像素时钟信号,表示正在传输一个像素的数据;
LCD_VDEN: 数据使能信号;
LCD_VD[23:0]: LCD像素数据输出端口
五、英寸液晶屏接口
0xffff
1-11位是功能 剩下的每八位 分别是蓝绿红
八、LCD的驱动主要做什么?
- 根据液晶屏的特定参数来设置LCD控制器(接口、bpp、......)
- 设置液晶屏的同步信号的频率(VCLK、VSYNC、HSYNC.....)
- 设置液晶屏的时序参数(帧的回扫时间、行的回扫时间、同步信号的极性.....)
- 设置显存的位置和大小
九、LCD的时序图
1、LCD控制器的输出时序
(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]上。用户只需要把要显示的图像数据写入帧内存中。
2、LCD液晶屏输入时序
十、相关寄存器
寄存器:DISPLAY_CONTROL 设置为10或11;RGB模式可行即可;
VIDCON0:Video Main Control 0 Register
bit28-26视频输出格式,设为RGB模式
bit18:设置RGB数据传输方式为并行还是串行,因为有24根数据线所以为并行;
bit2选择时钟源,选HCLK 连的是HCLC_DSYS 为166MHz
bit4:开启分频;
bit13-6设置时钟大小,时钟频率要小于控制器的最大时钟,也要小于LCD驱动器的最大时钟。
bit0 bit1为使能控制信号都使能
VIDCON1寄存器 Video Main Control 1 Register
bit5 bit6设置HSYNC和VSYNC的极性,如果LCD的高低电平脉冲是相同的话,则Normal,如果极性相反则Invert。
VIDTCON0:设置时序,根据LCD数据手册中的时序来设置,结合“LCD控制器的输出时序”
VIDTCON1
VIDTCON2
WINCON0寄存器
bit1:使能window0
bit5-2选择RGB888模式 1011
bit15:设置输出顺序为 red green blue还是 blue green red 设置为1:BGR 设置为0:RGB
VIDOSD0A VIDOSD0B这两个寄存器是用来设置内存中window0大小;(最下面的寄存器设置是使用哪一个windows0)
比如设置为LCD屏幕的尺寸(即左上坐标为(0, 0) 右下坐标为(799, 479))
VIDOSD0C也是设置内存中window0的大小 (最下面的寄存器设置是使用哪一个windows0)
比如设置为LCD屏幕的尺寸=800*480
VIDW0xADD0Bx设置内存中window0的起始地址的
VIDW0xADD1Bx设置内存中window0的结束地址的
SHODOWCON寄存器来设置虚拟windows显示的;
以下位可以分别设置哪个windows显示;
补充:看核心板、地板原理图相应引脚要设置为LCD的引脚模式,LCD背光要打开;
什么是LCDLCD屏幕的工作原理是怎样的?_哔哩哔哩_bilibili
(1)LCD(Liquid Crystal Display)俗称液晶.LCD(电子产品)_百度百科
(2)液晶是一种材料,液晶这种材料具有一种特点:可以在电信号的驱动下液晶分子进行旋转,旋转时会影响透光性,因此我们可以在整个液晶面板后面用白光照(称为背光),可以通过不同电信号让液晶分子进行选择性的透光,此时在液晶面板前面看到的就是各种各样不同的颜色,这就是LCD显示。
(3)被动发光和主动发光。有些显示器(譬如LED显示器、CRT显示器)自己本身会发光称为主动发光,有些(LCD)本身不会发光只会透光,需要背光的协助才能看起来是发光的,称为被动发光。
(4)液晶应用领域:电视机、电脑显示屏、手机显示屏、工业显示屏等····
其他主流显示设备(LED、CRT、等离子、OLED)
(1)CRT:阴极摄像管显示器。早期电视机的大屁股。寿命短,笨重。
(2)等离子显示:未成为主流
(3)OLED:目前未成为主流,但是很有市场潜力
(4)LED:(自发光)主要用在户外大屏幕(LCD易受光照影响,比如在亮处看不清屏幕)
(5)LCD:目前是主流显示器
LCD的显示原理和特点(液晶分子透光+背光)
(1)白光其实是由各种不同颜色的光组成的,所以白光被选择性透光之后可以产生各种不同颜色的光。
LCD的发展史和种类(TN/STN/TFT)
(1)TN最早。坏处是响应性不够好,有拖尾现象。
(2)STN是TN的升级版。有效解决拖尾现象,显示更清晰。
(3)TFT的最大特点就是超薄。
(4)TFT技术之上发展出来很多更新的技术。
(参考资料一:http://blog.163.com/tao198352__4232/blog/static/85020645201062285210682/)
(参考资料二:http://display.ofweek.com/2013-12/ART-8321301-8300-28763136.html)
LCD的接口技术
从电平角度来讲本质上都是TTL信号
(1)什么是TTL接口。+5V表示逻辑1,0V表示逻辑0.这种就叫TTL电平,和CMOS电平相对比。
(2)SoC的LCD控制器硬件接口是TTL电平的,LCD这边硬件接口也是TTL电平的。所以他们俩本来是可以直接对接的,手机、平板、开发板都是这样直接对接的(一般用软排线连接)。
(3)TTL电平的缺陷就是不能传递太远,如果LCD屏幕和主板控制器太远(1米甚至更远)就不能直接TTL连接了,要进行转换。转换方式:主机SoC(TTL) ->VGA-> LCD屏幕(TTL)
各种接口(TTL、LVDS、EDP、MIPI、)在传输速率、距离、适配性方面不同(参考资料:http://blog.csdn.net/wocao1226/article/details/23870149)
RGB接口详解(参考数据手册P1207页时序图)
(1)VD[23:0]:24根数据线,用来传输图像信息。可见LCD是并行接口,速率才够快。
(2)HSYNC(水平同步信号)
(3)VSYNC(垂直同步信号):时序信号线,为了让LCD能够正常显示给的控制信号
(4)VCLK(像素时钟):LCD工作时需要主板控制器给LCD模组一个工作时钟信号,就是VCLK。
(5)VDEN(数据有效标志):时序信号,和HSYNC、VSYNC结合使用。
(6)LEND(行结束标志,不是必须的):时序信号,非必须,譬如X210接口就没有。
LCD如何显示图像
像素(pixel)
OLED屏和LCD屏?放大看看区别!_哔哩哔哩_bilibili
(1)像素就是组成图像的最基本元素,或者说显示中可以被控制的最小单位,整个图像就是由很多个像素组成的。
(2)像素可以被单独控制,或控制其亮或不亮(单色屏)、或控制其亮度强弱(譬如亮50%,35%,这样叫灰度屏,以前的黑白电视机)、或控制其显示一定的颜色(这就是我们现在最常用的彩色显示屏)。
总结:像素很重要,整个显示图像是由一个个的像素组成的。我们要在显示器上显示一个图像,就是把这个图像离散化成一个一个的点,然后把各个点的颜色对应在显示器的像素上。
扫描
(1)扫描是一个动作而不是一个名字,扫描就是依次将颜色数值放入屏幕中所有的像素的这个过程。
(2)扫描这个词是由最早的CRT显示器遗留下来的,到LCD显示器的年代本来已经失去意义了,但是我们还是延续着这么叫。
(3)显示器的扫描显示原理依赖于人眼的视觉暂留。只要显示器扫描频率大于人眼的发现频率,人眼看到的图像就是恒定的。如果扫描频率偏小人眼就会看到闪动。(扫描频率的概念就叫做刷新率)
驱动器&控制器
(1)LCD驱动器一般和LCD显示面板集成在一起(本来是分开的,做面板的是只做面板的,譬如说三星、LG、台湾的友达、奇美都是做面板的;驱动器也由专门的IC厂商生产;集成厂商买来面板和驱动器后集成在一起做成LCD屏幕),面板只负责里面的液晶分子旋转透光,面板需要一定的模拟电信号来控制液晶分子;LCD驱动器芯片负责给面板提供控制液晶分子的模拟电信号,驱动器的控制信号(数字信号)来自于自己的数字接口,这个接口就是LCD屏幕的外部接口(第二节中讲到的接口)
(2)LCD控制器一般集成在SoC内部,他负责通过数字接口向远端的LCD驱动器提供控制像素显示的数字信号。LCD控制器的关键在于时序,它必须按照一定的时序和LCD驱动器通信;LCD控制器受SoC控制,SoC会从内存中拿像素数据给LCD控制器并最终传给LCD驱动器。
显示内存(简称:显存)
(1)SoC在内存中挑选一段内存(一般来说是程序员随便挑选的,但是挑选的时候必须符合一定规矩),然后通过配置将LCD控制器和这一段内存(以后称为显存)连接起来构成一个映射关系。一旦这个关系建立之后,LCD控制器就会自动从显存中读取像素数据传输给LCD驱动器。这个显示的过程不需要CPU的参与。
(2)显示体系建立起来后,CPU就不用再管LCD控制器、驱动器、面板这些东西了;以后CPU就只关心显存了,因为我只要把要显示的图像的像素数据丢到显存中,硬件就会自动响应(屏幕上就能自动看到显示的图像了)。
总结:LCD显示是分为2个阶段的:第一个阶段就是建立显示体系的过程,目的就是CPU初始化LCD控制器使其和显存联系起来构成映射;第二个阶段就是映射建立之后,此阶段主要任务是将要显示的图像丢到显存中去。
LCD显示单位:帧(frame)
(1)显示器上一整个画面的内容成为一个帧(frame),整个显示器工作时是一帧一帧的在显示。
(2)电影实际就是以每秒种24帧的速度在播放图片。
(3)帧内数据:一帧分为多行,一行分为多像素,因此一帧图像其实就是多个像素组成的矩阵。
(4)帧外数据:整个视频由很多个帧构成,最终播放视频时逐个播放各个图像帧即可。
LCD显示一帧图像的过程
(1)首先把帧分为行,然后再把行分为像素,然后逐个像素去显示。(显示像素:其实就是LCD驱动器按照接收到的LCD控制器给的显示数据,驱动一个像素的液晶分子旋转,让这个像素显示出相应的颜色值的过程)
(2)关键点:LCD控制器和驱动器之间一次只能传一个像素点的显示数据。所以一帧图像在屏幕上其实是串行的依次被显示上去的,不是同一时间显示出来的。(下面有虚拟显示技术,可以显示多一点,但是也是逐个数据送到各个像素点)
LCD的六个主要时序参数
为了向前兼容出现的六个时序参数
HSPW(horizontal sync pulse width) 水平同步信号脉宽
HBPD(horizontal back porch) 水平同步信号后肩
HFPD(horizontal front porch) 水平同步信号前肩
VSPW 垂直同步信号脉宽
VBPD 垂直同步信号后肩
VFPD 垂直同步信号前肩
注意:顺序从左往右,右边的为前肩,左边的为后肩。
(1)一行的通信过程是这样的:LCD控制器先发送一个HSYNC高电平脉冲(脉冲宽度是HSPW),脉冲告诉驱动器下面的信息是一行信息。然后开始这一行信息,这一行信息包括3部分:HBPD+有效行信息+HFPD。其中前肩和后肩都属于时序信息(和LCD屏幕具体有关),有效行信息就是横向分辨率。所以你可以认为一行总共包含4部分:HSPW+HBPD+有效行信息+HFPD。
(2)一帧图像其实就是一列,一列图像由多个行组成,每行都是上面讲的这个时序。
(3)一帧图像的通信过程是这样的:整个帧图像信号分为4部分:VSPW+VBPD+帧有效信号+VFPD。VSPW是帧同步信号宽度,用来告诉驱动器一帧图像要开始了;VBPD和VFPD分别是垂直同步信号前后肩。
(4)必须说明:这6个参数对于LCD显示器其实本来是没用的,这些信号其实是老式的CRT显示器才需要的,LCD本身不需要,但是出于历史兼容性要求,LCD选择了兼容CRT显示器的这些时序要求,所以理解LCD显示器时序,编程时用CRT的方式来理解不会错。
(5)要注意,这几个时序参数本身是LCD屏幕本身的参数,与LCD控制器无关。所以同一个主板如果接的屏幕不一样则时序参数设置也会不同。这些参数的来源一般是:第一,厂家会直接给出,一般以实例代码的形式给出;第二,来自于LCD的数据手册。
第一种方式,查看九鼎的210裸机教程(x210v3裸机开发教程\src\template-framebuffer-font\source\hardware\s5pv210-fb.c的第774行)
.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
第二种方式,查看LCD数据手册(X210光盘资料\A盘\DataSheet\AT070TN92.pdf)
补充:
1、注意这些数字的单位。H开头的三个单位都是DCLK(像素时钟),V开头的三个单位是TH。这样设置的好处是我们改变了像素时钟的设置时,不用改变这里的时序参数。
2、这些时序参数如果没设置好会影响什么?屏幕会跑偏。
LCD显示的主要相关概念
像素(pixel)
(1)整个图像是由一个个的像素组成的,像素就是一个显示点。
像素间距(pitch)
(1)pitch是连续2个像素的像素中心的距离。一般的像素是方形的,所以横向pitch和纵向的pitch一样的。但是也有不一样的。
(2)像素间距会影响屏幕的最佳观看距离。像素间距大的适合远距离看,像素间距小的适合近距离看。
分辨率(resolution)
(1)整个屏幕的横向和纵向的像素个数就叫分辨率,譬如X210开发板用的屏幕是800×480.
(2)屏幕尺寸和分辨率无关的,像开发板的屏幕尺寸是7寸的(纯屏幕对角线尺寸是7英寸)。
(3)屏幕尺寸和分辨率和像素间距三者之间有关联。
清晰度
(1)清晰度是一个主观概念,是人眼对显示效果的一个主观判断。说白了就是人看起来感觉清晰不清晰。
(2)客观来讲,清晰度由分辨率和像素间距共同决定。一般的,屏幕尺寸固定时分辨率越高越清晰,分辨率越低就越不清晰;分辨率固定下,屏幕尺寸越小越清晰,越大越不清晰。
(3)清晰度还由其他很多因素共同决定。
像素深度(bits per pixel,简称bpp)
(1)一个像素在计算机中由多少个字节数据来描述。
(2)计算机中用二进制位来表示一个像素的数据,用来表示一个像素的数据位越多,则这个像素的颜色值更加丰富、分的更细,颜色深度就更深。
(3)一般来说像素深度有这么几种:1位、8位、16位、24位、32位。
颜色在计算机中的表示
颜色的本质
(1)颜色是主观存在,颜色其实是自然光在人的眼睛中和大脑中产生的一种映像。
(2)颜色的本质决定于光的波长。
自然光的颜色是连续的
(1)光的波长是连续的,导致颜色也是连续的。理论上,只要你的眼睛分辨能力足够好,可以在自然界中发现无数种颜色。
计算机中的颜色是离散的
(1)计算机中不可能存储无数种颜色,所以必须将颜色有限化,所以就用有限种颜色来代表自然界中的无限种颜色。这个理论非常类似于之前学过的AD转换。
(2)这种离散化表达颜色的缺点是不够真实,漏掉了很多种颜色。因此计算机中所能表达的颜色没有自然界中丰富(计算机屏幕上显示的图像和真实图像有差别)
(3)计算机所能表达的颜色种类个数,这个参数叫:像素深度bpp。
常见像素深度:1位、8位、16位、24位、32位
1位:用1个二进制位来表示颜色,这种就叫单色显示。示例就是小饭店、理发店门口的LED屏。
8位:用8个二进制位来表示颜色,此时能表示256种颜色。这种叫灰度显示。这时候是黑白的,没有彩色,我们把纯白到纯黑分别对应255到0,中间的数值对应不同的灰。示例就是以前的黑白电视机。
16位:用16个二进制位表示颜色,此时能表示65536种颜色。这时候就可以彩色显示了,一般是RGB565的颜色分布(用5位二进制表示红色、用6位二进制表示绿色、用5位二进制表示蓝色)。这种红绿蓝都有的颜色表示法就是一种模拟自然界中所有颜色的表示方式。但是因为RGB的颜色表达本身二进制位数不够多(导致红绿蓝三种颜色本身分的都不够细致),所以这样显示的彩色失真比较重,人眼能明显看到显示的不真实。
24位:用24个二进制位来表示颜色,此时能表示16777216种颜色。这种表示方式和16位色原理是一样的,只是RGB三种颜色各自的精度都更高了(RGB各8位),叫RGB888。此时颜色比RGB565更加真实细腻,虽然说比自然界无数种颜色还是少了很多,不过由于人眼的不理想性所以人眼几乎不能区分1677万种颜色和无数种颜色的差别了。于是乎就把这种RGB888的表示方法叫做真彩色。(RGB565就是假彩色)
32位:总共用32位二进制来表示颜色,其中24位表示红绿蓝三元色(还是RGB888分布),剩下8位表示透明度。这种显色方式就叫ARGB(A是阿尔法,表示透明度),现在PC机中一般都用ARGB表示颜色。
补充:颜色的组成,三元色(三基色)是RGB,也就是说所有的颜色都可以由红绿蓝三种颜色组成。
S5PV210的LCD控制器
FIMD结构框图
(1)210的LCD控制器叫FIMD,FIMD是210内部和图像处理相关的一些部件,在摄像头等和图像处理有关的部分都可以有关联。
(2)FIMD在内部与AHB总线等相连接,在外部提供RGB接口、I80接口、YUV接口与外部相连接,我们实际使用的是RGB接口。
虚拟屏幕叠加(数据手册P1194)
(1)虚拟屏幕的意思是,我们平时看到的屏幕上显示出来的场景实际是很多个屏幕显示叠加在一起的效果(譬如新闻图像、电视台台标、下方飘动的字幕新闻)
(2)像S5PV210的LCD控制器中有5个虚拟屏幕Window0到Window4,虚拟屏幕不存在于真实而存在于内存中。(之前讲过,LCd显示时实际是显示的是对应的内存中的显存区域的数值)虚拟屏幕其实就是一个内存中的显存区域,有几个显存区域就有几个虚拟屏幕,但是这些虚拟屏幕都被映射到一个真实的显示屏上面,所以将来真实的现实效果实际是这几个虚拟屏幕的显示内容的叠加。(叠加时要注意上面一层会覆盖下面一层,所以要注意谁在前谁在后,设置寄存器时有这个选项)
(3)使用虚拟屏幕而不是整个LCD使用一个显存是有一定好处的:第一,可以保证不污染源图像,方便程序处理;第二,可以减少屏幕刷新,提高显示效率,减少CPU工作量。
虚拟显示(数据手册P1206)
(1)如何实现在小分辨率的屏幕上(真实)显示大分辨率的图像
(2)细节上,我们需要屏幕上看到不同图像时,需要对显存区域进行刷新。即使我们只需要屏幕显示移动一点点,整个屏幕对应的显存空间也需要整个重新刷新,工作量和完全重新显示一幅图像是一样的。这个显然不好,这样CPU刷新屏幕的工作量太大了,效率很低。
(3)如何能够在显示一个大图片的不同区域时让CPU刷新屏幕工作量减少?有,方法就是虚拟显示。具体做法就是在内存中建立显示缓存的时候实际建立一个很大的区域,然后让LCD去对应其中的一部分区域作为有效的显示区域。将来要显示大图像时,直接将大图像全部一次性加载入显示缓存区,然后通过移动有效显示区域就可以显示大图像的不同区域了。
主要寄存器简介
LCD编程实战1-LCD控制器初始化
参考代码lcd_init函数详解
(1)要想LCD工作,必须给LCD屏幕和显存之间建立一个映射(映射是在CPU初始化LCD控制器来完成的)。本部分就是在完成这个过程(这也是LCD显示的2个阶段的第一阶段,第二阶段中我们只需要给显存中丢入相应的数据,LCD屏幕就会自动显示相应内容)。
LCD编程实战2-显示像素&刷背景
(1)显示像素
(2)刷背景色
LCD编程实战3-横线竖线斜线&画圆
(1)画横线&竖线
(2)斜线
LCD编程实战4-写英文中文字符
LCD编程实战5-画图
图片显示分析
(1)图像是彩色的,而之前的文字、图形都是单色的。之前的图形文字绘制函数都有个color参数,就是传给显存告诉它这个像素的显示颜色。
(2)一副分辨率是800×480,BPP是24的图片,实际上就是800×480×3字节的数据。将来写代码将图片显示到LCD中时,图片将会以 unsigned char pic_data[800×480×3]的形式出现。
Image2LCD使用简介
(1)如何由一副图片得到它对应的数据的数组?要用取模工具,如Image2LCD。
画图函数的编写
LCD编程实战6-画图测试及调试
画图函数的显示效果测试
RGB的像素顺序调整
(1)图片中红色的变成了蓝色、蓝色的变成了红色,这就说明RGB顺序反了。
(2)解决方案一:重新使用Image2LCD来取模,取模时RGB顺序对调。
(3)解决方案二:不重新取模,改代码,在color形成的时候调换顺序。
小分辨率图片显示
(1)本质上大小分辨率的图像显示都是一样的,都是:都是在图像的每个像素点对应的显存中填入相应的颜色值即可。
未完成事项展望
RGB565和RGB888
(1)单片机等性能和资源有限的平台会用RGB565,嵌入式平台习惯用RGB888.
(2)有时候手头只有RGB888的颜色值,但是显示部分却只接受RGB565的(有时候反过来),这时候就需要在2种颜色之间做转换。
不同分辨率、不同起点坐标下的显示
(1)屏幕分辨率和图像分辨率不同时的显示。我们现在写的代码都是没有考虑的。
(2)图像起点坐标(左上角坐标)不一定在屏幕左上角,也可能在屏幕的任何其他区域,这种情况下画图的函数要做处理来支持。
(3)分辨率不同而且起始坐标不同下,这两个问题组合起来也对画图函数提出了更高要求。
bmp图片格式解析及显示
(1)我们当前的图像数据是用Image2LCD工具转过来的。实践中是不可能手工用工具来转的(你想一下Image2LCD也是一个软件,既然它能转,我们也应该可以用软件来转)
(2)bmp格式的图片本身遵照一定的格式来存储的,我们只需按照bmp的解析格式来读取文件就可得到这幅图片的图像数据的二进制,直接拿去显示。(这就是图片文件的本质)
jgp、png、gif等压缩图片的解码和显示
(1)对于以上压缩格式的图片是不能直接解析的,必须用相应的库来解压缩图片之后才能拿来显示。
(2)不同的格式的图片其压缩算法不同,解压缩算法自然也不同。开源社区中每种压缩格式都有个对应的库,库里提供了这种格式的压缩和解压缩函数,我们只需要移植这个库并且调用它来压缩或解压缩即可。
图片缩小和放大显示
(1)图片数据源本来是400×200的,但是显示时我希望显示成100×50的,这时候就要显示函数后台对源图像进行先缩小,然后再显示。这时候就需要一个缩小算法。(譬如最简单的算法就是抽点采样)
(2)图片数据源是100×50的,但是显示时希望全屏显示(800×480),这时候就需要对源图像进行放大然后再显示(当然了显示出来图像清晰度肯定比较低),这时候就需要一种放大算法(譬如插点方式)
显示动画
(1)动态刷屏形成动画
(2)立体3D图像显示(伪3D)
————————————————
版权声明:本文为CSDN博主「路溪非溪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28576837/article/details/125390042
内存映射型LCD控制器设计要点揭秘
1 内存映射型LCD控制器的结构及优点 传统的LCD控制器可分为双口RAM型、“乒乓”切换控制型、消隐写操作型等类型,这些控制器虽思路、设计简单,能较好地解决读写冲突,但都只能应用于某些特定环境下的设计开发,系统的可扩展性、灵活性较差。而内存映射型控制器系统性能稳定、扩展性强、成本低、读写速度快,是目前控制器设计的较好解决方 案。 1.1 内存映射型LCD控制器的结
1 内存映射型LCD控制器的结构及优点
传统的LCD控制器可分为双口RAM型、“乒乓”切换控制型、消隐写操作型等类型,这些控制器虽思路、设计简单,能较好地解决读写冲突,但都只能应用于某些特定环境下的设计开发,系统的可扩展性、灵活性较差。而内存映射型控制器系统性能稳定、扩展性强、成本低、读写速度快,是目前控制器设计的较好解决方 案。
1.1 内存映射型LCD控制器的结构
内存映射型控制器不用独立的存储器做显存,而是在内存中动态地开辟一块空间作为显存,故称之为内存映射型控制器,其结构如图1所示。
内存映射型控制器工作时,显存里的数据不是通过简单接口,而是通过总线传到时序发生器。由于对显存的读写通过总线进行自动协调,从而有效地避免了读写冲突的发生。通常,总线通过一个数据缓存区与时序发生器连接。
1.2 内存映射型LCD控制器的优点
内存映射型控制器用一小块双口存储器做缓存,保证了显示数据传输的流畅性;显存定义在SDRAM/SRAM内存中,取代了独立显存从而降低了系统成本;使 用中只需修改时序发生器,就可以驱动各种参数的显示器;同时,通过总线协调显存的读写操作,有效的避免了显存读写冲突问题。表1从4个方面对内存映射型控 制器与其他3种常见控制器类型进行了比较。
2 基于SOPC技术的内存映射型LCD控制器设计
2.1 内存映射型LCD控制器的总体结构
该控制器由寄存器模块、DMA模块、数据缓存模块、时序发生器4部分组成,采用VHDL语言编写。如图2所示。控制器内部定义了2个总线外设,其中,寄存 器模块为总线从端口设备,DMA模块为总线主端口设备。
2.2 寄存器模块(register_bank)
该模块为Avalon总线从端口设备,可以通过NiosⅡ Processor设置和读取显存起始地址、显示大小、显示颜色位数及相关控制参数。
寄存器模块中共定义了4个寄存器;显存起始地址寄存器、显示参数寄存器、控制寄存器和状态寄存器。各寄存器的读写控制、定义及功能描述如表2所示。
其中,显示参数寄存器(size)中“色数”标志位,值为1表示8位颜色显示,值为0表示16位颜色显示。状态寄存器(status)大小为两位,可与控制寄存器中的中断位(Interrupt)配合使用,为保留位。控制器寄存器的定义如表3所示。
2.3 数据缓存模块(line_buffer)
该模块设计采用了双口RAM,由MegaWizard Plug-In Manager生成,其存储空间约为一行数据所占的空间,用于暂存显示数据。由于DMA不是直接将显存中的数据传给时序发生器,而在中间使用了双口RAM 做数据缓存,这样DMA和时序发生器的读、写时序不必严格对应,简化了结构设计。同时,用于16位彩色显示时,可通过数据缓存模块将总线32位的数据输入 变为16位的数据输出给时序发生器;而在8位彩色显示时,可通过数据缓存模块将32位输入变为8位输出,实现了数据位数的转化,方便的时序发生器内部的数据操作。
2.4 DMA模块(image_dma)
该模块为Avalon总线主端口设备,它负责向Avalon总线提供有效的地址、数据和写请求信号,并在时钟上升沿发起总线传输,读取显存中的数据;同 时,DMA模块产生写数据缓存的地址和数据,将显示数据正确地从显存传送到数据缓存。DMA模块为三状态的状态机,包括空闲状态、传输状态、等待状态,各状态机逻辑关系如图3所示。
2.5 时序发生器(LCD_driver)
时序发生器模块主要有4个主要功能:
(1)产生驱动LCD的行扫描信号(hsync)、列扫描信号(vsync)、数据使能信号(blank_n);
(2)产生读双口R_AM缓存的地址信号;
(3)产生行、场消隐信号,控制DMA模块启动、停止数据传输;
(4)将显示数据RGB按正确的时序、指定模式输出。
常用的16位彩色显示可分为555、565(即RGB信号分量所占位数)两种显示模式,控制器通过判断控制寄存器中的模式设置位将RGB信号以不同的格式输出。
2.6 实验平台的设计及内存映射型LCD控制器的验证
为验证该控制器,本文设计了以CycloneⅡ系列EP2C8Q208C8为主芯片的SOPC评估电路板。实验平台的TFT-LCD选用SAMSUNG公 司的LTA104S1-L01,该LCD大小为10.4英寸、分辨率为800×600,可实现16位真彩色显示。由于LTA104S1-L01接口为 LVDS,本文设计了以DS90CF363为主芯片外接的接口板,以实现RGB到LVDS信号的转换实验结果说明,本控制器能有效地解决显存读写问题,设 计完全符合预期要求。实验平台及显示效果如图4所示。
3 结束语
本文设计的内存映射型LCD控制器,能有效地解决显存读写冲突。使用自定义的DMA代替了原有的DMA IP Core,数据的传输不必由CPU产生中断发起,而完全由控制器发起,从而减轻CPU的运行负担。本设计还具有适用范围广、占用逻辑单元少、实用性强、灵活性强、扩展性强等优点,可用于多种分辨率LCD的显示控制,具有一定的实用价值。
显存和屏幕像素的对应电路基础:显存数据要和LCD的像素的XY坐标信息相联系
1.XY轴的交流电压波形控制。
2.显示数据控制,选通要显示的列或者行。有列驱动,锁存器,和移位寄存器(显示数据移位到指定的列)
一、最初的显存和LCD的位置(可能还不是点阵像素的形式,但是原理一样,需要找到在LCD上的位置行列信息)
二、驱动器升格--显示驱动控制器
列驱动升格--增加显存(内置)
三、升级液晶显示控制器(接口部,驱动部(片外),控制部(外部显存),指令集所谓的三部一集)
1、接口部
2、驱动部
移位寄存器显示具体驱动过程:
3、控制部:显示处理
结合液晶屏的具体实例程序,IMX6ULL裸机屏幕,横纵向取模,模的每个字节对应的每个像素,依次写入红绿蓝颜色数值。逐列逐行取模,横纵坐标切换等高级功能表明,驱动更强
结合398产品12232液晶 的页写,纵向取模方式
理解液晶的显存和行列坐标的实现电路