Documentation/fb/framebuffer.txt 翻译

来源:互联网 发布:网络用语dm是什么意思 编辑:程序博客网 时间:2024/05/16 12:41
帧缓冲设备

0.介绍
-----------

帧缓冲设备为图形硬件提供了抽象层。他代表了某些视频硬件的帧流并允许应用软件通过容易定义的接口来操作图形硬件,因此应用软件不需要知道任何底层硬件寄存器的操作方式。

设备操作通过指定的设备节点,通常是在/dev目录下,例如/dev/fb*.

1.用户角度看 /dev/fb*
-------------------------

从用户的观点看,帧缓冲设备和其他 /dev下的设备一样。它是个主设备号为29,从设备号由frame buffer指定的字符设备。

按照惯例,下列设备节点被指定(数字表示从设备号):

0=/dev/fb0 第一个frame buffer
1=/dev/fb1 第二个frame buffer
...
31=/dev/fb31 第32个frame buffe

为了向后兼容,你需要创建下列符号连接:

/dev/fb0current -> fb0
/dev/fb1current -> fb1

等等

帧缓冲设备也可以看做是一个“普通”的存储设备,这意味这你可以读写他们的内容。例如,你能够通过如下方式获取屏幕截图
cp /dev/fb0 myfile

多个帧缓冲设备是可以同时使用的。比如你有一个额外的内置图形卡,那么与其对应的帧缓冲设备(/dev/fb0和/dev/fb1等)就可以独立工作。

应用软件(例如X server)默认情况下通过/dev/fb0来操作帧缓冲设备。你可以通过设置环境变量来指定可供选择的帧缓冲设备。
$FRAMEBUFFER变量(对于使用sh/bash的用户)代表了一个帧缓冲设备,例如:
  export FRAMEBUFFER=/dev/fb1
或者(对于csh用户):
  setenv FRAMEBUFFER /dev/fb1

设置后,Xserver将可以使用第二个帧缓冲设备。

2.程序员角度看 /dev/fb*
-------------------------

正如你所知道的,一个帧缓冲设备像/dev/mem一样,是一个存储器,而且有和存储器一样的特点,你能够通过read ,write,seek,mmap()(主要使用方式)等方式操作它。不同的是,出现在指定文件的存储空间不是内存,而是某些视频硬件的帧缓冲。

/dev/fb*也允许通过一些ioctls方法来查询和配置关于硬件的大量信息。颜色映射处理工作就是通过ioctls实现的。查看<linux/fb.h>能够或得更过关于ioctls存在方式和与其相关的数据结构的信息。这里只是个简要概述:

-你能够获取硬件的不可改变信息,例如名字,屏幕存储空间的组织方式(位面,每包像素),屏幕存储空间的地址和长度。

-你能够获取并改变硬件的可变信息,例如可见性,虚拟几何、深度、颜色映射格式
、定时器等。如果你试图改变这些信息,驱动程序会取这些值的上限来探测硬件的能力(可能会返回EINVAL,表示不能实现)

-你能够获取并改变部分色彩映射。每个色彩(红,绿,蓝,透明)16位并支持所有已存在硬件。驱动做所有的运算需要把它提供给硬件(更少位的下舍入可能会丢弃透明)

这些硬件抽象使应用程序实现更容易,可以移植性更好。例如,Xserver完全工作于/dev/fb*上而不需要知道硬件是如何组织具体的色彩寄存器的。XF68_FBDev是一个常用于位映射和不可加速视频设备的Xserver。唯一需要在应用编程时考虑的是屏幕组织方式(位平面或粗像素等等),因为其直接依赖于帧缓冲映像数据。

将来计划帧缓冲可以驱动图形卡,而且像内核模块一样在运行时加载。这样驱动仅需调用register_framebuffer()并提供一些函数。单独从内核写和分配这些驱动会存在很多麻烦。


3.帧缓冲分辨率维护
-------------------

