android 显示驱动学习
显示驱动framebuffer结构图如下:

framebuffer驱动的功能主要涉及了如下 两个文件:
include/linux/fb.h 是Framebuffer驱动的头文件
drivers/video/fbmem.c 是Framebuffer驱动的核心实现文件
在fb.h中,定义Framebuffer驱动中核心的数据接口是fb_info,在文件fb.h中的对应代码如下所示。
View Code
struct fb_info { int node; 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 */ struct fb_fix_screeninfo fix; /* Current fix */ 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 */ struct device *dev; /* This is this fb 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 */ unsigned long screen_size; /* Amount of ioremapped VRAM or 0 */ 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; }
在上述数据接口中fb_info中,包含了Framebuffer驱动的主要信息。具体说明如下:
struct fb_var_screeninfo 和 struct fb_fix_screeninfo:是两个相关的数据结构,分别对应FBOGET_VSCREENINFO和FBIOGET_FSCREENINFO 这两个ioctl,用于从用户空间获得显示信息。
fb_ops:表示Framebuffer驱动的操作。
在具体实现Framebuffer驱动的过程中,通常使用如下连个函数分别实现注册和注销的功能。
extern int register_framebuffer(struct fb_info * fb_info);
extern int unregister_framebuffer(struct fb_info *fb_info);
Frambuffer 驱动ioctl命令也是在上述文件fb.h中定义的,对应代码如下所示。
#define FBIOGET_VSCREENINFO 0x4600 #define FBIOPUT_VSCREENINFO 0x4601 #define FBIOGET_FSCREENINFO 0x4602 #define FBIOGETCMAP 0x4604 #define FBIOPUTCMAP 0x4605 #define FBIOPAN_DISPLAY 0x4606
在framebuffer驱动的实现过程中,需要定义一个实现fb_info结构和实现fb_ops中的各个函数的指针。从驱动程序的用户空间实现ioctl调用时,会转换成调用其中的函数。当注册具体的Framebuffer驱动后,将自动递增一个次设备号。

浙公网安备 33010602011771号