/************************************************************************************
*本文为个人学习记录,如有错误,欢迎指正。
* https://www.cnblogs.com/deng-tao/p/6075709.html
* https://blog.csdn.net/ultraman_hs/article/details/54985963
* https://www.cnblogs.com/xiaojianliu/p/8473095.html
* https://blog.csdn.net/qq_28992301/article/details/52727050
************************************************************************************/
(1)什么是framebuffer?
framebuffer,帧缓冲设备(简称fb)是linux内核中虚拟出的一个设备,属于字符设备;它的主设备号为FB_MAJOR = 29,次设备号用来区分内核中不同的framebuffer。Linux内核中最多支持32个framebuffer,设备文件位于/dev/fb*。
(2)framebuffer的作用
framebuffer的主要功能是向应用层提供一个统一标准接口的显示设备。 它将显示设备的硬件结构抽象为一系列的数据结构,应用程序通过framebuffer的读写直接对显存进行操作。用户可以将framebuffer看成是显存的一个映像,将其映射到进程空间后,就可以直接进行读写操作,写操作会直接反映在屏幕上。
对于现代LCD,有一种“多屏叠加”的机制,即一个LCD设备可以有多个独立虚拟屏幕,以达到画面叠加的效果。所以fb与LCD不是一对一的关系,在常见的情况下,一个LCD对应了fb0~fb4。
2. 相关数据结构
(1)struct fb_info
Linux内核中使用fb_info结构体变量来描述一个framebuffer,在调用register_framebuffer接口注册framebuffer之前,必须要初始化其中的重要数据成员。
struct fb_info中成员众多,我们需要着重关注以下成员:
fb_var_screeninfo:代表可修改的LCD显示参数,如分辨率和像素比特数等;
fb_fix_screeninfo:代表不可修改的LCD属性参数,如显示内存的物理地址和长度等;
fb_ops:LCD底层硬件操作接口集。
struct fb_info { int node; //用来表示该fb设备的次设备号 int flags; //一个标志位 struct mutex lock; /* Lock for open/release/ioctl funcs */ struct mutex mm_lock; /* Lock for fb_mmap and smem_* fields */ struct fb_var_screeninfo var; /* Current var */ // fb的可变参数 struct fb_fix_screeninfo fix; /* Current fix */ // fb的不可变参数 struct fb_monspecs monspecs; /* Current Monitor specs */ struct work_struct queue; /* Framebuffer event queue */ struct fb_pixmap pixmap; /* Image hardware mapper */ struct fb_pixmap sprite; /* Cursor hardware mapper */ struct fb_cmap cmap; /* Current cmap */ struct list_head modelist; /* mode list */ struct fb_videomode *mode; /* current mode */ #ifdef CONFIG_FB_BACKLIGHT /* 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 */ //fb设备的父设备 struct device *dev; /* This is this fb device */ //本设备的device int class_flag; /* private sysfs flags */ #ifdef CONFIG_FB_TILEBLITTING struct fb_tile_ops *tileops; /* Tile Blitting */ #endif char __iomem *screen_base; /* Virtual address */ //LCD的显存地址(虚拟地址) unsigned long screen_size; /* Amount of ioremapped VRAM or 0 */// LCD显存的字节大小 void *pseudo_palette; /* Fake palette of 16 colors */ #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; /* we need the PCI or similiar aperture base/size not smem_start/size as smem_start may just be an object allocated inside the aperture so may not actually overlap */ struct apertures_struct { unsigned int count; struct aperture { resource_size_t base; resource_size_t size; } ranges[0]; } *apertures; };