如何使用 AXI Interrupt Controller 处理超过 16 次中断

作者:Abhinayp

本篇博文主要讲解在 PL 中从 IP 核到 PS 之间需要完成含超 16 次中断的布线的情况下,该如何使用 AXI Interrupt Controller (INTC)。其中使用的赛灵思外设包括 Vivado 设计中的 GPIO、IIC、UART 以及定时器。

设计示例是使用 Vivado 2020.1 版本,以 ZCU106 评估板为目标而创建的。中断在 PetaLinux 2020.1 上经过测试,此处随附了设计 Tcl 和 system-user.dtsi 文件。

AXI GPIO:
General Purpose Input/output (GPIO) 核是支持轻松访问器件内部属性的接口。该核还可用于控制外部器件的行为。

中断:
中断控制可从 GPIO 通道获取中断状态,并向主机生成中断。在 Vivado 中设置“Enable Interrupt”(启用中断)选项后,即可启用中断控制。

对于输入模式,gpio_input 管脚连接到 ZCU106 的如下按钮 (PUSH BUTTON):
gpio_input(0) = GPIO_SW15
gpio_input(1) = GPIO_SW14
gpio_input(2) = GPIO_SW16
gpio_input(3) = GPIO_SW17
gpio_input(3) = GPIO_SW18

AXI INTC:
AXI Interrupt Controller (INTC) 核可将来自外设器件的多个中断输入集中到系统处理器的单一中断输出。使用寄存器来检查、启用和确认中断。

此示例的主要目的是将超过 16 个中断连接到 PS。AXI INTC 核可支持我们满足此需求。使用单一 AXI INTC 块的情况下最多可连接 32 个中断,并且您还可使用级联。(我们可能会通过另一篇博文来提供此操作示例。)
在下文描述 Concat IP 的多个图例中,您可以看到中断的连接方式。

块设计:
由于设计太大了,我并没有添加完整设计的示意图,因此下面会逐一展示必要的连接示意图。

Concat IP:
Concat IP 核可提供相应机制来将不同宽度的总线信号组合到单一总线内。

从 IP catalog(IP 目录)添加 Concat 块,然后双击 IP(如下所示)以打开“Re-customize IP”(重新自定义 IP)对话框。

将“Number of Ports”(端口数)参数设置为期望的输入端口数。在此示例中,所选数量为 18。

完成自定义 IP 后,结果如下所示,第 18 个端口连接到如前文所述的 GPIO_PUSH_BUTTONS 中断行。

dout 为输出端口,其位宽等于所有输入端口的位宽总和,该输出端口布线到 AXI INTC 核的输入 intr 端口。


AXI INTC 的输出连接到 Zynq MPSoC 块的 pl_ps_irq_0 端口:

请验证设计并遵循其余步骤进行操作以生成比特流。导出硬件,用于构建 PetaLinux 镜像。

​​​​​​​PetaLinux:

内核配置:
在 menuconfig 中启用以下选项。默认情况下,这些选项均已启用,但您应核实其状态,以防万一。

Device Drivers(器件驱动程序
GPIO Support(GPIO 支持)
Memory Mapped GPIO Drivers(存储器映射 GPIO 驱动程序)
Xilinx GPIO support(赛灵思 GPIO 支持)
Xilinx Zynq GPIO support(赛灵思 Zynq GPIO 支持)
Input device support(输入器件支持)
Keyboards(键盘)
GPIO Buttons(GPIO 按钮)
Polled GPIO buttons(轮询 GPIO 按钮)

向设备树添加按钮:
按钮仅可用于 Input GPIO 应用。
创建的每个子节点均可控制 GPIO 的单个位。在 dts 文件中的“gpio-keys”键节点下,根据设计,为按钮 (Push Buttons) 创建含如下名称的子节点:

完成此操作后,请启动 Linux。您可在 cat /proc/interrupts 中看到按钮 SW15 到 SW18 的标签。

随机按下按钮后,触发器计数会按如下所示方式增加:

最新文章