两个节点之间的设备树依赖关系

2024-02-13

我有两个设备树节点,一个设置 GPIO 引脚,另一个配置一个 i2c 总线,例如:

&gpio2 {
  en-gpio {
    gpio-hog;
    gpios = <5 0>;
    output-high;
  };
};

&i2c1 {
  gpiom1: gpio@27 {
    compatible = "microchip,mcp23008";
    gpio-controller;
    #gpio-cells = <2>;
    reg = <0x27>;
  };
};

如何在 i2c 节点和 GPIO 节点之间添加依赖关系? 我想要实现的是,应该在初始化 i2c 上的设备之前设置 GPIO 引脚。


简短回答

在这种情况下,您无法提供节点之间的依赖关系。但很可能在您的情况下已经考虑了正确的顺序,并且 GPIO 引脚将在 I2C 设备初始化之前设置,这要归功于早期用于 GPIO 控制器驱动程序的 initcall,并且因为gpio-hog用来。如果您想检查一下您的平台以确定 - 以下是详细信息。

节点关系

如中所述设备树 II:较难的部分 https://lwn.net/Articles/573409/LWN 文章:

当然,在每种情况下,提供中断或 GPIO 的设备都需要在被发现和使用之前进行初始化。在没有很多内核版本之前,这是一个真正的问题。然而,在 3.4 内核中,驱动程序获得了初始化的能力(或probe) 返回错误的例程EPROBE_DEFER这将导致稍后再次尝试初始化。因此,如果驱动程序发现设备树中列出了 GPIO 线,但还没有驱动程序为目标节点注册了 GPIO,则它可能会失败EPROBE_DEFER并知道它可以稍后再试。这甚至可以用来消除对回调和板文件中延迟注册的需要,但这对于 devicetree 来说确实很重要,而且令人高兴的是它工作得很好。

唉,在您的情况下,可能无法指定节点之间的依赖关系,因此您的i2c1 or gpiom1依赖于取决于gpio2。至少我没有看到任何gpiosI2C 控制器或 GPIO 控制器的属性Documentation/devicetree/bindings/,可用于参考您的en-gpio。所以看来你应该依赖驱动程序的加载顺序。

驱动程序依赖

驱动程序之间有两种可能的依赖关系:

  1. 如果司机是built-in(内核映像内部):驱动程序可以在不同的位置初始化初始化调用 https://0xax.gitbooks.io/linux-insides/content/Concepts/linux-cpu-3.html,从而以正确的顺序加载
  2. 如果司机是loadable (.ko文件):驱动程序可以具有在内核构建系统中定义的依赖项

由于您没有提及您的平台,让我们看看它如何使用 BeagleBone Black board 来工作。您可以使用它作为模板来了解它在您的平台上是如何完成的。

静态依赖

让我们检查一下驱动程序的初始化顺序:

  1. From am33xx-l4.dtsi file we can see that:
    • GPIO 控制器:compatible = "ti,omap4-gpio"
    • I2C控制器:compatible = "ti,omap4-i2c"
    • I2C设备:compatible = "microchip,mcp23008"
  2. Corresponding drivers for those compatible strings are:
    • GPIO 控制器:drivers/gpio/gpio-omap.c
    • I2C控制器:drivers/i2c/busses/i2c-omap.c
    • I2C设备:drivers/pinctrl/pinctrl-mcp23s08.c
  3. Those drivers are initialized on next initcalls:
    • GPIO 控制器:postcore_initcall (=2)
    • I2C控制器:subsys_initcall (=4)
    • I2C设备:subsys_initcall (=4)

因此 GPIO 控制器驱动程序将在 I2C 驱动程序之前初始化。

动态依赖

那么动态依赖呢?来自相应的Makefile and Kconfig文件我们可以看到配置选项和依赖项:

  • GPIO 控制器:CONFIG_GPIO_OMAP,三态,不依赖于 I2C 的东西
  • I2C控制器:CONFIG_I2C_OMA,三态,不依赖于 GPIO 的东西
  • I2C设备:CONFIG_PINCTRL_MCP23S08,三态,取决于 I2C

