本文转载自: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属性进行匹配【转】...相关推荐

  1. 学习笔记——《LINUX设备驱动程序(第三版)》Linux设备模型:内核添加、删除设备、驱动程序

    文章目录 1. 前言 2. 准备工作 2.1. 概念 2.2. 具体总线.设备.驱动结构体说明 2.3. 注册总线 3. 添加设备 3.1. STEP1 --发现设备并创建设备结构 struct XX ...

  2. Linux内核:VFIO Mediated Device(vfio-mdev)内核文档(翻译)

    <ARM SMMU原理与IOMMU技术("VT-d" DMA.I/O虚拟化.内存虚拟化)> <提升KVM异构虚拟机启动效率:透传(pass-through).DM ...

  3. linux3.10修复i2c adapter无法使用dts创建device

    i2c adapter device dts 格式: i2c0: i2c@1fe01000{compatible = "loongson,ls-i2c";reg = <0x1 ...

  4. linux 内核开logo大小,OK6410之Linux2.6.36内核添加logo显示

    在OK6410板子启动时并没有显示可爱的小企鹅logo,故进行添加显示并修改成自己喜欢的图片. 配置内核:make meunconfig Device Drivers  ---> Graphic ...

  5. 十天学Linux内核之第九天---向内核添加代码

    原文:十天学Linux内核之第九天---向内核添加代码 睡了个好觉,很晚才起,好久没有这么舒服过了,今天的任务不重,所以压力不大,呵呵,现在的天气真的好冷,不过实验室有空调,我还是喜欢待在这里,有一种 ...

  6. 向linux内核增加新的系统调用,为linux内核添加新的系统调用

    为linux内核添加新的系统调用 作者:李志勇 更多精彩: 更多精彩: 开发平台:x86 ubuntu 目标平台:S3C6410 linux3.4.4 一.    打开内核源码目录下arch/arm/ ...

  7. linux内核添加系统调用(详细)

    linux内核添加系统调用(详细) 说在前面: 这是我第五次编译内核,分别踩了很多坑.中途问过wz佬,佬让我用qemu.我还是最后换ubuntu虚拟机跑了.现在已经有点emo了. 这篇博客是我第五次的 ...

  8. 没有ch341驱动_NVIDIA Jetson TX2内核添加串口驱动

    NVIDIA Jetson TX2内核添加串口驱动 2018年02月04日 17:26:39 BumBleBee009 阅读数:2419 转载博客:http://blog.csdn.net/gzj20 ...

  9. addroutes刷新_vue 解决addRoutes动态添加路由后刷新失效问题

    前言 某些场景下我们需要利用addRoutes动态添加路由,但是刷新后就会失效,前段时间项目里刚好遇到了这个应用场景,所以就花时间研究了一下,做下分享跟记录,说的不对的地方,请大家指正. 应用场景:用 ...

最新文章

  1. 数字高程模型DEM和构建学习1
  2. spring源码分析之freemarker整合
  3. linux 7.0查看防火墙状态,centos7查看防火墙状态
  4. public protect private继承
  5. Kali渗透测试——WOL-E
  6. php输出语句中怎么嵌套计算,PHP嵌套输出缓冲代码实例
  7. kettle使用记录
  8. Android学习导航线路
  9. java反编译能拿到源码吗_大牛带你解读Spring源码,编写自定义标签,您能学会吗?
  10. 简单使用WPE进行网页嗅探
  11. python 实时取色器3.0(升级版)【内附源码】
  12. 对接腾讯广告平台系统开发(半自动化广告投放系统)
  13. 电信无限流量卡为什么无服务器,为什么移动、联通、电信4G无限流量卡都必须限速,怎么回事?...
  14. SpringBoot邮件发送
  15. idea git输错密码的处理 win10
  16. spring 中使用tdd_通过JavaScript中基于属性的TDD的钻石方块
  17. C# *未能找到类型“ * ”,请确保已引用包含此类型的程序集。如果此类型为开发项目的一部分,请确保已使用针对当前平台或任意 CPU 的设置成功生成该项目
  18. VScode常用插件下载
  19. 怎么样matlab做玫瑰花,Matlab画的玫瑰花
  20. 全国计算机一级WORD第三套,全国计算机等级考试一级WPSOffice练习题及答案第三套.docx...

热门文章

  1. 十大开源的.NET用户界面框架 让GUI设计不再犯难
  2. 【Open Search产品评测】-- 淘点点:基于OpenSearch,轻松实现一整套O2O类
  3. Chrome插件开发进阶
  4. Oracle技术之和分区表相关的一点总结(三)
  5. perl 发送邮件脚本
  6. RAC修改数据库的spfile位置
  7. [LeetCode]题解(python):153-Find Minimum in Rotated Sorted Array
  8. 使用selector修改TextView中字体的颜色
  9. mysql winxp 本地 10061 错误
  10. 经典mysql 语句收录