视频卡的各个属性保存在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);
};