S5PV210 液晶屏LCD

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Setul/article/details/79046459

1. LCD基本概念

1.1 LCD原理

液晶分子的偏转,不会改变透过光线的多少,而能改变偏振光的偏振方向,所以在液晶面板的两侧,需要2张偏振片,在背光源和液晶分子之间的偏振片,负责把背光的自然光过滤为单一方向的偏振光,而液晶分子到你的眼睛之间的偏振片与第一张偏振片的偏振方向垂直90度,当没有电压驱动液晶分子旋转时,透过第一张偏振片的偏振光完全被第二张偏振片挡住,显示黑色(0灰阶),当有电压驱动液晶分子旋转时,透过的偏振光与液晶分子旋转角度相关,逐步显示为白色(100%灰阶)。
链接:https://www.zhihu.com/question/28261046/answer/68550355 来源:知乎

TFT-LCD是目前使用最多的LCD。

1.2 LCD接口

液晶屏提供的输入电平是TTL电平的。一般各种控制器的输出IO也是TTL电平的,理论上说,将两者直接连接就好了,但是由于TTL电平不能长距离传输,所以需要转接线,实现 TTL->VGA(或DVI/HDMI)->TTL。

  • VGA接头:针数为15的视频接口,主要用于老式的电脑输出。VGA输出和传递的是模拟信号。大家都知道计算机显卡产生的是数字信号,显示器使用的也是数字信号。所以使用VGA的视频接口相当于是经历了一个数模转换和一次模数转换。信号损失,显示较为模糊。
  • DVI接口:DVI接口有两个标准,25针和29针。直观来说,这两种接口没有区别。DVI接口传输的是数字信号,可以传输大分辨率的视频信号。DVI连接计算机显卡和显示器时不用发生转换,所以信号没有损失。
  • HDMI接口:HDMI接口传输的也是数字信号,所以在视频质量上和DVI接口传输所实现的效果基本相同。HDMI接口还能够传送音频信号

但是由于TTL电平传输的不稳定,也有LVDS等电平接口的液晶屏。见下网页。
http://blog.csdn.net/wocao1226/article/details/23870149

1.3 一些基本概念

像素(pixel)
像素就是组成图像的最基本元素,或者说显示中可以被控制的最小单位,整个图像就是由很多个像素组成的。

像素间距(pitch)
pitch是连续2个像素的像素中心的距离。一般的像素是方形的,所以横向pitch和纵向的pitch一样的。但是也有不一样的。

屏幕尺寸
屏幕尺寸指的就是屏幕有几寸,可以由屏幕的像素数目和像素间距计算出来。

分辨率(resolution)
整个屏幕的横向和纵向的像素个数就叫分辨率,譬如X210开发板用的屏幕是1024 X 600。

清晰度
屏幕尺寸固定时分辨率越高越清晰,分辨率越低就越不清晰;分辨率固定下,屏幕尺寸越小越清晰,越大越不清晰。

