虚拟帧缓冲驱动

17.2.2 虚拟帧缓冲驱动

《嵌入式Linux系统开发全程解析》是一本全面介绍嵌入式Linux开发的专著,书中涵盖了程序生成工具、调试工具、引导加载器、Linux系统结构、Linux内核、驱动程序、用户空间编程、用户空间中间件等方面的内容。《嵌入式Linux系统开发全程解析》内容前后照应、贴近实践,且有较强的延伸型,有利于读者建立嵌入式Linux开发系统化的知识结构和技术理念。本节为大家介绍虚拟帧缓冲驱动。

17.2.2  虚拟帧缓冲驱动

虚拟帧缓冲(vfb,Virtual FrameBuffer)驱动程序是一个不基于硬件的驱动程序,它在内存中开辟虚拟显示设备的内存,这可以模拟对显示的操作。

从结构上,vfb和一个真实的显示驱动程序基本相同,但是它实际上并不完成显示的功能,而只提供虚拟显示输出功能。在实际的系统中,vfb通常仅仅用于测试,或者在没有支持FrameBuffer硬件的时候,作为默认的实现。

虚拟帧缓冲驱动的源代码为:drivers/video/vfb.c。

在内核配置的时候,如果选择了虚拟帧缓冲的支持(FB_VIRTUAL),将会自动选择帧缓冲驱动的几个配置宏(填充、区域复制、fb的sys文件系统)。

vfb变化屏幕信息(fb_var_screeninfo)的定义如下所示:

 
  1. static struct fb_var_screeninfo vfb_default __initdata = {  
  2.   .xres        =  640,      .yres          =  480,    // 定义屏幕的大小  
  3.   .xres_virtual    =  640,    .yres_virtual = 480,  
  4.   .bits_per_pixel = 8,  
  5.   .red    =       { 0, 8, 0 },      // 定义RGB888的颜色空间  
  6.      .green  =        { 0, 8, 0 },  
  7.      .blue   =        { 0, 8, 0 },  
  8.      .activate =  FB_ACTIVATE_TEST,  
  9.      .height =    -1,     .width =    -1,  
  10.      .pixclock      = 20000,  
  11.      .left_margin   = 64,     .right_margin = 64,  
  12.      .upper_margin =  32,     .lower_margin = 32,  
  13.      .hsync_len = 64,     .vsync_len =    2,  
  14.      .vmode = FB_VMODE_NONINTERLACED,  
  15. }; 

vfb_default结构的定义表示vfb的屏幕大小为640×480,颜色空间为RGB888,每个像素24个字节。

vfb固定屏幕信息(fb_fix_screeninfo)的定义如下所示:

 
  1. static struct fb_fix_screeninfo vfb_fix __devinitdata = {  
  2.   .id =       "Virtual FB",  
  3.   .type =     FB_TYPE_PACKED_PIXELS,  
  4.   .visual =   FB_VISUAL_PSEUDOCOLOR,  
  5.   .xpanstep = 1,// 虚拟的屏幕可以支持任意的移位操作  
  6.   .ypanstep = 1,  
  7.   .ywrapstep =    1,  
  8.   .accel =    FB_ACCEL_NONE,  
  9. }; 

vfb的FrameBuffer操作由vfb_ops结构表示,内容如下所示:

 
  1. static struct fb_ops vfb_ops = {  
  2.   .fb_read           = fb_sys_read,  
  3.   .fb_write          = fb_sys_write,  
  4.   .fb_check_var        = vfb_check_var,           // vfb的检查参数  
  5.   .fb_set_par      = vfb_set_par,             // vfb的设置参数  
  6.   .fb_setcolreg   = vfb_setcolreg,        // vfb的设置颜色寄存器  
  7.   .fb_pan_display = vfb_pan_display,      // vfb的移动操作  
  8.   .fb_fillrect         = sys_fillrect,  
  9.   .fb_copyarea         = sys_copyarea,  
  10.   .fb_imageblit        = sys_imageblit,  
  11.   .fb_mmap               = vfb_mmap,              // vfb的内存映射操作  
  12. }; 

在vfb_ops结构中的sys_fillrect(填充矩形)、sys_copyarea(复制区域)和sys_imageblit(绘制图像)是FrameBuffer驱动程序中公用的函数,而以vfb_为前缀的几个函数是在vfb驱动中单独实现的。

vfb_pan_display()的实现如下所示:

 
  1. static int vfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)  
  2. {  
  3.   if (var->vmode & FB_VMODE_YWRAP) {  
  4.       if (var->yoffset < 0 
  5.           || var->yoffset >= info->var.yres_virtual || var->xoffset)  
  6.           return -EINVAL;  
  7.   } else {  
  8.       if (var->xoffset + var->xres > info->var.xres_virtual ||  
  9.           var->yoffset + var->yres > info->var.yres_virtual)  
  10.           return -EINVAL;  
  11.   }  
  12.   info->varvar.xoffset = var->xoffset;      // 指定显示的位置  
  13.   info->varvar.yoffset = var->yoffset;  
  14.   if (var->vmode & FB_VMODE_YWRAP)  
  15.       info->var.vmode |= FB_VMODE_YWRAP;  
  16.   else  
  17.       info->var.vmode &= ~FB_VMODE_YWRAP;  
  18.   return 0;  

vfb_pan_display()利用了虚拟缓冲完成显示区域调整的函数。在其中,并不需要完全重写显示区域,只需要将可以显示区域的地址赋值。

提示:在一个实际的硬件系统中,pan功能的实现应当实际显示硬件的寄存器操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值