framebuffer驱动相关结构详解

1459阅读 0评论2010-12-08 jhluroom
分类:LINUX

Framebuffer对应的源文件在linux/drivers/video/目录下,总的抽象设备文件为fbcon.c,在这个目录下还有其他各种显卡驱动相关的源文件。

FrameBuffer设备驱动主要基于如下两个文件:
1) linux/include/linux/fb.h
2) linux/drivers/video/fbmem.c

1)fb_var_screeninfo
   这个结构描述了显示卡的特性:

struct fb_var_screeninfo
{
__u32 xres; /* visible resolution */   
//可视区域
__u32 yres;
__u32 xres_virtual; /* virtual resolution */  
//可视区域
__u32 yres_virtual;
__u32 xoffset; /* offset from virtual to visible resolution */ 
//可视区域的偏移
__u32 yoffset;

__u32 bits_per_pixel; /* guess what */  //每一象素的bit数
__u32 grayscale; /* != 0 Gray levels instead of colors */
//等于零就成黑白

struct fb_bitfield red; /* bitfield in fb mem if true color, */真彩的bit机构
struct fb_bitfield green; /* else only length is significant */
struct fb_bitfield blue;   
struct fb_bitfield transp; /* transparency */  
透明

__u32 nonstd; /* != 0 Non standard pixel format */ 不是标准格式

__u32 activate; /* see FB_ACTIVATE_* */

__u32 height; /* height of picture in mm */ 内存中的图像高度
__u32 width; /* width of picture in mm */ 
内存中的图像宽度

__u32 accel_flags; /* acceleration flags (hints) */ 加速标志

/* Timing: All values in pixclocks, except pixclock (of course) */

时序-_-这些部分就是显示器的显示方法了,可以找相关的资料看看
__u32 pixclock; /* pixel clock in ps (pico seconds) */
__u32 left_margin; /* time from sync to picture */
__u32 right_margin; /* time from picture to sync */
__u32 upper_margin; /* time from sync to picture */
__u32 lower_margin;
__u32 hsync_len; /* length of horizontal sync */  
水平可视区域
__u32 vsync_len; /* length of vertical sync */   
垂直可视区域
__u32 sync; /* see FB_SYNC_* */
__u32 vmode; /* see FB_VMODE_* */
__u32 reserved[6]; /* Reserved for future compatibility */
 备用-以后开发
};


2) fb_fix_screeninfon
这个结构在显卡被设定模式后创建,它描述显示卡的属性,并且系统运行时不能被修改,比如FrameBuffer内存的起始地址,它依赖于被设定的模式,当一个模式被设定后,内存信息由显示卡硬件给出,内存的位置等信息就不可以修改。

struct fb_fix_screeninfo {
char id[16]; /* identification string eg "TT Builtin" */
ID
unsigned long smem_start; /* Start of frame buffer mem */ 内存起始
/* (physical address) */ 
物理地址
__u32 smem_len; /* Length of frame buffer mem */ 
内存大小
__u32 type; /* see FB_TYPE_* */ 
__u32 type_aux; /* Interleave for interleaved Planes */
插入区域?
__u32 visual; /* see FB_VISUAL_* */
__u16 xpanstep; /* zero if no hardware panning */
没有硬件设备就为零
__u16 ypanstep; /* zero if no hardware panning */
__u16 ywrapstep; /* zero if no hardware ywrap */
__u32 line_length; /* length of a line in bytes */ 
一行的字节表示
unsigned long mmio_start; /* Start of Memory Mapped I/O */内存映射的I/O起始
/* (physical address) */ 
__u32 mmio_len; /* Length of Memory Mapped I/O */ 
I/O的大小
__u32 accel; /* Type of acceleration available */ 可用的加速类型
__u16 reserved[3]; /* Reserved for future compatibility */
};


3) fb_cmap
描述设备无关的颜色映射信息。可以通过
FBIOGETCMAP 和FBIOPUTCMAP 对应的ioctl操作设定或获取颜色映射信息.

struct fb_cmap {
__u32 start; /* First entry */ 
第一个入口
__u32 len; /* Number of entries */ 入口的数字
__u16 *red; /* Red values */ 

__u16 *green;
__u16 *blue;
__u16 *transp; /* transparency, can be NULL */
 透明,可以为零
};


