5.7.6.framebuffer驅動框架分析1

http://www.mamicode.com/info-detail-1209620.html
5.7.6.一、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的對應html

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




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

所以能夠對/proc/fb文件進行打開,讀寫操做。而後註冊一個主設備號爲29的字符設備,fbmem_init函數中註冊了字符設備的文件操做接口函數fb_fops,定義以下:

5.7.6.二、fb_fops[framebuffer設備驅動的接口集]android

在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 。ide

framebuffer驅動註冊:
一、定義兩個變量: registered_fb[FB_MAX]用來保存全部framebuffer驅動, num_registered_fb已註冊的framebuffer個數
二、任何一個特定硬件framebuffer驅動在初始化時必須向fbmem.c註冊,framebuffer模塊提供了驅動註冊接口函數register_framebuffer.

參數fb_info描述特定硬件的framebuffer驅動信息。
三、do_register_framebuffer註冊過程就是將指定的設備驅動信息fb_info存放到registered_fb數組中。所以在註冊具體的fb_info時,首先要構造一個fb_info數據結構,並初始化該數據結構,該結構用於描述一個特定的FrameBuffer驅動。
android是/dev/graphics/fb0,而純linux對應的是/dev/fb0.函數

相關文章
相關標籤/搜索