Linux_framebuffer.text文件翻译

本文是"Documentation\fb\framebuffer.txt"一文的翻译。

0.引言
帧缓冲设备(framebuffer)为图形硬件设备(LCD)提供了抽象。它代表一些视频硬件的帧缓冲区并允许应用程序通过已经定义好的接口访问图形硬件,所以应用程序不需要知道任何有关底层(硬件寄存器)的东西。可以通过特殊的设备节点来访问帧缓冲区设备,通常位于/dev目录下,即/dev/fb*。
1.用户角度观察"/dev/fb*"节点
从用户的角度来看,帧缓冲区设备看起来就像"/dev"目录中的任何其他设备。本质上是一个字符设备,主设备号是29,此设备号用来指定具体的帧缓冲区设备,也就是fb0,fb1等。
按照惯例,使用以下设备节点(数字表示设备的次设备号):
      0 = /dev/fb0 First frame buffer
      1 = /dev/fb1 Second frame buffer
  ... ......
      31 = /dev/fb31         32nd frame buffer
为了向后兼容,您可能需要创建以下符号链接:
    /dev/fb0current -> fb0
    /dev/fb1current -> fb1
在实际的开发中,很少做进行向下兼容。
帧缓冲设备也被称为是"普通"的存储设备,这意味着,你可以读写他们的内容。例如,您可以通过如下方式创建屏幕快照:
cp /dev/fb0 myfile
一次也可以有多个帧缓冲区设备,例如,如果除了内置硬件外还有图形卡。相应的帧缓冲区设备(/dev/fb0和/dev/fb1等)独立工作。应用程序默认使用/dev/fb0这个帧缓冲区设备。
2.程序员角度观察"/dev/fb*"节点
如你所知,帧缓冲区设备是一个像/dev/mem这样的存储设备,它具有相同的功能。你可以去读、写或定位到某个地方它,也可以使用mmap它。区别在于,特殊文件中出现的内存不是整个内存,而是某些视频硬件(LCD)的帧缓冲区。
对/dev/fb*文件节点也可以使用ioctl函数调用,从而可以查询和设置大量的关于硬件的信息。
颜色映射也是通过ioctl函数调用来进行处理。可以通过查看""文件,获取更多关于ioctl使用的信息,以及使用那些数据结构。
这里只做一个简要的概述:
    您可以请求有关硬件的不变信息,例如名称,屏幕内存(平面,打包像素等)的组织和屏幕虚拟内存的地址和长度。
    您可以请求和更改有关硬件的可变信息,如可见和虚拟几何图形,深度,颜色映射格式,时序信息等。
    如果您尝试更改这些信息,那么驱动程序可能会收集一些值以满足硬件的功能(如果不可能,则返回EINVAL)。
    您可以获取并设置色彩映射的各个部分。通信采用每个像素16位(红色,绿色,蓝色,透明度)支持所有现有硬件。
驱动程序会将所有计算应用于硬件(将其舍入到更少位,也许会丢弃透明度)。
所有这些硬件抽象使应用程序的实现更容易和更便捷。完全在/dev/fb*上工作,因此不需要知道如何组织具体硬件的颜色寄存器。
在未来,计划用于图形显示硬件等的帧缓冲区驱动器可以实现为在运行时加载的内核模块。这样的驱动程序只需调用register_framebuffer()并提供一些函数。独立于内核编写和分发这些驱动程序将节省很多麻烦...
3.帧缓冲区分辨率维护
帧缓冲区分辨率使用"fbset"命令进行维护。它可以改变帧缓冲区设备的视频模式属性。其主要用途是改变当前的视频模式,例如,在您的/etc/rc.*或/etc/init.d/*文件之一中启动。
fbset命令使用存储在配置文件中的视频模式数据库,因此您可以轻松添加自己的模式并使用简单的标识符引用它们。
4.X服务器
X服务器(XF68_FBDev)是帧缓冲设备最值得注意的应用程序。从XFree86的3.2版开始,X服务器是XFree86的一部分,有两种模式:
如果/etc/XF86Config文件中"fbdev"驱动程序的"显示"子节包含模式"default"行,则X服务器将使用上面讨论的方案。
它将在由/dev/fb0确定的分辨率中启动。
不过,您仍然必须指定颜色深度和虚拟分辨率。这是XFree86提供的配置文件的默认值。这是最简单的配置,但它有一些限制。
因此,也可以在/etc/XF86Config文件中指定分辨率。这可以在保持相同虚拟桌面大小的同时实现动态分辨率切换。
帧缓冲设备使用的仍然是/dev/fb0current,但可用分辨率现在由/etc/XF86Config定义。
缺点是你必须以不同的格式指定时序参数。
要调整视频模式,您可以使用fbset或xvidtune。请注意,xvidtune不能与XF68_FBDev一起完全使用:报告的时钟值始终不正确。
5.视频模式下的时序
显示器通过使用电子束(3个电子束用于彩色模型,1个电子束用于单色监视器)在屏幕上绘制图像。屏幕正面覆盖有彩色荧光粉图案(像素)。如果磷光体被电子击中,它会发射光子并因此变得可见。电子束从左到右,从屏幕的顶部到底部绘制水平线(扫描线)。通过修改电子束的强度,可以显示具有各种颜色和强度的像素。在扫描完每条线后,电子束必须移回到屏幕的下一行左侧:这称为水平回扫。在整个屏幕被涂上后,光束移回到左上角:这称为垂直回扫。在水平和垂直回扫期间,电子束被关闭(消隐)。
电子束描绘像素的速度由图形卡上的像素时钟决定。
对于例如28.37516MHz的像素时钟(每秒百万次循环),每个像素时长35242ps(皮秒):

1/(28.37516E6 Hz) = 35.242E-9 s

如果屏幕分辨率是640x480,则需要:

        640*35.242E-9 s = 22.555E-6 s

的时间在一条扫描线上绘制640(xres)个像素。

但是水平回扫也需要时间(例如272个像素),因此完整的扫描一行需要的时间:
(640+272)*35.242E-9 s = 32.141E-6 s
我们也可以说水平扫描速度约为31kHz:
1/(32.141E-6 s) = 31.113E3 Hz
全屏显示480行(yres),但我们也必须考虑垂直回扫(例如49行),因此,全屏幕扫描需要的时间是:
(480+49)*32.141E-6 s = 17.002E-3 s
垂直扫描速率约为59Hz:
1/(17.002E-3 s) = 58.815Hz
这意味着屏幕数据每秒刷新约59次。要获得稳定的图像而不会出现闪烁,VESA建议至少72Hz的垂直扫描速度。但感知的闪烁是非常依赖人的:有些人可以毫无困难地使用50HZ。由于显示器不知道新扫描行线何时开始,所以板子将为每条扫描线提供同步脉冲(水平同步或hsync)。同样,它为每个新帧提供同步脉冲(垂直同步或垂直同步)。图像在屏幕上的位置受到同步脉冲发生时刻的影响。
下面的图片总结了所有的时序。水平回扫时间是左边距、右边距和hsync长度的总和,而垂直回扫时间是上边距、下边距和垂直同步长度的总和。
Linux_framebuffer.text文件翻译_第1张图片
帧缓冲区设备是以像素时钟来定义所有水平时序参数,以行数为单位来定义垂直时序参数。

你可能感兴趣的:(Linux驱动)