我从两个不同的设备树源中获取了以下代码段。
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>;
};
我想知道什么是中断=&lt; 1 4&gt ;;中断=&lt; 42 2&gt ;;代表什么?
我们从哪里获得&lt; 1 4&gt; ,&lt; 42 2&gt;值来自?
答案 0 :(得分:8)
您需要更多上下文来确定这些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>;
&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在他的评论中提到的),在这种情况下,两个单元<0x1 0x4>
代表中断线1,以及一个高电平(0x4 == IRQ_TYPE_LEVEL_HIGH
)中断类型。
你的第二个例子有点复杂:它使用一个mpic中断控制器,它有自己的xlate
功能。有关内部详细信息,请查看mpic_host_xlate
中的arch/powerpc/sysdev/mpic.c
。