码迷,mamicode.com
首页 > 其他好文 > 详细

5.7.6.framebuffer驱动框架分析1

时间:2018-07-01 19:52:42      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:rap   proc文件系统   image   video   14.   ide   属性   注册   mamicode   

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.

5.7.6.framebuffer驱动框架分析1

标签:rap   proc文件系统   image   video   14.   ide   属性   注册   mamicode   

原文地址:https://www.cnblogs.com/Ocean-Star/p/9251006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!