1. 程式人生 > >Framebuffer 驅動學習總結(一) ---- 總體架構及關鍵結構體

Framebuffer 驅動學習總結(一) ---- 總體架構及關鍵結構體

一、Framebuffer 裝置驅動總體架構

幀緩衝裝置為標準的字元型裝置,在Linux中主裝置號29,定義在/include/linux/major.h中的FB_MAJOR,次裝置號定義幀緩衝的個數,最大允許有32個FrameBuffer,定義在/include/linux/fb.h中的FB_MAX,對應於檔案系統下/dev/fb%d裝置檔案。

 

 

我們從上面這幅圖看,幀緩衝裝置在Linux中也可以看做是一個完整的子系統,大體由fbmem.c和xxxfb.c組成。向上給應用程式提供完善的裝置檔案操作介面(即對FrameBuffer裝置進行read、write、ioctl等操作),介面在Linux提供的fbmem.c檔案中實現;向下提供了硬體操作的介面,只是這些介面Linux並沒有提供實現,因為這要根據具體的LCD控制器硬體進行設定,所以這就是我們要做的事情了(即xxxfb.c部分的實現)。

二 、Framebuffer 相關的重要資料結構:

1、從Framebuffer裝置驅動程式結構看,該驅動主要跟fb_info結構體有關,該結構體記錄了Framebuffer裝置的全部資訊,包括裝置的設定引數、狀態以及對底層硬體操作的函式指標。在Linux中,每一個Framebuffer裝置都必須對應一個fb_info,fb_info在/linux/fb.h中的定義如下:(只列出重要的一些) 

複製程式碼

1 struct fb_info {
 2     atomic_t count;
 3     int node; ///次裝置號
 4     int flags;
 5     struct mutex lock;  //用於open、release、ioctrl功能的鎖
 6     struct mutex mm_lock;  /* Lock for fb_mmap and smem_* fields */
 7     struct fb_var_screeninfo var;  //LCD 可變引數
 8     struct fb_fix_screeninfo fix;   //LCD 固定引數
 9     struct fb_monspecs monspecs;   /* Current Monitor specs *///LCD 顯示器標準
10     struct work_struct queue;   //幀緩衝事件佇列
11     struct fb_pixmap pixmap;   ///影象硬體 mapper
12     struct fb_pixmap sprite;   //游標硬體 mapper
13     struct fb_cmap cmap;     //當前顏色表
14     struct list_head modelist;   //模式列表
15     struct fb_videomode *mode;   //當前的顯示模式
16 
17 #ifdef CONFIG_FB_BACKLIGHT
18     /* assigned backlight device */
19     /* set before framebuffer registration, 
20        remove after unregister */
21     struct backlight_device *bl_dev;///對應的背光裝置
22 
23     /* Backlight level curve */
24     struct mutex bl_curve_mutex;    
25     u8 bl_curve[FB_BACKLIGHT_LEVELS];///背光調整
26 #endif
27 #ifdef CONFIG_FB_DEFERRED_IO
28     struct delayed_work deferred_work;
29     struct fb_deferred_io *fbdefio;
30 #endif
31 
32     struct fb_ops *fbops;///---->對底層硬體裝置操作的函式指標
33     struct device *device;     /* This is the parent *////父裝置節點
34     struct device *dev;      /* This is this fb device *////當前的幀緩衝裝置
35     int class_flag;               /* private sysfs flags */
36 #ifdef CONFIG_FB_TILEBLITTING
37     struct fb_tile_ops *tileops;  /* Tile Blitting *///圖塊Blitting ?
38 #endif
39     char __iomem *screen_base;   /* Virtual address *///虛擬地址
40     unsigned long screen_size;   /* Amount of ioremapped VRAM or 0 */ ///LCD IO對映的虛擬記憶體大小
41     void *pseudo_palette;       /* Fake palette of 16 colors *///偽16色 顏色表
42 #define FBINFO_STATE_RUNNING   0
43 #define FBINFO_STATE_SUSPENDED   1
44     u32 state;            /* Hardware state i.e suspend *////LCD 掛起或復位的狀態
45     void *fbcon_par;                /* fbcon use-only private area */
46     /* From here on everything is device dependent */
47     void *par;
48     /* we need the PCI or similar aperture base/size not
49        smem_start/size as smem_start may just be an object
50        allocated inside the aperture so may not actually overlap */
51     struct apertures_struct {
52         unsigned int count;
53         struct aperture {
54             resource_size_t base;
55             resource_size_t size;
56         } ranges[0];
57     } *apertures;
58 
59     bool skip_vt_switch; /* no VT switch on suspend/resume required */
60 };