帧缓冲分辨率使用“fbset”来维护。它能够改变一个帧缓冲设备的视频模式。它的主要用法是:通过修改启动时加载的文件/etc/rc.*或/etc/init.d/*来改变当前的视频模式,

Fbset使用存储在配置文件中的音频模式数据库,因此你能够很容易的添加你自己的模式并通过简单的标识符来控制。

4.Xserver
----------


对于帧缓冲设备,Xserver(XF68_FBDev)是最著名的应用程序。Xserver由XFree863.2来启动,其包含两种模式:
-在/etc/SF86Config文件中,如果“fbdev”驱动的“Display”字段包含模式“default”行,Xserver会使用上述的组合。例如启动时分辨率由/dev/fb0(或者$FRAMEBUFFER,如果设置了)确定。你依然需要配置色彩深度(使用Depth关键字)和虚拟分辨率(使用Virtual关键字)。这是XFree86提供的默认配置。十分简易但是有局限性。
-因此也可以通过修改/etc/SF86Config指定分辨率。这就允许了在保持同样虚拟桌面大小时分辨率的实时切换。这时使用的帧缓冲设备依然是/dev/fb0current(或者$FRAMEBUFFER),但是可用的分辨率却定义在/etc/SF86Config.缺点是你要用不同的格式指定timings(“fbset -x”可以提供帮助)。



5.视频模式计时
---------------

显示器使用电子束照在屏幕上画图。屏幕的最上面被一层彩色荧光粉覆盖。如果一个荧光粉被电子击中,它会发出光子并因此可见。
电子束按照从左到右,从上到下的顺序在屏幕上划线。通过调节电子束的强度,各种颜色和亮度的像素点能够被显示出来。

电子束扫描每条线后回到屏幕最左端扫描下一条线:叫做水平折返。整个屏幕扫描过后电子束停在左上角:叫垂直折返。完成水平和垂直折返,电子束会关闭。

电子束绘制像素点的速度有图形板上的点时钟决定。对于28.37516MHz的点时钟,每个像素要耗时35242皮秒:
  1/(28.37516E6Hz)= 35.242E-9 s
如果屏幕分辨率是640x480,那会花费:
   640*35.242E-9 s=22.555E-6 s
来画一条线上的640个点。但是水平折返也需要时间(例如272个像素),所以完成一行的总时间是:
   (640+272)*35.242E-9 s=32.141-6 s
因此我们会说水平扫描频率是31kHz:
    1/(32.141E-6 s)=31.113E3 Hz
整个屏幕是480条线,但是我们要考虑垂直折返(例如49条线),所以全屏会花费:
   (480+49)*32.141E-6 s = 17.002E-3 s
那么垂直扫描频率大约59Hz:
     1/(17.002E-3 s)=58.815Hz
这意味着屏幕数据大约每秒刷新59次。为了使静态图片看不见闪烁,VESA建议垂直扫描频率至少72Hz.但是每个人对闪烁的感知是不同的:有的人50Hz也感觉不到闪烁,而我至少要80Hz才行。

既然显示器不知到一个新的扫描线是何时开始的,那么图形板必须提供为每一条扫面线提供同步脉冲。与此相似,它也要为每一个新的帧提供同步脉冲。图片在屏幕中的位置受同步脉冲产生时机的影响。

下面这张图是所有计时的概述。水平折返时间是左边界、右边界、水平同步长度的和。竖直折返时间是上边界、下边界、竖直同步长度的和。
  +----------+---------------------------------------------+----------+-------+
  |          |                ↑                            |          |       |
  |          |                |upper_margin                |          |       |
  |          |                ↓                            |          |       |
  +----------###############################################----------+-------+
  |          #                ↑                            #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |   left   #                |                            #  right   | hsync |
  |  margin  #                |       xres                 #  margin  |  len  |
  |<-------->#<---------------+--------------------------->#<-------->|<----->|
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                |yres                        #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                |                            #          |       |
  |          #                ↓                            #          |       |
  +----------###############################################----------+-------+
  |          |                ↑                            |          |       |
  |          |                |lower_margin                |          |       |
  |          |                ↓                            |          |       |
  +----------+---------------------------------------------+----------+-------+
  |          |                ↑                            |          |       |
  |          |                |vsync_len                   |          |       |
  |          |                ↓                            |          |       |
  +----------+---------------------------------------------+----------+-------+
帧缓冲设备希望所有的水平计时用dotclcok计量,竖直计时用scanlines计量。

6.转换XFree86计时值为帧缓冲设备计时值
------------------------------------

一条XFree86模式的线包含下列领域:
 "800x600"     50      800  856  976 1040    600  637  643  666
 < name >     DCF       HR  SH1  SH2  HFL     VR  SV1  SV2  VFL

帧缓冲设备使用下列领域:
  - pixclock: 精度为皮秒的像素时钟
  - left_margin: sync到picture的时间
  - right_margin: picture到sync的时间
  - upper_margin: sync到picture的时间
  - lower_margin:picture到sync的时间
  - hsync_len: 水平同步的长度
  - vsync_len: 竖直同步的长度

1) Pixelclock:
   xfree: 单位 MHz
   fb: 单位 picoseconds (ps)

   pixclock = 1000000 / DCF

2) horizontal timings:
   left_margin = HFL - SH2
   right_margin = SH1 - HR
   hsync_len = SH2 - SH1

3) vertical timings:
   upper_margin = VFL - SV2
   lower_margin = SV1 - VR
   vsync_len = SV2 - SV1

最好的VESA计时的例子可以在XFree86的码源树中找到,在"xc/programs/Xserver/hw/xfree86/doc/modeDB.txt"下。

7.参考资料
要获得更多帧缓冲设备的详细信息,可以登录相关的Linux-fbdev网站:
    http://linux-fbdev.sourceforge.net/
或者阅读下列文章
  - The manual pages for fbset: fbset(8), fb.modes(5)
  - The manual pages for XFree86: XF68_FBDev(1), XF86Config(4/5)
  - The mighty kernel sources:
      o linux/drivers/video/
      o linux/include/linux/fb.h
      o linux/include/video/

8.邮件列表
---------------

这是kernel.org中帧缓冲设备相关邮件列表:
linux-fbdev@vger.kernel.org.

把你的浏览器指向http://sourceforge.net/projects/linux-fbdev/ 来
订阅信息和归档浏览.


9. 下载
--------------

所有必须的文件都可以在一下网址或它的镜像中找到:

    ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/680x0/

最新版本的fbset可以在这找到

    http://www.linux-fbdev.org/

 
10. 作者                                                       
----------                                                       
                
这篇文章由 Geert Uytterhoeven编写, 一定程度上参考了由
Roman Hodek和Martin Schaller编写的`X-framebuffer.README'. 第六节由 Frank Neumann提供.

帧缓冲设备抽象层由Martin Schaller设计.
0 0
原创粉丝点击