/************************************************************************************

*本文为个人学习记录,如有错误,欢迎指正。

*本文参考资料: 

*        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;
};
struct fb_info

相关文章: