前篇博客链接:http://blog.csdn.net/xuan_h/article/details/38519975
上篇博文说到了mtkfb_probe函数,本文在说mtkfb_probe函数之前。我还是打算在从应用程序的调用开始分析下具体的调用过程。这是我们理解驱动框架的核心,而并不是简单的接受。
一、驱动核心Fbmem.c(alps\kernel\drivers\video\Fbmem.c)分析
下面先摘取一部分源码,源码包括:入口函数、fb_fops、fb_fops中的open函数。用户调用open函数打开lcd时,会调用到这里的fb_open函数,我们待会就从这个函数开始分析下流程。
static int fb_open(struct inode *inode, struct file *file)
__acquires(&info->lock)
__releases(&info->lock)
{
int fbidx = iminor(inode); //获得次设备号
struct fb_info *info;
int res = 0;
info = get_fb_info(fbidx); //根据次设备号获得fb_info结构体
if (!info) {
request_module("fb%d", fbidx);
info = get_fb_info(fbidx);
if (!info)
return -ENODEV;
}
if (IS_ERR(info))
return PTR_ERR(info);
mutex_lock(&info->lock);
if (!try_module_get(info->fbops->owner)) {
res = -ENODEV;
goto out;
}
file->private_data = info;
if (info->fbops->fb_open) {
res = info->fbops->fb_open(file,info,1);
if (res)
module_put(info->fbops->owner);
}
#ifdef CONFIG_FB_DEFER