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

标签 linux-kernel device-driver device-tree

我正在使用 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 个中断 parent ,gpio7 和 gpio3。

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

最佳答案

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

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 一起使用)。

interrupt-names 字段是可选的,但允许您通过名称而不是代码中的编号来请求 irq(即,使用 platform_get_irq_byname(),而不是 platform_get_irq())

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

关于linux-kernel - Linux 设备树,具有多个中断父节点的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25056717/

相关文章:

windows - 内存转储中的 DbgPrint?

c - Linux 4.5 GPIO 中断通过 Xilinx Zynq 平台上的 Devicetree

linux - 设备树和GPIO

ubuntu - 是否可以在具有 3.5.0/3.8.0 内核的 Ubuntu 12.04 上使用 systemtap 1.7/2.1?

检查我在linux中使用的串口

c - Linux-内存不足

windows - 为什么当我尝试打开删除挂起的文件时 Windows 返回 ERROR_ACCESS_DENIED

c - "binary"在设备驱动中是什么意思?

linux-kernel - Linux 的 'timebase-frequency' 和 'clock-frequency' 有什么区别

c - 在 Linux 内核模块中设置动态变量