5.7.1.framebuffer介紹

本節介紹framebuffer的概念和來源、設計思想,fb設備的應用層接口等,爲下節使用framebuffer應用編程打基礎。linux

5.7.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設備文件,使用以下方式:前面的數字表示次設備號3d

* 0 = /dev/fb0 第一個fb設備
* 1 = /dev/fb1 第二個fb設備

fb也是一種普通的內存設備,能夠像內存設備/dev/mem同樣,對其read,write,seek以及mmap。但區別在於fb使用的不是整個內存區,而是顯存部分。
code

5.7.1.二、framebuffer的使用(應用層)blog

(1). 打開設備文件/dev/fb0
若是系統沒有顯示器就沒有fb,因此必定是fb0,若是有三個顯示器就是fb0,fb1,fb2接口

ls /dev/fb0進程

(2). 獲取設備信息 #include <linux/fb.h>
調用相關接口讀取屏幕,分辨率之類內存

(3)mmap作映射

(4)填充framebuffer

相關文章
相關標籤/搜索