一、什么是framebuffer
framebuffer 是一种独立于硬件的抽象图形设备。
是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。
二、framebuffer的使用步骤
-
打开 Framebuffer 设备:通常在
/dev/fb0
设备文件中。 -
获取屏幕信息:使用
ioctl
系统调用获取屏幕的分辨率、颜色深度等信息。
ioctl函数
int ioctl(int fd, unsigned long request, ...);
fd
:设备文件的文件描述符。request
:请求的命令,通常是一个宏,定义了要执行的操作。...
:可选参数,通常是指向数据结构的指针,用于传递额外的信息。
对于应用层,通过操作/dev/fb*,通过ioctl来用各种命令控制fb
/usr/include/linux/fb.h 中查看
进入内核源码中看看<linux/fb.h>,里面定义了一些ioctl的命令
#define FBIOGET_VSCREENINFO 0x4600 //获取应用程序可改变的参数(如设定的分辨率)
#define FBIOPUT_VSCREENINFO 0x4601
#define FBIOGET_FSCREENINFO 0x4602 //获取固定的参数(如屏幕的分辨率,一般只是拿来看看)
#define FBIOGETCMAP 0x4604
#define FBIOPUTCMAP 0x4605
#define FBIOPAN_DISPLAY 0x4606
<linux/fb.h>中还提供了专门的结构体类型,用来存放上述两个参数,如下就是存放可变参数的结构体类型
struct fb_var_screeninfo {
__u32 xres; /* visible resolution 可视画面的x、y轴分辨率 */
__u32 yres;
__u32 xres_virtual; /* virtual resolution */
__u32 yres_virtual;
__u32 xoffset; /* offset from virtual to visible 可视画面相对于虚拟画面的x、y轴偏移量*/
__u32 yoffset; /* resolution */
__u32 bits_per_pixel; /* guess what 像素深度 */
__u32 grayscale; /* != 0 Graylevels instead of colors */
struct fb_bitfield red; /* bitfield in fb mem if true color, */
struct fb_bitfield green; /* else only length is significant */
struct fb_bitfield blue;
struct fb_bitfield transp; /* transparency */
__u32 nonstd; /* != 0 Non standard pixel format */
__u32 activate; /* see FB_ACTIVATE_* */
__u32 height; /* height of picture in mm */
__u32 width; /* width of picture in mm */
__u32 accel_flags; /* (OBSOLETE) see fb_info.flags */
3.映射 Framebuffer 到内存:使用 mmap
将 framebuffer 映射到进程的地址空间。
mmap
是一个系统调用,用于将文件或设备的内容映射到进程的地址空间。它允许程序直接访问文件或设备的内存,而无需使用传统的读写操作。
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
addr
:建议的映射起始地址,通常设置为NULL
。length
:要映射的字节数。prot
:映射区域的保护标志(如可读、可写)。flags
:映射的选项(如共享或私有)。fd
:要映射的文件描述符。offset
:文件或设备的偏移量。
4.绘制图形:直接操作映射的内存来绘制图形。
5.关闭设备:完成后,解除映射并关闭设备。