Chinaunix首页 | 论坛 | 博客
  • 博客访问: 708655
  • 博文数量: 240
  • 博客积分: 3616
  • 博客等级: 大校
  • 技术积分: 2663
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-21 23:59
文章分类

全部博文(240)

文章存档

2013年(6)

2012年(80)

2011年(119)

2010年(35)

分类:

2011-12-12 15:30:16

本文摘录自 《嵌入式linux程序设计案例与实验教程》

我觉得,自己敲一遍理解深刻点。。

FrameBuffer 机制介绍

     FrameBuffer(帧缓冲) 是出现在 2.2.xx之后版本中的内核的一种驱动程序接口,是一种用来提供用户态实现直接写屏的抽象设备。FrameBuffer可以看成是显存的一个映像,映射到进程地址空间中,不仅能够直接写屏,而且写操作可以立即在屏幕上显示出来。

     FrameBuffer 操作是抽象的,其中物理显存和硬件结构都对用户透明,用户只需要通过应用程序直接读写FrameBuffer内容就可以完成对屏幕的显示控制。因此,FrameBuffer 不具有运算和处理数据的能力,只负责进行数据传递。
 

    可见,FrameBuffer 不是一个图形系统,只是一种机制的实现-----可以简单地把内存中的数值映射到屏幕上。也正因为如此,基于FrameBuffer的GUI具有高度的可移植性。


FrameBuffer的实现

    FrameBuffer对应的源文件位于 linux/drivers/video 目录下,除了总抽象设备文件 fbcon.c 之外,其设备驱动主要 fbmem.c 文件之中有所描述。 fbmem.c 是 FrameBuffer 机制的驱动程序,也是FrameBuffer机制的核心文件,它为上层应用程序提供通用的借口,同时也为下一层的特点硬件提供接口。其中的函数操作具体的硬件,设置寄存器,对现实缓冲进行映射。该程序的具体说明如下。


    首先,该程序有大量的关于设备的定义,之后用fb.h中包含的结构体定义了几个变量(fb.h位于 /opt/host/armv41/include/linux目录中)。涉及的主要结构体包括:

   fb_var_screeninfo: 记录帧缓存设备和制定显示模式的可修改记录,包括屏幕的分辨率、像素信息和一些时序变量。
  
   fb_fix_screeninfo: 记录帧缓存设备和指定显示模式的不可修改记录,包括屏幕缓冲区的物理地址和长度

   fb_info:linux 为帧缓冲设备定义的驱动层接口。
 
   fb_cmap: 调色板信息
  1. struct fb_camp{
  2.    __u32 start;      开始入口
  3.    __u32 len;        长度
  4.    __u16 *red;       红色数值
  5.    __u16 *green;     绿色数值
  6.    __u16 *blue;      蓝色数值
  7.    __u16 *transp;    透明度,可以为空
  8. };

    除这些常用的结构体外,该程序还定义了关于缓冲帧的一些常用操作函数,及操作集。
  1. static struct_operations fb_fops={
  2.     owner: THIS_MODULE,
  3.     read : fb_read,
  4.     write: fb_write,
  5.     ioctl: fb_ioctl,
  6.     mmap: fb_mmap,
  7.     open: fb_open,
  8.     release: fb_release,
  9. #ifdef HAVE_ARCH_FB_UNMAPPED_AREA
  10.    get_unmapped_area:get_fb_unmapped_area,
  11. #endif

  12. };

    从帧缓冲操作集可以看到,关于FB的操作包括 open. close . read . write.ioctl等,这些在之前的驱动程序中都做过介绍。内核通过fb_open 打开 /dev/fb0 设备文件,之后通过fb_ioctl操作获得LCD的分辨率长宽和bpp等信息,并且通过mmap操作等其映射到用户空间之中。在这个过程中,可以通过 fb_read  和 fb_write 操作直接对 FrameBuffer 进行读写。在这里简单介绍一下 mmap映射操作。


   mmap 映射操作可以将设备内存直接映射到用户空间。对于帧缓冲设备,可以通过映射操作直接将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址之中。之后用户就可以通过读写这段虚拟地址来直接在屏幕上绘图。
 
阅读(1491) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~