LCD及FrameBuffer驱动(二)-------------------FrameBuffer

帧缓冲

帧缓冲的概念

帧缓冲(framebuffer)是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。用户不必关心物理显示缓冲区的具体位置及存放方式,这些都由帧缓冲设备驱动本身来完成。对于帧缓冲设备而言,只要在显示缓冲区中与显示点对应的区域写入颜色值,对应的颜色会自动在屏幕上显示。 
帧缓冲设备为标准字符设备,主设备号为29,对应于/dev/fb%d设备文件。帧缓冲驱动的应用非常广泛,在Linux的桌面系统中,Xwindow服务器就是利用帧缓冲进行窗口的绘制。嵌入式系统中的Qt/Embedded等图形用户界面环境也基于帧缓冲而设计。另外,通过帧缓冲可支持汉字点阵的显示,因此帧缓冲也成为Linux汉化的可行方案。 

Linux帧缓冲相关的数据结构与函数

1. 帧缓冲设备最关键的一个数据结构体是fb_info 结构体。定义如下:

[cpp]  view plain  copy
  1. struct fb_info  
  2. {  
  3.     int node;  
  4.     int flags;  
  5.     struct fb_var_screeninfo var;/*可变参数 */  
  6.     struct fb_fix_screeninfo fix;/*固定参数 */  
  7.     struct fb_monspecs monspecs;/*显示器标准 */  
  8.     struct work_struct queue;/* 帧缓冲事件队列 */  
  9.     struct fb_pixmap pixmap;/* 图像硬件mapper */  
  10.     struct fb_pixmap sprite;/* 光标硬件mapper */  
  11.     struct fb_cmap cmap;/* 目前的颜色表*/  
  12.     struct list_head modelist;  
  13.     struct fb_videomode *mode;/* 目前的video模式 */  
  14. #ifdef CONFIG_FB_BACKLIGHT  
  15.     struct mutex bl_mutex;  
  16.     /* 对应的背光设备  */  
  17.     struct backlight_device *bl_dev;  
  18.     /* 背光调整 */  
  19.     u8 bl_curve[FB_BACKLIGHT_LEVELS];  
  20. #endif   
  21.     struct fb_ops *fbops;/* fb_ops,帧缓冲操作 */  
  22.     struct device *device;  
  23.     struct class_device *class_device;/   
  24.     int class_flag;/* 私有sysfs标志 */  
  25. #ifdef CONFIG_FB_TILEBLITTING  
  26.     struct fb_tile_ops *tileops;/* 图块Blitting */  
  27. #endif   
  28.     char __iomem *screen_base;/* 虚拟基地址 */  
  29.     unsigned long screen_size;/* ioremapped的虚拟内存大小 */  
  30.     void *pseudo_palette;/* 伪16色颜色表 */  
  31.     #define FBINFO_STATE_RUNNING 0  
  32.     #define FBINFO_STATE_SUSPENDED  1  
  33.     u32 state;/* 硬件状态,如挂起 */  
  34.     void *fbcon_par;  
  35.     void *par;  
  36. };  
fb_info结构体记录了帧缓冲设备的全部信息,包括设备的设置参数、状态以及操作函数指针。每一个帧缓冲设备都必须对应一个fb_info结构体~

2. fb_ops结构体

fb_info结构体成员变量fbops为指向底层操作的函数的指针,这些函数是需要驱动程序开发人员编写的,定义如下:

[cpp]  view plain  copy
  1. struct fb_ops  
  2. {  
  3.     struct module *owner;  
  4.     /* 打开/释放 */  
  5.     int(*fb_open)(struct fb_info *info, int user);  
  6.     int(*fb_release)(struct fb_info *info, int user);  
  7.   
  8.     /* 对于非线性布局的/常规内存映射无法工作的帧缓冲设备需要 */  
  9.     ssize_t(*fb_read)(struct file *file, char _ _user *buf, size_t count, loff_t*ppos);  
  10.     ssize_t(*fb_write)(struct file *file, const char _ _user *buf, size_t count, loff_t *ppos);  
  11.   
  12.     /* 检测可变参数,并调整到支持的值*/  
  13.     int(*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);  
  14.   
  15.     /* 根据info->var设置video模式 */  
  16.     int(*fb_set_par)(struct fb_info *info);  
  17.   
  18.     /* 设置color寄存器 */  
  19.     int(*fb_setcolreg)(unsigned regno, unsigned red, unsigned green, unsigned blue, unsigned transp, struct fb_info *info);  
  20.       
  21.     /* 批量设置color寄存器,设置颜色表 */  
  22.     int(*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);  
  23.   
  24.     /* 显示空白 */  
  25.     int(*fb_blank)(int blank, struct fb_info *info);  
  26.   
  27.     /* pan显示 */  
  28.     int(*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);  
  29.   
  30.     /* 矩形填充 */  
  31.     void(*fb_fillrect)(struct  fb_info  *info, const  struct fb_fillrect *rect);  
  32.     /* 数据复制 */  
  33.     void(*fb_copyarea)(struct  fb_info  *info, const  struct fb_copyarea *region);  
  34.     /* 图形填充 */  
  35.     void(*fb_imageblit)(struct fb_info *info, const struct fb_image *image);  
  36.   
  37.     /* 绘制光标 */  
  38.     int(*fb_cursor)(struct fb_info *info, struct fb_cursor *cursor);  
  39.   
  40.     /* 旋转显示 */  
  41.     void(*fb_rotate)(struct fb_info *info, int angle);  
  42.   
  43.     /* 等待blit空闲 (可选) */  
  44.     int(*fb_sync)(struct fb_info *info);  
  45.   
  46.     /* fb特定的ioctl (可选) */  
  47.     int(*fb_ioctl)(struct fb_info *info, unsigned int cmd, unsigned long arg);  
  48.   
  49.     /* 处理32位的compat ioctl (可选) */  
  50.     int(*fb_compat_ioctl)(struct fb_info *info, unsigned cmd, unsigned long arg);  
  51.   
  52.     /* fb特定的mmap */  
  53.     int(*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);  
  54.   
  55.     /* 保存目前的硬件状态 */  
  56.     void(*fb_save_state)(struct fb_info *info);  
  57.   
  58.     /* 恢复被保存的硬件状态 */  
  59.     void(*fb_restore_state)(struct fb_info *info);  
  60. };  

fb_ops的fb_check_var()成员函数用于检查可以修改的屏幕参数并调整到合适的值,而fb_set_par()则使得用户设置的屏幕参数在硬件上有效。 


3. fb_var_screeninfo 和fb_fix_screeninfo 结构体
fb_info的fb_var_screeninfo 和fb_fix_screeninfo 成员也是结构体,fb_var_screeninfo记录用户可修改的显示控制器参数,包括屏幕分辨率和每个像素点的比特数。fb_var_screeninfo中的xres定义屏幕一行有多少个点,yres定义屏幕一列有多少个点,bits_per_pixel定义每个点用多少个字节表示。而fb_fix_screeninfo 中记录用户不能修改的显示控制器的参数,如屏幕缓冲区的物理地址、长度。当对帧缓冲设备进行映射操作的时候,就是从fb_fix_screeninfo 中取得缓冲区物理地址的。上述数据成员都需要在驱动程序中初始化和设置。

fb_var_screeninfo和fb_fix_screeninfo结构体的定义分别如下:

[cpp]  view plain  copy
  1. struct fb_var_screeninfo   
  2. {   
  3.     /* 可见解析度 */  
  4.     __u32 xres;  
  5.     __u32 yres;  
  6.     /* 虚拟解析度 */  
  7.     __u32 xres_virtual;  
  8.     __u32 yres_virtual;  
  9.     /* 虚拟到可见之间的偏移 */  
  10.     __u32 xoffset;  
  11.     __u32 yoffset;  
  12.   
  13.     __u32 bits_per_pixel;/* 每像素位数,BPP */  
  14.     __u32 grayscale;/非0时指灰度 */  
  15.   
  16.     /* fb缓存的R\G\B位域 */  
  17.     struct fb_bitfield red;  
  18.     struct fb_bitfield green;  
  19.     struct fb_bitfield blue;  
  20.     struct fb_bitfield transp;/* 透明度 */  
  21.   
  22.     __u32 nonstd;/* != 0 非标准像素格式 */  
  23.   
  24.     __u32 activate;  
  25.   
  26.     __u32 height;/* 高度 */  
  27.     __u32 width;/* 宽度 */  
  28.   
  29.     __u32 accel_flags;/* 看fb_info.flags */  
  30.   
  31.     /* 定时: 除了pixclock本身外,其他的都以像素时钟为单位 */  
  32.     __u32 pixclock;/* 像素时钟(皮秒) */  
  33.     __u32 left_margin;/* 行切换:从同步到绘图之间的延迟 */  
  34.     __u32 right_margin;/* 行切换:从绘图到同步之间的延迟 */  
  35.     __u32 upper_margin;/* 帧切换:从同步到绘图之间的延迟 */  
  36.     __u32 lower_margin;/* 帧切换:从绘图到同步之间的延迟 */  
  37.     __u32 hsync_len;/* 水平同步的长度     */  
  38.     __u32 vsync_len;/* 垂直同步的长度     */  
  39.     __u32 sync;  
  40.     __u32 vmode;  
  41.     __u32 rotate;/* 顺时钟旋转的角度 */  
  42.     __u32 reserved[5];/* 保留 */  
  43. };  
  44.   
  45. struct fb_fix_screeninfo   
  46. {   
  47.     char id[16];/* 字符串形式的标识符 */  
  48.     unsigned long smem_start;/* fb缓存的开始位置 */  
  49.     __u32 smem_len;/* fb缓存的长度 */  
  50.     __u32 type;/* FB_TYPE_* */  
  51.     __u32 type_aux;/* 分界 */  
  52.     __u32 visual;/* FB_VISUAL_* */  
  53.     __u16 xpanstep;/* 如果没有硬件panning ,赋0 */  
  54.     __u16 ypanstep;   
  55.     __u16 ywrapstep;/   
  56.     __u32 line_length;/* 1行的字节数 */  
  57.     unsigned long mmio_start;/* 内存映射I/O的开始位置 */  
  58.     __u32 mmio_len;/* 内存映射I/O的长度  */  
  59.     __u32 accel;  
  60.     __u16 reserved[3];/* 保留 */  
  61. };  
