關於LCD 設備資料可參考以下資料:html
frame buffer 設備是圖形硬件的抽象,它表明了圖形硬件的偵緩衝區,容許應用程序經過指定的接口訪問圖形硬件。所以,應用程序沒必要關心底層硬件細節。linux
設備經過特定的設備節點訪問,一般在 /dev 目錄下,如 /dev/fb*。數組
更 多關於 frame buffer device 的資料能夠在如下兩個文件中找到: linux /Documentation/fb/framebuffer.txt 和 linux /Documentation/fb /interal.txt,但這些資料內容很少,還須要看看結合代碼具體分析。數據結構
Linux Frame Buffer 驅動程序層次結構Frame Buffer 設備驅動能夠從三個層次來看:框架
在 Linux 內核中,Frame Buffer 設備驅動的源碼主要在如下兩個文件中,它們處於 frame buffer 驅動體系結構的中間層,它爲上層的用戶程序提供系統調用,也爲底層特定硬件驅動提供了接口:ide
頭文件 fb.h 定義了全部的數據結構:函數
framebuffer 驅動主要數據結構網站
接口fbmem.c 實現了全部驅動使用的通用代碼,避免了重複。.net
全局變量:code
struct fb_info *registered_fb [FB_MAX] int num_registered_fb;
這個兩個變量用於記錄正在使用的 fb_info 結構實例。fb_info 表明 video card 的當前狀態,全部的 fb_info 結構都放在數組中。當一個 frame buffer 在內核中登記時,一個新的 fb_info 結構被加入該數組,num_registered_fb 加 1。
fb_drivers 數組:
static struct { const char *name; int (*init)(void); int (*setup)(void); } fb_drivers[] __initdata= { ....};
若 frame buffer 驅動程序是靜態連接到內核中,一個新的 entry 必需要加到這個表中。 若該驅動程序是使用 insmod/rmmod 動態加載到內核,則沒必要關心這個結構。
static struct file_operations fb_ops ={ owner: THIS_MODULE, read: fb_read, write: fb_write, ioctl: fb_ioctl, mmap: fb_mmap, open: fb_open, release: fb_release };
這是用戶應用程序的接口,fbmem.c 實現了這些函數。
register/unregister framebuffer:
register_framebuffer(struct fb_info *fb_info) unregister_framebuffer(struct fb_info *fb_info)
這是底層 frame buffer 設備驅動程序的接口。驅動程序使用這對函數實現註冊和撤銷操做。底層驅動程序的工做基本上是填充 fb_info 結構,而後註冊它。
一個 LCD controller 驅動程序實現一個 LCD controller 驅動程序主要作以下兩步:
因爲大多數 LDC controller 沒有本身的顯存,須要分配一塊系統內存做爲顯存。這塊系統內存的起始地址和長度以後會被存放在 fb_fix_screeninfo 的 smem_start 和 smem_len 域中。該內存應該是物理上連續的。
對於帶獨立顯存的顯卡,使用 request_mem_region 和 ioremap 將顯卡外設內存映射處處理器虛擬地址空間。
實現 fb_ops 結構目前尚未討論的 file_operations 方法是 ioctl ()。用戶應用程序使用 ioctrl 系統調用操做 LCD 硬件。fb_ops 結構中定義的方法爲這些操做提供支持。注意, fb_ops 結構不是 file_operations 結構。fb_ops 是底層操做的抽象,而 file_operations 爲上層系統調用接口提供支持。
下面考慮須要實現哪些方法。ioctl 命令和 fb_ops 結構中的接口之間的關係以下所示:
FBIOGET_VSCREENINFO fb_get_var FBIOPUT_VSCREENINFO fb_set_var FBIOGET_FSCREENINFO fb_get_fix FBIOPUTCMAP fb_set_cmap FBIOGETCMAP fb_get_cmap FBIOPAN_DISPLAY fb_pan_display
只要咱們實現了那些 fb_XXX 函數,那麼用戶應用程序就可使用 FBIOXXXX 宏來操做 LDC 硬件了。那怎麼實現那些接口呢?能夠參考下 linux/drivers/video 目錄下的驅動程序。
在衆多接口中, fb_set_var 是最重要的。它用於設置 video mode 等信息。下面是實現 fb_set_var 函數的通用步驟:
其中第四步是底層硬件操做。