複製程式碼

其中,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_imageblit、記憶體對映fb_mmap等等。

         fb_info結構體在呼叫register_framebuffer之前完成初始化。一般來說,LCD裝置屬於平臺裝置,其初始化是在平臺裝置驅動的probe介面完成。而LCD裝置所涉及的硬體初始化則在平臺裝置初始化中完成。

 

2、fb_fix_screeninfo結構體主要記錄使用者不可以修改的控制器的引數,該結構體的定義如下:

複製程式碼

1 struct fb_fix_screeninfo {
 2     char id[16];            //字串形式的識別符號
 3     unsigned long smem_start;   /fb 快取的開始位置
 4                     /* (physical address) */
 5     __u32 smem_len;            /* Length of frame buffer mem *///fb 快取的長度
 6     __u32 type;            /* see FB_TYPE_*        *////看FB_TYPE_* -->
 7     __u32 type_aux;            /* Interleave for interleaved Planes *///分界
 8     __u32 visual;             ///看FB_VISUAL_* -->
 9     __u16 xpanstep;         //如果沒有硬體panning就賦值為0
10     __u16 ypanstep;            //如果沒有硬體panning就賦值為0
11     __u16 ywrapstep;        //如果沒有硬體ywrap就賦值為0
12     __u32 line_length;        //一行的位元組數
13     unsigned long mmio_start;   //記憶體對映 IO的開始位置
14                     /* (physical address) */
15     __u32 mmio_len;            //記憶體對映 IO的長度
16     __u32 accel;            /* Indicate to driver which    */
17                     /*  specific chip/card we have    */
18     __u16 capabilities;        /* see FB_CAP_*            *///功能 ---FB_CAP_FOURCC--- Device supports FOURCC-based formats
19     __u16 reserved[2];       //為以後的相容性保留
20 };

複製程式碼

 

3、fb_var_screeninfo結構體主要記錄使用者可以修改的控制器的引數,比如螢幕的解析度和每個畫素的位元數等,該結構體定義如下:

複製程式碼

