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

1174523-20180701190528222-186574976.png
1174523-20180701190704567-376374410.png
1174523-20180701190735220-2137844967.png
1174523-20180701190756732-1192398342.png

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

因此可以对/proc/fb文件进行打开,读写操作。然后注册一个主设备号为29的字符设备,fbmem_init函数中注册了字符设备的文件操作接口函数fb_fops,定义如下:
1174523-20180701190855179-128494283.png
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
1174523-20180701190921105-1337830968.png
(3)struct fb_info
从framebuffer设备驱动程序结构来看,该驱动主要跟fb_info结构体有关,该结构体记录了framebuffer设备的全部信息,包括设备的设置参数,状态以及对底层硬件操作的函数指针。在linux中,每一个framebuffer设备必须对应一个fb_info, fb_info在/linux/fb.h中的定义如下:(只列出重要的一些)
1174523-20180701191051877-1815379481.png
1174523-20180701191158054-975635356.png
1174523-20180701191218297-484088828.png

* 其中,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结构体主要记录用户不可以修改的控制器的参数,该结构体的定义如下
1174523-20180701191324257-1578099563.png
fb_var_screeninfo结构体主要记录用户可以修改的控制器的参数,比如屏幕的分辨率和每个像素的比特数等,该结构体定义如下:
1174523-20180701191412075-2037515447.png
1174523-20180701191425149-1469369055.png

fb_ops结构体是对底层硬件操作的函数指针,该结构体中定义了对硬件的操作有:
注: fb_ops结构与file_operations 结构不同,fb_ops是底层操作的抽象,而file_operations是提供给上层系统调用的接口,可以直接调用.
1174523-20180701191807448-1792849455.png
1174523-20180701191825533-601333376.png
1174523-20180701191837984-315593723.png

fb_cmap:设备独立的 colormap 信息,可以通过 ioctl 的 FBIOGETCMAP 和 FBIOPUTCMAP 命令设置 colormap;
1174523-20180701191857707-811491482.png
这些结构相互之间的关系如下所示:
1174523-20180701192005264-2054441594.png
1174523-20180701192019599-1665241710.png

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

转载于:https://www.cnblogs.com/Ocean-Star/p/9251006.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值