framebuffer驱动详解2——fb驱动框架分析(核心层)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、前言

framebuffer驱动框架包括以下两部分:

1、内核开发者实现的部分(核心层)

root@ubuntu:省略部分路径/x210_kernel/drivers/video# ls *.o
built-in.o     cfbfillrect.o  fbcmap.o  fbmem.o  fb_notify.o  fbsysfs.o
cfbcopyarea.o  cfbimgblt.o    fbcvt.o   fbmon.o  fb.o         modedb.o
root@ubuntu:省略部分路径/x210_kernel/drivers/video#

通过检查内核编译结果相应目录中的.o文件,得知驱动框架核心层主要涉及的文件:

(1)drivers/video/fbmem.c(主要文件)

该文件创建graphics类,注册fb设备驱动,提供fb设备注册接口register_framebuffer。

该文件相对于fb设备,就好比misc.c文件相对于杂散类设备,其结构和分析方法类似。

(2)drivers/video/fbsysfs.c

这个文件与fb在/sys目录下的一些属性文件有关。

(3)drivers/video/modedb.c

这个文件与显示模式(比如VGA、720P等)的管理有关。

(4)drivers/video/fb_notify.c

2、驱动工程师实现的部分(操作层)

root@ubuntu:省略部分路径/x210_kernel/drivers/video# cd samsung/
root@ubuntu:省略部分路径/x210_kernel/drivers/video/samsung# ls *.o
built-in.o  s3cfb_fimd6x.o  s3cfb.o
root@ubuntu:省略部分路径/x210_kernel/drivers/video/samsung# 

通过检查内核编译结果相应目录中的.o文件,得知具体操作层主要涉及的文件:

(1)drivers/video/samsung/s3cfb.c,这是驱动主要文件。

(2)drivers/video/samsung/s3cfb_fimd6x.c,里面有很多LCD硬件操作的函数。

(3)arch/arm/mach-s5pv210/mach-x210.c,负责提供platform_device。

(4)arch/arm/plat-s5p/devs.c,为platform_device提供一些硬件描述信息。

接下来,我们将对这两部分内容进行源码级别的分析。

二、fb驱动框架核心层分析

1、fbmem_init()函数

此函数位于drivers/video/fbmem.c文件中。

