本节介绍framebuffer的概念和来源、设计思想,fb设备的应用层接口等,为下节使用framebuffer应用编程打基础。
5.7.1.1、什么是framebuffer
(1).裸机中如何操作LCD
Soc里面有CPU,LCD控制器;外部有LCD的驱动器,驱动器后面带着屏幕,驱动器和控制器之间使用LCD排线进行连接(LCD特有的接口)。CPU通过操作LCD控制器里面的寄存器,使得DDR分出一部分作为显存,显存和LCD屏幕做双向映射。以后CPU只需要把要显示的内容放入显存。硬件就会自动将内容数据刷到驱动器里面,驱动器操控LCD就可以显示。
关键点:LCD控制器操纵显存。
(2).OS下操作显存的难点
分层。分为内核(驱动)和应用。驱动做跟底层硬件相关(初始化寄存器,内存,内存与LCD之间映射);应用把要显示的内容丢到显存里面去。应用驱动怎么配合。驱动是在内核空间,应用在应用空间。两者之间通信不能用copy_to_user或者copy_from_user(小容量),要将mmap映射:在内核空间申请一段内存作为显存,在将内存的物理地址用Mmap映射虚拟地址。这时应用里面也有一个显存,
(3)framebuffer帧缓冲,是linux内核中虚拟出来的一个设备,用来代替LCD显示器这个硬件设备以及软件设施
* frambuffer向应用层提供一个统一接口的显示设备,所以应用层就不用管驱动层
* 从驱动来看,fb是一个典型的字符设备,而且定义了一个类/sys/class/qraphics
framebuffer是linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的差异,允许上层应用程序在图像模式下直接对显示缓冲区进行读写操作。用户不必关心物理显示缓冲区的具体位置以及存放方式,这些都有帧缓冲设备驱动本身来完成。
framebuffer机制模仿显卡的功能,将显卡硬件结构抽象为一系列的数据结构,可以通过framebuffer的读写直接对显存进行操作。用户可以将framebuffer看成是显卡的一个映像,将其映射到进程空间后,就可以直接进行读写操作,写操作会直接反映在屏幕上。
帧缓冲设备为标准的字符型设备,在linux中的主设备号29,定义在/include/linux/major.h中的FB_MAJOR,次设备号定义帧缓冲的个数,最大允许有32个FrameBuffer,定义在/include/linux/fb.h的FB_MAX,对应文件系统下的/dev/fb%d设备文件,使用如下方式:前面的数字表示次设备号
* 0 = /dev/fb0 第一个fb设备
* 1 = /dev/fb1 第二个fb设备
fb也是一种普通的内存设备,可以像内存设备/dev/mem一样,对其read,write,seek以及mmap。但区别在于fb使用的不是整个内存区,而是显存部分。
5.7.1.2、framebuffer的使用(应用层)
(1). 打开设备文件/dev/fb0
如果系统没有显示器就没有fb,所以一定是fb0,如果有三个显示器就是fb0,fb1,fb2
ls /dev/fb0
(2). 获取设备信息 #include <linux/fb.h>
调用相关接口读取屏幕,分辨率之类
(3)mmap做映射
(4)填充framebuffer