内核添加dts后,device和device_driver的match匹配的变动:通过compatible属性进行匹配【转】...
本文转载自:http://blog.csdn.net/ruanjianruanjianruan/article/details/61622053
内核添加dts后,device和device_driver的match匹配的变动:
先看platform总线:
/driver/base/platform.c文件:
static int platform_match(struct device *dev, struct device_driver *drv)
{
struct platform_device *pdev = to_platform_device(dev);
struct platform_driver *pdrv = to_platform_driver(drv);
/* Attempt an OF style match first */
if (of_driver_match_device(dev, drv))//通过这个OpenFirmware的匹配方式(of就是OpenFirmware的缩写)
return 1;
/* Then try ACPI style match */
if (acpi_driver_match_device(dev, drv))
return 1;
/* Then try to match against the id table */
if (pdrv->id_table)
return platform_match_id(pdrv->id_table, pdev) != NULL;
/* fall-back to driver name match */
return (strcmp(pdev->name, drv->name) == 0);
}
of_driver_match_device这个函数最终调用到__of_match_node()函数,在这个函数里,通过把device_driver的of_match_table(of_device_id结构体的数组)和device里的of_node(device_node结构体)进行匹配,匹配方式是分别比较两者的name、type、和compatible字符串,三者要同时相同(一般name、和type为空,只比较compatible字符串,比较compatible时,是比较整个字符串,不管字符串里的逗号的,直接compare整个字符串)。所以,可以看出,对dts的OpenFirmware device的支持是从最根本的driver-model上支持的,在device和device_driver两者上都加了of_device的成员,也在bus_type的match函数里添加了of_device的匹配语句。所以driver-model的device、device_driver、bus_type都加了支持。
现在内核解析dtb文件,然后创建platform设备时,大部分platform设备是没有名字的,我还纠结那它们怎么和驱动match,原来bus_type的match函数添加了of_driver_match_device()这个匹配方式。他们大部分是通过compatible这个属性匹配成功的(这个compatible也对应dts里的compatible字符串)。
再来看下其他总线的match函数,比如i2c的,也有of_device的匹配方式:
static int i2c_device_match(struct device *dev, struct device_driver *drv)
{
struct i2c_client*client = i2c_verify_client(dev);
struct i2c_driver*driver;
if (!client)
return 0;
/* Attempt an OF style match */
if (of_driver_match_device(dev, drv))
return 1;
/* Then ACPI style match */
if (acpi_driver_match_device(dev, drv))
return 1;
driver = to_i2c_driver(drv);
/* match on an id table if there is one */
if (driver->id_table)
return i2c_match_id(driver->id_table, client) != NULL;
return 0;
}
内核添加dts后,device和device_driver的match匹配的变动:通过compatible属性进行匹配【转】...相关推荐
- 学习笔记——《LINUX设备驱动程序(第三版)》Linux设备模型:内核添加、删除设备、驱动程序
文章目录 1. 前言 2. 准备工作 2.1. 概念 2.2. 具体总线.设备.驱动结构体说明 2.3. 注册总线 3. 添加设备 3.1. STEP1 --发现设备并创建设备结构 struct XX ...
- Linux内核:VFIO Mediated Device(vfio-mdev)内核文档(翻译)
<ARM SMMU原理与IOMMU技术("VT-d" DMA.I/O虚拟化.内存虚拟化)> <提升KVM异构虚拟机启动效率:透传(pass-through).DM ...
- linux3.10修复i2c adapter无法使用dts创建device
i2c adapter device dts 格式: i2c0: i2c@1fe01000{compatible = "loongson,ls-i2c";reg = <0x1 ...
- linux 内核开logo大小,OK6410之Linux2.6.36内核添加logo显示
在OK6410板子启动时并没有显示可爱的小企鹅logo,故进行添加显示并修改成自己喜欢的图片. 配置内核:make meunconfig Device Drivers ---> Graphic ...
- 十天学Linux内核之第九天---向内核添加代码
原文:十天学Linux内核之第九天---向内核添加代码 睡了个好觉,很晚才起,好久没有这么舒服过了,今天的任务不重,所以压力不大,呵呵,现在的天气真的好冷,不过实验室有空调,我还是喜欢待在这里,有一种 ...
- 向linux内核增加新的系统调用,为linux内核添加新的系统调用
为linux内核添加新的系统调用 作者:李志勇 更多精彩: 更多精彩: 开发平台:x86 ubuntu 目标平台:S3C6410 linux3.4.4 一. 打开内核源码目录下arch/arm/ ...
- linux内核添加系统调用(详细)
linux内核添加系统调用(详细) 说在前面: 这是我第五次编译内核,分别踩了很多坑.中途问过wz佬,佬让我用qemu.我还是最后换ubuntu虚拟机跑了.现在已经有点emo了. 这篇博客是我第五次的 ...
- 没有ch341驱动_NVIDIA Jetson TX2内核添加串口驱动
NVIDIA Jetson TX2内核添加串口驱动 2018年02月04日 17:26:39 BumBleBee009 阅读数:2419 转载博客:http://blog.csdn.net/gzj20 ...
- addroutes刷新_vue 解决addRoutes动态添加路由后刷新失效问题
前言 某些场景下我们需要利用addRoutes动态添加路由,但是刷新后就会失效,前段时间项目里刚好遇到了这个应用场景,所以就花时间研究了一下,做下分享跟记录,说的不对的地方,请大家指正. 应用场景:用 ...
最新文章
- 数字高程模型DEM和构建学习1
- spring源码分析之freemarker整合
- linux 7.0查看防火墙状态,centos7查看防火墙状态
- public protect private继承
- Kali渗透测试——WOL-E
- php输出语句中怎么嵌套计算,PHP嵌套输出缓冲代码实例
- kettle使用记录
- Android学习导航线路
- java反编译能拿到源码吗_大牛带你解读Spring源码,编写自定义标签,您能学会吗?
- 简单使用WPE进行网页嗅探
- python 实时取色器3.0(升级版)【内附源码】
- 对接腾讯广告平台系统开发(半自动化广告投放系统)
- 电信无限流量卡为什么无服务器,为什么移动、联通、电信4G无限流量卡都必须限速,怎么回事?...
- SpringBoot邮件发送
- idea git输错密码的处理 win10
- spring 中使用tdd_通过JavaScript中基于属性的TDD的钻石方块
- C# *未能找到类型“ * ”,请确保已引用包含此类型的程序集。如果此类型为开发项目的一部分,请确保已使用针对当前平台或任意 CPU 的设置成功生成该项目
- VScode常用插件下载
- 怎么样matlab做玫瑰花,Matlab画的玫瑰花
- 全国计算机一级WORD第三套,全国计算机等级考试一级WPSOffice练习题及答案第三套.docx...