static int __init fbmem_init(void)
{proc_create("fb", 0, NULL, &fb_proc_fops);if (register_chrdev(FB_MAJOR,"fb",&fb_fops))printk("unable to get major %d for fb devs\n", FB_MAJOR);fb_class = class_create(THIS_MODULE, "graphics");if (IS_ERR(fb_class)) {printk(KERN_WARNING "Unable to create fb class;errno = %ld\n",\PTR_ERR(fb_class));fb_class = NULL;}return 0;
}#ifdef MODULE          //MODULE没有定义
module_init(fbmem_init);
static void __exit
fbmem_exit(void)
{remove_proc_entry("fb", NULL);class_destroy(fb_class);unregister_chrdev(FB_MAJOR, "fb");
}module_exit(fbmem_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Framebuffer base");
#else //MODULE没有定义,所以对于fbmem_init而言,执行的是这个
subsys_initcall(fbmem_init);
#endif

(1)subsys_initcall(fbmem_init)

对于fbmem_init()函数,因为没有定义MODULE(表示以模块方式安装),因此执行的是subsys_initial(表示直接集成在内核中)。又因为是直接集成的,所以不需要卸载函数。

(2)proc_create("fb", 0, NULL, &fb_proc_fops);

fb_proc_fops和fb在proc文件系统中的表现,即cat /proc/fb的实现;

(3)register_chrdev(FB_MAJOR,"fb",&fb_fops)

利用register_chdev()函数注册fb设备,注册之后在cat /proc/devices时显示有“29 fb”。

其中,FB_MAJOR=29,而变量fb_fops的定义见下文。

(4)fb_class = class_create(THIS_MODULE, "graphics");

利用class_create()函数创建了一个名为“graphics”的类。即在/sys/class/下有graphics目录。

 

2、变量fb_fops

变量fb_fops定义在drivers/video/fbmem.c文件中,内容如下:

static const struct file_operations fb_fops = {.owner =	THIS_MODULE,.read =		fb_read,.write =	fb_write,.unlocked_ioctl = fb_ioctl,//省略部分代码
};

可知其函数成员所指向的函数,分别为fb_read,fb_write,fb_ioctl。后面将讨论这些函数。

 

3、register_framebuffer()函数

此函数位于drivers/video/fbmem.c文件中,是fb驱动框架设计的fb设备注册接口,内容如下。

/***	register_framebuffer - registers a frame buffer device*	@fb_info: frame buffer info structure*	Registers a frame buffer device @fb_info.*	Returns negative errno on error, or zero for success.**/int register_framebuffer(struct fb_info *fb_info)
{int i;struct fb_event event;struct fb_videomode mode;if (num_registered_fb == FB_MAX)return -ENXIO;if (fb_check_foreignness(fb_info))//判断大小端模式return -ENOSYS;remove_conflicting_framebuffers(fb_info->apertures, fb_info->fix.id,fb_is_primary_device(fb_info));num_registered_fb++;for (i = 0 ; i < FB_MAX; i++)if (!registered_fb[i])break;fb_info->node = i;mutex_init(&fb_info->lock);mutex_init(&fb_info->mm_lock);fb_info->dev = device_create(fb_class, fb_info->device,MKDEV(FB_MAJOR, i), NULL, "fb%d", i);if (IS_ERR(fb_info->dev)) {/* Not fatal */printk(KERN_WARNING "Unable to create device for framebuffer %d; \errno = %ld\n", i, PTR_ERR(fb_info->dev));fb_info->dev = NULL;} elsefb_init_device(fb_info);if (fb_info->pixmap.addr == NULL) {fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL);if (fb_info->pixmap.addr) {fb_info->pixmap.size = FBPIXMAPSIZE;fb_info->pixmap.buf_align = 1;fb_info->pixmap.scan_align = 1;fb_info->pixmap.access_align = 32;fb_info->pixmap.flags = FB_PIXMAP_DEFAULT;}}	fb_info->pixmap.offset = 0;if (!fb_info->pixmap.blit_x)fb_info->pixmap.blit_x = ~(u32)0;if (!fb_info->pixmap.blit_y)fb_info->pixmap.blit_y = ~(u32)0;if (!fb_info->modelist.prev || !fb_info->modelist.next)INIT_LIST_HEAD(&fb_info->modelist);fb_var_to_videomode(&mode, &fb_info->var);fb_add_videomode(&mode, &fb_info->modelist);registered_fb[i] = fb_info;event.info = fb_info;if (!lock_fb_info(fb_info))return -ENODEV;fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);unlock_fb_info(fb_info);return 0;
}

(1)struct fb_info 结构体

此结构体的定义如下:

struct fb_info {int node; //fb_info在registered_fb数组的下标int flags;struct mutex lock;		/* Lock for open/release/ioctl funcs */struct mutex mm_lock;		/* Lock for fb_mmap and smem_* fields */struct fb_var_screeninfo var;	/* Current var */struct fb_fix_screeninfo fix;	/* Current fix */struct fb_monspecs monspecs;	/* Current Monitor specs */struct work_struct queue;	/* Framebuffer event queue */struct fb_pixmap pixmap;	/* Image hardware mapper */struct fb_pixmap sprite;	/* Cursor hardware mapper */struct fb_cmap cmap;		/* Current cmap */struct list_head modelist;      /* mode list */struct fb_videomode *mode;	/* current mode *///省略部分代码struct fb_ops *fbops;struct device *device;		/* This is the parent */struct device *dev;		/* This is this fb device */int class_flag;                    /* private sysfs flags */char __iomem *screen_base;	/* Virtual address */unsigned long screen_size;	/* Amount of ioremapped VRAM or 0 */ void *pseudo_palette;		/* Fake palette of 16 colors */ 
#define FBINFO_STATE_RUNNING	0
#define FBINFO_STATE_SUSPENDED	1u32 state;			/* Hardware state i.e suspend */void *fbcon_par;                /* fbcon use-only private area *//* From here on everything is device dependent */void *par;/* we need the PCI or similiar aperture base/size notsmem_start/size as smem_start may just be an objectallocated inside the aperture so may not actually overlap */struct apertures_struct {unsigned int count;struct aperture {resource_size_t base;resource_size_t size;} ranges[0];} *apertures;
};

(2)fb_check_foreignness()函数

判断大小端模式。

(3)remove_conflicting_framebuffers()函数

去掉冲突的fb。

(4)device_create()函数

在/sys/class/graphic目录下创建设备?还是说创建设备文件/dev/xxx?应该是后者。

(5)fb_init_device()函数

这是fb在sys文件系统的接口函数。涉及dev_set_drvdata和dev_get_drvdata。有待深入。

(6)fb_var_to_videomode()函数

1)什么是mode?

2)fb_var_to_videomode()函数的内容

