【轉】S3C2440上LCD驅動(FrameBuffer)實例開發講解(1)

本文轉自: http://www.linuxidc.com/Linux/2011-03/33600.htm

 

一、開發環境

  • 主  機:VMWare--Fedora 9
  • 開發板:Mini2440--64MB Nand, Kernel:2.6.30.4
  • 編譯器:arm-linux-gcc-4.3.2

1. 幀緩衝設備驅動在Linux子系統中的結構如下:

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

2. 幀緩衝相關的重要數據結構:
   從幀緩衝設備驅動程序結構看,該驅動主要跟fb_info結構體有關,該結構體記錄了幀緩衝設備的全部信息,包括設備的設置參數、狀態以及對底層硬件操作的函數指針。在Linux中,每一個幀緩衝設備都必須對應一個fb_info,fb_info在/linux/fb.h中的定義如下:(只列出重要的一些)

struct fb_info {
    int node;
    int flags;
    struct fb_var_screeninfo var;/*LCD可變參數結構體*/
    struct fb_fix_screeninfo fix;/*LCD固定參數結構體*/
    struct fb_monspecs monspecs; /*LCD顯示器標準*/
    struct work_struct queue;    /*幀緩衝事件隊列*/
    struct fb_pixmap pixmap;     /*圖像硬件mapper*/
    struct fb_pixmap sprite;     /*光標硬件mapper*/
    struct fb_cmap cmap;         /*當前的顏色表*/
    struct fb_videomode *mode;   /*當前的顯示模式*/

#ifdef CONFIG_FB_BACKLIGHT
    
struct backlight_device *bl_dev;/*對應的背光設備*/
    struct mutex bl_curve_mutex;
    u8 bl_curve[FB_BACKLIGHT_LEVELS];/*背光調整*/
#endif
#ifdef CONFIG_FB_DEFERRED_IO
    struct delayed_work deferred_work;
    struct fb_deferred_io *fbdefio;
#endif

    struct fb_ops *fbops; /*對底層硬件操作的函數指針*/
    struct device *device;
    struct device *dev;   /*fb設備*/
    int class_flag;    
#ifdef CONFIG_FB_TILEBLITTING
    struct fb_tile_ops *tileops; /*圖塊Blitting*/
#endif
    char __iomem *screen_base;   /*虛擬基地址*/
    unsigned long screen_size;   /*LCD IO映射的虛擬內存大小*/
    void *pseudo_palette;        /*僞16色顏色表*/
#define FBINFO_STATE_RUNNING    0
#define FBINFO_STATE_SUSPENDED  1
    u32 state;  /*LCD的掛起或恢復狀態*/
    void *fbcon_par;
    void *par;    
};

 

其中,比較重要的成員有struct fb_var_screeninfo var、struct fb_fix_screeninfo fix和struct fb_ops *fbops,他們也都是結構體。下面我們一個一個的來看。

 

struct fb_ops {

    struct module *owner;

    
//檢查可變參數並進行設置
    int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);

    
//根據設置的值進行更新,使之有效
    int (*fb_set_par)(struct fb_info *info);

    
//設置顏色寄存器
    int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,
             unsigned blue, unsigned transp, struct fb_info *info);

    
//顯示空白
    int (*fb_blank)(int blank, struct fb_info *info);

    
//矩形填充
    void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);

    
//複製數據
    void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);

    
//圖形填充
    void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章