zoukankan      html  css  js  c++  java
  • 【整理】Linux驱动中,probe函数何时被调用

    声明:以下主要内容参考自:
    关于struct device_driver结构中的probe探测函数的调用
    http://blog.chinaunix.net/u2/71164/showart.php?id=1361188
    
    用SourceInsight跟踪:
    从driver_register看起,此处我的这里是:
    int driver_register(struct device_driver * drv)
    {
    if ((drv->bus->probe && drv->probe) ||
         (drv->bus->remove && drv->remove) ||
         (drv->bus->shutdown && drv->shutdown)) {
       printk(KERN_WARNING "Driver '%s' needs updating - please use bus_type methods\n", drv->name);
    }
    klist_init(&drv->klist_devices, NULL, NULL);
    return bus_add_driver(drv);
    }
    
    klist_init不相关,不用管他,具体再去看bus_add_driver:
    
    int bus_add_driver(struct device_driver *drv)
    {
    1.先kobject_set_name(&drv->kobj, "%s", drv->name);
    2.再kobject_register(&drv->kobj)
    3.然后调用了:driver_attach(drv)
    }
    
    
    int driver_attach(struct device_driver * drv)
    {
    return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
    }
    
    真正起作用的是__driver_attach:
    
    static int __driver_attach(struct device * dev, void * data)
    {
    。。。
    if (!dev->driver)
       driver_probe_device(drv, dev);
    。。。
    }
    
    
    int driver_probe_device(struct device_driver * drv, struct device * dev)
    {
    。。。
    //1.先是判断bus是否match:
    if (drv->bus->match && !drv->bus->match(dev, drv))
       goto done;
    //2.再具体执行probe:
    ret = really_probe(dev, drv);
    。。。
    }
    
    really_probe才是我们要找的函数:
    static int really_probe(struct device *dev, struct device_driver *drv)
    {
    。。。
    //1.先是调用的驱动所属总线的probe函数:
    if (dev->bus->probe) {
       ret = dev->bus->probe(dev);
       if (ret)
        goto probe_failed;
    
    } else if (drv->probe) {
    //2.再调用你的驱动中的probe函数:
       ret = drv->probe(dev);
       if (ret)
        goto probe_failed;
    }
    。。。
    }
    
    其中,drv->probe(dev),才是真正调用你的驱动实现的具体的probe函数。
    也就是对应此文标题所问的,probe函数此时被调用。


  • 相关阅读:
    Python语言程序设计基础(3)—— 基本数据类型
    Python语言程序设计基础(2)—— Python程序实例解析
    Python语言程序设计基础(1)—— 程序设计基本方法
    Codeforces Round #513
    Codeforces Round #514 (Div. 2)
    面试必备:Java 原子操作的实现原理[精品长文]
    最常见的Java面试题及答案汇总(一)
    Java面试题大汇总(附答案)
    Java快速排序和归并排序详解
    Java面试官最常问的volatile关键字
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124317.html
Copyright © 2011-2022 走看看