我正在使用Linux内核设备树,乍一看似乎有多个中断父节点的节点缺少功能。我有一个控制定制ARM嵌入式主板的驱动程序,它需要来自多个GPIO中断父级的GPIO和引脚中断,并管理板载电池,电压低irqs,reset_pending irq等。
我找到了一个来源,其中有人似乎已经破解了其他功能来处理这个问题,但这不是正式的,而是涉及修改我不想要的中断源文件。 该修改增加了对称为"中断扩展"像这样。这里中断父元素在元组中指定。
#interrupt-cells = <2>;
interrupts-extended = <&gpio3 21 1>, <&gpio7 13 2>; /* voltage/reset irq */
我还没有找到任何方法或示例,说明如何使用interrupt-map属性来实现简单的gpio中断映射,以便我在那里丢失。
如果我只使用单个GPIO中断父,那么正确的方法就是这样。
interrupt-parent = <&gpio1>;
interrupts = <9 2>, <8,1>;
但这只允许声明一个中断父节点,并在&#34;中断&#34;中指定多个中断。并且它们必须都属于指定的父级。我使用了2个中断父项gpio7和gpio3。
在设备树的单个设备节点中使用不同的中断父项实现多个中断的正确方法是什么?
答案 0 :(得分:3)
我不知道这是否适用于gpio中断父节点,但对于其他类型的中断控制器,你可以使用&#39; interrupt-map&#39; property,并使用phandles指定每个独立控制器的中断列表。这是我看到的一个示例,其中驱动程序需要3个中断,2个来自&#39; intc&#39;控制器和来自&#39; spmi&#39;控制器:
interrupts = <0 1 2>;
interrupt-map = <0 &intc 0 134 0
1 &intc 0 140 0
2 &spmi 0 0x9 0 0>;
interrupt-names = "core_irq", "async_irq", "pmic_id_irq";
interrupt-map-mask = <0 0 0 0>;
在该示例中,intc节点具有#interrupt-cells值&lt; 3&gt;。并且spmi节点的#interrupt-cells值为4(意味着需要将许多参数与其各自的phandles一起使用)。
interrupt-names字段是可选的,但允许您通过名称而不是代码中的数字来请求irq(即,使用platform_get_irq_byname()而不是platform_get_irq())
说实话,我有点不确定使用什么是interrupt-map-mask。
答案 1 :(得分:0)
“ interrupts-extended”属性是一种特殊形式;当一个 节点需要引用多个中断父节点或其他中断父节点 中断父项比继承父项。此属性中的每个条目 包含父模型和中断说明符。
示例:
interrupts-extended = <&intc1 5 1>, <&intc2 1 0>;
https://www.kernel.org/doc/Documentation/devicetree/bindings/interrupt-controller/interrupts.txt