一屏幕含有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
翻譯:[email protected]
××××幀緩衝設備中用到的結構體××××
以下數據結構在幀緩衝設備使用,定義 。
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:)