作者:ShownSun
工作室:时沿科技
文章目录
ZYNQ PS端模块读书笔记-中断
0 引言
来源于Zynq-7000 SoC Technical Reference Manual
1 环境
单核设备包含一个Cortex-A9处理器(CPU),双核设备包含两个。本章讨论双核配置。
1.1 私有、共享和软件中断
每个CPU都有一组私有外围中断(PPIs),通过使用banked寄存器进行私有访问。PPIs包括全局定时器、私有看门狗定时器、私有定时器和来自PL的FIQ/IRQ。软件产生的中断(SGIs)被布线到一个或两个cpu。SGIs是由写入通用中断控制器(GIC)中的寄存器而产生。共享外围中断(SPIs)是由各种I/O和在PS与PL之间的内存控制器。来自PS外围的SPI中断也可以布线到PL。
1.2 通用中断控制器
通用中断控制器(GIC)是用于管理来自PS和PL的中断发送到cpu。控制器启用、禁用、掩码并为中断源排序并将它们作为CPU接口,以编程的方式发送到选定的CPU(或CPU)接受下一个中断。此外,控制器支持实现安全性敏感的系统的安全扩展。
中断分发服务器将所有中断源集中在一起,然后调度其中最高优先级的中断源到各自cpu。GIC确保一个针对多个cpu的中断只能一次被一个CPU占用。所有中断源都由唯一的中断ID号标识。所有中断源都有自己的可配置优先级和目标cpu列表。
1.3 复位和时钟
通过向SCLR中的A9_CPU_RST_CTRL 寄存器写入参萨湖复位中断控制器。该复位信号也复位CPU私有定时器、私有看门狗定时器。一旦复位,所有中断挂起,服务被忽略。
中断控制器操作在CPU_3x2x时钟(一半的CPU频率)。
1.4 模块框图
1.5 CPU中断信号传递
来自PL的IRQ/FIQ可以作为PPI#4和#1通过GIC布线,或者使用如图7-3所示的直通多路复用器旁路GIC。这个逻辑是为两个cpu实例化的。直通模式通过mpcore.ICCICR寄存器使能。
2 功能描述
2.1 软件产生中断
每个CPU能够中断自身或者其他CPU或者两个CPUs使用一个SGI。通过向ICDSGIR寄存器和指定的CPUs写入SGI中断序号来产生SGI。每个CPU有它自己的SGI寄存器的设置来产生一个或者多个SGI。中断可以通过读取ICCIAR寄存器或者向ICDICPR寄存器写1来清除中断标志。
所有的SGIs是边沿敏感的,不能被改变。ICDICFR0寄存器只读,配置所有16个SGI的敏感类型。
2.2 CPU私有外部中断
每个CPU连接5个外围中断的一个私有设置。
PPI的敏感类型是固定的。因此ICDICFR1寄存器只读,并且配置所有5个PPI的敏感类型。注意来自PL的快速中断FIQ信号和中断IRQ信号是反向的,然后发送到中断控制器。因此,在PS-PL接口他们是高电平激活,因此ICDICFR1寄存器设置低电平响应。
2.3 共享外部中断
大约有60个中断被布线到一个或者多个CPU或者PL。中断控制器管理优先级和这些中断的接收。
除了IRQ 61-68和84-91,所有的敏感类型是固定的请求源,不能被改变。SDK设备驱动编程GIC来调节这些敏感类型。
ICDICFR2到ICDICFR5寄存器配置所有的SPIs的中断类型。每个中断类型有2个bit,配置具体的敏感类型和处理模式。
2.4 中断敏感、触发和处理
主要有两个寄存器来设置敏感、处理和触发;
mpcore.ICDICFR[5:0]寄存器:敏感和处理;
mpcore.ICDICFR[23:0]寄存器:触发CPU(s);
共享外围中断SPI
SPI中断可以针对任意数量的CPU,但是只有一个CPU处理中断。如果一个中断同时针对两个cpu,并且它们同时响应GIC,那就是MPcore确保只有一个cpu读取活动的中断ID#。另一个CPU接收假信号id# 1023中断或下一个挂起的中断,取决于时间。这消除了在中断服务程序中需要一个锁。通过ICDIPTR[23:8]寄存器来触发中断。每个SPI中断的触发边沿必须按照清单被编程。触发边沿通过ICDICFR[5:2]进行编程。
所有外围中断PPI
每个CPU有它自己的PPI中断;触发边沿、处理和这些中断的处理不可编程。每个中断只有他自己的CPU和被CPU处理。ICDICFR[1]寄存器只读,ICDICFR[5:2]保留。
软件产生中断SGI
SGI中断总是边沿触发,通过向ICDSGIR寄存器写入对应中断号来生成。
2.5 等待中断事件信号
3 寄存器概述
3.1 写协议锁定
中断控制器提供了功能,对关键配置寄存器防止进行写访问。这是通过将1写入APU_CTRL[CFGSDISABLE]位来实现的。APU_CTRL寄存器是SoC的系统电平控制寄存器集的部分,SLCR。控制安全中断控制寄存器的写行为。
4 编程模板
4.1 中断优先级
所有的中断请求(PPI、SGI和SPI)都被分配一个惟一的ID号。控制器使用要仲裁的ID号。中断分发服务器持有每个中断的挂起中断列表,然后在将它发送给CPU接口之前,选择最高优先级的中断。具有同等优先级的中断通过选择最低ID来解析。
优先级逻辑在物理上进行了复制,以支持同时选择最高的优先级每个CPU的优先中断。中断分发服务器持有中断的中心列表,处理器和激活信息,并负责触发软件中断cpu。
SGI和PPI分布寄存器被存入银行,为每个连接的寄存器提供单独的副本处理器。硬件确保一个针对多个CPU的中断在一个时间只能由一个CPU执行。
中断分发服务器将最高挂起的中断传输给CPU接口。它接收返回中断已被确认的信息,然后可以更改的状态相应的中断。只有接受中断的CPU才能结束中断。
4.2 中断处理
如果在GIC中的中断是挂起的,并且IRQ被取消断言,那么在GIC中的中断变成不活动(CPU永远不会看到它)。
如果中断在GIC中是活动的(因为CPU接口已经确认了中断),那么软件ISR通过首先检查GIC寄存器,然后轮询I/O来确定原因外设中断状态寄存器。
4.3 ARM编程主题
GIC寄存器接口
分配器和CPU接口
GIC安全扩展的影响
PU接口寄存器
保留和存储控制状态
4.4 遗留中断和安全扩展
仅向可重入的IRQ处理程序发送IRQ信号,并在GIC中使用抢占特性。
在ICCICR[AckCtl]=0时使用FIQ和IRQ,在不安全模式的情况下使用TLB表处理IRQ,并在安全模式下处理FIQ。