zoukankan      html  css  js  c++  java
  • 5.7.6.framebuffer驱动框架分析1

    http://www.mamicode.com/info-detail-1209620.html
    5.7.6.1、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的对应

    初始化framebuffer:framebuffer驱动是以模块的形式注册到系统中,在模块初始化时,创建framebuffer对应的设备文件以及proc文件,并注册framebuffer设备操作接口函数fb_fops
    




    framebuffer作为一个子系统,在fbmem_init通过register_chrdev接口向系统注册一个主设备号位29的字符设备驱动。通过class_create创建graphics设备类,配合mdev机制生成工用户访问的设备文件(位于/dev目录)
    //向proc文件系统报告驱动状态和参数-:在proc文件系统中创建/proc/fb文件,并注册proc接口函数

    因此可以对/proc/fb文件进行打开,读写操作。然后注册一个主设备号为29的字符设备,fbmem_init函数中注册了字符设备的文件操作接口函数fb_fops,定义如下:

    5.7.6.2、fb_fops[framebuffer设备驱动的接口集]

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

    framebuffer驱动注册:
    1、定义两个变量: registered_fb[FB_MAX]用来保存所有framebuffer驱动, num_registered_fb已注册的framebuffer个数
    2、任何一个特定硬件framebuffer驱动在初始化时必须向fbmem.c注册,framebuffer模块提供了驱动注册接口函数register_framebuffer.

    参数fb_info描述特定硬件的framebuffer驱动信息。
    3、do_register_framebuffer注册过程就是将指定的设备驱动信息fb_info存放到registered_fb数组中。因此在注册具体的fb_info时,首先要构造一个fb_info数据结构,并初始化该数据结构,该结构用于描述一个特定的FrameBuffer驱动。
    android是/dev/graphics/fb0,而纯linux对应的是/dev/fb0.

  • 相关阅读:
    线段的平移和旋转
    《构建之法》第一章读书笔记
    课程大作业总结
    2016.1.8
    2016.1.7
    2016.1.6总结
    初学MFC
    实时控制软件第三次编程作业
    实时控制软件设计第二次编程作业
    实时控制软件设计第一次编程作业
  • 原文地址:https://www.cnblogs.com/Ocean-Star/p/9251006.html
Copyright © 2011-2022 走看看