platform_device 与 platform_driver 是如何匹配的?
我们知道 platform_device 注册到内核以后,当我们每注册一个 platform_driver 时,它们就会两两确定是否能够匹配,如果能够配对成功,就会调用 platform_driver 的 probe() 函数。
platform_device 是怎么来的呢?一般有三种来源
1、从设备树的某些节点转换而来 (具体哪些节点才能够转换呢?请参考下一篇)
2、平台厂商注册而来,比如 TI 的 gpio 子系统的实现方式,其他厂商也类似。
linux-4.9/arch/arm/mach-omap2/gpio.c ( platform_device 的注册 )
linux-4.9/drivers/gpio/gpio-omap.c ( platform_driver 的注册 )
这样才有了各个平台都可以在 使用 gpio 子系统的函数API gpio_set_value() 等
3、自己写的平台设备,比如板子需要在总线上扩展两个网卡,这时候就需要自己完成 platform_device 的描述
我们先来看看 内核对设备树的处理流程
① dts在PC机上被编译为dtb文件;
② u-boot把dtb文件传给内核;
③ 内核解析dtb文件,把每一个节点都转换为 device_node 结构体;
④ 对于某些 device_node 结构体,会被转换为 platform_device 结构体。
dtb中的每一个节点都会被转化成 device_node 结构体
那到底哪些 设备节点 最终会被转换成 platform_device 呢?
A. 根节点 下含有compatile属性的子节点 ( 1级子节点 )
B. 含有 特定compatile 属性的节点的子节点 ( 2级子节点)
如果一个节点的compatile属性,它的值是这4者之一:”simple-bus”,”simple-mfd”,”isa”,”arm,amba-bus”,
那么它的子结点(需含compatile属性)也可以转换为 platform_device 。
/ { mytest { compatile = "mytest", "simple-bus"; mytest@0 { compatile = "mytest_0"; }; }; }
/mytest 节点因为含有 compatile 属性,会被转化为 platform_device
/mytest/mytest@0 节点有 compatile 属性,且父节点兼容 "simple-bus" 属性,也会被转化为 platform_device.
一般2级子节点是不会转化为 platform_device 的,”simple-bus” 是专门为开发者创造的,如果你想让你添加的 2级子节点转化为 platform_device ,就可以添加这个属性。
C. 总线I2C、SPI节点下的子节点:不转换为platform_device
某个总线下到子节点,应该交给对应的总线驱动程序来处理, 它们不应该被转换为platform_device
/ { i2c { compatile = "samsung,i2c"; at24c02 { compatile = "at24c02"; }; }; spi { compatile = "samsung,spi"; flash@0 { compatible = "winbond,w25q32dw"; spi-max-frequency = <25000000>; reg = <0>; }; }; };
/i2c节点一般表示i2c控制器, 它会被转换为platform_device, 在内核中有对应的platform_driver;
/i2c/at24c02节点不会被转换为platform_device, 它被如何处理完全由父节点的platform_driver决定, 一般是被创建为一个i2c_client。
类似的也有/spi节点, 它一般也是用来表示SPI控制器, 它会被转换为platform_device, 在内核中有对应的platform_driver; /spi/flash@0节点不会被转换为platform_device, 它被如何处理完全由父节点的platform_driver决定, 一般是被创建为一个spi_device。
怎么转换为platform_device
内核处理设备树的函数调用过程,这里不去分析;我们只需要得到如下结论:
A. platform_device中含有resource数组, 它来自 device_node 的 reg, interrupts 属性;
B. platform_device->dev->of_node 指向 device_node, 可以通过它获得其他属 性
platform_device如何与platform_driver 匹配呢?
我们知道 platform_device 注册到内核以后,当我们每注册一个 platform_driver 时,它们就会两两确定是否能够匹配,如果能够配对成功,就会调用 platform_driver 的 probe() 函数。
匹配规则如下 :
最先比较:是否强制选择某个driver
比较platform_device. driver_override和platform_driver.driver.name
可以设置platform_device的driver_override,强制选择某个platform_driver。
然后比较:设备树信息
比较:platform_device. dev.of_node和platform_driver.driver.of_match_table。
由设备树节点转换得来的platform_device中,含有一个结构体:of_node。
它的类型如下:
如果一个platform_driver支持设备树,它的platform_driver.driver.of_match_table是一个数组,类型如下:
使用设备树信息来判断dev和drv是否配对时,判断的顺序为 compatile --> type --> name ,其中要是有一个判断成功,则返回成功。
接下来比较:platform_device_id
比较platform_device. name和platform_driver.id_table[i].name,id_table中可能有多项。
platform_driver.id_table是“platform_device_id”指针,表示该drv支持若干个device,它里面列出了各个device的{.name, .driver_data},其中的“name”表示该drv支持的设备的名字,driver_data是些提供给该device的私有数据。
最后比较:platform_device.name 和 platform_driver.driver.name
platform_driver.id_table可能为空,
这时可以根据platform_driver.driver.name来寻找同名的platform_device。
一个图概括所有的配对过程
Reference : https://book.100ask.org/source/chapterfive/ELADCMSecondEditionChapterFive.html#id87
platform_device 与 platform_driver 是如何匹配的?相关推荐
- 关于platform_device和platform_driver的匹配
说句老实话,我不太喜欢现在Linux 2.6这套bus, platform, device,device driver 的模式.我觉得这种模式破坏了Linux的"简单就是美"的哲学 ...
- 内核驱动中常见的miscdevice、platform_device、platform_driver
最近在看驱动模型,是越看越糊涂,以前接触比较多的都是一些字符驱动,对字符驱动的框架有一定的了解.后来因为想在驱动中实现设备文件的创建,又了解了一下,sysfs文件系统和udev设备文件系统,必然就涉及 ...
- platform_device与platform_driver
做Linux方面也有三个多月了,对代码中的有些结构一直不是很明白,比如platform_device与platform_driver一直分不清关系.在网上搜了下,做个总结.两者的工作顺序是先定义pla ...
- Linux内核平台设备驱动模型platform_device和platform_driver框架
关于Linux平台设备驱动模型,并不是创建新的设备分类,是在原有的字符设备基础上使用,将设备和驱动分开,生成两个.ko文件. Linux内核维护一个全局设备链表,对应的总线会将驱动和设 ...
- linux resouce,platform_device和platform_driver驱动的关系
Author: taoyuetao Email: tao_yuetao@yahoo.com.cn Blog: http://www.eetop.cn/blog/?11145 2006-11-21 == ...
- platform_device和platform_driver的注册过程,及probe函数何时调用的分析
转载于http://blog.chinaunix.net/uid-7828352-id-3833188.html 参考资料:http://blog.csdn.net/xiafeng1113/artic ...
- platform设备驱动全透析
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://21cnbao.blog.51cto.com/109393/337609 1.1 ...
- Linux platform总线(1):总体框架
PlatForm设备驱动: 一.platform总线.设备与驱动 1.一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI.USB.I2 C.SPI等的设备而言,这自然不是问 ...
- Linux 设备驱动开发 —— platform 设备驱动
一.platform总线.设备与驱动 在Linux 2.6 的设备驱动模型中,关心总线.设备和驱动3个实体,总线将设备和驱动绑定.在系统每注册一个设备的时候,会寻找与之匹配的驱动:相反 ...
最新文章
- egg.js ajax上传文件,上传图片功能不会使用
- 对F-score的理解
- java中常用的并发工具类
- HashSet.contains
- java threadstatus_Thread之一:线程生命周期及六种状态
- 设置ORACLE_HOME环境变量
- Android PullTorefreshScrollview回到顶部
- # 20155337 2016-2017-2 《Java程序设计》第十周学习总结
- java 确定对象的引用_JVM学习笔记之了解对象存活判断和4种引用【三】
- python简介pdf_Python以及QuTip包简介.PDF
- 材料界的魔术师:值得关注的10家超材料创业公司
- c#模板保存并读取.mdl文件
- 狂团KtAdmin框架正式免费开源发布,助力独立版SAAS系统快速开发
- c# 使用正则表达式 提取章节小说正文全本篇
- 部分国家人均GDP和生活满意度可视化
- 5G可以让万人演唱会中人人有网上?有它就行 1
- 木讷的程序员需要知道的事情 (四)
- Vue-组件自定义事件
- 相亲角、地摊,暗访小县城的夜市
- 根据图片快速设置IDEA启动的Banner效果