3

我正在使用 linux 内核设备树,乍一看似乎缺少具有多个中断父节点的节点的功能。我有一个控制自定义 ARM 嵌入式板的驱动程序,它从多个 GPIO 中断父级获取 GPIO 和引脚中断,并管理板载电池、电压低 irq、reset_pending irq 等。

我发现了一个来源,有人似乎已经破解了额外的功能来处理这个问题,但这不是官方的,并且涉及修改我不想要的中断源文件。该修改增加了对这样一个称为“中断扩展”的术语的支持。这里中断父级在元组中指定。

    #interrupt-cells = <2>;
    interrupts-extended = <&gpio3 21 1>, <&gpio7 13 2>; /* voltage/reset irq */

我还没有找到任何方法或示例来说明如何使用中断映射属性来实现简单的 gpio 中断映射,所以我不知所措。

如果我只使用一个 GPIO 中断父级,那么正确的方法就是这样。

interrupt-parent = <&gpio1>;
interrupts = <9 2>, <8,1>;

但这仅允许声明一个中断父级,其中在“中断”中指定了多个中断,并且它们都必须属于指定的父级。我正在使用 2 个中断父母,gpio7 和 gpio3。

在设备树的单个设备节点中实现具有不同中断父级的多个中断的正确方法是什么?

4

2 回答 2

3

我不知道这是否适用于 gpio 中断父级,但对于其他类型的中断控制器,您可以使用“interrupt-map”属性,并使用 phandles 为每个单独的控制器指定中断列表。这是一个示例,我看到驱动程序需要 3 个中断,2 个来自“intc”控制器,1 个来自“spmi”控制器:

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 值为 <3>,spmi 节点的 #interrupt-cells 值为 4(这意味着许多参数需要与它们各自的 phandles 一起使用)。

中断名称字段是可选的,但允许您在代码中按名称而不是按编号请求 irq(即,使用 platform_get_irq_byname(),而不是 platform_get_irq())

老实说,我有点不确定中断映射掩码的用途。

于 2014-08-04T22:10:22.860 回答
1

“中断扩展”属性是一种特殊形式;当节点需要引用多个中断父级或与继承的中断父级不同的中断父级时很有用。此属性中的每个条目都包含父 phandle 和中断说明符。

例子:

interrupts-extended = <&intc1 5 1>, <&intc2 1 0>;

https://www.kernel.org/doc/Documentation/devicetree/bindings/interrupt-controller/interrupts.txt

于 2020-02-07T12:41:23.710 回答