1 struct fb_var_screeninfo { ///顯示屏資訊
 2     __u32 xres;            /* visible resolution*//可視區域,一行有多少個畫素點
 3     __u32 yres;            ///可視區域,一列有多少個畫素點
 4     __u32 xres_virtual;  /* virtual resolution*//虛擬區域,一行有多少個畫素點,簡單的意思就是記憶體中定義的區間是比較大的
 5     __u32 yres_virtual;////虛擬區域,一列有多少個畫素點
 6     __u32 xoffset;            //虛擬到可見螢幕之間的行偏移
 7     __u32 yoffset;            /* resolution *//虛擬到可見螢幕之間的列偏移
 8 
 9     __u32 bits_per_pixel; /* guess what*/ 每個畫素的 bit 數,這個引數不需要自己配置,而是通過上層在呼叫 checkvar 函式傳遞 bpp 的時候賦值的
10     __u32 grayscale;        /* 0 = color, 1 = grayscale,*////等於零就成黑白 (灰度)
11                     /* >1 = FOURCC            */
12     // 通過 pixel per bpp 來設定 red green 和 blue 的位置; pixel per bpp 可以通過 ioctl 設定
13     struct fb_bitfield red;        //fb快取的R位域
14     struct fb_bitfield green;    /* else only length is significant *//fb快取的G位域
15     struct fb_bitfield blue;                                        //fb快取的B位域
16     struct fb_bitfield transp;    /* transparency *//透明度
17 
18     __u32 nonstd;            /* != 0 Non standard pixel format *///如果nonstd 不等於0,非標準的畫素格式
19 
20     __u32 activate;            /* see FB_ACTIVATE_*     */
21 
22     __u32 height;         //記憶體中的影象高度
23     __u32 width;        //記憶體中的影象寬度
24 
25     __u32 accel_flags;        /* (OBSOLETE) see fb_info.flags *////加速標誌
26 
27     /* Timing: All values in pixclocks, except pixclock (of course) */
28     ///時序,這些部分就是顯示器的顯示方法了,和具體的液晶顯示屏有關,在驅動中一般放在 具體液晶屏的配置檔案 
29     __u32 pixclock;            /* pixel clock in ps (pico seconds) *///畫素時鐘
30     __u32 left_margin;        /* time from sync to picture    *////行切換,從同步到繪圖之間的延遲
31     __u32 right_margin;        /* time from picture to sync    *///行切換,從繪圖到同步之間的延遲
32     __u32 upper_margin;        /* time from sync to picture    *///幀切換,從同步到繪圖之間的延遲
33     __u32 lower_margin;                                        ////幀切換,從繪圖到同步之間的延遲
34     __u32 hsync_len;        /* length of horizontal sync    */ //水平同步的長度
35     __u32 vsync_len;        /* length of vertical sync    */ //垂直同步的長度
36     __u32 sync;            /* see FB_SYNC_*      *////---->看 FB_SYNC_*
37     __u32 vmode;            /* see FB_VMODE_*      *////---->看 FB_VMODE_*
38     __u32 rotate;            /* angle we rotate counter clockwise */
39     __u32 colorspace;        /* colorspace for FOURCC-based modes */
40     __u32 reserved[4];        /* Reserved for future compatibility */
41 };

複製程式碼

 通過下圖可以對fb_var_screeninfo中涉及的時序理解更清楚一些:

 

4、fb_ops結構體是對底層硬體操作的函式指標,該結構體中定義了對硬體的操作有:

注: fb_ops結構與file_operations 結構不同,fb_ops是底層操作的抽象,file_operations是提供給上層系統呼叫的介面,可以直接呼叫.

複製程式碼

1 struct fb_ops {
 2     /* open/release and usage marking */
 3     struct module *owner;
 4     int (*fb_open)(struct fb_info *info, int user);
 5     int (*fb_release)(struct fb_info *info, int user);

/*對於非線性佈局的/常規記憶體對映無法工作的幀緩衝裝置需要*/ 
10     ssize_t (*fb_read)(struct fb_info *info, char __user *buf,
11                size_t count, loff_t *ppos);
12     ssize_t (*fb_write)(struct fb_info *info, const char __user *buf,
13                 size_t count, loff_t *ppos);
15     /* checks var and eventually tweaks it to something supported,
16      * DO NOT MODIFY PAR */
17     int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);///檢查可變引數並進行設定
19     /* set the video mode according to info->var */
20     int (*fb_set_par)(struct fb_info *info);///根據設定的值進行更新,使之有效
22     /* set color register */
23     int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green, ////設定顏色暫存器
24                 unsigned blue, unsigned transp, struct fb_info *info);
26     /* set color registers in batch */
27     int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);
29    
30     int (*fb_blank)(int blank, struct fb_info *info);///顯示空白
32     /*pan顯示*/
33     int (*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);
36     void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);///矩形填充 
38     void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);///複製資料
40     void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);///圖形填充
42     /* 繪製游標 */
43     int (*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor);
45     /* 旋轉顯示 */
46     void (*fb_rotate)(struct fb_info *info, int angle);
48     /* 等待blit空閒 */
49     int (*fb_sync)(struct fb_info *info);
51     /* fb 特定的 ioctl */
52     int (*fb_ioctl)(struct fb_info *info, unsigned int cmd,
53             unsigned long arg);
55     /* 處理32bit compat ioctl (optional) */
56     int (*fb_compat_ioctl)(struct fb_info *info, unsigned cmd,
57             unsigned long arg);
59     /* fb 特定的 mmap */
60     int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);
62     /* get capability given var */
63     void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,
64                 struct fb_var_screeninfo *var);
66     /* teardown any resources to do with this framebuffer */
67     void (*fb_destroy)(struct fb_info *info);
69     /* called at KDB enter and leave time to prepare the console */
70     int (*fb_debug_enter)(struct fb_info *info);
71     int (*fb_debug_leave)(struct fb_info *info);
72 };

