能否从命令行增加中断号并通过devmem触发ARM GIC中断?
问题解答
1. 能否通过devmem操作GIC寄存器触发中断?
可以,但需先确认GIC的物理基地址,再按步骤操作相关寄存器,注意操作需root权限。
前提:获取GIC基地址
在Petalinux中执行cat /proc/iomem,查找类似如下的GIC地址段(示例地址仅供参考,以实际输出为准):
f9000000-f90fffff : arm,gic
其中f9000000为GIC基地址,分发器(Distributor)从该地址起始,CPU接口(CPU Interface)通常偏移0x10000(GICv2版本标准偏移)。
操作核心寄存器(针对GICv2,你的输出显示为GIC 0,大概率为该版本)
你列出的寄存器中,以下是触发中断的关键操作对象:
- ICDDCR(分发器控制寄存器):先启用分发器,写入
0x1:devmem 0xf9000000 32 0x1 - ICDISER(中断使能寄存器):41号中断对应第1组ICDISER(每组控制32个中断,41=32+9),偏移地址为
0x100 + 4*1 = 0x104,置位对应位:
若操作42号中断,对应位为devmem 0xf9000104 32 $(devmem 0xf9000104 32 | awk '{print "0x" toupper(sprintf("%x", $1 | (1<<9)))}')1<<10,寄存器偏移相同。 - ICDIPTR(中断目标CPU寄存器):指定中断发送到CPU0,41号中断对应偏移
0x800 + 4*41 = 0x8A4,写入0x01:devmem 0xf90008A4 32 0x01 - ICCICR(CPU接口控制寄存器):启用CPU接口,地址为GIC基地址+
0x10000:devmem 0xf9010000 32 0x3 - ICCPMR(优先级掩码寄存器):允许所有优先级中断,写入
0xff:devmem 0xf9010004 32 0xff
模拟中断触发注意事项
你的中断标记为level(电平触发),仅操作GIC寄存器无法直接触发,需通过操作DMA设备的寄存器(比如触发DMA传输完成事件)来产生电平中断信号。若为边沿触发,可尝试使用GIC的ICDSGIR软件触发寄存器,但该寄存器仅适用于软件中断,无法直接触发外设DMA中断。
2. 能否从命令行增加中断号?
不行。中断号由内核根据设备树配置、驱动注册逻辑静态分配,用户空间无权限直接新增中断号。若需新增中断,需:
- 修改设备树,添加新的中断节点;
- 编写或修改内核驱动以注册该中断;
- 重新编译Petalinux内核与设备树,重新部署至开发板。
内容的提问来源于stack exchange,提问作者Creator
相关产品推荐
相关产品推荐

