1. 程式人生 > >5.7.6.framebuffer驅動框架分析1

5.7.6.framebuffer驅動框架分析1

iop 之間 write ioctl 程序 硬件 struct 於平 完成

http://www.mamicode.com/info-detail-1209620.html
5.7.6.1、fbmem_init函數[driver/video/fbmem.c]
(1)#ifdef MODULE
(2)fb_proc_fops和fb在proc文件系統中的表現
(3)register_chrdev註冊fb設備
(4)class_create創建graphics類
(5)fbmem_exit的對應

初始化framebuffer:framebuffer驅動是以模塊的形式註冊到系統中,在模塊初始化時,創建framebuffer對應的設備文件以及proc文件,並註冊framebuffer設備操作接口函數fb_fops

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

framebuffer作為一個子系統,在fbmem_init通過register_chrdev接口向系統註冊一個主設備號位29的字符設備驅動。通過class_create創建graphics設備類,配合mdev機制生成工用戶訪問的設備文件(位於/dev目錄)
//向proc文件系統報告驅動狀態和參數-:在proc文件系統中創建/proc/fb文件,並註冊proc接口函數
技術分享圖片

因此可以對/proc/fb文件進行打開,讀寫操作。然後註冊一個主設備號為29的字符設備,fbmem_init函數中註冊了字符設備的文件操作接口函數fb_fops,定義如下:
技術分享圖片
5.7.6.2、fb_fops[framebuffer設備驅動的接口集]

在linux設備驅動中,所有的顯示緩存設備均由framebuffer子系統內部管理,即linux設備驅動框架只認識一個主設備號為29的framebuffer設備。應用層所有針對顯示緩存[最多32個]的訪問均會推送給fb_fops進行進一步分發操作。
(1)read/write/mmap/ioctl
(2)registered_fb和num_registered_fb
技術分享圖片
(3)struct fb_info
從framebuffer設備驅動程序結構來看,該驅動主要跟fb_info結構體有關,該結構體記錄了framebuffer設備的全部信息,包括設備的設置參數,狀態以及對底層硬件操作的函數指針。在linux中,每一個framebuffer設備必須對應一個fb_info, fb_info在/linux/fb.h中的定義如下:(只列出重要的一些)
技術分享圖片


技術分享圖片
技術分享圖片

* 其中,fb_var_screeninfo和fb_fix_screeninfo兩個結構體跟LCD硬件屬性相關,fb_var_screeninfo代表可修改的LCD顯示參數,如分辨率和像素比特數;fb_fix_screeninfo代表不可修改的LCD屬性參數,如顯示內存的物理地址和長度等。另外一個非常重要的成員是fb_ops,其是LCD底層硬件操作接口集。
* fb_ops硬件操作接口包含很多接口,如設置可變參數fb_set_par,設置顏色寄存器fb_setcolreg,清屏接口fb_blank,畫位圖接口fb_imagebit,內存映射接口fb_mmap等等
* fb_info結構體在調用register_framebuffer之前完成初始化。一般來說,LCD設備屬於平臺設備,其初始化時在平臺設備驅動的probe接口完成。 而LCD設備所涉及的硬件初始化則在平臺設備初始化中完成。
* fb_info是linux為幀緩沖設備定義的驅動接口。包含了底層函數和記錄狀態設備的數據。每個幀緩沖設備都與一個fb_info結構對應。

fb_fix_screeninfo結構體主要記錄用戶不可以修改的控制器的參數,該結構體的定義如下
技術分享圖片
fb_var_screeninfo結構體主要記錄用戶可以修改的控制器的參數,比如屏幕的分辨率和每個像素的比特數等,該結構體定義如下:
技術分享圖片
技術分享圖片

fb_ops結構體是對底層硬件操作的函數指針,該結構體中定義了對硬件的操作有:
註: fb_ops結構與file_operations 結構不同,fb_ops是底層操作的抽象,而file_operations是提供給上層系統調用的接口,可以直接調用.
技術分享圖片
技術分享圖片
技術分享圖片

fb_cmap:設備獨立的 colormap 信息,可以通過 ioctl 的 FBIOGETCMAP 和 FBIOPUTCMAP 命令設置 colormap;
技術分享圖片
這些結構相互之間的關系如下所示:
技術分享圖片
技術分享圖片

總結:framebuffer模塊初始化過程
module_init(fbmem_init);
fbmem_init
proc_create("fb", 0, NULL, &fb_proc_fops); 首先在proc文件系統中創建fb文件,同時註冊操作該文件的接口函數。 因此可以對/proc/fb文件進行打開,讀寫操作
register_chrdev(FB_MAJOR,"fb",&fb_fops): 。然後註冊一個主設備號為29的字符設備,fbmem_init函數中註冊了字符設備的文件操作接口函數fb_fops 。

framebuffer驅動註冊:
1、定義兩個變量: registered_fb[FB_MAX]用來保存所有framebuffer驅動, num_registered_fb已註冊的framebuffer個數
2、任何一個特定硬件framebuffer驅動在初始化時必須向fbmem.c註冊,framebuffer模塊提供了驅動註冊接口函數register_framebuffer.
技術分享圖片
參數fb_info描述特定硬件的framebuffer驅動信息。
3、do_register_framebuffer註冊過程就是將指定的設備驅動信息fb_info存放到registered_fb數組中。因此在註冊具體的fb_info時,首先要構造一個fb_info數據結構,並初始化該數據結構,該結構用於描述一個特定的FrameBuffer驅動。
android是/dev/graphics/fb0,而純linux對應的是/dev/fb0.

5.7.6.framebuffer驅動框架分析1