fb_fix_screeninfo结构体中的成员变量visual记录屏幕使用的色彩模式,在Linux系统中,支持的色彩模式包括以下几种:

Monochrome(FB_VISUAL_MONO01、FB_VISUAL_MONO10),每个像素是黑或白。

Pseudo  color ( FB_VISUAL_PSEUDOCOLOR、FB_VISUAL_STATIC_PSEUDOCOLOR),即伪彩色,采用索引颜色显示。

True color(FB_VISUAL_TRUECOLOR),真彩色,分成红、绿、蓝三基色。

Direct color(FB_VISUAL_DIRECTCOLOR),每个像素颜色也是有红、绿、蓝组成,不过每个颜色值是个索引,需要查表。

Grayscale displays,灰度显示,红、绿、蓝的值都一样。


4. fb_bitfield结构体
fb_var_screen结构体中的fb_bitfield结构的成员变量red、green、blue分别记录R、G、B的位域,fb_bitfield结构体描述每一像素显示缓冲区的组织方式,包含位域偏移、位域长度和MSB指示,如下:

[cpp]  view plain  copy
  1. struct fb_bitfield  
  2. {  
  3.     __u32 offset; /* 位域偏移 */  
  4.     __u32 length; /* 位域长度 */  
  5.     __u32 msb_right; /* MSB */  
  6. };  

5. fb_cmap结构体

fb_cmap结构体记录设备无关的颜色表信息,用户空间可以通过ioctl()的FBIOGETCMAP 和FBIOPUTCMAP命令读取或设定颜色表。
[cpp]  view plain  copy
  1. struct fb_cmap  
  2. {  
  3.     __u32 start; /* 第1个元素入口 */   
  4.     __u32 len; /* 元素数量 */  
  5.     /* R、G、B、透明度 */  
  6.     __u16 *red;  
  7.     __u16 *green;  
  8.     __u16 *blue;  
  9.     __u16 *transp;  
  10. };  
6. 文件操作结构体
作为一种字符设备,帧缓冲设备的文件操作结构体定义于/linux/drivers/vedio/fbmem.c 文件中,如下所示:

[cpp]  view plain  copy
  1. static struct file_operations fb_fops =   
  2. {  
  3.     .owner = THIS_MODULE,  
  4.     .read = fb_read, //读函数  
  5.     .write = fb_write, //写函数  
  6.     .ioctl = fb_ioctl, //I/O控制函数  
  7. #ifdef CONFIG_COMPAT  
  8.     .compat_ioctl = fb_compat_ioctl,  
  9. #endif  
  10.     .mmap = fb_mmap, //内存映射函数  
  11.     .open = fb_open,  //打开函数  
  12.     .release = fb_release, //释放函数  
  13. #ifdef HAVE_ARCH_FB_UNMAPPED_AREA  
  14.     .get_unmapped_area = get_fb_unmapped_area,  
  15. #endif  
  16. };  
帧缓冲设备驱动的文件操作接口函数已经在fbmem.c 中被统一实现,一般不需要由驱动工程师再编写。

7. 注册与注销帧缓冲设备
Linux内核提供了register_framebuffer()和unregister_framebuffer()函数分别注册和注销帧缓冲设备,这两个函数都接受FBI指针为参数,原型为:

int register_framebuffer(struct fb_info *fb_info);

int unregister_framebuffer(struct fb_info *fb_info);

对于register_framebuffer()函数而言,如果注册的帧缓冲设备数超过了FB_MAX(目前定义为32),则函数返回-ENXIO,注册成功则返回0。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值