因此,如果驱动程序加载到用户空间中.ko文件,这完全取决于它们的加载顺序,用户必须在 rootfs 中处理它。通常GPIO和I2C控制器驱动程序是内置的,因此无需进一步讨论,仅供参考,here is https://unix.stackexchange.com/questions/90027/what-is-the-sequence-loading-linux-kernel-module-on-startup-how-priority-is-set如何定义顺序modprobe tool.

内核配置

要检查驱动程序是如何构建的(内置的或可加载的),可以检查.config文件。例如。如果multi_v7_defconfig用来:

  • CONFIG_GPIO_OMAP=y
  • CONFIG_I2C_OMAP=y

在这种情况下,两个驱动程序都是内置的,并且我们知道 GPIO 驱动程序的 initcall 早于 I2C 驱动程序。

GPIO 占用

您将您的 PIN 声明为正确的做法gpio-hog。您可能已经知道它的含义,但我会为其他感兴趣的人参考此处的解释。从文档/devicetree/bindings/gpio/gpio.txt https://www.kernel.org/doc/Documentation/devicetree/bindings/gpio/gpio.txt:

GPIO 芯片可能包含 GPIO hog 定义。 GPIO 占用是一种机制 提供自动 GPIO 请求和配置作为 GPIO-controller的驱动探针函数.

所以这是你能尽早得到的。如果您的 GPIO 控制器驱动程序是内置的,并且 initcall 编号小于 I2C 驱动程序的 1,那么您可以说您的en-gpio引脚将在 I2C 设备驱动程序初始化之前设置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个节点之间的设备树依赖关系 的相关文章

  • 如何通过设备树配置 uio_dmem_genirq 驱动程序

    The uio dmem genirq https git kernel org pub scm linux kernel git stable linux stable git tree drivers uio uio dmem geni
  • 使用 gdb 在指定的可执行文件之外单步执行汇编代码会导致错误“无法找到当前函数的边界”

    我在 gdb 的目标可执行文件之外 甚至没有与该目标对应的堆栈 无论如何 我想单步执行 以便我可以验证汇编代码中发生了什么 因为我不是 x86 汇编方面的专家 不幸的是 gdb 拒绝进行这种简单的汇编级调试 它允许我设置并停止在适当的断点上
  • 哪个进程拥有给定的端口(Linux 内核)?

    我正在为 Linux 编写一个简单的应用程序层防火墙 目前没什么特别的 只是我需要的东西 由于 iptables 的所有者模块不够 我决定使用 libnetfilter queue 来实现 在我的防火墙 C C 应用程序 中的某个时刻 我需
  • 加载内核模块时出现未知符号

    我需要帮助理解为什么在插入模块时出现错误 我努力了this http www linuxforums org forum kernel 56497 unkown symbol module error while insmodding bu
  • fork() & 内存分配行为

    我在一个禁用交换和禁用内存过量使用的系统上工作 假设我的进程当前消耗 100 MB 内存 而系统可用内存小于 100 MB 如果我执行 fork 它会失败 因为内核也尝试为子进程分配 100 MB 的空间吗 我读过 Linux 在分叉时使用
  • 如何用 C 语言从串行(SPI)连接读取数据?

    我正在尝试编写一个程序 该程序将安装在 Linux MCU Raspberry Pi 上 该程序将读取从另一个 MCU 我将自己构建的自制程序 发送到它的串行数据 我研究了如何做到这一点 并认为我有 大局 但仍然缺少一些东西 其一 我需要启
  • Linux 内核:为什么调用 kstrtol 会崩溃?

    我正在学习内核编程 并且对 kstrtol 进行了简单的调用 我用它来将字符串转换为数字 然而 每次我编译这个模块并使用 insmod 将其放入内核时 我都会收到 BUG 无法处理 f862b026 处的内核分页请求 然后是寄存器和堆栈转储
  • syn队列和accept队列的混淆

    在阅读TCP源码时 我发现一个困惑的事情 我知道 TCP 在 3 次握手中有两个队列 第一个队列存储服务器收到的连接SYN并发回ACK SYN 我们称之为同步队列 第二个队列存储3WHS成功并建立连接的连接 我们称之为接受队列 但在阅读代码
  • Linux 内核线程没有地址空间

    为什么Linux内核线程没有地址空间 对于任何要执行的任务 它都应该有一个内存区域 对吗 内核线程的文本和数据去了哪里 内核线程确实有一个地址空间 只是他们都有同一个 这并不妨碍它们各自拥有不同的堆栈 文本和数据放置在内核地址空间 由所有线
  • 调试严重的 SIGILL 崩溃:文本段损坏

    我们的系统是基于 PowerPC 的运行 Linux 的嵌入式系统 我们遇到了随机的 SIGILL 崩溃 这种情况在各种应用程序中都会出现 崩溃的根本原因是将要执行的指令归零 这表明内存中的文本段已损坏 由于文本段是以只读方式加载的 因此应
  • 在内核模块中执行shell命令

    是否可以在内核模块中执行shell命令 我知道我们可以在用户空间 C 代码中使用system子程序 我正在调试一个存在内存泄漏问题的内核模块 在无限循环中执行 insmod 和 rmmod module ko 后 8G RAM 的系统在几分
  • 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    例如 常见设备模块的Makefile obj m jc o default MAKE C lib modules shell uname r build M shell pwd modules clean MAKE C lib module
  • 内存地址是否指向一个字节的信息?

    以下是 DTS 文件的摘录 linux arch powerpc boot dts 板名 dts memory device type memory reg lt 0x00000000 0x40000000 gt 1GB at 0 嵌入式设
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 什么是标记结构初始化语法?

    struct file operations scull fops owner THIS MODULE llseek scull llseek read scull read write scull write ioctl scull io
  • “perf record”或“perf-record”可以对子进程进行采样吗?

    假设我有一个harness二进制文件 它可以根据命令行选项生成不同的基准 我对这些基准测试非常感兴趣 我有3个选择 更改线束二进制文件以生成perf record运行基准测试并进行采样的子进程 just do perf record har
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志
  • 树莓派的设备树驱动内核

    我想用设备树驱动的 Linux 内核启动树莓派 有什么特别的事情要做吗 谁能指出为树莓派设置基于设备树的内核启动需要什么 我可能需要有树莓派内核源代码 其中设备驱动程序应与设备树兼容 如果是这样 我在哪里可以找到 Raspberry Pi
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • Linux内核container_of宏和C90中的通用容器

    是否有可能实施容器的 http lxr linux no linux tools perf util include linux kernel h L18纯C90中的宏 我不确定如何做到这一点 因为内核实现取决于海湾合作委员会黑客 http

