framebuffer[转之]
生活随笔
收集整理的這篇文章主要介紹了
framebuffer[转之]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
framebuffer[轉之]
| Frame Buffer 設備 0、 簡介 ?????? Frame Buffer設備為圖形硬件提供抽象。它表示一些視頻硬件的Frame Buffer,允許應用軟件通過定義好的接口訪問圖形硬件,所以這些軟件不必知道任何關于低層(硬件寄存器)的知識。 設備通過特殊的設備節點來訪問,通常這些節點位于/dev目錄,即/dev/fb*。 1、 從用戶來看/dev/fb* ?????? 從用戶的觀點來看,Frame Buffer設備就如位于/dev目錄下的其他設備。它是一個字符設備使用主設備號29;次設備號指定了frame buffer號。 按照習慣,使用下列的設備節點(號碼指定設備的次設備號): 0 = /dev/fb0第1個frame buffer 1 = /dev/fb1第2個frame buffer ... 31 = /dev/fb31 第32個frame buffer 考慮向后兼容,你可能需要創建下面的符號連接: /dev/fb0current -> fb0 /dev/fb1current -> fb1 等等... frame buffer設備也是“通常”的內存設備,意味著,你可以讀或者寫他們的內容。例如,你可以截屏 cp /dev/fb0 myfile 某一時刻可以存在多個frame buffer,就是說,如果你在固定的硬件上附加一個圖形卡。相應的frame buffer 設備(/dev/fb0和/dev/fb1等等)可以獨立的工作。 使用frame buffer設備的應用程序(例如 X server)默認使用/dev/fb0(老一點的軟件使用 /dev/fb0current)。你可以 通過設定環境變量$FRAMEBUFFER等于frame buffer設備的路徑名來改變frame buffer設備,例如(針對 sh/bash 用戶): export FRAMEBUFFER=/dev/fb1 或者(針對 csh 用戶): setenv FRAMEBUFFER /dev/fb1 之后,X server將使用第二個frame buffer。 2、 從程序員來看 /dev/fb* ?????? 大家都已經知道,frame buffer設備是一個內存設備,就像/dev/mem, 所以他擁有相同的特征。你可以讀他,寫他,在他里面定位和mmap他(主要用途)。不同點在于在特殊文件中的通常的內存不是整體的內存(譯注:whole memory),但是一些視頻硬件的frame buffer是。 /dev/fb*也允許在他之上做一些ioctls操作,通過這種方法硬件的許 多信息可以獲取和設置。顏色映射處理(the color map handling)也通過ioctls工作。查看<linux/fb.h>取得更多的信息關于ioctls怎么存在,和賴以工作的數據結構。 這里僅僅是簡要的預覽: - 你可以取得硬件的不可更改信息,例如名字,屏幕內存組織方式(位面,象素格式,……)和地址和屏幕內存的長度。 - 你可以獲取和修改硬件的可變信息,例如可見,虛擬幾何,深度,顏色映射格式,定時,等等。 如 果你試圖修改這些信息,驅動可能規整一些值以適應硬件的能力(或者返回EINVAL 如果這個操作不可能) (譯注:the driver maybe will round up some values to meet the hardware's capabilities) - 你可以取得和設置部分顏色映射。通信使用16位每一顏色(紅,綠,藍,透明)來支持所有存在的硬件。驅動處理所有應用于硬件的計算(截取他們到較少的位,可能會舍棄透明)。 所 有的這些硬件抽象使得應用程序的實現變得容易和更加易于移植。例如,X server完全工作在/dev/fb*,所以不必要知道,諸如具體的硬件上關聯的顏色是怎么組織的。XF68_FBDEV是針對位圖和沒有視頻硬件加速 的通用X server。僅有的需要應用程序處理的是屏幕的組織方式(位面或者象素塊等等),因為它直接工作于frame buffer圖像模式。 在未來,計劃把圖形卡相關的frame buffer驅動實現為內核模塊,以便在允許時加載。這樣的驅動只需要調用register_framebuffer()和提供一些函數。獨立于內核的編寫和分發這樣的驅動,將會省掉許多問題…… 3、 Frame Buffer分辨率維護 ?????? Frame Buffer分別綠使用'fbset'來維護。它可以更改frame buffer設備的視頻模式屬性。它的主要用途是更改當前的視頻模式,例如在引導時期在你的/etc/rc.*或者/etc/init.d/* 文件中。 fbset使用存儲在配置文件中的視頻模式數據庫,所有你可以容易的添加你自己的模式并且使用簡單的標識符引用他們。 4、 X server ????? X server(XF68_FBDev)是使用frame buffer設備最著名的應用程序。從XFree86 release 3.2開始,X server成為 XFree86的組成部分,它有兩個模式: - 如果供'fbdev'驅動使用的/etc/XF86Config文件的'Display'部分含有一行Modes "default"X server將使用上面提到的配置,即它將以/dev/fb0(或者 $FRAMEBUFFER,如果設定了)指定的分辨率啟動。 你仍然需要指定顏色深度(使用關鍵字Depth)和虛擬分辨率(使用關鍵字Virtual)。這是隨XFree86提供的配置 文件需要默認設定的項目。這是最簡單的配置,但是它有一些限制。 - 因此,在/etc/XF86Conifg文件里指定分辯率也是可能的。這允許在保持同樣的虛擬桌面尺寸動態的(譯注:on-the-fly)切換分辨率。 使用的Frame Buffer設備仍然是/dev/fb0current(或者$FRAMEBUFFER),但是可用的分辨率現在由 /etc/XF86Config定義。缺點是,你必須以不同的格式指定時間(timings)(但是 'fbset -x'可以幫助你)。 為了調優顯示模式,你可以使用fbset或者xvidtune。需要注意的是xvidtune對XF68_FBDev不一定工作:報告的時鐘值通常是錯誤的。 5、 視頻模式計時 ?????? 顯示器使用電子束(彩色模式使用3個電子束,單色模式使用1個電子束)繪制屏幕上的圖像。屏幕的前面 被 顏色熒光(象素)覆蓋.如果熒光被電子擊中,它就會發出光子從而可見.電子束從左至右繪制水平行,從上到下繪制整個屏幕.通過改變電子束的亮度,便可以顯 示各種顏色和亮度的像素.每條掃描線完成后電子束必須重新移回到下一行的左端:這稱做水平回掃.等到完成整個屏幕(幀)的繪制,電子束會移回到左上方點: 這被稱做垂直回掃.在水平和垂直回掃期間,電子束被關閉(空). 電子束繪制像素的速度由圖形板的時鐘(譯注:dotclock).例如時鐘是 28.37516MHZ(每秒百萬周期),每像素需35242 ps(微秒):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 我們稱水平刷新率約是31 kHz: 1/(32.141E-6 s) = 31.113E3 Hz 整個屏幕有480(yres)條掃描線,但是我們必須還要考慮垂直回掃(例如 49 條掃描線). 所以完整的一屏需要: (480+49)*32.141E-6 s = 17.002E-3 s 垂直刷新率約是 59 Hz:1/(17.002E-3 s) = 48.815 Hz 這意味著屏幕上的數據每秒鐘刷新約59此.為了得到穩定的圖像沒有視覺閃爍,VESA建議垂直掃描率不低于72 Hz. 不過是否閃爍跟人極大相關:一些人使用50 Hz感覺卻很好, 然而當低于80 Hz時我就會覺察到. 下面的圖片可以說明一切.水平回掃時間是左邊緣,右邊緣和 hsync 長度的總和. 而垂直回掃時間是上邊緣,下邊緣和 vsync長度的總和 . frame buffer設備期待所有的水平計時以時鐘(以picoseconds, 1E-12 s)為單位, 垂直計時則以掃描線數目為單位. 6、 轉換 XFree86 計時值信息到frame buffer設備計時 ????? XFree86 模式行由以下域組成:"800x600" 50 800856 976 1040 600 637 643 666 < name > DCF HR SH1 SH2 HFL VR SV1 SV2 VFL frame buffer設備使用以下的域: - pixclock: 以ps為單位的像素時鐘(pico seconds) - left_margin: 從sync到畫面的時間 - right_margin: 從畫面到sync的時間 - upper_margin: 從sync到畫面的時間 -lower_margin: 從畫面到sync的時間 - hsync_len: 水平sync的長度 - vsync_len: 垂直sync的長度 1) 像素時鐘: xfree: in MHz fb: in picoseconds (ps) pixclock = 1000000 / DCF 2) 水平計時: left_margin = HFL - SH2 right_margin = SH1 - HR hsync_len = SH2 - SH1 3) 垂直計時: upper_margin = VFL - SV2 lower_margin = SV1 - VR vsync_len = SV2 - SV1 針對VESA計時的很多例子可以在 XFree86 源代碼樹找到, 在"xc/programs/Xserver/hw/xfree86/doc/modeDB.txt"下. 7、 參考 ????? 更多的關于frame buffer 設備的信息和應用程序, 請參考 Linux-fbdev 網站: http://linux-fbdev.sourceforge.net/ 和下面的文檔: - fbset的手冊頁: fbset(8), fb.modes(5) - XFree86的手冊頁: XF68_FBDev(1), XF86Config(4/5) - 內核源代碼: o linux/drivers/video/ o linux/include/linux/fb.h o linux/include/video/ 8、 郵件列表 ????? 有一些與frame buffer設備相關的郵件列表存在于SourceForge: - linux-fbdev-announce@lists.sourceforge.net, 用于通告, - linux-fbdev-user@lists.sourceforge.net, 用于對一般用戶的支持, - linux-fbdev-devel@lists.sourceforge.net, 用于項目開發人員. 登錄到http://sourceforge.net/projects/linux-fbdev/ 這個網頁 查看訂閱信息. 9、 下載 ?? 所有必需的文件可以在下面的地址找到: ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/680x0/ 或者在它的鏡像站點. 最新版本的fbset可以在下面找到: http://home.tvd.be/cr26864/Linux/fbdev/ 10、 致謝 這份說明文件由Geert Uytterhoeven編寫,部分是基于最初的 由Roman Hodek和Martin Schaller編寫的 'X-framebuffer.README'. 第六節由Frank Neumann提供. frame buffer設備抽象是由Martin Schaller設計的. 注:內核版本是2.6.12,本文件位于 linux/Documentation/fb |
轉載于:https://blog.51cto.com/tianxiaolin/415751
總結
以上是生活随笔為你收集整理的framebuffer[转之]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .htaccess必须以ASCII模式上
- 下一篇: C# 向Com口发送数据