最近看到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. Possible MySQL server UUID duplication for server
  2. Qt下的OpenGL 编程(1)Qt下的OpenGL编程必须步骤
  3. 重磅发布 | 2021 年 OpenAtom XuperChain 开源技术路径
  4. 对datatable操作经验-排序和分页
  5. 局部变量-不同函数内的同名局部变量
  6. linux服务器_Linux 服务器为什么被黑?
  7. 【数论】四则运算的取模处理
  8. mysql去掉两个最高分_Excel函数 去掉最高分和最低分取平均值?这个函数不可不知...
  9. 关于HTML5页面与手机虚拟键盘的回车的处理
  10. 计算机内打不开小米路由器,小米路由器登录界面打不开怎么办?
  11. Win11终端管理员打不开解决方法
  12. 【Nav2中文网】三、导航相关概念
  13. Linux连接蓝牙键盘
  14. MySql ocp认证之备份与恢复(四)
  15. 为啥linux识别螃蟹驱动,螃蟹卡 RTL8168 更新驱动解决 BBR 单线程限速
  16. 【数据结构笔记】3.栈和队列
  17. 使用Visio画各种可视化的流程图之基本流程图和跨职能流程图
  18. Mac壁纸软件哪款好用?Wallpaper Wizard可以一试
  19. Playbook的写法讲解
  20. Activity跳转方式

热门文章

  1. Python 实现 GIF 动图以及视频卡通化,两脚踢碎次元壁
  2. eclipse链接mysql数据池配置_Eclipse中配置Tomcat的数据库连接池 | 学步园
  3. Spark常见故障诊断(一)
  4. 什么是mysql的索引_什么是索引?mysql目前索引有哪些?
  5. 信呼协同办公系统在线办公管理系
  6. mBlock机器人组装教程_如何使用Makeblock构造Delta机器人
  7. 3DMAX游戏角色头部建模教程
  8. 【AI大咖】认真认识一代AI教父Hinton
  9. 【linux】centos7下使用LAMP架构实现zabbix 4.0部署
  10. C# EXCEL 根据列内容将原始表格拆分成多个表格