4) fb_info
定义当显卡的当前状态;fb_info结构仅在内核中可见,fb_ops指针指向驱动设备工作所需的函数集。

struct fb_info {
char modename[40]; /* default video mode */ 
默认的视频卡类型
kdev_t node;
int flags;
int open; /* Has this been open already ? */ 
被打开过么?
#define FBINFO_FLAG_MODULE 1 /* Low-level driver is a module */ 
struct fb_var_screeninfo var; /* Current var */ 
现在的视频信息
struct fb_fix_screeninfo fix; /* Current fix */ 修正的信息
struct fb_monspecs monspecs; /* Current Monitor specs */ 现在的显示器模式
struct fb_cmap cmap; /* Current cmap */ 
当前优先级
struct fb_ops *fbops;
char *screen_base; /* Virtual address */ 
物理基址
struct display *disp; /* initial display variable */初始化
struct vc_data *display_fg; /* Console visible on this display */
char fontname[40]; /* default font name */
默认的字体
devfs_handle_t devfs_handle; /* Devfs handle for new name */
devfs_handle_t devfs_lhandle; /* Devfs handle for compat. symlink */
兼容
int (*changevar)(int); /* tell console var has changed */ 告诉console变量修改了
int (*switch_con)(int, struct fb_info*);
/* tell fb to switch consoles */ 
告诉fb选择consoles
int (*updatevar)(int, struct fb_info*);
/* tell fb to update the vars */ 
告诉fb更新变量
void (*blank)(int, struct fb_info*); /* tell fb to (un)blank the screen */告诉fb使用黑白模式(或者不黑)
/* arg = 0: unblank */
arg=0的时候黑白模式
/* arg > 0: VESA level (arg-1) */ arg>0时候选择VESA模式
void *pseudo_palette; /* Fake palette of 16 colors and
the cursor's color for non
palette mode */  
修正调色板
/* From here on everything is device dependent */ 
现在就可以使用了
void *par;
};


5) struct fb_ops
用户应用可以使用ioctl()系统调用来操作设备。

struct fb_ops {
/* open/release and usage marking */
struct module *owner;
int (*fb_open)(struct fb_info *info, int user);
int (*fb_release)(struct fb_info *info, int user);
/* get non settable parameters */
int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con,
struct fb_info *info);
/* get settable parameters */
int (*fb_get_var)(struct fb_var_screeninfo *var, int con,
struct fb_info *info);
/* set settable parameters */
int (*fb_set_var)(struct fb_var_screeninfo *var, int con,
struct fb_info *info);
/* get colormap */
int (*fb_get_c
map)(struct fb_cmap *cmap, int kspc, int con,

struct fb_info *info);
/* set colormap */
int (*fb_set_cmap)(struct fb_cmap *cmap, int kspc, int con,
struct fb_info *info);
/* pan display (optional) */
int (*fb_pan_display)(struct fb_var_screeninfo *var, int con,
struct fb_info *info);
/* perform fb specific ioctl (optional) */
int (*fb_ioctl)(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg, int con, struct fb_info *info);
/* perform fb specific mmap */
int (*fb_mmap)(struct fb_info *info, struct file *file, struct vm_area_struct *vma);
/* switch to/from raster image mode */
int (*fb_rasterimg)(struct fb_info *info, int start);
};


6) structure map
struct fb_info_gen | struct fb_info | fb_var_screeninfo
                   |                | fb_fix_screeninfo
                   |                | fb_cmap
                   |                | modename[40]
                   |                | fb_ops ---|--->ops on var
                   |                | ...       | fb_open
                   |                |           | fb_release
                   |                |           | fb_ioctl
                   |                |           | fb_mmap
                   | struct fbgen_hwswitch 

                              \-----|-> detect
                                    | encode_fix
                                    | encode_var
                                    | decode_fix
                                    | decode_var
                                    | get_var
                                    | set_var
                                    | getcolreg
                                    | setcolreg
                                    | pan_display
                                    | blank
                                    | set_disp

上一篇:Linux FB 驱动讲解
下一篇:Android 应用程序快速启动的秘诀