interrupt-controller
是设备树(Device Tree)中用于声明某个节点是一个中断控制器的关键属性。以下是中文分步解释:
1. 核心作用
- 当一个节点(如GIC、PIC)被标记为
interrupt-controller
时,表示:- 该节点是一个中断控制器,能够接收、管理和路由来自其他设备的中断信号。
- 其他设备可通过
interrupt-parent
属性指向它,以声明自己的中断由该控制器处理。
2. 属性语法
在设备树中,通过以下方式声明一个中断控制器:
interrupt_controller: interrupt-controller@<地址> {
compatible = "arm,gic-v3"; // 示例:兼容ARM GICv3控制器
reg = <0x0 0x8000000 0x0 0x10000>; // 寄存器地址范围
interrupt-controller; // 声明该节点是中断控制器
#interrupt-cells = <3>; // 指定中断号格式(如:控制器编号、中断号、触发方式)
};
3. 关键子属性
#interrupt-cells
定义中断号的格式,其他设备引用中断时需按此格式提供参数。例如:#interrupt-cells = <3>
表示中断号由3个参数组成(如GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH
)。
4. 典型场景
假设系统中有以下硬件结构:
CPU
└── GIC(顶级中断控制器)
└── GPIO中断控制器(子控制器)
└── GPIO设备
- GIC节点:
gic: interrupt-controller@8000000 { compatible = "arm,gic-v3"; interrupt-controller; #interrupt-cells = <3>; };
- GPIO中断控制器节点:
gpio-ic: interrupt-controller@9000000 { compatible = "my-gpio-ic"; interrupt-controller; #interrupt-cells = <2>; interrupt-parent = <&gic>; // 声明上级控制器是GIC };
- GPIO设备节点:
gpio: gpio@9010000 { interrupt-parent = <&gpio-ic>; // 指向子控制器 interrupts = <0 8>; // 中断号格式由#interrupt-cells=2定义 };
5. 与 interrupt-parent
的关系
interrupt-controller
:声明自身是控制器。interrupt-parent
:其他设备指向控制器的指针。- 例如,GPIO设备的
interrupt-parent
指向gpio-ic
,而gpio-ic
的interrupt-parent
指向gic
,形成中断路由链。
6. 实际应用
- 在ARM平台中,GIC通常作为顶级中断控制器,子控制器(如GPIO、UART)通过
interrupt-parent
连接到它。 - 正确配置
interrupt-controller
和#interrupt-cells
可确保内核正确解析中断信号,避免路由错误。
通过 interrupt-controller
,设备树能够清晰描述中断控制器的层级结构,确保硬件中断被正确路由和处理。