導航:首頁 > 編程系統 > linuxframebuffer

linuxframebuffer

發布時間:2023-07-08 18:58:05

『壹』 linux系統下如何更改終端顯示解析度

『貳』 linux 如何通過fb0顯示字元

幀緩沖(framebuffer)是 Linux 為顯示設備提供的一個介面,把顯存抽象後的一種設備,他允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。這種操作是抽象的,統一的。用戶不必關心物理顯存的位置、換頁機制等等具體細節。這些都是由Framebuffer 設備驅動來完成的。幀緩沖驅動的應用廣泛,在 linux 的桌面系統中,Xwindow 伺服器就是利用幀緩沖進行窗口的繪制。尤其是通過幀緩沖可顯示漢字點陣,成為 Linux漢化的唯一可行方案。
幀緩沖設備對應的設備文件為/dev/fb*,如果系統有多個顯示卡,Linux 下還可支持多個幀緩沖設備,最多可達 32個,分別為/dev/fb0 到/dev/fb31,而/dev/fb 則為當前預設的幀緩沖設備,通常指向/dev/fb0。當然在嵌入式系統中支持一個顯示設備就夠了。幀緩沖設備為標准字元設備,主設備號為29,次設備號則從0到31。分別對應/dev/fb0-/dev/fb31。
通過/dev/fb,應用程序的操作主要有這幾種:
1.讀/寫(read/write)/dev/fb:相當於讀/寫屏幕緩沖區。例如用 cp /dev/fb0 tmp 命令可將當前屏幕的內容拷貝到一個文件中,而命令 cp tmp > /dev/fb0 則將圖形文件tmp顯示在屏幕上。
2.映射(map)操作:由於 Linux工作在保護模式,每個應用程序都有自己的虛擬地址空間,在應用程序中是不能直接訪問物理緩沖區地址的。為此,Linux 在文件操作file_operations 結構中提供了 mmap函數,可將文件的內容映射到用戶空間。對於幀緩沖設備,則可通過映射操作,可將屏幕緩沖區的物理地址映射到用戶空間的一段虛擬地址中,之後用戶就可以通過讀寫這段虛擬地址訪問屏幕緩沖區,在屏幕上繪圖了。
3.I/O控制:對於幀緩沖設備,對設備文件的 ioctl操作可讀取/設置顯示設備及屏幕的參數,如解析度,顯示顏色數,屏幕大小等等。ioctl 的操作是由底層的驅動程序來完成的。
在應用程序中,操作/dev/fb的一般步驟如下:
1.打開/dev/fb設備文件。
2.用 ioctrl 操作取得當前顯示屏幕的參數,如屏幕解析度,每個像素點的比特數。根據屏幕參數可計算屏幕緩沖區的大小。
3.將屏幕緩沖區映射到用戶空間(mmap)。
4.映射後就可以直接讀寫屏幕緩沖區,進行繪圖和圖片顯示了。

『叄』 6. Linux-LCD 驅動程序概述

入局:應用程序是如何操控LCD顯示器的?
      我們知道應用程序的調用介面,無非 open/read/write ...然後通過驅動程序最終作用到硬體設備上。以字元設備為例,對於驅動的開發者,實現了應用程序調用的驅動層中與之相匹配的 drv_open/drv_read/drv_write 函數,為應用層序提供了操作實際硬體設備的通道。那麼,對於LCD驅動程序又是如何?先來了解下兩個非常重要的概念。

      LCD控制器的功能是控制驅動信號,進而驅動LCD。用戶只需要通過讀寫一系列的寄存器,完成配置和顯示驅動。在驅動LCD設計的過程中首要的是配置LCD控制器,而在配置LCD控制器中最重要的一步則是幀緩沖區(Frame Buffer)的指定。用戶所要顯示的內容皆是從緩沖區中讀出,從而顯示到屏幕上的。幀緩沖區的大小由屏幕的解析度和顯示色彩數決定。驅動幀緩沖的實現是整個驅動開發過程的重點。
      幀緩沖區是出現在Linux 2.2.xx及以後版本內核當中的一種驅動程序介面,這種介面將顯示設備抽象為幀緩沖區設備區。幀緩沖區為圖像硬體設備提供了一種抽象化處理,它代表了一些視頻硬體設備,允許應用軟體通過定義明確的界面來訪問圖像硬體設備。這樣軟體無須了解任何涉及硬體底層驅動的東西(如硬體寄存器)。它允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫和I/O控制等操作。通過專門的設備節點可對該設備進行訪問,如/dev/fb*。用戶可以將它看成是顯示內存的一個映像,將其映射到進程地址空間之後,就可以進行讀寫操作,而讀寫操作可以反映到LCD。

      幀緩沖(Frame Buffer)是Linux為顯示設備提供的一個介面,把顯存抽象後的一種設備,允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。用戶不必關心物理顯存的位置、換頁機制等等具體細節,這些都是由Frame Buffer設備驅動來完成的。幀緩沖設備屬於字元設備。
      Linux系統Frame Buffer本質上只是提供了對圖形設備的硬體抽象,在開發者看來,Frame Buffer是一塊顯示緩存,向顯示緩存中寫入特定格式的數據就意味著向屏幕輸出內容。

