“第017课 LCD编程”的版本间的差异

来自百问网嵌入式Linux wiki
第1行: 第1行:
 
<categorytree mode=all style="float:left; clear:left; margin-left:1ex; border:1px solid gray; padding:0.7ex; background-color:white;">ARM裸机加强版</categorytree>
 
<categorytree mode=all style="float:left; clear:left; margin-left:1ex; border:1px solid gray; padding:0.7ex; background-color:white;">ARM裸机加强版</categorytree>
 +
 +
 +
 +
 +
 +
 +
 +
  
 
= 第017课 LCD =
 
= 第017课 LCD =

2018年1月12日 (五) 15:35的版本





第017课 LCD

第001节_LCD硬件原理

原理介绍

如下图的LCD示意图,里面的每个点就是一个像素点。

Lesson1 001.jpg

想象有一个电子枪,一边移动,一边发出各种颜色的光。这里有很多细节问题,我们一个一个的梳理。

  1. 1. 电子枪是如何移动的?

答:有一条CLK时钟线与LCD相连,每发出一次CLK(高低电平),电子枪就移动一个像素。

  1. 2. 颜色如何确定?

答:由连接LCD的三组线:R(Red)、G(Green)、B(Blue)确定。

  1. 3. 电子枪如何得知应跳到下一行?

答:有一条HSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到下一行。

  1. 4. 电子枪如何得知应跳到原点?

答:有一条VSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到原点。

  1. 5. RGB线上的数据从何而来?

答:内存里面划分一块显存(FrameBuffer),里面存放了要显示的数据,LCD控制器从里面将数据读出来,通过RGB三组线传给电子枪,电子枪再依次打到显示屏上。

  1. 6. 前面的信号由谁发给LCD?

答:有S3C2440里面的LCD控制器来控制发出信号。

通过JZ2440原理图对上面进行验证,下图的LCD控制器接口图。

Lesson1 002.jpg

①是时钟信号,每来一个CLK,电子枪就移动一个像素;

②是用来传输颜色数据;

③是垂直方向同步信号,FRAME(帧);

④是水平方向同步信号,LINE(行);

再来看看LCD的芯片手册。

Lesson1 003.jpg

  • 先是VLED+、VLED-背光灯电源。VDD、VDD是LCD电源。
  • R0-R7、G0-G7、B0-B7是红绿蓝颜色信号。
  • PCLK是像素时钟信号。DISP是像素开关。
  • HSYNC、VSYNC分别是水平方向、垂直方向信号。
  • DE数据使能。X1、Y1、X2、Y2是触摸屏信号。

可以看出LCD有很多信号,这些信号要根据时序图传输才能正确显示。

参考JZ2440_4.3寸LCD手册_AT043TN24的时序如下:

生成缩略图出错:尺寸超过12.5 MP的文件

从最小的像素开始分析,电子枪每次在CLK下降沿(本开发板是下降沿)从数据线Dn0-Dn7上得到数据,发射到显示屏上,然后移动到下一个位置。Dn0-Dn7上的数据来源就是前面介绍的FrameBuffer。 就这样从一行的最左边,一直移动到一行的最右边,完成了一行的显示,假设为x。 当打完一行的最后一个数据后,就会收到Hsync行同步信号,根据时序图,一个Hsync周期可以大致分为五部分组成:thp、thb、1/tc、thd、thf。thp称为脉冲宽度,这个时间不能太短,太短电子枪可能识别不到。 电子枪正确识别到thp后,会从最右端移动最左端,这个移动的时间就是thb,称之为移动时间。thf表示显示完最右像素,再过多久Hsync才来。 同理,当电子枪一行一行的从上面移动到最下面时,Vsync垂直同步信号就让电子枪移动回最上边。Vsync中的tvp是脉冲宽度,tvb是移动时间,tvf表示显示完最下一行像素,再过多久Vsync才来。 假设一共有y行,则LCD的分辨率就是x*y。

关于显示原理,可以参考这篇博客:http://www.cnblogs.com/shangdawei/p/4760933.html 里面有一个LCD显示配置示意图如下:

Lesson1 005.jpg

