目录
1.不同接口的LCD硬件操作原理
应用工程师眼中看到的LCD
LCD由一个一个像素组成:每行由xres个像素,有yres行,他的分辨率是:xres*yres.
只要我们能控制任意一个像素的颜色,就可以在LCD上绘制图片,文字
1.1像素的颜色怎么表示
用红绿蓝三种颜色来表示,可以用24位数据来表示红绿蓝,也可以用16位等等格式。比如:
- bpp : bits per pixel ,每个像素用多少位来表示
- 24bpp:实际上会用到32位,其中8位未使用,其余24位中分别用8位来表示红(R),绿(G),蓝(B)
- 16bpp:有rbg565,rbg555
- rbg565:用5位表示红,用6位表示绿,用5位表示蓝
- rbg555:16位数据中用5位表示红,5位表示绿,5位表示蓝,浪费一位
1.2怎么把颜色发给LCD
假设每个像素的颜色用16位来表示,那么一个LCD的所有像素点假设有xres*yres个,
需要的内存为:xres * yres *16/8 ,也就是要设置所有像素的颜色,需要这么大的内存
这块内存就被称为framebuffer:
- Framebuffer中每块数据对应一个像素
- 每块数据的大小可能是16位,32位,这跟LCD上的像素的颜色格式有关
- 设置好LCD硬件后,只需要把颜色数据写入到Framebuffer即可
驱动工程师眼中看到的LCD
驱动工程师对LCD的理解要深入硬件,必须要回答这几个问题:
- Framebuffer在哪里
- 谁把Framebuffer中的数据发给LCD
统一的LCD硬件模型
第一种情况:将显存,LCD控制器,LCD屏幕组成一个模组(LCM)
第二种情况:将LCD控制器,显存与LCD屏幕分隔开,LCD控制器是位于ARM芯片内部的,ARM 芯片外接内存,从内存中分配出一块空间供显存使用
第一种情况一般用于单片机MCU(F103):这种接口称为8080
第二种情况一般用于能运行Linux的高性能的芯片MPU:这种接口一般被称为TFTRGB接口
这两种接口是不一样的,但整个模块的原理是一样的
8080接口
用这种接口的单片机一般性能比较弱, 所以外接的模块用内存的接口最好,我们在访问内存时,一般用数据线访问(读信号,写信号,地址线,数据线,片选信号),这样的话需要的IO口太多了,如何进行精简呢?数据线不可少,所以只能精简地址线,可以通过将地址信号转换为数据通过数据线发送,但是怎么分辨发送的是数据还是地址呢,通过引出一个引脚来分辨(data/cmd)
这种显存在屏幕上,显存一般是SRAM,它比较贵,所以一般的 8080屏幕分辨率不高
要使用更高分辨率的屏幕,就可以用以下接口的方式,这种方式内存接口比较便宜
TFTRGB接口
LCD控制器在ARM芯片内部,它会自动获取Framebuffer中的数据,那它怎么将数据发送到LCD屏幕上边呢:
1.移动像素:DCLK
2.从最后跳到下一行:HSYNC(每来一个脉冲就执行一次)
3.跳回一帧的开始(从最后一个像素段跳到第一个像素点):VSYNC
4.数据来源:RGB三组线(24条线)
5.当数据从最后跳到下一行和从会后一个像素点跳到第一个像素点的时候数据是无效的,所以使用:DE(来决定数据是否有效)
什么是MIPI
实际上上边这两种接口的实质是一样的,这两种接口都可以归入一个标准:MIPI标准
MIPI表示“Mobile Industry Proc8080essor Interface”,即移动产业处理器接口,是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。主要是手机内部的接口(摄像头,显示器接口,射频/基带接口)等标准化,从而减少手机内部接口的复杂程度及增加设计的灵活性
对于LCD,MIPI可以分为3类:
MIPI-DBI(Display Bus Interface)
既可以是Bus(总线),就是既能发送命令,常用的8080接口就是属于DBI接口
MIPI-DPI(Display Pixel Interface)
Pixel(像素),强调的是操作单个像素,在MPU上的LCD控制器就是这种接口
MIPI-DSI(Display Serial Interface)
Serial,相比于DBI,DPI需要使用很多接口线,DSI需要的接口线大为减少
Framebuffer驱动程序框架
它再怎么复杂,还是一个字符驱动程序
LCD驱动程序分为
1.上层比较通用性的代码(框架):fbmem.c
2.硬件驱动:对于不同的芯片还有不同的硬件相关的文件:s3c2410fb.c STM32MP157_fb.c
调用关系:
示例1:
app: open("/dev/fb0", ...) 主设备号:29 , 次设