我有两个设备树节点,一个设置一个 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 来说确实是必不可少的,而且很高兴它运行良好。
唉,在您的情况下,可能无法指定节点之间的依赖关系,因此您的i2c1
或gpiom1
依赖于gpio2
. 至少我没有看到gpios
I2C 控制器或 GPIO 控制器的任何属性Documentation/devicetree/bindings/
,可用于引用您的en-gpio
. 所以看起来你应该依赖驱动程序加载顺序。
驱动程序之间有两种可能的依赖关系:
.ko
文件):驱动程序可以有依赖项,在内核构建系统中定义由于您没有提到您的平台,让我们看看它是如何使用 BeagleBone Black 板为例的。您可以将其用作模板来了解它是如何在您的平台上完成的。
让我们检查驱动程序初始化顺序:
am33xx-l4.dtsi
文件中我们可以看到:
compatible = "ti,omap4-gpio"
compatible = "ti,omap4-i2c"
compatible = "microchip,mcp23008"
drivers/gpio/gpio-omap.c
drivers/i2c/busses/i2c-omap.c
drivers/pinctrl/pinctrl-mcp23s08.c
postcore_initcall
(=2)subsys_initcall
(=4)subsys_initcall
(=4)因此 GPIO 控制器驱动程序将在 I2C 驱动程序之前初始化。
动态依赖呢?从相应的Makefile
和Kconfig
文件中我们可以看到配置选项和依赖项:
CONFIG_GPIO_OMAP
,三态,不依赖于 I2C 的东西CONFIG_I2C_OMA
,三态,不依赖于 GPIO 的东西CONFIG_PINCTRL_MCP23S08
,三态,取决于 I2C因此,如果驱动程序作为.ko
文件加载到用户空间中,这完全取决于它们的加载顺序,用户必须在 rootfs 中处理它。通常 GPIO 和 I2C 控制器驱动程序是内置的,所以不需要进一步讨论这个,但仅供参考,这里是如何定义modprobe
工具的顺序。
要检查驱动程序是如何构建的(内置的或可加载的),可以检查.config
文件。例如,如果multi_v7_defconfig
使用:
CONFIG_GPIO_OMAP=y
CONFIG_I2C_OMAP=y
在这种情况下,两个驱动程序都是内置的,我们知道 GPIO 驱动程序的 initcall 比 I2C 更早。
通过将您的 pin 声明为 ,您做了正确的事情gpio-hog
。您可能已经知道它的含义,但我会为其他感兴趣的人参考这里的解释。从Documentation/devicetree/bindings/gpio/gpio.txt:
GPIO 芯片可能包含 GPIO 猪定义。GPIO 占用是一种提供自动 GPIO 请求和配置的机制,作为 gpio 控制器的驱动程序探测功能的一部分。
所以这是你能尽早得到的。如果您的 GPIO 控制器驱动程序是内置的,并且 I2C 驱动程序的 initcall 编号小于 1,您可以争辩说您的en-gpio
pin 将在 I2C 设备驱动程序初始化之前设置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句