最近看到linux的设备驱动模型,关于Kobject、Kset等还不是很清淅。看到了struct device_driver这个结构时,想到一个问题:它的初始化函数到底在哪里调用呢?以前搞PCI驱动时用pci驱动注册函数就可以调用它,搞s3c2410驱动时只要在mach-smdk2410.c中的struct platform_device *smdk2410_devices {}中加入设备也会调用。但从来就没有想过具体的驱动注册并调用probe的过程。

于是打开SourceInsight追踪了一下:

从driver_register看起:

int driver_register(struct device_driver * drv)

{

klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put);

init_completion(&drv->unloaded);

return bus_add_driver(drv);

}

klist_init与init_completion没去管它,可能是2.6的这个设备模型要做的一些工作。直觉告诉我要去bus_add_driver。

bus_add_driver中:

都是些Kobject 与 klist 、attr等。还是与设备模型有关的。但是其中有一句:

driver_attach(drv);

单听名字就很像:

void driver_attach(struct device_driver * drv)

{

bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);

}

这个熟悉,遍历总线上的设备并设用__driver_attach。

在__driver_attach中又主要是这样:

driver_probe_device(drv, dev);

跑到driver_probe_device中去看看:

有一段很重要:

if (drv->bus->match && !drv->bus->match(dev, drv))

goto Done;

明显,是调用的驱动的总线上的match函数。如果返回1,则可以继续,否则就Done了。

继承执行的话:

if (drv->probe) {

ret = drv->probe(dev);

if (ret) {

dev->driver = NULL;

goto ProbeFailed;

}

只要probe存在则调用之。至此就完成了probe的调用。

这个过程链的关键还是在drv->bus->match ,因为其余的地方出错的话就是注册失败,而只要注册不失败且match返回1,那么就铁定会调用驱程的probe了。你可以注册一个总线类型和总线,并在match中总是返回 1, 会发现,只要struct device_driver中的bus类型正确时,probe函数总是被调用.

PCI设备有自己的总线模型,估计在它的match中就有一个判断的条件。

static int pci_bus_match(struct device *dev, struct device_driver *drv)

{

struct pci_dev *pci_dev = to_pci_dev(dev);

struct pci_driver *pci_drv = to_pci_driver(drv);

const struct pci_device_id *found_id;

found_id = pci_match_device(pci_drv, pci_dev);

if (found_id)

return 1;

return 0;

}

再往下跟踪就知道主要是根据我们熟悉的id_table来的。

linux驱动模块probe,linux 驱动之 probe 调用相关推荐

  1. linux编写gpio驱动程序,linux driver ------ GPIO的驱动编写和调用

    判断哪些文件被编译进内核: 1.通过 make menuconfig 查看 2.比如查看gpio类型的文件,输入 ls drivers/gpio/*.o,有生成.o文件表示被编译进内核 在编写驱动程序 ...

  2. linux驱动模块makefile,linux驱动makefile求解

    下面是一个网卡驱动的makefile,有很多地方不懂,拿出来和大家一起分析一下: CURRENT= $(shell uname -r) TARGET= asix OBJS= asix.o MDIR=  ...

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

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

  4. linux 设备驱动 probe,linux 驱动之 probe 调用

    最近看到linux的设备驱动模型,关于Kobject.Kset等还不是很清淅.看到了struct device_driver这个结构时,想到一个问题:它的初始化函数到底在哪里调用呢?以前搞PCI驱动时 ...

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

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

  6. linux 设备驱动 probe,Linux驱动模型Probe解惑

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 问题 首先来回顾下,Linux设备驱动模型中bus.device和driver三者的关系:bus是物理总线的抽象. de ...

  7. linux usb驱动 probe,linux USB设备驱动之2:usb设备的probe全过程

    本文将详细讲述2.6.22下的一个USB设备插上linux系统的PC后是如何一步一步调到我们的usb设备驱动的probe函数的,我们知道我们的USB驱动的probe函数中的一个参数是interface ...

  8. Linux下的硬件驱动——USB设备(下)

    Linux下的硬件驱动--USB设备(下)(驱动开发部分) 文档选项 打印本页 将此页作为电子邮件发送 未显示需要 JavaScript 的文档选项 级别: 初级 赵明, 联想软件设计中心嵌入式研发处 ...

  9. Linux之Platform设备驱动

    目录 一.Linux 设备驱动分层和分离 1.设备驱动的分层思想 2.主机驱动和外设驱动分离思想 二.Platform 平台驱动模型 1.platform 设备 2.platform 驱动 3.pla ...

最新文章

  1. nvm-windows安装和配置
  2. 解决ifconfig命令未找到
  3. gcc工具链查看默认编译选项
  4. 链表c语言stl,C++STL之List容器
  5. 一、crontab 定时任务
  6. 【P000-008】交易费计算系统,1.1版
  7. windows远程Linux
  8. 一种语音识别的自动控制系统及方法与流程
  9. 2019第十届蓝桥杯B组C++省赛E题迷宫--BFS(倒搜)
  10. 逻辑回归与线性回归的区别与联系
  11. C# Log4Net简单使用方法
  12. (附源码)计算机毕业设计ssm-高校科研信息管理系统
  13. Carhart四因子模型实用攻略
  14. 优秀宝宝都有的6个特点
  15. python notify wait_Python中的threading
  16. 每天学点clickhouse
  17. 爬山算法改进粒子群求解测试测试函数shubert,测试函数的100种优化方法之14
  18. 打捞“世越号” 我国“钢梁托底”技术显实力
  19. docker部署apache服务(使用存储卷)
  20. windows系统文件名不能包含哪些字符

热门文章

  1. centos7盘符 linux_centos7 盘符变动 绑定槽位
  2. 传输层TCP/UDP的一些疑问
  3. xp计算机管理下的服务显示不出来,使用打印机出现无法打印XP电脑中后台程序服务没有运行修复...
  4. shopee店铺如何做好定位—扬帆际海
  5. ssh输入正确的密码不能登录报错:pam_tally2(sshd:auth):/var/log/tallylog is either world writable or not normal
  6. 树莓派gpio readall命令出错
  7. python graphql_详解Python Graphql
  8. 微信公众号 语音转文字api_文字一键转语音,无需安装任何软件
  9. 这款相见恨晚的开源问卷系统,我粉了
  10. 机甲大师s1 python_大疆机甲大师S1,可视化模块编程机器人