/*** fb_var_to_videomode - convert fb_var_screeninfo to fb_videomode* @mode: pointer to struct fb_videomode* @var: pointer to struct fb_var_screeninfo*/
void fb_var_to_videomode(struct fb_videomode *mode,const struct fb_var_screeninfo *var)
{u32 pixclock, hfreq, htotal, vtotal;mode->name = NULL;mode->xres = var->xres;mode->yres = var->yres;mode->pixclock = var->pixclock;mode->hsync_len = var->hsync_len;mode->vsync_len = var->vsync_len;mode->left_margin = var->left_margin;mode->right_margin = var->right_margin;mode->upper_margin = var->upper_margin;mode->lower_margin = var->lower_margin;mode->sync = var->sync;mode->vmode = var->vmode & FB_VMODE_MASK;mode->flag = FB_MODE_IS_FROM_VAR;mode->refresh = 0;if (!var->pixclock)return;pixclock = PICOS2KHZ(var->pixclock) * 1000;htotal = var->xres + var->right_margin + var->hsync_len +var->left_margin;vtotal = var->yres + var->lower_margin + var->vsync_len +var->upper_margin;if (var->vmode & FB_VMODE_INTERLACED)vtotal /= 2;if (var->vmode & FB_VMODE_DOUBLE)vtotal *= 2;hfreq = pixclock/htotal;mode->refresh = hfreq/vtotal;
}

(7)fb_add_videomode()函数

(8)registered_fb[i] = fb_info

注册与登记该fb设备。结合fb_read等函数中对fb_info的使用。

关键点:数据如何封装、数据由谁准备由谁消费、数据如何传递。

(9)fb_notifier_call_chain()函数

待写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle conn 协议适配器错误解决

Oracle conn 协议适配器错误 --解决方法C:\Documents and Settings\administrator>set oracle_sidmyoracleC:\Documents and Settings\administrator>sqlplus /nologSQL*Plus: Release 10.2.0.1.0 - Production on 星期三 12月 26 09:47:16 2012Copyright (c) 1982, 2005…

jquery ajax 文本丢失加号和连接号的问题

因为采用data:字符串这种形式&#xff0c;和&是jquery分隔参数的分隔符&#xff0c;所以会丢失&#xff0c;解决方法就是把text文本中的和&替换掉&#xff0c;用js里面的encodeURIComponent编码&#xff0c;为了省事&#xff0c;直接写出编码替换.. function FixJqText…

python给定一个整数n、判断n是否为素数_输入一个大于3的整数n,判断它是否为素数...

#include //让n被i除(i的值从2到n-1)int main(){int n,i;printf("please enter a integer number,n?");scanf("%d",&n);for(i2;i<n-1;i)if(n%i0) break;if(i",n);else printf("%d is a prime number.",n);return 0;}**************…

kernel移植——修改内核的启动logo

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权请告知删除。 参考博客 http://blog.csdn.net/ultraman_hs/article/details/54988168 一、自定义内核启动logo 步骤一&#xff1a;安装工具包 在命令行中输入以下内容 sudo apt-get install netpbm 步骤二&#xff1a;…

编译Ngnix遇到的问题,查看程序依赖的库文件

要点:ldd 可以读取每个可以运行的程序依赖的 so 文件。 编译的时候提示需要Openssl库. 查看本机,已经安装了openssl 查看编译报错文件,查找Openssl所依赖的库 more objs/autoconf.err 查看openssl所依赖的库文件 ldd /usr/bin/openssl ldd –u /usr/bin/openssl objdump -x ob…

[JavaWeb修行之路 Day1] 安装、配置、部署Tomcat

一、相关软件下载 Tomcat下载地址&#xff1a;http://tomcat.apache.org 。选择Tomcat 6或者Tomcat 7。Eclipse下载地址&#xff1a;http://www.eclipse.org/downloads/ 。选择Eclipse IDE for Java EE Developers进行下载。当然&#xff0c;也可以使用MyEclipse&#xff0c;收…

springboot创建parent_理解spring-boot-starter-parent

理解spring-boot-starter-parent通过spring initializr&#xff0c;我们可以快速构建一个springboot应用&#xff0c;如果你选择的是Maven来管理项目&#xff0c;在默认的pom文件中有这么一个section&#xff1a;org.springframework.bootspring-boot-starter-parent2.1.1.RELE…

应用层为何不能设置分辨率

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 5、在应用程序中设置分辨率 &#xff08;1&#xff09;可视分辨率&#xff08;即实际分辨率&#xff09;、虚拟分辨率 &#xff08;2&#xff09;实验及结果 vinfo.xres 1024; …

