想象一下,屏幕的后面有一个电子枪,电子枪位于某个像素的背后,然后向这个像素发射红绿蓝三原色,从而就可以组成任意一种颜色。简单的说,电子枪在像素的背后一边移动,一边向像素发射红绿蓝。
如果要编写出LCD的驱动程序,首先要搞清楚下面的几个问题:
1)电子枪如何移动
2)颜色如何确定
3)电子枪如何得知应该跳到下一行
4)电子枪跳到最下面一行的最后一个像素时,如何得知应该跳到原点
5)RGB线上的数据从什么地方获取
回答第5个问题,首先要明确framebuffer是什么东西?
在内存中划出一块区域,这块区域就称为framebuffer.
在framebuffer中的这些数据,显然是写程序的人想要显示的,由程序员构造。
framebuffer中的这些值,最终会被LCD控制器读出来,然后通过RGB三组线,传给电子枪,电子枪要把它转换为红绿蓝三种颜色,打到像素上面去。右面屏中的每个像素在framebuffer中都有对应的存储空间,里面存有这个像素的颜色。
2、分析lcd的时序图
clk:电子枪在clk的下降沿(对于其它型号的lcd,有可能是上升沿)从数据线上得到数据,然后发射到像素上,最后移动到下一个像素。
数据线上的数据其实就是从framebuffer中获得的数据。
一行有多少像素,假设是x。
-------------------------------------------------------------------------------------------------------------------------------------------
当电子枪打完一行中的最后一个像素时,再经过多长时间会收到行同步信号呢?在该图中取为thf.
当电子枪打完一行中的最后一个像素时,会收到一个行同步信号HSYNC,如果这个行同步信号的脉冲很小,电子枪根本反应不过来,因此脉冲宽度不能太小,在该图中取为thp。
电子枪收到行同步信号后,就会从最右边移动到最左边,移动过程也不会瞬间完成,需要一定的时间,在该图中取为thb.
--------------------------------------------------------------------------------------------------------------------------------------------
当显示完所有的行后,再经过多长时间会收到垂直同步信号呢?在该图中取为tvf.
当显示完所有的行后,电子枪会收到一个垂直同步信号VSYNC,如果这个垂直同步信号的脉冲很小,电子枪根本反应不过来,因此脉冲宽度不能太小,在该图中取为tvp。
电子枪收到垂直同步信号后,就会从最下边移动到原点,移动过程也不会瞬间完成,需要一定的时间,在该图中取为tvb.
----------------------------------------------------------------------------------------------------------------------------------------------
3、这些时间参数如何影响屏幕上的图像位置呢?(和第2部分的参数名字不一样,但意义是一样的)
4、每个像素在framebuffer中占据多少位,用bpp表示。bit per pixel
硬件上LCD的bpp是确定的,比如说看该款LCD,有24条数据线。即每个像素可以用24bit来表示。
是不是有多少条数据线,我就得用多少条呢?这是不一定的。
比如说
R0~R7,我只用5条,其他接地
G0~G7,我只用6条,其他接地
B0~B7,我只用5条,其他接地
总共需要5+6+5=16条线,即每个像素占据16位的数据
总结一下:如何进行lcd编程?
1)需要看LCD的芯片手册,确定时间参数,确定分辨率,确定引脚极性。根据这些信息来设置lcd控制器,使它可以发出正确的信号。
2)在内存中分配一个framebuffer,这个framebuffer里面,每个像素占据若干位。分配好framebuffer后,把首地址告诉lcd控制器。以后lcd控制器就可以周而复始的从framebuffer中取出每个数据,然后配合其他信号,把像素的数据发给电子枪,让电子枪显示出来。
3)设置好lcd控制器后,写程序时,只需要把数据填到framebuffer中就可以了,硬件上会自动的把这些数据在lcd上显示出来。