Linux中LCD驅動結構分析

來源:互聯網
上載者:User

 針對Linux2.6核心中LCD驅動結構分析,由於公司項目是xx方案,所以也就用其來做分析,置於s3c2410的驅動,對比著看,應該沒問題。

    在分析驅動之前,首先先瞭解幾個LCD驅動中的幾個重要的資料結構,

 1、struct fb_info資料結構(FBI)

1  struct fb_info 2  { 3     int node; 4     int flags; 5     struct fb_var_screeninfo var; /*可變參數 */ 6     struct fb_fix_screeninfo fix; /*固定參數 */ 7     struct fb_monspecs monspecs; /*顯示器標準 */ 8     struct work_struct queue; /* 幀緩衝事件隊列 */ 9     struct fb_pixmap pixmap; /* 映像硬體mapper */ 10    struct fb_pixmap sprite; /* 游標硬體mapper */ 11    struct fb_cmap cmap; /* 目前的顏色表*/ 12    struct list_head modelist;  13    struct fb_videomode *mode; /* 目前的video模式 */ 14  15    #ifdef CONFIG_FB_BACKLIGHT 16       struct mutex bl_mutex; 17       /* 對應的背光裝置  */ 18       struct backlight_device *bl_dev; 19       /* 背光調整 */ 20       u8 bl_curve[FB_BACKLIGHT_LEVELS]; 21     #endif 22  23     struct fb_ops *fbops; /* fb_ops,幀緩衝操作 */ 24     struct device *device; 25     struct class_device *class_device; / 26     int class_flag; /* 私人sysfs標誌 */ 27     #ifdef CONFIG_FB_TILEBLITTING 28         struct fb_tile_ops *tileops; /* 圖塊Blitting */ 29     #endif 30     char _  _iomem *screen_base; /* 虛擬基地址 */ 31     unsigned long screen_size; /* ioremapped的虛擬記憶體大小 */ 32     void *pseudo_palette; /* 偽16色顏色表 */ 33     #define FBINFO_STATE_RUNNING  0 34     #define FBINFO_STATE_SUSPENDED         1 35     u32 state; /* 硬體狀態,如掛起 */ 36     void *fbcon_par; 37     void *par; 38 }; 

    FBI 中記錄了幀緩衝裝置的全部資訊,包括裝置的設定參數、狀態以及操作函數指標。每一個幀緩衝裝置都必須對應一個 FBI。

2.fb_ops結構體
FBI 的成員變數 fb_ops 為指向底層操作的函數的指標,這些函數是需要驅動程式開發人員編寫的。

1  struct fb_ops 2  { 3      struct module *owner; 4       /* 開啟/釋放 */ 5      int(*fb_open)(struct fb_info *info, int user); 6      int(*fb_release)(struct fb_info *info, int user); 7   8      /* 對於非線性布局的/常規記憶體映射無法工作的幀緩衝裝置需要 */ 9      ssize_t(*fb_read)(struct file *file, char _  _user *buf, size_tcount, 10        loff_t*ppos); 11     ssize_t(*fb_write)(struct file *file, const char _  _user *buf,size_t count, 12        loff_t *ppos); 13  14     /* 檢測可變參數,並調整到支援的值*/ 15         int(*fb_check_var)(struct  fb_var_screeninfo  *var,  structfb_info *info); 16  17    /* 根據info->var設定video模式 */ 
18    int(*fb_set_par)(struct fb_info *info); 19  20    /* 設定color寄存器 */ 21    int(*fb_setcolreg)(unsigned  regno,  unsigned  red,  unsigned  green, unsigned 22        blue, unsigned transp, struct fb_info *info); 23  24     /* 大量設定color寄存器,設定顏色表 */ 25     int(*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info); 26  27     /*顯示空白 */ 28     int(*fb_blank)(int blank, struct fb_info *info); 29  30     /* pan顯示 */ 31      int(*fb_pan_display)(struct  fb_var_screeninfo  *var,  struct fb_info *info); 32  33     /* 矩形填充 */ 34        void(*fb_fillrect)(struct  fb_info  *info,  const  structfb_fillrect *rect); 35     /* 資料複製 */ 36        void(*fb_copyarea)(struct  fb_info  *info,  const  structfb_copyarea *region); 37     /* 圖形填滿 */ 38     void(*fb_imageblit)(struct  fb_info  *info,  const  struct  fb_image*image); 39  40     /* 繪製游標 */ 41     int(*fb_cursor)(struct  fb_info  *info,  struct  fb_cursor  *cursor);42  43     /* 旋轉顯示 */ 44     void(*fb_rotate)(struct fb_info *info, int angle); 45  46     /* 等待blit空閑 (可選) */ 47     int(*fb_sync)(struct fb_info *info); 48  49     /* fb特定的ioctl (可選) */ 50   int(*fb_ioctl)(struct  fb_info *info,  unsigned int  cmd, unsignedlong arg); 51  52   /* 處理32位的compat ioctl (可選) */ 53     int(*fb_compat_ioctl)(struct  fb_info  *info,  unsigned  cmd,unsigned long arg); 54  55   /* fb特定的mmap */ 56   int(*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);57  58   /* 儲存目前的硬體狀態 */ 59   void(*fb_save_state)(struct fb_info *info); 60  61   /* 恢複被儲存的硬體狀態 */ 62   void(*fb_restore_state)(struct fb_info *info); 63 }; 

    LCD驅動中比較關鍵的是framebuff(幀緩衝) 

    FrameBuffer的原理

FrameBuffer 是出現在 Linux核心當中的一種驅動程式介面。它是Linux核心抽象出來的裝置,供使用者態進程實現直接寫屏。Framebuffer機制模仿顯卡的功能,將顯卡硬體結構抽象掉,可以通過Framebuffer的讀寫直接對顯存進行操作。使用者可以將Framebuffer看成是顯示記憶體的一個映像,將其映射到進程地址空間之後,就可以直接進行讀寫操作,而寫操作可以立即反應在螢幕上。這種操作是抽象的,統一的。使用者不必關心物理顯存的位置、換頁機制等等具體細節,這些都是由Framebuffer裝置驅動來完成的。但Framebuffer本身不具備任何運算資料的能力,就只好比是一個暫時存放水的水池.CPU將運算後的結果放到這個水池,水池再將結果流到顯示器.中間不會對資料做處理. 應用程式也可以直接讀寫這個水池的內容.在這種機制下,儘管Framebuffer需要真正的顯卡驅動的支援,但所有顯示任務都有CPU完成,因此CPU負擔很重。

   
framebuffer的裝置檔案一般是 /dev/fb0、/dev/fb1 等等。

可以用命令: #dd if=/dev/zero of=/dev/fb 清空螢幕.

如果顯示模式是 1024x768-8 位色,用命令:$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768 清空螢幕;

用命令: #dd if=/dev/fb of=fbfile 可以將fb中的內容儲存下來;

可以重新寫回螢幕: #dd if=fbfile of=/dev/fb;

在使用Framebuffer時,Linux是將顯卡置於圖形模式下的.

在應用程式中,一般通過將 FrameBuffer 裝置映射到進程地址空間的方式使用,比如下面的程式就開啟 /dev/fb0 裝置,並通過 mmap 系統調用進行地址映射,隨後用 memset 將螢幕清空(這裡假設顯示模式是 1024x768-8 位色模式,線性記憶體模式):

  int fb;

  unsigned char* fb_mem;

  fb = open ("/dev/fb0", O_RDWR);

  fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);

  memset (fb_mem, 0, 1024*768); //這個命令應該只有在root可以執行

  FrameBuffer 裝置還提供了若干 ioctl 命令,通過這些命令,可以獲得顯示裝置的一些固定資訊(比如顯示記憶體大小)、與顯示模式相關的可變資訊(比如解析度、象素結構、每掃描線的位元組寬度),以及偽彩色模式下的調色盤資訊等等。

--------------------------------------------------------------------------------------------------------------------------------------------------------

    下面開始分析framebuff在Linux核心中的實現機制。

下班了,先簡要寫點,LCD驅動中有三個檔案需要注意,

1、alps\xx\platform\mt\kernel\drivers\video\lcd_drv.c

2、alps\xx\source\kernel\drivers\video\xxfb.c

3、alps\kernel\driver\video\fbmem.c

fbmem.c 檔案是原始核心中的檔案,framebuff的核心檔案,實現了framebuff驅動的註冊、卸載等函數,並且在這裡註冊了裝置檔案。

xxfb.c是xx平台,LCD具體的framebuff驅動。通過調用fbmem.c中的framebuff的註冊與卸載函數來向系統註冊xx的fb驅動。

lcd_drv.c中實現了具體的硬體設定操作。ok啦。餓死了~~回去~~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.