视频卡的各个属性保存在struct fb_var_screeninfo
struct fb_var_screeninfo { __u32 xres; /* visible resolution 可视分辨率*/ __u32 yres; __u32 xres_virtual; /* virtual resolution 虚拟分辨率*/ __u32 yres_virtual; __u32 xoffset; /* 从虚拟到可见区X偏移 */ __u32 yoffset; /* 从虚拟到可见区Y偏移*/ __u32 bits_per_pixel; /* 每像素比特 */ __u32 grayscale; /* != 0 表示灰度图 */ struct fb_bitfield red; /* bitfield in fb mem if true color, */ 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; /* (OBSOLETE) see fb_info.flags */ /* 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 rotate; /* angle we rotate counter clockwise 角度逆时针旋转*/ __u32 reserved[5]; /* Reserved for future compatibility */ };
视频硬件的固定信息
struct fb_fix_screeninfo { char id[16]; /* identification string eg "TT Builtin" */ unsigned long smem_start; /* framebuffer物理地址开始*/ __u32 smem_len; /* framebuffer 物理内存长度*/ __u32 type; /* see FB_TYPE_* */ __u32 type_aux; /* Interleave for interleaved Planes */ __u32 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; /* I/O映射内存起点 */ /* (physical address) */ __u32 mmio_len; /* I/O映射内存长度 */ __u32 accel; /* Indicate to driver which */ /* specific chip/card we have */ __u16 reserved[3]; /* Reserved for future compatibility */ };
fb_cmap规定了颜色映射
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 透明度,可以为NULL*/ };
帧缓冲关键数据结构
struct fb_info { atomic_t count; 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; /* 可变屏幕参数 */ struct fb_fix_screeninfo fix; /* 固定屏幕参数 */ struct fb_monspecs monspecs; /* Current Monitor specs */ struct work_struct queue; /* Framebuffer 事件队列 */ 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; /* 当前视频模式 */ #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 私有sysfs标志*/ #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 16位颜色表*/ #define FBINFO_STATE_RUNNING 0 #define FBINFO_STATE_SUSPENDED 1 u32 state; /* 硬件状态 */ void *fbcon_par; /* fbcon use-only private area */ /* From here on everything is device dependent */ void *par; /* we need the PCI or similar 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_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);//释放 /*读接口*/ ssize_t (*fb_read)(struct fb_info *info, char __user *buf, size_t count, loff_t *ppos); /*写接口*/ ssize_t (*fb_write)(struct fb_info *info, const char __user *buf, size_t count, loff_t *ppos); /*sanity check on video parameters*/ //视频参数的合法性检查 int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info); /* configure the video controller registers */ int (*fb_set_par)(struct fb_info *info);//配置视频参数 //配置颜色寄存器 int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green, unsigned blue, unsigned transp, struct fb_info *info); //批量配置颜色寄存器 int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info); /* blank display */ //清空显示 int (*fb_blank)(int blank, struct fb_info *info); /* pan display */ //虚拟屏的游动显示 int (*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info); /* Draws a rectangle */ //填充区域 void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect); /* Copy data from area to another */ //复制区域 void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region); /* Draws a image to the display */ //显示图像 void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image); /* Draws cursor */ //光标接口 int (*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor); /* Rotates the display */ //旋转显示 void (*fb_rotate)(struct fb_info *info, int angle); /* wait for blit idle, optional */ //等待了位图的闲置,可选 int (*fb_sync)(struct fb_info *info); /* 特定的ioctl */ int (*fb_ioctl)(struct fb_info *info, unsigned int cmd, unsigned long arg); /* 32位兼容的ioctl*/ int (*fb_compat_ioctl)(struct fb_info *info, unsigned cmd, unsigned long arg); /* 内存映射 */ int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma); /* 获取屏幕参数 */ void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps, struct fb_var_screeninfo *var); /* 释放资源*/ void (*fb_destroy)(struct fb_info *info); /* called at KDB enter and leave time to prepare the console */ int (*fb_debug_enter)(struct fb_info *info); int (*fb_debug_leave)(struct fb_info *info); };