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

米海特

我有两个设备树节点,一个设置一个 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:较难的部分LWN 文章中所述:

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

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

驱动依赖

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

  1. 如果驱动程序是内置的(内核映像内部):驱动程序可以在不同的initcalls初始化,从而以正确的顺序加载
  2. 如果驱动程序是可加载的.ko文件):驱动程序可以有依赖项,在内核构建系统中定义

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

静态依赖

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

  1. am33xx-l4.dtsi文件中我们可以看到:
    • GPIO 控制器: compatible = "ti,omap4-gpio"
    • I2C控制器: compatible = "ti,omap4-i2c"
    • I2C设备: compatible = "microchip,mcp23008"
  2. 这些兼容字符串的相应驱动程序是:
    • GPIO 控制器: drivers/gpio/gpio-omap.c
    • I2C控制器: drivers/i2c/busses/i2c-omap.c
    • I2C设备: drivers/pinctrl/pinctrl-mcp23s08.c
  3. 这些驱动程序在下一个 initcalls 中初始化:
    • GPIO 控制器:postcore_initcall(=2)
    • I2C 控制器:subsys_initcall(=4)
    • I2C 设备:subsys_initcall(=4)

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

动态依赖

动态依赖呢?从相应的MakefileKconfig文件中我们可以看到配置选项和依赖项:

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

因此,如果驱动程序作为.ko文件加载到用户空间中,这完全取决于它们的加载顺序,用户必须在 rootfs 中处理它。通常 GPIO 和 I2C 控制器驱动程序是内置的,所以不需要进一步讨论这个,但仅供参考,这里是如何定义modprobe工具的顺序

内核配置

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

  • CONFIG_GPIO_OMAP=y
  • CONFIG_I2C_OMAP=y

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

GPIO占用

通过将您的 pin 声明为 ,您做了正确的事情gpio-hog您可能已经知道它的含义,但我会为其他感兴趣的人参考这里的解释。Documentation/devicetree/bindings/gpio/gpio.txt

GPIO 芯片可能包含 GPIO 猪定义。GPIO 占用是一种提供自动 GPIO 请求和配置的机制,作为 gpio 控制器的驱动程序探测功能的一部分

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

人偶-两个节点之间的依赖关系

MySQL-递归两个节点之间的树路径

缓存中两个项目之间的缓存依赖关系

Android:设置两个应用之间的依赖关系

两个类之间的属性依赖关系

当依赖关系树中存在两个或多个依赖关系版本时,Maven如何选择传递依赖关系的版本?

还考虑空节点找到二叉树的两个节点之间的水平距离?

使用Cypher删除两个节点之间存在多个关系的重复关系

查找两个节点之间的路径时显示中间节点和关系

在两个项目之间使用依赖关系的超级pom之间的区别

获取两个节点之间的节点

如何在两个不同的树图中显示包含相同数据的两个框之间的关系

在二叉树中找到两个节点之间的距离

Alloy:如何定义两个模块之间的关系而不出现模块依赖错误?

如何在 ReactJS 中的两个表单过滤器之间建立依赖关系

如何在两个项目中的测试文件夹之间设置Maven依赖关系?

如何在两个发布管道 Azure DevOps 之间添加依赖关系

如何消除两个手势识别器之间的依赖关系?

如何处理Fedora中两个软件包之间的循环依赖关系?

Go:如何解决在两个包之间作为参数传递的结构的依赖关系?

如何在图数据库中的节点之间创建两个关系

在neo4j中的两个节点之间创建多个关系

我将如何查询这两个节点之间的关系?

如何使用Cypher获得两个节点之间相同关系的数量

如何找到neo4j中两个节点之间最短的关系?

计算两个特定节点之间的关系数 - Neo4j / Cypher

如何在具有共同属性的两个节点之间创建关系?

使用 Google Knowledge Graph API 查找两个节点之间的关系

两个表之间的关系?