莫道不销魂 帘卷西风 人比黄花瘦 ——李清照
上篇我们粗略的学习了LCD一些硬件相关知识,本篇文章我们学习一下LCD最重要的设备:framebuffer(帧缓冲设备)
framebuffer是Linux系统为显示设备提供的一个接口,它显示缓冲区抽象,屏蔽图像硬件的底层差异,即允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。用户不用关系物理显示缓冲区的具体位置及存放方式,这些都由帧缓冲设备驱动本身完成,对于帧缓冲设备,只需要在显示缓冲区中与显示点对应的区域写入颜色值,对应的颜色就自动在屏幕上显示。可供用户态进程实现直接写屏,模仿显卡功能,将显卡硬件结构抽象掉,通过framebuffer这个设备直接对显存进行操作,将framebuffer看成显示内存的一个映像,将其映射到进程地址空间以后,进行直接读写操作,而且可以立即反应在屏幕上。
但Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器. 中间不会对数据做处理. 应用程序也可以直接读写这个水池的内容.在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但所有显示任务都由CPU完成。
framebuffer是标准字符设备,主设备号29,对应/dev/fbxx设备文件
接下来我们来了解一下framebuffer相关的数据结构和函数:
1、fb_info结构体。
这是framebuffer最关键的一个数据结构体,其中包括了framebuffer设备属性和操作的完整描述:
struct fb_info {
int node; //一个特定的framebuffer,相当于一个次设备号
int flags;
struct mutex lock;/* Lock for open/release/ioctl funcs */互斥锁
struct fb_var_screeninfo var;/* Current var */当前缓冲区的可变参数
struct fb_fix_screeninfo fix;/* Current fix */固定参数
struct fb_monspecs monspecs;/* Current Monitor specs */当前显示器标志
struct work_struct queue;/* Framebuffer event queue */帧缓冲事件队列
struct fb_pixmap pixmap;/* Image hardware mapper */图像硬件mapper
struct fb_pixmap sprite;/* Cursor hardware mapper */光标硬件mapper
struct fb_cmap cmap;/* Current cmap */当前的调色板
struct list_head modelist; /* mode list */
struct fb_videomode *mode;/* current mode */当前的视频模式
#ifdef CONFIG_FB_BACKLIGHT如果配置了LCD支持背光灯
/* assigned backlight device */
/* set before framebuffer registration,
remove after unregister */背光调整
struct backlight_device *bl_dev;
/* Backlight level curve */
struct mutex bl_curve_mutex;
u8 bl_curve[FB_BACKLIGHT_LEVELS];
#endif
#ifdef CONFIG_FB_DEFERRED_IO
struct delayed_work deferred_work;
struct fb_deferred_io *fbdefio;
#endif
struct fb_ops *fbops;帧缓冲操作函数集
struct device *device;/* This is the parent */父设备
struct device *dev;/* This is this fb device */fb设备
int class_flag; /* private sysfs flags */私有的sysfs标志
#ifdef CONFIG_FB_TILEBLITTING
struct fb_tile_ops *tileops; /* Tile Blitting */图块blitting
#endif
char __iomem *screen_base;/* Virtual address */虚拟基地址
unsigned long screen_size;/* Amount of ioremapped VRAM or 0 */ ioremap的虚拟内存大小
void *pseudo_palette;/* Fake palette of 16 colors */ 伪16位调色板
#define FBINFO_STATE_RUNNING 0
#define FBINFO_STATE_SUSPENDED 1
u32 state; /* Hardware state i.e suspend */硬件的状态
void *fbcon_par; /* fbcon use-only private area */
/* From here on everything is device dependent */
void *par;
};
fb_info结构体记录了帧缓冲设备的全部信息,包括设备的设置参数、状态以及操作函数指针,每一个帧缓冲设。备都对应一个fb_info。
2、fb_ops结构体
可以从上面得知fbops为fb_info的成员变量,它是指向底层操作的函数的指针,它是提供给底层设备驱动的一个接口。通常我们编写字符驱动的时候,要填写一个file_operations结构体,并使用register_chrdev()注册之,以告诉Linux如何操控驱动。当我们编写一个FrameBuffer的时候,就要