現在的位置: 首頁 > 技術文章 > 正文

LINUX驅動框架之Framebuffer驅動框架

2018年11月06日 技術文章 ⁄ 共 1949字 ⁄ 字號 LINUX驅動框架之Framebuffer驅動框架已關閉評論

長時間不看,一些基礎知識確實忘得差不多了,得慢慢撿起來,從網上搜了一篇關于Framebuffer的文章,記錄一下:

(節選自 https://blog.csdn.net/gqb_driver/article/details/12918547)

一、基本概念

幀緩沖(Framebuffer)是Linux系統為顯示設備提供的一個接口,它將顯示緩沖區抽象,屏蔽圖像硬件的底層差異,允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。用戶不必關心物理顯示緩沖區的具體位置及存放方式,這些都是由幀緩沖設備驅動本身來完成。對于幀緩沖設備而言,只要在顯示緩沖區與顯示點對應的區域寫入顏色值,對應的顏色會自動在屏幕上顯示,下一小節重點講解各種模式下緩沖區與顯示點的對應關系。

幀緩沖設備為標準字符設備,主設備號為29,對應于/dev/fbn設備文件。應用程序可以通過打開讀寫此設備文件而講視頻及圖像數據輸出到顯示設備上。在接下來的博文中會介紹用戶態如果操作幀緩沖設備的方法,Linux抽象出FrameBuffer這個設備來供用戶態進程實現直接寫屏。 Framebuffer機制模仿顯卡的功能,將顯卡硬件結構抽象掉,可以通過Framebuffer的讀寫直接對顯存進行操作。用戶可以將Framebuffer看成是顯示內存的一個映像,將其映射到進程地址空間之后,就可以直接進行讀寫操作,而寫操作可以立即反應在屏幕上。這種操作是抽象的,統一的,用戶不必關心物理顯存的位置、換頁機制等等具體細節,這些都是由Framebuffer設備驅動來完成的,但Framebuffer本身不具備任何運算數據的能力,就只好比是一個暫時存放水的水池,CPU將運算后的結果放到這個水池,水池再將結果流到顯示器,中間不會對數據做處理,應用程序也可以直接讀寫這個水池的內容。在嵌入式系統中一般沒有專門的顯存,而僅僅是從RAM(SDRAM)空間中分配一段顯示緩沖區。

如下圖所示,看看Framebuffer的軟件架構到底長什么樣子:

framebuffer

framebuffer

Framebuffer幀緩沖設備給用戶態提供的讀寫接口file_operations實際由fbmem.c文件里的特定file_operatins結構對象來提供,而特定幀緩沖設備fb_info結構體的注冊、注銷及其中成員的維護,尤其是fb_ops中的成員函數的實現則由對應的xxxfb.c文件實現,fb_ops中的成員函數最終會操作LCD控制器的寄存器。


1、什么是framebuffer?

(1)framebuffer幀緩沖(一屏幕數據)(簡稱fb)是linux內核中虛擬出的一個設備,framebuffer向應用層提供一個統一標準接口的顯示設備。幀緩沖(framebuffer)

是Linux為顯示設備提供的一個接口,把顯存抽象后的一種設備,他允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。這種操作是抽象的,統一的。用

戶不必關心物理顯存的位置、換頁機制等等具體細節。這些都是由Framebuffer設備驅動來完成的。

(2)從驅動來看,fb是一個典型的字符設備,而且創建了一個類/sys/class/graphics

(3)framebuffer的使用

1):打開framebuffer設備文件: /dev/fb0

2):獲取framebuffer設備信息 #include <linux/fb.h>

3):mmap做映射

4):填充framebuffer

FB驅動框架相關代碼:drivers\video 這個目錄中

 

總結:framebuffer驅動框架總覽

fb的驅動框架代碼主要涉及到以下的4個文件:

(1)drivers/video/fbmem.c。主要任務:1、創建graphics類、注冊FB的字符設備驅動、提供register_framebuffer接口給具體framebuffer驅動編寫著來注冊fb設備的。

本文件相對于fb來說,地位和作用和misc.c文件相對于雜散類設備來說一樣的,結構和分析方法也是類似的。

(2)drivers/video/fbsys.c。這個文件是處理fb在/sys目錄下的一些屬性文件的,例如register_framebuffer函數中fb_init_device函數就是存在這個文件中

(3)drivers/video/modedb.c。這個文件是管理顯示模式(譬如VGA、720P等就是顯示模式)的

(4)drivers/video/fb_notify.c。異步通知函數,例如fb_notifier_call_chain函數就在這個文件中

二八杠讨论心得
×