一屏幕含有480行,加上垂直折回时间49,一屏所需的时间:
(480+49)*32.141E-6 s = 17.002E-3 s
我们就认为垂直扫描的频率是59Hz:
1/(17.002E-3 s) = 58.815 Hz
这也意味着屏幕数据每秒钟刷新59次。为了得到稳定的图像显示效果,VESA垂直扫描
频率不低于72Hz。但是也因人而异,有些人50Hz感觉不到任何问题,有些至少在
80Hz以上才可以。
由于显示器不知道什么时候新行开始扫描,显卡为每一行扫描提供水平同步信号。
类似的,他也为每一帧显示提供垂直同步信号。图像在屏幕上点的位置取决于这些
同步信号的发生时刻。
下图给出了所有时序的概要。水平折回的时间就是左边空白+右边空白+水平同步长度。
垂直折回的时间就是上空白+下空白+垂直同步长。
+----------+---------------------------------------------+----------+-------+
| | ^ | | |
| | |upper_margin | | |
| | ? | | |
+----------###############################################----------+-------+
| # ^ # | |
| # | # | |
| # | # | |
| # | # | |
| left # | # right | hsync |
| margin # | xres # margin | len |
|<-------->#<---------------+--------------------------->#<-------->|<----->|
| # | # | |
| # | # | |
| # | # | |
| # |yres # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # | # | |
| # ? # | |
+----------###############################################----------+-------+
| | ^ | | |
| | |lower_margin | | |
| | ? | | |
+----------+---------------------------------------------+----------+-------+
| | ^ | | |
| | |vsync_len | | |
| | ? | | |
+----------+---------------------------------------------+----------+-------+
6.把XFree86时序变成frame buffer device时序
典型的显示模式:
"800x600" 50 800 856 976 1040 600 637 643 666
< name > DCF HR SH1 SH2 HFL VR SV1 SV2 VFL
而帧缓冲设备使用下面的参数:
- pixclock: 点时钟 in ps (pico seconds)
- left_margin: time from sync to picture
- right_margin: time from picture to sync
- upper_margin: time from sync to picture
- lower_margin: time from picture to sync
- hsync_len: length of horizontal sync
- vsync_len: length of vertical sync
1) Pixelclock:
xfree: in MHz
fb: in 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. 引用
获取更多关于帧缓冲设备以及应用的参考,请访问:
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/
帧缓冲设备的内部数据结构(internals.txt)
Geert Uytterhoeven , 21 July 1998
翻译:good02xaut@hotmail.com
××××帧缓冲设备中用到的结构体××××
以下数据结构在帧缓冲设备使用,定义 。
1. Outside the kernel (user space)
- struct fb_fix_screeninfo
帧缓冲设备中设备无关的常值数据信息。可以通过Ioctl的FBIOGET_FSCREENINFO获取。
- struct fb_var_screeninfo
帧缓冲设备中设备无关的变量数据信息和特定的显示模式。可以通过iotcl的FBIOGET_VSCREENINFO
获取,并通过ioctl的FBIOPUT_VSCREENINFO设定。还有FBIOPAN_DISPLAY可以用。
- struct fb_cmap
设备无关的颜色表信息。你可以通过ioctl的FBIOGETCMAP 和 FBIOPUTCMAP读取或设定。
2. Inside the kernel
- struct fb_info
常规信息,API以及帧缓冲设备的底层信息(主板地址...).
- struct `par'
唯一指定该设备的显示模式的设备相关信息。
- struct display
帧缓冲设备和控制台驱动之间的接口。
--------------------------------------------------------------------------------
*** 常用的帧缓冲 API ***
Monochrome (FB_VISUAL_MONO01 and FB_VISUAL_MONO10)
-------------------------------------------------
每个象素是黑或白。
Pseudo color (FB_VISUAL_PSEUDOCOLOR and FB_VISUAL_STATIC_PSEUDOCOLOR)
---------------------------------------------------------------------
索引颜色显示
True color (FB_VISUAL_TRUECOLOR)
--------------------------------
真彩显示,分成红绿兰三基色
Direct color (FB_VISUAL_DIRECTCOLOR)
------------------------------------
每个象素颜色也是有红绿蓝组成,不过每个颜色值是个索引,需要查表。
Grayscale displays
------------------
灰度显示,红绿蓝的值都一样
准备开始写我们自己的驱动之前,请详细阅读如下文件:
/Documentation/fb目录 vesafb.txt,matroxfb.txt,sa1100fb.txt
/drivers/video目录 fbmem.c,fbgen.c,fbmon.c,fbcmap.c
skeletonfb.c
vesafb.c,sa1100fb.c,sa1100fb.h
include/linux目录 fb.h
最值得关注的是skeletonfb.c,该文件给出了一个fb device 驱动的框架
准备好了,就开始写自己的fram buffer device driver:)