5.7.1.framebuffer介紹
本節介紹framebuffer的概念和來源、設計思想,fb設備的應用層接口等,為下節使用framebuffer應用編程打基礎。
5.7.1.1、什麽是framebuffer
(1).裸機中如何操作LCD
Soc裏面有CPU,LCD控制器;外部有LCD的驅動器,驅動器後面帶著屏幕,驅動器和控制器之間使用LCD排線進行連接(LCD特有的接口)。CPU通過操作LCD控制器裏面的寄存器,使得DDR分出一部分作為顯存,顯存和LCD屏幕做雙向映射。以後CPU只需要把要顯示的內容放入顯存。硬件就會自動將內容數據刷到驅動器裏面,驅動器操控LCD就可以顯示。
關鍵點:LCD控制器操縱顯存。
(2).OS下操作顯存的難點
分層。分為內核(驅動)和應用。驅動做跟底層硬件相關(初始化寄存器,內存,內存與LCD之間映射);應用把要顯示的內容丟到顯存裏面去。應用驅動怎麽配合。驅動是在內核空間,應用在應用空間。兩者之間通信不能用copy_to_user或者copy_from_user(小容量),要將mmap映射:在內核空間申請一段內存作為顯存,在將內存的物理地址用Mmap映射虛擬地址。這時應用裏面也有一個顯存,
(3)framebuffer幀緩沖,是linux內核中虛擬出來的一個設備,用來代替LCD顯示器這個硬件設備以及軟件設施
* frambuffer向應用層提供一個統一接口的顯示設備,所以應用層就不用管驅動層
* 從驅動來看,fb是一個典型的字符設備,而且定義了一個類/sys/class/qraphics
framebuffer是linux系統為顯示設備提供的一個接口,它將顯示緩沖區抽象,屏蔽圖像硬件的差異,允許上層應用程序在圖像模式下直接對顯示緩沖區進行讀寫操作。用戶不必關心物理顯示緩沖區的具體位置以及存放方式,這些都有幀緩沖設備驅動本身來完成。
framebuffer機制模仿顯卡的功能,將顯卡硬件結構抽象為一系列的數據結構,可以通過framebuffer的讀寫直接對顯存進行操作。用戶可以將framebuffer看成是顯卡的一個映像,將其映射到進程空間後,就可以直接進行讀寫操作,寫操作會直接反映在屏幕上。
幀緩沖設備為標準的字符型設備,在linux中的主設備號29,定義在/include/linux/major.h中的FB_MAJOR,次設備號定義幀緩沖的個數,最大允許有32個FrameBuffer,定義在/include/linux/fb.h的FB_MAX,對應文件系統下的/dev/fb%d設備文件,使用如下方式:前面的數字表示次設備號
* 0 = /dev/fb0 第一個fb設備
* 1 = /dev/fb1 第二個fb設備
fb也是一種普通的內存設備,可以像內存設備/dev/mem一樣,對其read,write,seek以及mmap。但區別在於fb使用的不是整個內存區,而是顯存部分。
5.7.1.2、framebuffer的使用(應用層)
(1). 打開設備文件/dev/fb0
如果系統沒有顯示器就沒有fb,所以一定是fb0,如果有三個顯示器就是fb0,fb1,fb2
ls /dev/fb0
(2). 獲取設備信息 #include <linux/fb.h>
調用相關接口讀取屏幕,分辨率之類
(3)mmap做映射
(4)填充framebuffer
5.7.1.framebuffer介紹