像素深度(bits per pixel,简称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表示颜色。


显示器上一整个画面的内容成为一个帧(frame),整个显示器工作时是一帧一帧的在显示。

扫描
扫描就是依次将颜色数值放入屏幕中所有的像素的这个过程。显示器的扫描显示原理依赖于人眼的视觉暂留。(扫描频率的概念就叫做刷新率)。

显示内存(简称:显存)
SoC在内存中挑选一段内存(一般来说是程序员随便挑选的,但是挑选的时候必须符合一定规矩),然后通过配置将LCD控制器和这一段内存(以后称为显存)连接起来构成一个映射关系。一旦这个关系建立之后,LCD控制器就会自动从显存中读取像素数据传输给LCD驱动器。这个显示的过程不需要CPU的参与。

驱动器与控制器
LCD驱动器一般和LCD显示面板集成在一起(本来是分开的,做面板的是只做面板的,譬如说三星、LG、台湾的友达、奇美都是做面板的;驱动器也由专门的IC厂商生产;集成厂商买来面板和驱动器后集成在一起做成LCD屏幕),面板只负责里面的液晶分子旋转透光,面板需要一定的模拟电信号来控制液晶分子;LCD驱动器芯片负责给面板提供控制液晶分子的模拟电信号,驱动器的控制信号(数字信号)来自于自己的数字接口,这个接口就是LCD屏幕的外部接口。

LCD控制器一般集成在SoC内部,他负责通过数字接口向远端的LCD驱动器提供控制像素显示的数字信号。

1.4 LCD控制时序

LCD时序

时序图如上所示。在一帧图像的显示过程中,是逐行逐个显示的。

  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显示器的这些时序要求。
  5. 要注意,这几个时序参数本身是LCD屏幕本身的参数,与LCD控制器无关。所以同一个主板如果接的屏幕不一样则时序参数设置也会不同。这些参数的来源一般是:第一,厂家会直接给出,一般以实例代码的形式给出;第二,来自于LCD的数据手册。

1.5 S5PV210的LCD控制器

1.5.1 FIMD结构框图

  • 210的LCD控制器叫FIMD,FIMD是210内部和图像处理相关的一些部件,在摄像头等和图像处理有关的部分都可以有关联。
  • FIMD在内部与AHB总线等相连接,在外部提供RGB接口、I80接口、YUV接口与外部相连接,我们实际使用的是RGB接口。

1.5.2 虚拟屏幕叠加(数据手册P1194)

  • 虚拟屏幕的意思是,我们平时看到的屏幕上显示出来的场景实际是很多个屏幕显示叠加在一起的效果(譬如新闻图像、电视台台标、下方飘动的字幕新闻)
  • 像S5PV210的LCD控制器中有5个虚拟屏幕Window0到Window4,虚拟屏幕不存在于真实而存在于内存中。虚拟屏幕其实就是一个内存中的显存区域,有几个显存区域就有几个虚拟屏幕,但是这些虚拟屏幕都被映射到一个真实的显示屏上面,所以将来真实的现实效果实际是这几个虚拟屏幕的显示内容的叠加。(叠加时要注意上面一层会覆盖下面一层,所以要注意谁在前谁在后,设置寄存器时有这个选项)
  • 使用虚拟屏幕而不是整个LCD使用一个显存是有一定好处的:第一,可以保证不污染源图像,方便程序处理;第二,可以减少屏幕刷新,提高显示效率,减少CPU工作量。

1.5.3 虚拟显示(数据手册P1206)

  • 如何实现在小分辨率的屏幕上(真实)显示大分辨率的图像?即使我们只需要屏幕显示移动一点点,整个屏幕对应的显存空间也需要整个重新刷新,工作量和完全重新显示一幅图像是一样的。这个显然不好,这样CPU刷新屏幕的工作量太大了,效率很低。
  • 如何能够在显示一个大图片的不同区域时让CPU刷新屏幕工作量减少?有,方法就是虚拟显示。具体做法就是在内存中建立显示缓存的时候实际建立一个很大的区域,然后让LCD去对应其中的一部分区域作为有效的显示区域。将来要显示大图像时,直接将大图像全部一次性加载入显示缓存区,然后通过移动有效显示区域就可以显示大图像的不同区域了。

1.6 像素着色函数

u32 *pfb = (u32 *)(0x23000000);
static inline void lcd_draw_pixel(u32 x, u32 y, u32 color)
{
    *(pfb + COL * y + x) = color;
}

这个函数是所有画线、显示图像等的基础:对某一个像素进行操作。指针pfb就是显存的起始地址。 pfb显然是一个32位的指针,即指向四个字节的数据,这四个字节的数据控制一个像素点。在计算某个像素点的显存地址时有两种写法:

  • 0x23000000+ 4 * (COL * y + x)
  • pfb + COL * y + x

这两者都是可行的,指针pfd是一个32位的指针,所以其加一就相当于地址加4。

猜你喜欢

转载自blog.csdn.net/Setul/article/details/79046459