前言
DE25-Nano是基于Altera Agilex™ 5 FPGA(138K逻辑单元)的开发平台,集成了双集群ARM Cortex-A76/A55硬处理器系统(HPS),为开发者提供了兼具硬件可重构性与强大软件处理能力的异构计算平台。在实际嵌入式系统开发中,FPGA端外设(如按键、开关等)产生的中断需要被HPS端的Linux系统及时响应和处理。本文将系统介绍Agilex 5 SoC FPGA中HPS端响应FPGA端中断的完整开发流程。
本文先深入解析GIC-600中断控制器的架构与中断映射机制;然后以DE25-Nano开发板为载体,从修改GHRD工程添加支持中断的PIO外设开始,逐步完成设备树配置、中断驱动程序开发,最终通过按键触发中断验证HPS对FPGA中断的实时响应能力。
GIC控制器介绍
Agilex 5 SoC FPGA 的HPS中集成了 Arm Generic Interrupt Controller (GIC-600)。该 GIC 控制器位于应用处理器子系统(APS)分区内,独立于 Cortex-A55和Cortex-A76 处理器之外,由所有 CPU 核心共享。GIC是HPS中负责管理所有中断请求的核心组件,是Agilex 5 SoC FPGA 的中断传递通路的"总调度官",它接收来自各类外设的中断信号,仲裁优先级,并将其路由到合适的CPU核心进行处理。

GIC系统集成示意图
GIC-600的架构由多个功能模块协同构成。其中Distributor(分发器) 是整个GIC通信的中枢,负责管理所有共享外设中断(Shared Peripheral Interrupts, SPI),包括来自FPGA逻辑的中断请求。Redistributor(重分发器) 则为每个CPU核心维护私有外设中断(PPI) 和软件触发中断(SGI)。此外,SPI Collator(SPI收集器) 支持将多达512个SPI中断转换为消息格式,以减少系统布线并支持更激进的时钟门控,从而降低功耗。Interrupt Translation Service(ITS) 则负责翻译PCIe等来源的消息信号中断。
GIC 把中断分作了三类SGI、PPI和SPI。
软件生成中断(SGI)
Software Generated Interrupts (SGI)属于核间中断,即由一个核心生成并发送至其他核心的中断。系统中每个核心对 SGI 的处理相互独立,其优先级及其他设置也按核心单独配置。SGI 通过向发起核心的 CPU 接口中的系统寄存器执行写操作来产生,信号类型为边沿触发。每个目标核心最多可记录 16 个 SGI,各自对应中断 ID 0 至 15 范围内的唯一 INTID。
私有外设中断(PPI)
Private Peripheral Interrupt (PPI)通常用于与特定核心紧密耦合的外设,连接至某一核心 PPI 输入的中断仅发送至该核心。每个核心对 PPI 的处理相互独立,且每个 PPI 的 INTID 用于标识其来源。PPI 对每个核心是私有的,但不同核心的 PPI 可以使用相同的 INTID。每个目标核心最多可记录 12 个 PPI,各自对应中断 ID 16 至 31 范围内的唯一 INTID。
共享外设中断(SPI)
Shared Peripheral Interrupt (SPI)可编程为定向至特定核心或任意核心。HPS 的 GIC-600 支持 512个SPI中断,这些既可以是线连中断,也可以通过从接口向 GIC-600 内部特定寄存器执行写操作来生成。首个 SPI 的中断 ID 号为 32。每个 SPI 均可配置为上升沿触发或高电平有效(active-HIGH)的电平敏感方式,通常用于与特定核心无紧密耦合关系的外设。
FPGA中断在GIC中的映射关系
对于FPGA开发者而言,最关键的莫过于理解FPGA中断在GIC中的映射关系。
根据Atera官方技术手册,GIC 中断号 0-31 保留给 PPI 和 SGI,SPI 从 GIC irq32 开始。Agilex 5 的FPGA 外设中断属于SPI,FPGA逻辑产生的64个中断通过fpga2hps_interrupt0至fpga2hps_interrupt63共64条中断线接入GIC-600。每条中断线对应一个唯一的GIC SPI编号:fpga2hps_interrupt0对应GIC SPI 49,fpga2hps_interrupt1对应SPI 50,依此类推。GIC-600支持这些FPGA中断线配置为电平触发(Level Triggered) 或边沿触发(Edge Triggered),为开发者提供了灵活的触发方式选择。
GIC 中断号(GIC irqx)与系统中断号(irqSx)之间存在固定偏移。以下是 Agilex 5 HPS 的共享外设中断映射表的部分常用内容(完整表格内容参考Hard Processor System Technical Reference Manual Agilex™ 5 SoCs的表格Table 81. Shared Peripheral Interrupts Map):
|----------------|-----------------|--------------|----------------------------|---------------|-------------|
| 系统 中断号 | GIC 中断号 | 源 模块 | 中断名称 | 中断 类型 | 描述 |
| 0 | 32 | SDM | sdm_aps_mailbox_intr | Level | SDM中断 |
| ... ||||||
| 17-80 | 49-112 | FPGA | fpga2hps_interrupt0-63 | Level /Edge | FPGA 逻辑中断请求 |
| ... ||||||
| 93 | 125 | USB0 | usb0_irq | Level | OTG0中断请求 |
| ... ||||||
| 104 | 136 | I2C1 | i2c1_irq | Level | I2C1中断请求 |
| ... ||||||
| 109 | 141 | UART1 | uart1_irq | Level | UART1中断请求 |
| ... ||||||
Agilex 5 FPGA-to-HPS中断接口 (f2h_irq0/1_in) 详解
在Agilex 5 SoC底层硬件设计GHRD当中配置HPS时勾选Enable FPGA-to-HPS Interrupts选项会出现f2h_irq0_in 和 f2h_irq1_in 端口。

f2h_irq0_in 和 f2h_irq1_in 是FPGA向HPS内的GIC发送中断请求的专用接口(如下图)。它们的主要作用是让FPGA中自定义的逻辑(如PIO按键)能够异步通知Arm处理器执行相应的中断服务程序。

f2h_irq0_in 和 f2h_irq1_in 端口共提供了64个通用的FPGA到HPS中断信号。FPGA端外设中断连接到f2h_irq0_in或f2h_irq1_in时,需分配一个0~31的序号,这个序号称之为位索引(Bit Index),一个FPGA外设中断的系统中断号与位索引对应关系如下:
-
f2h_irq0_in 上的中断,其系统中断号 = 17 + (位索引)
-
f2h_irq1_in 上的中断,其系统中断号 = (17+32) + (位索引)
比如上图按键挂在f2h_irq0_in上,中断位索引是1,那么按键的系统中断号是17+1=18。后续在设备树里面描述按键中断的时候,中断号填写18即可。