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
    评论
驱动加载成功 Thu Jun 08 22:43:18 CST 2023 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. java.sql.SQLException: No timezone mapping entry for 'GTM+8' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:71) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:85) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229) at com.til.jdbc.JDBC.main(JDBC.java:16) Caused by: com.mysql.cj.exceptions.WrongArgumentException: No timezone mapping entry for 'GTM+8' at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.ref
06-09

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值