複製程式碼

 

5、fb_cmap:裝置獨立的 colormap 資訊,可以通過 ioctl 的 FBIOGETCMAP 和 FBIOPUTCMAP 命令設定 colormap;

複製程式碼

struct fb_cmap { //顏色對映表
    __u32 start;            /* First entry    *////第一個入口
    __u32 len;            /* Number of entries *///入口的數字
    __u16 *red;            /* Red values    *///紅色
    __u16 *green;                        ///綠色
    __u16 *blue;                        ///藍色
    __u16 *transp;           //透明度,允許為空
};

複製程式碼

 

這些結構相互之間的關係如下所示:

 

標籤: 

相關推薦

Framebuffer 驅動學習總結 ---- 總體架構關鍵結構

一、Framebuffer 裝置驅動總體架構 幀緩衝裝置為標準的字元型裝置,在Linux中主裝置號29,定義在/include/

MEF學習總結1---總體架構

attr 總結 技術分享 dir target get gre round 管理 用了很久的MEF框架來做依賴註入,最近想把它的原理和機構總結一下,主要包括如下幾個方面: 1. 總體架構 2. .Net Composition Primitive 3. Attribu

JSON必知必會學習總結

tor lint 沒有 script app 對數 數據交換格式 object 什麽 七月第一周,從學校畢業回來上班的第一周。離開一段時候後,再次回來重新工作,有了很多新的認識,不再是實習時那麽混混沌沌了。每天我自己該做什麽,怎麽做,做到什麽程度更清晰了。除了要去完成我負責

PHP學習總結

encode 什麽 code 解決 new span att 面向對象 反斜杠 》PHP 面向對象 使用parent訪問父類的構造方法(__construct)時一定要為當前類繼承要訪問的構造方法 類的構造方法(__construct)在實例化時直接被加載,靜態方法

Java IO學習總結

file flush writer directory 創建 str java 資源 tab 一、File 類 Java中不管文件還是目錄都可以使用File類操作,File能新建、刪除、重命名文件和目錄,但是不能訪問文件內容本身,訪問文件內容需要使用輸入輸出流。 Fi

JSP學習總結

展示 cat 一起 time server 資源 type div simple 一、JSP的介紹與項目部署 JSP,全稱 Java server page是由Sun公司開發的一種動態生成網頁資源的技術。JSP技術使用java語言作為腳本語言,可以將html元素和java代

JAVA學習總結

產生 java虛擬機 右鍵 分布式系 jdk 問題 功能 地址 輸出 一、Java是什麽? Java 是由 Sun Microsystems 在 1995 年首先發布的編程語言和計算平臺。Java 是一項用於開發應用程序的技術,可以讓 Web 變得更有意思和更實用。有許多應

Linux學習總結 windos環境vmware安裝centos7

color 學習總結 oot 遠程訪問服務 分享圖片 watermark 需要 mage 磁盤大小 1.在這裏我先簡單介紹下虛擬化技術,就是我們通過軟件虛擬化出來一個硬件環境,然後就可以在系統裏面安裝子系統,以來我們避免了裝linux,windos雙系統的麻煩,二來我們可以

webservice學習總結-- WebService相關概念介紹

