如何在Armbian系统(OrangePI 3 LTS)中添加新的IRQ映射?
硬件IRQ到系统IRQ编号的映射配置(OrangePI 3 LTS + Armbian)
核心说明
ARM架构下,你说的硬件IRQ编号(比如35)是中断控制器的硬件线编号,系统级IRQ是内核分配的虚拟编号。/proc/irq只是运行时状态展示,不能直接修改映射,得在启动阶段通过设备树或内核配置完成。
具体操作步骤
1. 先确认当前中断状态
先搞清楚硬件IRQ 35现在的绑定情况,执行以下命令:
cat /proc/interrupts | grep 35 cat /sys/kernel/debug/irqchip/gicv2/irq35
输出会显示它当前对应的系统IRQ编号和绑定的设备。
2. 用设备树覆盖永久修改(推荐)
Armbian支持设备树覆盖,不用编译内核就能改:
- 新建自定义覆盖文件
irq-remap.dts,内容如下(假设要把硬件IRQ35映射到系统IRQ100,可按需修改目标编号):
/dts-v1/; /plugin/; &gic { // 全志H616用GICv2,硬件IRQ35属于SPI(共享外设中断),对应SPI编号=35-32=3 spi@3 { interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; linux,irq = <100>; // 指定要映射到的系统IRQ编号 }; };
- 编译这个文件成设备树二进制:
dtc -I dts -O dtb -o irq-remap.dtbo irq-remap.dts
- 把编译好的文件放到系统设备树覆盖目录:
sudo cp irq-remap.dtbo /boot/dtb/allwinner/overlay/
- 修改启动配置文件,启用这个覆盖:
sudo nano /boot/armbianEnv.txt
在文件里添加一行:
overlays=irq-remap
- 重启后检查是否生效:
cat /proc/interrupts | grep 100
3. 内核debugfs临时修改(重启失效)
如果只是临时测试,用debugfs接口快速调整:
// 先解绑当前硬件IRQ35的关联 echo 35 | sudo tee /sys/kernel/debug/irqchip/gicv2/unbind // 重新绑定到目标系统IRQ(比如100) echo 100 | sudo tee /sys/kernel/debug/irqchip/gicv2/bind
注意:这种方法只适用于未被设备占用的中断,重启后会恢复默认。
4. 注意事项
- 目标系统IRQ编号必须是未被占用的,可通过
cat /proc/interrupts查看已用编号。 - 全志H616的硬件IRQ里,0-31是PPI(私有外设中断),32及以上是SPI,映射时要区分类型。
- 确保Armbian内核开启了
CONFIG_OF_OVERLAY配置(默认是开启的)。
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

