linux驱动模块probe,linux 驱动之 probe 调用
最近看到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 调用相关推荐
- linux编写gpio驱动程序,linux driver ------ GPIO的驱动编写和调用
判断哪些文件被编译进内核: 1.通过 make menuconfig 查看 2.比如查看gpio类型的文件,输入 ls drivers/gpio/*.o,有生成.o文件表示被编译进内核 在编写驱动程序 ...
- linux驱动模块makefile,linux驱动makefile求解
下面是一个网卡驱动的makefile,有很多地方不懂,拿出来和大家一起分析一下: CURRENT= $(shell uname -r) TARGET= asix OBJS= asix.o MDIR= ...
- linux驱动中probe函数是怎么调用的
linux驱动的三个概念:设备.驱动.总线 probe何时被调用:在总线上驱动和设备的名字匹配,就会调用驱动的probe函数 probe函数被调用后,系统就调用platform设备的probe函数完成 ...
- linux 设备驱动 probe,linux 驱动之 probe 调用
最近看到linux的设备驱动模型,关于Kobject.Kset等还不是很清淅.看到了struct device_driver这个结构时,想到一个问题:它的初始化函数到底在哪里调用呢?以前搞PCI驱动时 ...
- linux probe函数调用,linux spi设备驱动中probe函数何时被调用
这两天被设备文件快搞疯了,也怪自己学东西一知半解吧,弄了几天总算能把设备注册理清楚一点点了.就以spi子设备的注册为例总结一下,免得自己忘记. 首先以注册一个spidev的设备为例: static s ...
- linux 设备驱动 probe,Linux驱动模型Probe解惑
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 问题 首先来回顾下,Linux设备驱动模型中bus.device和driver三者的关系:bus是物理总线的抽象. de ...
- linux usb驱动 probe,linux USB设备驱动之2:usb设备的probe全过程
本文将详细讲述2.6.22下的一个USB设备插上linux系统的PC后是如何一步一步调到我们的usb设备驱动的probe函数的,我们知道我们的USB驱动的probe函数中的一个参数是interface ...
- Linux下的硬件驱动——USB设备(下)
Linux下的硬件驱动--USB设备(下)(驱动开发部分) 文档选项 打印本页 将此页作为电子邮件发送 未显示需要 JavaScript 的文档选项 级别: 初级 赵明, 联想软件设计中心嵌入式研发处 ...
- Linux之Platform设备驱动
目录 一.Linux 设备驱动分层和分离 1.设备驱动的分层思想 2.主机驱动和外设驱动分离思想 二.Platform 平台驱动模型 1.platform 设备 2.platform 驱动 3.pla ...
最新文章
- nvm-windows安装和配置
- 解决ifconfig命令未找到
- gcc工具链查看默认编译选项
- 链表c语言stl,C++STL之List容器
- 一、crontab 定时任务
- 【P000-008】交易费计算系统,1.1版
- windows远程Linux
- 一种语音识别的自动控制系统及方法与流程
- 2019第十届蓝桥杯B组C++省赛E题迷宫--BFS(倒搜)
- 逻辑回归与线性回归的区别与联系
- C# Log4Net简单使用方法
- (附源码)计算机毕业设计ssm-高校科研信息管理系统
- Carhart四因子模型实用攻略
- 优秀宝宝都有的6个特点
- python notify wait_Python中的threading
- 每天学点clickhouse
- 爬山算法改进粒子群求解测试测试函数shubert,测试函数的100种优化方法之14
- 打捞“世越号” 我国“钢梁托底”技术显实力
- docker部署apache服务(使用存储卷)
- windows系统文件名不能包含哪些字符
热门文章
- centos7盘符 linux_centos7 盘符变动 绑定槽位
- 传输层TCP/UDP的一些疑问
- xp计算机管理下的服务显示不出来,使用打印机出现无法打印XP电脑中后台程序服务没有运行修复...
- shopee店铺如何做好定位—扬帆际海
- ssh输入正确的密码不能登录报错:pam_tally2(sshd:auth):/var/log/tallylog is either world writable or not normal
- 树莓派gpio readall命令出错
- python graphql_详解Python Graphql
- 微信公众号 语音转文字api_文字一键转语音,无需安装任何软件
- 这款相见恨晚的开源问卷系统,我粉了
- 机甲大师s1 python_大疆机甲大师S1,可视化模块编程机器人