【转】S3C2440上LCD驱动(FrameBuffer)实例开发讲解(1)

来源:互联网 发布:ld矢量制图软件 编辑:程序博客网 时间:2024/05/01 07:08

本文转自: 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);
};

 

原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 经期可以吃提子吗 晚上吃提子会长胖吗 提子上火还是降火 提子为什么比葡萄贵这么多 提子什么时候成熟 提子的功效与作用 提子和葡萄的区别 葡萄和提子的区别 葡萄与提子的区别 提子酥的做法 绿提子的功效与作用 葡萄与提子有什么区别 提子是凉性还是热性 提子多少钱一斤 黑提子的功效与作用 提子和葡萄的营养价值 黑提子的营养价值 青提子的功效与作用 红提子的功效与作用 葡萄和提子哪个营养价值高 提子怎么保存 葡萄跟提子的区别 提子的营养价值 普提子图片及价格 提子是酸性还是碱性 提子籽可以吃吗 提子是热性还是凉性 吃提子的好处和坏处 提子能做酒吗 提子的籽能吃吗 多吃提子有什么好处 提子的种植技术 提子苗多少钱一株 提子吃多了会怎么样 吃提子的好处 黑加仑是提子吗 来月经能吃提子吗 提子的正确吃法 提子会发胖吗 空腹可以吃提子吗 提子的品种有哪些