linux probe函数调用,【整理】Linux驱动中,probe函数何时被调用
【整理】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函数何时被调用相关推荐
- linux probe函数调用,linux spi设备驱动中probe函数何时被调用
这两天被设备文件快搞疯了,也怪自己学东西一知半解吧,弄了几天总算能把设备注册理清楚一点点了.就以spi子设备的注册为例总结一下,免得自己忘记. 首先以注册一个spidev的设备为例: static s ...
- linux probe函数调用,Linux驱动中probe函数何时被调用?
关于struct device_driver结构中的probe探测函数的调用 用SourceInsight跟踪: 从driver_register看起,此处我的这里是: int driver_regi ...
- linux驱动中probe函数是怎么调用的
linux驱动的三个概念:设备.驱动.总线 probe何时被调用:在总线上驱动和设备的名字匹配,就会调用驱动的probe函数 probe函数被调用后,系统就调用platform设备的probe函数完成 ...
- 关于linux字符驱动中read函数filp->f_pos 和 loff_t *ppos的关系
在学习linux 字符驱动的时候会有这样的困惑 比如我们实现一个字符驱动的读函数,如下 static ssize_t globalmem_read(struct file *filp, char __ ...
- linux程序设计知识点整理,笔试面试中C/C++重要知识点整理
4. 类与面向对象编程 4.1 类接口与实现的概念: 每个类都定义了一个接口(可以不是很确切的理解为类中访问级别为public的函数为接口)和一个实现.接口由使用该类的代码需要执行的操作组成.实现 ...
- linux下mkdir头文件_Linux中mkdir函数与Windows中_mkdir函数的区别
下面先来给大家介绍windows下_mkdir函数 #include int _mkdir( const char *dirname ); 参数: dirname是目录的路径名指针 返回值: 如果新目 ...
- Javascript中匿名函数的多种调用方式
avascript中定义函数的方式有多种,函数直接量就是其中一种.如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数.好,看看匿名函数的如何被 ...
- AsyncTask中各个函数详细的调用过程,初步实现异步任务
AsyncTask内部类可能会产生内存泄露的问题 解决上述内部类可能引起的内存泄露问题的方法 将AsyncTask或者Thread的子类作为单独的类文件,不持有Activity的强引用 将Async ...
- python中可以使用变量来引用函数吗_如何在python语言中使用函数变量并调用函数...
在python语言中,除了常规变量之外,还有函数变量.把函数本身赋值给变量,这个变量为函数变量. 工具/原料 python pycharm 截图工具 WPS 方法/步骤 1 在已新建的python文件 ...
- linux mmc分区_【经验记录】如何给嵌入式Linux的SD/MMC卡驱动中添加多个分区
How to add multi partition for SD/MMC card in Linux Driver 之所以写这个,是因为,在这个过程中,自己明显感觉到了,做事情一定要有一定的方法,方 ...
最新文章
- Could not generate DH keypair 解决方案
- Android HttpClient GET或者POST请求基本使用方法
- SGS 0.9.7 协议解析
- linux find命令格式及find命令详解
- JavaSE----基础语法(方法)
- Android 点击应用外的Url拉起应用
- thinkphp使用问题
- stream流_最详细的JDK8新特性————Stream流
- zabbix-proxy+cacti+nagios基本安装配置
- 暴力解决配置HTTPS后无法使用Hermit
- cc2530设计性实验代码八
- DirectShow Samples
- 下载各版本cuda,下载以前版本的cuda
- 请领导批阅文件怎么说_请领导批复文件怎么说
- 安装redhat系统步骤图解_用u盘安装redhat图文教程
- 深入解析设置磁盘写保护
- 一级计算机基础知识考试成绩截图,全国计算机一级考试成绩分析与总结
- Z05 - 046、工作流调度实现方式
- 银河麒麟操作系统开机进入grub提示符界面
- android 关机消息广播,Android开机、关机播音监听
热门文章
- 【运维面试】金山科技8月份最新面试题-自动化运维岗位
- python中图像的批量处理
- 不小心被锁!物联卡锁卡机制与解锁方法,你不准备了解一下?
- 扇贝python课程免费_欣赏“旱扇”
- java虚拟机收集器_Java虚拟机(JVM)垃圾回收器G1收集器 - Break易站
- vmware虚拟化平台虚拟机迁移至H3C CAS虚拟化平台
- 基于ssm框架的校园订餐系统设计与实现 毕业设计-附源码270912
- android系统平台,Android系统平台 实用小软件推荐
- java 用折半查找,java折半查找算法
- 【日常】服务器入门补充