帧缓冲(framebuffer)设备应用于linux显示技术方面。
因为linux的显示平台已经全部基于framebuffer,所以目前在linux环境下开发图形化界面、游戏、影视软件等可视化应用时都必须用到帧缓冲技术.
帧缓冲在linux体系中居于上层应用和底层显示设备之间,它的设计意图是对上层应用屏蔽掉低层不同硬件的操作细节,需要在上层开发和底层设备之间加入一个中间层以节省开发人员的时间和精力。
帧缓冲类似一个蓄水池,存放来自用户进程的数据,然后把这些数据再输入显示设备中。
对于用户而言,帧缓冲就是内存中的一块区域,可以读、写、映射。只要在初始化阶段把显示设备映射到用户进程空间,可以理解为将屏幕中的每一点和帧缓冲的每一点一一对应起来。这样接下来就可以对这块内存区域填充任何已经定义的像素以及颜色,而屏幕也就可以根据刚才写入的像素及颜色呈现出五彩缤纷的画面。
=============================================================
在用户空间内使用的数据结构主要有fb_fix_screeninfo和fb_var_screeninfo。
在内核空间使用的主要数据结构为fb_info。
fb_fix_screeninfo结构体:
该数据结构定义了一些系统运行期间不能改变的信息,例如设备名,屏幕的像素数量,缓冲区的首址和长度等。这类信息一般通过ioctl函数获得。
下面列出了fb_fix_screeninfo 的主要内容:
struct fb_fix_screeninfo {
char id[16]; /* 设备名*/
unsigned long smem_start; /* frame buffer 缓冲区起始地址(物理地址)*/
__u32 smem_len; /* 缓冲区长度*/
__u32 type; /* 设备类型,例如TFT或STN*/
……
__u32 visual; /* 色彩类型,真彩色、假彩色或单色*/
……
__u32 line_length; /* 屏幕上每行的字节数 */
unsigned long mmio_start; /* IO映射区起始地址(物理地址) */
__u32 mmio_len; /* IO 映射区长度 */
__u32 accel; /* 指出使用的加速卡是哪些特定的芯片 */
__u16 reserved[3]; /* 系统保留*/
};
fb_var_screeninfo结构体:
相对应的,fb_var_screeninfo定义了一些在系统运行期间可以改变的信息。例如像素深度、灰度级、颜色格式、时序,屏幕边缘空白区等。
下表中列出了fb_var_screeninfo的主要内容:
struct fb_var_screeninfo {
__u32 xres; /* visible resolution 可见分辨率 */
__u32 yres;
__u32 xres_virtual; /* virtual resolution 虚拟分辨率 */
__u32 yres_virtual;
__u32 xoffset; /* 从虚拟分辨率到可见分辨率的偏移量*/
__u32 yoffset;
__u32 bits_per_pixel; /* 像素深度 */
__u32 grayscale; /* 灰度级 */
struct fb_bitfield red;
struct fb_bitfield green;
struct fb_bitfield blue;
struct fb_bitfield transp; /* 透明度 */
__u32 nonstd; /* 非标准像素格式 */
……
__u32 pixclock; /* 像素时钟,单位是皮秒*/
__u32 left_margin; /* 左侧边缘区*/
__u32 right_margin; /*右侧边缘区 */
__u32 upper_margin; /*顶部边缘区 */
__u32 lower_margin;
__u32 hsync_len; /*水平扫描边缘区 */
__u32 vsync_len; /*垂直扫描边缘区 */
…….
};
内核空间fb_info结构体
struct fb_info {
int node; /* 设备节点 */
int flags; /*标志*/
struct fb_var_screeninfo var; /* 当前可变参数 */
struct fb_fix_screeninfo fix; /* 当前固定参数 */
struct fb_monspecs monspecs; /* 当前监视器特征 */
struct work_struct queue; /* 帧缓冲事件队列 */