【整理】Linux驱动中,probe函数何时被调用

用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 methodsn", 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函数此时被调用。

linux probe函数调用,【整理】Linux驱动中,probe函数何时被调用相关推荐

  1. linux probe函数调用,linux spi设备驱动中probe函数何时被调用

    这两天被设备文件快搞疯了,也怪自己学东西一知半解吧,弄了几天总算能把设备注册理清楚一点点了.就以spi子设备的注册为例总结一下,免得自己忘记. 首先以注册一个spidev的设备为例: static s ...

  2. linux probe函数调用,Linux驱动中probe函数何时被调用?

    关于struct device_driver结构中的probe探测函数的调用 用SourceInsight跟踪: 从driver_register看起,此处我的这里是: int driver_regi ...

  3. linux驱动中probe函数是怎么调用的

    linux驱动的三个概念:设备.驱动.总线 probe何时被调用:在总线上驱动和设备的名字匹配,就会调用驱动的probe函数 probe函数被调用后,系统就调用platform设备的probe函数完成 ...

  4. 关于linux字符驱动中read函数filp->f_pos 和 loff_t *ppos的关系

    在学习linux 字符驱动的时候会有这样的困惑 比如我们实现一个字符驱动的读函数,如下 static ssize_t globalmem_read(struct file *filp, char __ ...

  5. linux程序设计知识点整理,笔试面试中C/C++重要知识点整理

    4.   类与面向对象编程 4.1 类接口与实现的概念: 每个类都定义了一个接口(可以不是很确切的理解为类中访问级别为public的函数为接口)和一个实现.接口由使用该类的代码需要执行的操作组成.实现 ...

  6. linux下mkdir头文件_Linux中mkdir函数与Windows中_mkdir函数的区别

    下面先来给大家介绍windows下_mkdir函数 #include int _mkdir( const char *dirname ); 参数: dirname是目录的路径名指针 返回值: 如果新目 ...

  7. Javascript中匿名函数的多种调用方式

    avascript中定义函数的方式有多种,函数直接量就是其中一种.如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数.好,看看匿名函数的如何被 ...

  8. AsyncTask中各个函数详细的调用过程,初步实现异步任务

     AsyncTask内部类可能会产生内存泄露的问题 解决上述内部类可能引起的内存泄露问题的方法 将AsyncTask或者Thread的子类作为单独的类文件,不持有Activity的强引用 将Async ...

  9. python中可以使用变量来引用函数吗_如何在python语言中使用函数变量并调用函数...

    在python语言中,除了常规变量之外,还有函数变量.把函数本身赋值给变量,这个变量为函数变量. 工具/原料 python pycharm 截图工具 WPS 方法/步骤 1 在已新建的python文件 ...

  10. linux mmc分区_【经验记录】如何给嵌入式Linux的SD/MMC卡驱动中添加多个分区

    How to add multi partition for SD/MMC card in Linux Driver 之所以写这个,是因为,在这个过程中,自己明显感觉到了,做事情一定要有一定的方法,方 ...

最新文章

  1. Could not generate DH keypair 解决方案
  2. Android HttpClient GET或者POST请求基本使用方法
  3. SGS 0.9.7 协议解析
  4. linux find命令格式及find命令详解
  5. JavaSE----基础语法(方法)
  6. Android 点击应用外的Url拉起应用
  7. thinkphp使用问题
  8. stream流_最详细的JDK8新特性————Stream流
  9. zabbix-proxy+cacti+nagios基本安装配置
  10. 暴力解决配置HTTPS后无法使用Hermit
  11. cc2530设计性实验代码八
  12. DirectShow Samples
  13. 下载各版本cuda,下载以前版本的cuda
  14. 请领导批阅文件怎么说_请领导批复文件怎么说
  15. 安装redhat系统步骤图解_用u盘安装redhat图文教程
  16. 深入解析设置磁盘写保护
  17. 一级计算机基础知识考试成绩截图,全国计算机一级考试成绩分析与总结
  18. Z05 - 046、工作流调度实现方式
  19. 银河麒麟操作系统开机进入grub提示符界面
  20. android 关机消息广播,Android开机、关机播音监听

热门文章

  1. 【运维面试】金山科技8月份最新面试题-自动化运维岗位
  2. python中图像的批量处理
  3. 不小心被锁!物联卡锁卡机制与解锁方法,你不准备了解一下?
  4. 扇贝python课程免费_欣赏“旱扇”
  5. java虚拟机收集器_Java虚拟机(JVM)垃圾回收器G1收集器 - Break易站
  6. vmware虚拟化平台虚拟机迁移至H3C CAS虚拟化平台
  7. 基于ssm框架的校园订餐系统设计与实现 毕业设计-附源码270912
  8. android系统平台,Android系统平台 实用小软件推荐
  9. java 用折半查找,java折半查找算法
  10. 【日常】服务器入门补充