Linux kernel Linux设备树,具有多个中断父节点的节点

Linux kernel Linux设备树,具有多个中断父节点的节点,linux-kernel,device-driver,device-tree,Linux Kernel,Device Driver,Device Tree,我正在使用linux内核设备树,乍一看,对于具有多个中断父节点的节点,似乎缺少一个功能。我有一个控制定制ARM嵌入式板的驱动程序,它从多个GPIO中断父级接收GPIO和pin中断,并管理板上电池、低电压irq、复位等待irq等 我发现了一个源代码,其中有人似乎入侵了其他功能来处理这个问题,但这不是官方的,涉及修改我不想要的源文件的中断。 修改增加了对“中断扩展”这样一个术语的支持。这里,中断父级在元组中指定 #interrupt-cells = <2>; interr

我正在使用linux内核设备树,乍一看,对于具有多个中断父节点的节点,似乎缺少一个功能。我有一个控制定制ARM嵌入式板的驱动程序,它从多个GPIO中断父级接收GPIO和pin中断,并管理板上电池、低电压irq、复位等待irq等

我发现了一个源代码,其中有人似乎入侵了其他功能来处理这个问题,但这不是官方的,涉及修改我不想要的源文件的中断。 修改增加了对“中断扩展”这样一个术语的支持。这里,中断父级在元组中指定

    #interrupt-cells = <2>;
    interrupts-extended = <&gpio3 21 1>, <&gpio7 13 2>; /* voltage/reset irq */
#中断单元=;
中断扩展=,;/*电压/复位irq*/
我还没有找到任何方法或示例来说明如何使用中断映射属性来实现简单的gpio中断映射,因此我对此感到困惑

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

interrupt-parent = <&gpio1>;
interrupts = <9 2>, <8,1>;
interrupt parent=;
中断=;
但这只允许声明一个中断父级,并在“中断”中指定多个中断,并且它们必须都属于指定的父级。我用了两个中断父母,gpio7和gpio3


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

我不知道这是否适用于gpio中断父节点,但对于其他类型的中断控制器,您可以使用“中断映射”属性,并使用幻影为每个单独的控制器指定中断列表。下面是我看到的一个示例,其中驱动程序需要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>;
中断=;
中断映射=;
中断名称=“core\u irq”、“async\u irq”、“pmic\u id\u irq”;
中断映射掩码=;
在本例中,intc节点的#中断单元值为,spmi节点的#中断单元值为4(这意味着许多参数需要与各自的幻影一起使用)

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

老实说,我有点不确定中断映射掩码是用来做什么的

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

例如:

interrupts-extended = <&intc1 5 1>, <&intc2 1 0>;
中断扩展=;

OK-再进一步研究一下,设备树中的中断映射功能似乎已被您描述的中断扩展功能所取代。请参阅文件Documentation/devicetree/bindings/interrupt controller/interrupts.txt,以了解有关这方面的一些说明。这方面的原始补丁是在2013年10月提交的-请参阅感谢您的贡献,我遇到的问题是,我的内核源代码3.10.17有一些旧的中断绑定源代码,因此不支持“扩展”功能。我在树中(在我的驱动程序节点下)为每个包含interrupt parent关键字和中断列表的所需中断父级创建一个子节点,然后让我的驱动程序查找子节点并用当前设备树代码提取中断,从而成功地解决了这一问题。不太优雅,但足以绕过当前的限制。