笔者最近在尝试在Linux3.4.2版本内核下编写程序在液晶显示屏上显示信息,在使用mmap读取显存地址以及读写数据时接触了Linux的framebuffer(帧缓冲),现对framebuffer的编程做一点总结与解析。
1,framebuffer简介
framebuffer本意是帧缓冲,它是指显示设备里的显存。显存里保存是像素的RGB数据。一个显存的大小等于屏幕宽度*屏幕高度*每像素字节数。我们通过程序修改显存的像素值,就形成各种显示效果.再由硬件将显存数据送到显示模块输出。显存一般是由SDRAM一段连续的空间来充当。framebuffer是一种出现在内核2.2.xx版本后的一种驱动程序接口,由于Linux工作在保护模式下,且每个应用程序都有自己的虚拟地址空间,所以不能在应用程序中直接访问物理缓冲区的地址,所以为了能通过应用程序读写framebuffer进而显示图像内容,我们可以在用户层使用void *mmap()函数将framebuffer的一段物理地址映射到用户空间的虚拟地址上,用户就可以通过这段虚拟地址访问framebuffer,实现屏幕的绘图。
2,设备的主要操作
framebuffer对应的设备文件通常是/dev/fb0,我们读写这个设备相当于读写framebuffer,读写framebuffer采用读写mmap()函数的方式来实现对framebuffer的读写,除了读写之外,我们还需用到ioctl()函数获取显示设备信息,如屏幕大小与分辨率等参数,ioctl()的操作由底层驱动完成。
3,framebuffer常用数据结构:
- 1. fb_info结构体:帧缓冲设备中最重要的数据结构体,包括了帧缓冲设备属性和操作的完整性属性。
- 2. fb_ops结构体:fb_info结构体的成员变量,fb_ops为指向底层操作的函数的指针。
- 3.fb_var_screen和fb_fix_screen结构体:fb_var_screen记录用户可以修改的显示控制器参数,fb_fix_screen记录用户不能修改的显示控制器参数。