由於有了frambuffer的抽象,使得應用程序通過定義好的介面就可以訪問硬體。所以應用程序不需要考慮底層的(寄存器級)的操作。應用程序對設備文件的訪問一般在/dev目錄,如 /dev/fb*。

內核中的frambuffer在: drivers/video/fbmem.c (fb: frame buffer)

(1) 創建字元設備"fb", FB_MAJOR=29,主設備號為29。
(2)創建類,但並沒有創建設備節點,因為需要注冊了LCD驅動後,才會有設備節點;

2.1 fb_open函數如下:

(1) registered_fb[fbidx] 這個數組也是fb_info結構體,其中fbidx等於次設備號id,顯然這個數組就是保存我們各個lcd驅動的信息;

2.2 fb_read函數如下:

從.open和.read函數中可以發現,都依賴於fb_info幀緩沖信息結構體,它從registered_fb[fbidx]數組中得到,這個數組保存我們各個lcd驅動的信息。由此可見,fbmem.c提供的都是些抽象出來的東西,最終都得依賴registered_fb這個數組。

這個register_framebuffer()除了注冊fb_info,還創建了設備節點。

以s3c2410fb.c為例,分析驅動的實現。

既然是匯流排設備驅動模型,那我們關心的是它的probe函數。

看到這里驅動的寫法也大致清晰:



附:
LCD的顯示過程與時序:
      1.顯示從屏幕左上角第一行的第一個點開始,一個點一個點地在LCD上顯示,點與點之間的時間間隔為VCLK(像素時鍾信號);當顯示到屏幕的最右邊就結束這一行(Line),這一行的顯示對應時序圖上的HSYNC(水平同步信號)
      2. 接下來顯示指針又回到屏幕的左邊從第二行開始顯示,顯示指針針在從第一行的右邊回到第二行的左邊是需要一定的時間的,我們稱之為行切換。
      3. 以此類推,顯示指針就這樣一行一行的顯示至矩形的右下角才把一幅圖像(幀:frame)顯示完成,這一幀的顯示時間在時序圖上表示為VSYNC(垂直同步信號)。

參考:
https://sites.google.com/a/hongdy.org/www/linux/kernel/lcddriver

閱讀全文

與linuxframebuffer相關的資料

熱點內容
遇見不安全網站怎麼辦 瀏覽:251
哪個app有慶余年電視劇 瀏覽:420
iphone5s視頻時很黑 瀏覽:601
js獲取埠號 瀏覽:347
手機短息發的鏈接病毒蘋果手機 瀏覽:724
win10專業忘記家庭組密碼 瀏覽:176
南寧applestore幾樓 瀏覽:296
java字元串怎麼初始化 瀏覽:349
醫美哪個app好 瀏覽:768
代碼編程和機器人編程哪個好 瀏覽:875
90版本男法 瀏覽:796
win10桌面字體難看 瀏覽:848
三菱fx5u支持哪些編程 瀏覽:7
優酷在文件夾在哪裡 瀏覽:91
趣列印的數據文件是什麼 瀏覽:871
linuxjava程序 瀏覽:483
蘋果6splus數據線圖片 瀏覽:98
蘋果官網數據如何恢復 瀏覽:251
spss怎麼拆分數據 瀏覽:306
photoshop復位所有工具 瀏覽:492

友情鏈接