CI框架--加载静态内容

首先&#xff0c;你需要创建一个可以处理静态内容请求的控制器类。控制器&#xff0c;是一个用来代理完成某项任务的PHP类&#xff0c;它充当基于MVC架构应用程序的“粘合剂”&#xff08;译者注&#xff1a;控制器用来粘合/协调不同模型和视图。随着教程的深入&#xff0c;你会…

java se ee me都是什么意思_Java SE、Java EE、Java ME三者的区别

Java SE、Java EE、Java ME三者的区别1. Java SE(Java Platform&#xff0c;Standard Edition)。Java SE 以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web服务开发的类&#xff0c;并为 Java Platfor…

Vagrant 快速入门

1. Vagrant功能: Vagrant uses Oracle’s VirtualBox to build configurable, lightweight, and portable virtual machines dynamically.. 【Vagrant 使用Oracle VM VirtualBox 动态创建和配置轻量级的&#xff0c;可重现的&#xff0c;便携的虚拟机环境。】 2. Vagrant下载: …

framebuffer驱动详解3——fb驱动分析(具体操作层)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 博文fb驱动框架分析&#xff08;核心层&#xff09;已经对内核驱动维护者编写的fb驱动框架进行讲解。 接下来将对具体的fb驱动文件进行分析。这些驱动文件是驱动工程师要完成的部分。 rootubu…

各种分页存储过程 (转)

在项目中&#xff0c;我们经常遇到或用到分页&#xff0c;那么在大数据量&#xff08;百万级以上&#xff09;下&#xff0c;哪种分页算法效率最优呢&#xff1f;我们不妨用事实说话。 测试环境 硬件&#xff1a;CPU 酷睿双核T5750 内存&#xff1a;2G 软件:Windows server 20…

java连接phpstudy_PHPStudy快速自动搞定所有配置文件

phpStudy 是一个 PHP 调试环境的程序集成包。该程序包集成最新的 ApachePHPMySQLphpMyAdminZendOptimizer, 一次性安装 , 无须配置即可使用 , 是非常方便、好用的 PHP 调试环 境 . 该程序不仅包括 PHP 调试环境 , 还包括了开发工具、开发手册等 . 总之学习 PHP 只需一个包 . 对…

ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?

症状&#xff1a; 类似上面的警告提示&#xff0c;运行程序不会有任何错误&#xff0c;但若干地方都提示警告&#xff0c;并且明明dll的引用都是正确的。 解决方案&#xff1a; 删除&#xff1a;C:\Users\{your computer name}\AppData\Local\Temp\Temporary ASP.NET Files 该目…

framebuffer驱动详解4——framebuffer驱动分析2(probe函数讲解)

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 主要在填充fbdev这个结构体。 二、framebuffer驱动分析2 1、probe函数分析 &#xff08;1&#xff09;struct s3c_platform_fb 这个结构体是fb的platform_data结构体&#xff1…

Zend Framework学习之Zend_Mail

Zend_Mail组件提供了通用化的功能来创建和发送文本。Zend_Mail通过PHP内建的mail()函数或者直接通过SMTP连接来发送邮件。一个简单的邮件由收件人、主题、邮件内容以及发件人等内容组成。步骤如下1.创建对象2.设置邮件内容3.发送案例&#xff1a; <?php require_once "…

XenDesktop 5 SQL Server Mirror事务日志比较大的原因分析

在实施XenDesktop5项目过程中&#xff0c;发现XenDesktop5版本的数据库镜像事务日志很大&#xff0c;在XenDesktop4和XenApp版本中不存在该问题&#xff1b;于是我根据该现象探究XenDesktop5及以上版本镜像数据库事务日志为何如此之大以及我们今后实施的过程中该如何来维护这么…

nanotime java 博客园_System.nanoTime (计时工具类)

转自&#xff1a;http://blog.csdn.net/yuansuruanjian/article/details/8562890JDK1.5之后java中的计时给出了更精确的方法&#xff1a;System.nanoTime()&#xff0c;输出的精度是纳秒级别&#xff0c;这个给一些性能测试提供了更准确的参考。但是这个方法有个需要注意的地方…

input子系统详解1——input子系统简介

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 转载博客&#xff1a;input输入子系统 - 涛少& - 博客园​​​​​​​ 前言 Linux系统支持的输入设备繁多&#xff0c;例如键盘、鼠标、触摸屏、手柄等等&#xff0c;Linux系统是如何管理如此…