framebuffer驅動全篇(一)--補

2008-12-31 21:21

一屏幕含有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:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章