随机推荐

  • 我们如何在 Grails 中迁移/更新数据库架构?

    我们使用 Grails 已经有一段时间了 我的团队负责人提出了一些关于 Grails ORM GORM 的问题 一旦我们进入生产环境 我们如何维护数据库模式 我们可以使用 Grails 更新数据库架构吗 如果更新架构 更改是否会自动反映 框
  • 如何判断我的 IE 是否是 64 位? (就此而言,Java 也是如此吗?)

    网络上已经有数以百万计的问题涉及如何判断操作系统是否是 64 位 但不知道 IE 和 或 Java 运行时是否是 64 位 一些背景 我安装了 64 位 Win 7 IE 会自动从 CD 中安装 我没有下载IE 我确实下载了Java运行时
  • 我们如何在 Comparator.comparing 中传递变量字段/方法名称

    我有一个Report String name Date date int score 班级 我希望能够使用新的 java 8 语法对任何成员变量的报告列表进行排序 所以java 8提供了这个新的 list sort Comparator c
  • Android studio 虚拟设备未加载

    我有 4GB 内存 android studio 虚拟设备显示 ANDROID 所以加载是无限的 它没有结束 我已经等太久了 可能是什么问题 无论我使用什么应用程序 您尝试过使用 Genymotion 吗 它比普通虚拟设备好数百倍 这里有一
  • Ruby - 将目录添加到 $LOAD_PATH - 它有什么作用?

    这实际上是关于这个问题的一个问题 将目录添加到 LOAD PATH Ruby https stackoverflow com questions 837123 adding a directory to load path ruby 将目录
  • 使用 gulp 创建 tar 档案

    我正在使用 gulp tar 创建一个 tar 文件 如何添加顶级文件夹 以便当用户运行时tar xzf myArchive tar它解压到特定的文件夹中 这是我的代码 gulp task prod min gittag function
  • div 向下滑动时自动聚焦在输入字段上

    我有一个隐藏的div 单击按钮时 div 会向下滑动并带有输入字段 如何让这个输入框在 div 向下滑动时自动对焦 谢谢
  • sphinx autodoc包含子功能

    我想在 sphinx 文档中自动包含函数的子函数 有什么选择呢 我的代码看起来像 import numpy def mainfunc to be documented def subfunc to be documented as well
  • PCRE pcre_exec 线程安全吗?

    我有一个 C 程序 它使用 PCRE 正则表达式来确定 cgroup 中的进程是否应添加到一个变量或另一个变量 我生成一个线程来读取每个正在运行的 cgroup 中的 cpuacct stat 文件 其中线程数从未超过核心数 然后将这些样本
  • Haskell 中的 S 组合器

    可以模拟一下S组合器 https en wikipedia org wiki SKI combinator calculus仅使用标准函数 不通过方程定义 并且不使用 lambda 匿名函数 在 Haskell 中表达 我希望它能按类型 a
  • Facebook“点赞”推荐点击添加变量;无法识别链接的页面作为喜欢的页面

    所以我有一个网站 我们称之为foo com并且所有页面都有点赞按钮插件 https developers facebook com docs reference plugins like 在上面 每个页面上都重新散列相同的代码 所以我 喜欢
  • 如何在 Vue 中条件绑定 v-model?

    在 JavaScript 中 对象可以选择扩展值 如下所示 const payload name Joseph isMember credential true 在 React 中 JSX 可以像这样可选地传递 props
  • 如何使用 SetConsoleHandler() 阻止退出调用

    我知道我必须使用SetConsoleCtrlHandler 如果我想管理控制台关闭事件 不知道怎么屏蔽CTRL CLOSE EVENT 我尝试过如果捕获该事件则返回 false true 但没有成功 这是我到目前为止所得到的 谢谢 Anto
  • 设置运行/段落样式以支持 RTL 和 LTR 单词

    我怎样才能设计一个Run and or Paragraph支持 RTL 和 LTR 字 问题是 我有一个复杂的文本 其中包含波斯语和英语单词 我正在尝试创建一个 docx使用 OpenXML SDK 的文档 但是 英语单词也可以得到 RTL
  • 对 PowerPC 寄存器值感到困惑)?

    所以 我一直在学习 PowerPC 来完成 Xbox 的简单逆向项目 但我总是对这样的事情感到困惑 lwz r11 0 r29 Loads 0x34 from 0x10710 and stores in r11 lwz r10 4 r29
  • android:如何使用属性集构造函数实例化我的自定义视图

    我的自定义视图具有动态自定义属性 例如背景图像属性 通过当前星期分配 我不想使用构造函数 CalendarView Context context AttributeSet attrs 来传递多个属性 并且我尝试使用 Xml asAttri
  • Tomcat 7 作为 Windows 服务无法从其他系统访问

    我已经下载了适用于 32 位 Windows 7 机器的 Tomcat 7 zip 我已经解压了该包并使用 bin service bat 创建了 Windows 服务 但是当我从 windows services msc 启动服务时 我无
  • 在远程 ssh 命令中传递变量

    我希望能够使用 ssh 从我的机器运行命令并传递环境变量 BUILD NUMBER 这就是我正在尝试的 ssh email protected cdn cgi l email protection tools myScript pl BUI
  • 为树状图中的刻度标签着色以匹配簇颜色

    如何为树状图的标签单独着色 使其与 MATLAB 中簇的颜色相匹配 这是使用下面我的答案中的代码生成的所需输出示例 请注意 标签只是 50 个字符系列 A r 如果有更直接的方法来做到这一点 请发布答案 因为我无法通过谷歌搜索找到解决方案
  • 两个节点之间的设备树依赖关系

    我有两个设备树节点 一个设置 GPIO 引脚 另一个配置一个 i2c 总线 例如 gpio2 en gpio gpio hog gpios lt 5 0 gt output high i2c1 gpiom1 gpio 27 compatib