高清嵌入式系統中的DVI驅動開發
3 Linux的幀緩沖設備
3.1 framebuffer機制
framebuffer(幀緩沖)是出現在Linux2.2.xx之后版本內核的一種驅動程序接口,在Linux體系中它居于上層應用程序和底層顯示設備之間。framebuffer屏蔽了不同顯示設備間的差異,將顯示設備抽象為幀緩沖區,它是一種供用戶態實現直接寫屏的抽象設備。framebuffer可
以看成是顯存的一個映像,用戶通過內存映射將其映射到進程的地址空間后,通過對顯示緩沖區的讀寫操作可直接控制LCD的屏幕輸出。
frameBuffer設備驅動主要基于linux/include/linux/fb.h和linux/drivers/video/fbmem.c這兩個文件。fb.h中包含了與幀緩沖設備相關的重要的數據結構。fbmem.c是framebuffer機制的核心程序,它為上層應用程序提供了通用接口,同時也為下層特定硬件提供了接口。其內的函數可對具體硬件進行操作,比如對寄存器進行設置,對顯示緩沖進行映射等。
3.2 幾個重要的數據結構
(1)struct fb_info
這個結構是Linux為幀緩沖區設備定義的驅動層接口,它包含了關于幀緩沖設備屬性和操作的完整描述,部分成員定義如下:

其中,var記錄用戶可以修改的顯示控制器參數,包括屏幕分辨率和每個像素的位寬等;fix記錄用戶不能修改的顯示控制器參數;cmap為當前的顏色表;fbops指向對底層硬件操作的函數集;dev表示幀緩沖設備;screen_base為I/O映射的虛擬基地址。
(2)struct fb_ops
該結構提供了指向底層操作的函數指針,其成員函數最終與LCD控制器硬件打交道,這些函數需要驅動開發者根據LCD控制器的硬件設置及LCD顯示屏的硬件參數進行設計。該結構部分成員定義如下:

其中,fb_check_var用于檢查可變的屏幕參數,并調整其為硬件支持的值;fb_set_par根據屏幕參數設置具體讀寫LCD控制器的寄存器以使其進入相應的工作狀態,fb_setcolreg設置color寄存器來實現偽顏色表和顏色表的填充。
(3)struct fb_var_screeninfo
這是fb_info的成員結構體。它記錄了幀緩沖設備和指定顯示模式的可修改信息,包括屏幕分辨率、每個像素的位寬、幀延時、行延時等。
(4)struct fb_fix_screeninfo
這是fb_info的成員結構體,它描述顯示卡的屬性,并且在系統運行時不能被修改,例如緩沖區的首地址、長度等。當一種模式被設定后,內存信息由顯示卡硬件給出,內存的位置等信息就不可修改。
MX51將LCD控制器直接嵌入到處理器芯片內部,這為嵌入式系統關于顯示功能的擴展提供了直接接口。LCD控制器驅動是DVI設備驅動的核心,它是一個標準的framebuffer設備驅動。設計驅動程序,首要的是配置LCD控制器,設置幀緩沖區,這在很大程度上要依賴于上述的數據結構,驅動設計需填寫相關結構體并完成系統指定的接口函數。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論