1. 介绍
Linux下的framebuffer是用于在显示器上显示图像的硬件无关抽象层, 意味着包含当前视频帧的一块内存区域
Framebuffer看成是显示内存的一个映像, 将其映射到进程地址空间之后, 可以直接进行读写操作, 写操作可以立即反应在屏幕上, 这种操作是抽象统一的, 用户态进程不必关心物理显存的位置、换页机制等等具体细节(由Framebuffer设备驱动来完成)
2. Framebuffer的使用
Framebuffer对应的设备文件一般是/dev/fb0、/dev/fb1等
2.1 相关结构体
Framebuffer使用前需要了解两个结构体
fb_var_screeninfo: 显卡的显示属性, 如屏幕分辨率、每个像素点的比特数, 用户可修改
fb_fix_screeninfo: 显卡的硬件属性, 用户不可修改, 驱动程序初始化时设置
2.2 使用方法
一般的步骤如下:
- 打开framebuffer设备(/dev/fbX)
- 通过ioctl FBIOGET_VSCREENINFO命令获取当前fb_var_screeninfo信息
- 设置需要修改的fb_var_screeninfo参数, 并通过ioctl FBIOPUT_VSCREENINFO设置这些信息(可选)
- 设置global alpha和blank/unblank参数, 通过用于多个fb的情况(可选)
- 计算屏幕的总大小(占用字节数): xres * yres * bits_per_pixel / 8
- 映射到用户进程地址空间: mmap
- 往映射的地址空间写入数据
- 删除映射(munmap), 关闭framebuffer设备
2.3 实例
实例
3. Linux中framebuffer驱动的实现
Linux实现framebuffer在文件层的部分, 提供了对用户的接口(部分接口同时需要驱动实现), 同时对驱动提供了注册接口
详细见文件linux/drivers/video/fbmem.c
对驱动提供的注册接口是register_framebuffer(struct fb_info *fb_info)
其中, 参数fb_info描述特定硬件的FrameBuffer驱动信息
主要成员包含fb_var_screeninfo、fb_fix_screeninfo、fb_cmap和fb_ops