wve

导航

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驱动后,将自动递增一个次设备号。

 

 

 

posted on 2012-10-13 16:12  wve  阅读(820)  评论(0)    收藏  举报