IT strong 資源 fire 求和 log AC service服務 為什麽 一、WebService是什麽? 基於Web的服務:服務器端整出一些資源讓客戶端應用訪問(獲取數據) 一個跨語言、跨平臺的規範(抽象) 多個跨平臺、跨語言的應用間通信整合的方案(實際)

【Java】 Spring 框架初步學習總結簡單實現 IoC 和 AOP

1.0 其中 表示 只需要 第一篇 否則 info fin pojo   Spring 是一個開源的設計層面的輕量級框架,Spring 的好處網上有太多,這裏就不在贅述。   IoC 控制反轉和 AOP 面向切面編程是 Spring 的兩個重要特性。   IoC(Inver

python學習總結,第一個python程序的編寫

程序代碼 spa 編碼 結構 編輯 下載地址 utf 修改編碼 general 1. python是一種解釋性,編譯型,互動型的語言,面向對象,動態數據類型的高級程序設計語言。 1.1 交互式:意味著可以在一個提示符直接交互執行你寫的程序。 1.2 解釋型:意味著開發過程中

MyBatis學習總結——ORM概要與MyBatis快速起步

管理 stat prim aot 驅動 單元測試 build sta 環境 目錄 一、ORM 1.1、ORM簡介 1.2、ORM的概念 1.3、ORM的優缺點 二、MyBatis 2.1、MyBatis的特點 2.2、MyBatis工作流程

[學習總結] python語言學習總結

用py也很久了,很多東西只知道拿來用,並沒有深究,感覺這樣是不夠的。 我決定寫這麼一篇總結,把很多遺忘的東西拾起來,把很多沒搞懂的東西搞清楚。 1.eval函式 用法:eval(expression, globals=None, locals=None) 解釋:將字串str當成有效的表

Dubbo的學習總結——遠端呼叫

在學習用dubbo進行分散式遠端呼叫之前,先來看一個簡單的有關訪問網路上的天氣預報介面的遠端呼叫例項。 1.先建立一個java專案,建立過程這裡不詳細講述,只附上一張截圖供入門級選手參考: 2.建立好一個java專案後,接下來就是建立一個Weather實體類(這裡可以使用lombok的@Da

Http學習總結

http使用面向連線的TCP作為傳輸層協議。http本身無連線。 請求報文 CRLF是回車換行   方法為GET的請求報文     方法為POST的請求報文   &n

多執行緒學習總結

一、程序和執行緒的定義 程序:程序是資源(CPU、記憶體等)分配的基本單位,它是程式執行時的一個例項。程式執行時系統就會建立一個程序,併為它分配資源,然後把該程序放入程序就緒佇列,程序排程器選中它的時候就會為它分配CPU時間,程式開始真正執行。 執行緒:執行緒是程式執行時的最小單位,它是程序

JavaWeb學習總結---httpservletrequest物件

javaweb學習總結(十)——HttpServletRequest物件(一) 一、HttpServletRequest介紹   HttpServletRequest物件代表客戶端的請求,當客戶端通過HTTP協議訪問伺服器時,HTTP請求頭中的所有資訊都封裝在這個物件中,通過這個物件提供的方

java執行緒學習總結

(宣告:並非原創,只是一個簡單總結) 一、執行緒和程序的概念:            程序:程序是處於執行過程中的程式,並且具有一定的對功能,是系統進行資源分配和排程的一個獨立單位。      

Git學習總結git的安裝和配置

git的安裝: 在這裡,因為網上有了很多詳盡的教程,我就不贅述了。git安裝教程 然後你需要申請一個GitHub賬號:點選申請GitHub賬號 申請GitHub賬號的時候要繫結一個郵箱,繫結QQ郵箱即可。 下面將你電腦上的git繫結GitHub賬號: 開啟Git

Spring Boot 學習總結 ---入口類和@SpringBootApplication

入口類和@SpringBootApplication SpringBoot通常有一個名為*Application的入口類,入口類裡有一個main方法,這個main方法是一個標準的java應用的入口方法。在main方法中使用SpringApplication.run(*App