当发出一个HSYNC信号后,电子枪就会从最右边花费HBP时长移动到最左边,等到了最右边后,等待HFP时长HSYNC信号才回来。因此,HBP和HFP分别决定了左边和右边的黑框。 同理,当发出一个VSYNC信号后,电子枪就会从最下边花费VBP时长移动到最上边,等到了最下边后,等待VFP时长VSYNC信号才回来。因此,VBP和VFP分别决定了上边和下边的黑框。 中间灰色区域才是有效显示区域。

再来解决最后一个问题:每个像素再FrameBuffer中,占据多少位BPP(Bits Per Pixels)? 前面的LCD引脚功能图里,R0-R7、G0-G7、B0-B7,每个像素是占据3*8=24位的,即硬件上LCD的BPP是确定的。 虽然LCD上的引脚是固定的,但我们使用的时候,可以根据实际情况进行取舍,比如我们的JZ2440使用的是16BPP,因此LCD只需要R0-R4、G0-G5、B0-B4与SOC相连,5+6+6=16BPP,每个像素就只占据16位数据。

我们写程序的思路如下:

  1. 1. 查看LCD芯片手册,查看相关的时间参数、分辨率、引脚极性;
  2. 2. 根据以上信息设置LCD控制器寄存器,让其发出正确信号;
  3. 3. 在内存里面分配一个FrameBuffer,在里面用若干位表示一个像素,再把首地址告诉LCD控制器;

之后LCD控制器就能周而复始取出FrameBuffer里面的像素数据,配合其它控制信号,发送给电子枪,电子枪再让在LCD上显示出来。以后我们想显示图像,只需要编写程序向FrameBuffer填入相应数据即可,硬件会自动的完成显示操作。


第002节_S3C2440_LCD控制器

LCD控制器主要功能和需要的设置:

1. 取:从内存(FrameBuffer)取出某个像素的数据;之后需要把FrameBuffer地址、BPP、分辨率告诉LCD控制器; 2. 发:配合其它信号把FrameBuffer数据发给LCD;需要设置LCD控制器时序、设置引脚极性;

这里主要的难点就是如何配合其它信号,需要我们阅读LCD芯片手册,知道其时序要求,然后设置相应的LCD控制器。

先看下S3C2440芯片手册上的LCD控制器框图:

Lesson2 001.png


通过设置REGBANK(寄存器组),LCDCDMA会自动(无需CPU参与)把内存上FrameBuffer里的数据,通过VIDPRCS发送到引脚VD[23:0]上,再配合VIDEOMUX引脚的控制信号,正确的显示出来。

S3C2440芯片手册介绍了LCD控制器支持TFT和STN两种LCD,我们常用的都是TFT材质的,因此主要看TFT相关的部分。

调色板的概念:

画油画的时候,通常先在调色板里配好想要的颜色,再用画笔沾到画布上作画。LCD控制器里也借用了这个概念,从FrameBuffer获得数据,这个数据作为索引从调色板获得对应数据,再发给电子枪显示出来。

Lesson2 002.jpg


如图,假如是16BPP的数据,LCD控制器从FB取出16bit数据,显示到LCD上。 当如果想节约内存,对颜色要求也没那么高,就可以采用调色板的方式,调色板里存放了256个16bit的数据,FB只存放每个像素的索引,根据索引去调色板找到对应的数据传给LCD控制器,再通过电子枪显示出来。

假设现在想要LCD只显示一种颜色怎么办?

如果是16BPP/24BPP需要修改FB里面的数据,填充同一个值。 如果是8BPP可以修改FB为同一种颜色,也可以设置调色板为同一种颜色,对于S3C22440有个临时调色板的特性,一旦使能了临时调色板,不管FB里面是什么数据,都只调用临时调色板的数据。





Lesson3 001.jpg

Lesson3 002.jpg

Lesson5 001.png

Lesson5 002.png

Lesson5 003.png

Lesson5 004.png

Lesson5 005.png

Lesson5 006.png

Lesson5 007.png

Lesson5 008.png

Bak.png

Lesson6 001.png

Bak.png

Lesson6 001.png

Lesson8 001.jpg

Lesson8 002.jpg

标题文字

标题文字