[笔记分享] [OS] Linux设备模型之驱动注册

来源:互联网 发布:湖北地税软件下载 编辑:程序博客网 时间:2024/06/03 21:46

Platform: msm8x60
Kernel: 2.6

overview

这一章我们说下驱动是如何注册的。用platform上的的msm framebuffer platform_driver来举例,源文件为msm_fb.c。platform_driver结构如下:
这里写图片描述

msm_fb_driver会在platform_driver_register()会被调用到,如下:
这里写图片描述

那么msm_fb_init()又是在哪被调用到的呢,请看下一节。


驱动初始化

int __init msm_fb_init(void)看这函数之后有module_init(msm_fb_init);这句初始化在上一篇文章提到过如何调用到了,和msm8x60_init()调用原理是一样的。直接看platform_driver_register()这个函数是怎么注册驱动的。


驱动注册

分析了初始化流程之后,我们在从platform_driver_register()函数来追代码,定义在drivers/base/ platform.c中,代码如下:
这里写图片描述
代码中, driver.bus设置成platform_bus_type这个很重要,因为driver和device是通过bus联系在一起的,具体在本例中是通过platform_bus_type中注册的回调函数和属性来是实现的。下面就分析driver_register()。
driver_register()代码:
这里写图片描述
代码中:
1.driver_find()用来查找相应的driver是不是被注册过,如果是,那么直接返回错误。
2.bus_add_driver()将driver添加到platform_bus上,完成其他主要大部分工作。

driver_find()代码如下:
这里写图片描述

bus_add_driver()代码如下:
这里写图片描述

bus_add_driver()中,
1. 首先进行一些初始化工作,将driver作为kobject添加到/sys/bus/platform/driver目录下,通过kobject_init_and_add()实现,kobject_init_and_add()其实就是kobject_init()和kobject_add()的结合。
2. driver_attach()用来使设备和驱动进行匹配,如果没匹配成功,那么就返回,下面会讲述。
3. 一旦匹配成功之后,驱动相关的属性就会被建立起来,如driver_create_file()、driver_add_atts()等,还会被加到驱动列表中,如klist_add_tail()。

kobject_init_and_add()代码:
这里写图片描述

driver_attach()代码:
这里写图片描述

好了,又看到了一个bus_for_each_dev(),上一篇文章的函数是bus_for_each_drv(),也就是前者是driver找device,后者是device找driver。其实都是为了匹配两者而调用了__driver_attach()这个函数。关于__driver_attach()我们在上一章已经描述过了,是通过device和driver的name来进行简单匹配的,这里就能匹配成功了,因为我们之前已经注册了device。

driver_create_file()代码:
这里写图片描述

driver_add_atts()代码:
这里写图片描述

至此,我们的驱动和设备匹配完成,在/sys下也建立起相应的目录和属性文件。最后一点要注意的是内核通过kobject_uevent()来通知上层应用程序有添加、删除设备或驱动事件产生,而上层往往有个应用程序(udev)来用来监测(netlink方式)是否有事件产生,然后根据得到相关属性(主要是主次设备号)来决定是否在/dev目录下建立设备文件。
流程如下:
这里写图片描述

原创粉丝点击