snail_kernel

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

分析完了linux设备模型的核心实现代码,想小结下挂在总线上的设备和驱动是如何匹配上的。

以平台总线(platform bus)为例:

向系统中注册一个平台设备(platform device)时,需调用:platform_device_register()函数,

该函数会调用相关函数初始化一个设备实例,并将其挂到平台总线上:

int platform_device_register(struct platform_device *pdev)
{
        device_initialize(&pdev->dev);
        arch_setup_pdev_archdata(pdev);
        return platform_device_add(pdev);
 }    

函数device_initialize()便是完成对设备实例的初始化工作,该函数是设备模型核心提供的接口函数。

 

接下来,platform_device_add()将设备挂到平台总线,该函数的实现不算太复杂,其主要功能是:

1、将平台设备和平台总线绑定起来

2、设置设备的名称

3、如果我们在创建一个平台设备时,指定了其需要的“资源”,在该函数中会分配给设备

4、调用函数device_add()将平台设备抽象的“设备”添加到设备容器中

其实,除了第3,第1和第2、以及前面对设备实例的初始化工作,都是为第4点做准备。

 

device_add()的源码较长,其主要是对前面一些已被初始化的参数进行检查、在sys中创建对应的目录以及

一些属性文件、向用户空间发送热插拔事件,最后调用bus_probe_device()为我们注册的设备匹配对应的驱动。

 

前面写了总结了这么多,终于进入主题了——开始设备和驱动的匹配。

将设备和挂在总线上的驱动进行匹配:

void bus_probe_device(struct device *dev)
{
        struct bus_type *bus = dev->bus;
        struct subsys_interface *sif;
        int ret;

        if (!bus)
                return;

        if (bus->p->drivers_autoprobe) {
                ret = device_attach(dev);
                WARN_ON(ret < 0); 
        }   
                                                                                
        mutex_lock(&bus->p->mutex);
        list_for_each_entry(sif, &bus->p->interfaces, node)
                if (sif->add_dev)
                        sif->add_dev(dev, sif);
        mutex_unlock(&bus->p->mutex);
}

 (未完)

 

posted on 2013-08-20 20:06  snail_kernel  阅读(2706)  评论(0)    收藏  举报