【问题标题】:Reading Device tree node with Interrupt property读取具有中断属性的设备树节点
【发布时间】:2014-10-29 20:50:47
【问题描述】:

我有来自两个不同设备树源的 sn-ps。

UART1: serial@ef600400 {
              device_type = "serial";
              compatible = "ns16550";
              reg = <0xef600400 8>;
              virtual-reg = <0xef600400>;
              clock-frequency = <0x00a8c000>;
              current-speed = <0>;
              interrupt-parent = <&UIC0>;
              interrupts = <1 4>;
                    };


serial0: serial@4500 {
                    cell-index = <0>;
                    device_type = "serial";
                    compatible = "ns16550";
                    reg = <0x4500 0x100>;
                    clock-frequency = <0>;
                    interrupts = <42 2>;
                    interrupt-parent = <&mpic>;
            };

我想知道中断 = ; 是什么意思中断 = ;代表什么?

我们从哪里得到 , 值?

【问题讨论】:

  • 这里有一些信息,但看起来这些值将是特定于硬件的:devicetree.org/Device_Tree_Usage
  • @AmitSinghTomar 您将不得不查看此设备的设备树绑定,但第一个数字通常表示中断线,第二个通常表示它是上升沿触发、下降沿还是电平触发等。

标签: linux-kernel linux-device-driver powerpc device-tree


【解决方案1】:

您需要更多上下文来确定interrupts 属性代表什么。与您的第一个示例类似,让我们看一下arch/powerpc/boot/dts/bamboo.dts,它具有以下内容:

        UART1: serial@ef600400 {
            device_type = "serial";
            compatible = "ns16550";
            reg = <0xef600400 0x00000008>;
            virtual-reg = <0xef600400>;
            clock-frequency = <0>;
            current-speed = <0>;
            interrupt-parent = <&UIC0>;
            interrupts = <0x1 0x4>;
        };

interrupts 属性描述了从该设备到中断控制器的连接。假设控制器有多个输入(即中断线),我们需要找出该设备将与哪一条线交互。

不同的控制器可能有不同的方法来解复用它们的 IRQ,因此属性类型会有所不同。在这种情况下,让我们看一下中断控制器。我们看到serial@ef600400 节点具有以下属性:

            interrupt-parent = <&UIC0>;

&amp;UIC0 语法告诉我们在设备树的其他地方有一个 UIC0 标签。那是我们的中断控制器。如果我们找到该标签,我们会看到:

UIC0: interrupt-controller0 {
    compatible = "ibm,uic-440ep","ibm,uic";
    interrupt-controller;
    cell-index = <0>;
    dcr-reg = <0x0c0 0x009>;
    #address-cells = <0>;
    #size-cells = <0>;
    #interrupt-cells = <2>;
};

首先,我们看到#interrupt-cells 是2——这意味着每个中断描述符占用两个单元。由于串行设备的interrupt 属性有两个单元格(0x1 和 0x4),这告诉我们有一个中断线被描述。

compatible 属性告诉我们这是一个 IBM UIC 中断控制器。如果我们看一下这个控制器的驱动程序,我们会看到:

static struct irq_domain_ops uic_host_ops = {
    .map    = uic_host_map,
    .xlate  = irq_domain_xlate_twocell,
};

xlate 函数用于将中断源的interrupts 属性映射到硬件 IRQ 编号(可能还有它的 IRQ 类型)。 irq_domain_xlate_twocell 函数非常简单:

int irq_domain_xlate_twocell(struct irq_domain *d, struct device_node *ctrlr,
            const u32 *intspec, unsigned int intsize,
            irq_hw_number_t *out_hwirq, unsigned int *out_type)
{
    if (WARN_ON(intsize < 2))
        return -EINVAL;
    *out_hwirq = intspec[0];
    *out_type = intspec[1] & IRQ_TYPE_SENSE_MASK;
    return 0;
}

所以(正如 Peter L 在他的评论中提到的),在这种情况下,&lt;0x1 0x4&gt; 的两个单元格代表中断线 1,以及一个高电平 (0x4 == IRQ_TYPE_LEVEL_HIGH) 中断类型。

你的第二个例子稍微复杂一点:它使用了一个 mpic 中断控制器,它有自己的xlate 函数。查看arch/powerpc/sysdev/mpic.c 中的mpic_host_xlate 了解内部详细信息。

【讨论】:

  • 那么我怎样才能找到“IBM UIC 中断控制器”设备驱动程序? dtc 文件说它与 ibm-uic-440ep 和 ibm-uic 兼容,但是当我使用这些关键字搜索它们时找不到这些驱动程序之一。 dts 文件中的“驱动程序名称”和兼容参数之间是否存在映射关系?
  • 驱动程序几乎总是使用设备树中的“兼容”属性与其设备匹配。如果您在树中查找ibm,uic,您将在arch/powerpc/platforms/4xx/uic.c 中找到驱动程序。但是,UIC 驱动程序有点不同,它不使用匹配表。如果您想了解更多详细信息,请发布问题,我可以添加更详细的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多