FrameBuff
FrameBuffer介绍
FrameBuffer直译就是,帧缓冲。
Frame(帧):所看到的屏幕上的图像,或者在一个窗口中的图像,就叫一帧。
Buffer(缓冲):一段RAM,用来暂存图像数据,这些数据会被直接写入到显示设备。
帧缓冲就相当于图形操作和图像输出中间的一个介质,将程序对图形数据的处理操作反馈到显示输出上。
LCDC是将系统需要显示的数据经过处理后输出到LCD显示驱动器的液晶显示控制模块 ,在用户初始化配置后,LCDC将自动进行读取数据、缓存数据、处理数据以及输出符合时序要求的控制和数据信号等操作。
FrameBuffer是Linux内核为显示设备提供的一个接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。 帧缓冲设备是字符设备,主设备号为29,次设备号为帧缓冲的个数(最多32个),对应的设备文件一般是 /dev/fb0、/dev/fb1 等等。假设现在的显示模式是1024x768-8 位色,则可以通过如下的命令清空屏幕
dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
如果应用程序需要知道FrameBuffer设备的相关参数,必须通过ioctl()系统调用来完成。最常用的ioctl命令字是下面这两个: FBIOGET_FSCREENINFO:与FrameBuffer有关的固定的信息,比如图形硬件上实际的帧缓存空间的大小、能否硬件加速等信息 FBIOGET_VSCREENINFO:与FrameBuffer有关的可变信息,之所以可变,是因为对同样的图形硬件,可以工作在不同的模式下,简单来讲,一个支持 1024x768x24图形模式的硬件通常也能工作在800x600x16的图形模式下,可变的信息就是指FrameBuffer的长度、宽度以及颜色深度等信息。
Framebuffer中驱动重要数据结构
struct fb_info
驱动最关键的结构体,包含了设备属性和操作的完整描述,包括设备的设置参数、状态以及对底层硬件操作的函数指针。在Linux中,每一个帧缓冲设备都必须对应一个fb_info,fb_info在/linux/fb.h中的定义如下 (只列出重要的一些) :
struct fb_info {
int node;
int flags;
struct fb_var_screeninfo var; /*LCD可变参数结构体*/
struct fb_fix_screeninfo fix; /*LCD固定参数结构体*/
struct fb_monspecs monspecs; /*LCD显示器标准*/
struct work_struct queue ; /*帧缓冲事件队列*/
struct fb_pixmap pixmap; /*图像硬件mapper*/
struct fb_pixmap sprite; /*光标硬件mapper*/
struct fb_cmap cmap; /*当前的颜色表*/
struct fb_vi