1 中断
1.1 GIC中断
GIC 将众多的中断源分为分为三类:
- ①、
SPI(Shared Peripheral Interrupt),共享中断,顾名思义,所有 Core 共享的中断,这个是最常见的,那些外部中断都属于 SPI 中断(注意!不是 SPI 总线那个中断) 。比如 GPIO 中断、串口中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core。 - ②、
PPI(Private Peripheral Interrupt),私有中断,我们说了 GIC 是支持多核的,每个核肯定有自己独有的中断。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断。 - ③、
SGI(Software-generated Interrupt),软件中断,由软件触发引起的中断,通过向寄存器GICD_SGIR写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信
1.2 中断ID
中断源有很多,为了区分这些不同的中断源肯定要给他们分配一个唯一 ID,这些 ID 就是中断 ID。每一个 CPU 最多支持 1020 个中断 ID,中断 ID 号为 ID0~ID1019。这 1020 个 ID 包含了 PPI、SPI 和 SGI,那么这三类中断是如何分配这 1020 个中断 ID 的呢?这 1020 个 ID 分配如下:
ID0-ID15:这 16 个 ID 分配给 SGIID16-ID31:这 16 个 ID 分配给 PPIID32~ID1019:这 988 个 ID 分配给 SPI,像 GPIO 中断、串口中断等这些外部中断 ,至于具体到某个 ID 对应哪个中断那就由半导体厂商根据实际情况去定义了。比如STM32MP1 系列总共分配了 265 个中断 ID(有很多并未使用,只是保留着),加上前面属于 PPI 和 SGI 的 32 个ID,STM32MP1 的中断源共有 256+32=288 个
1.3 参考手册
- NVIC
- GIC
- EXTI,EXTI 是什么东西呢?全称是:Extended interrupt and event controller,中文一般叫做外部中断和事件控制器。
EXTI 是 ST 自己设计的,用来辅助 GIC 管理 STM32MP1 相应中断的。EXTI通过可配置的事件输入和直接事件输入来管理唤醒。它可以针对电源控制提供唤醒请求、针对CPU 事件输入生成事件。EXTI 唤醒请求
1.4 ST MP157中断处理方式
可以看出 STM32MP1 的中断处理方式有 5 种:
- ①、外设直接产生中断到 GIC,然后由GIC 、通知 CPU 内核。
- ②、GPIO 或外设产生中断到 EXTI,EXTI 将信号提交给 GIC,最终再将中断信号提交给CPU。
- ③、GPIO 或外设产生中断到 EXTI,EXTI 直接将中断信号提交给 CPU。
2 设备树
2.1 设备树参考文档
- 如果要在 Linux 系统中使用中断,那么就需要在设备树中设置好中断属性信息,Linux 内核通过读取设备树中的中断属性信息来配置中断
- GIC 控制器的设备树绑定信息参考文档Documentation/devicetree/bindings/interrupt-controller/arm,gic.yaml,
- EXTI 控制器的设备树绑定信息参考文档 Documentation/devicetree/bindings/interrupt-controller/st,stm32-exti.txt
2.2 GIC控制器节点
-
compatible 属性值为“arm,cortex-a7-gic”在 Linux 内核源码中搜索“arm,cortex-a7-gic”即可找到 GIC 中断控制器驱动文件
-
第 3 行,#interrupt-cells 和#address-cells、#size-cells 一样。表示此中断控制器下设备的 cells大小,对于设备而言,会使用 interrupts 属性描述中断信息,#interrupt-cells 描述了 interrupts 属性的 cells 大小,也就是一条信息有几个 cells。每个 cells 都是 32 位整形值,对于 ARM 处理的GIC 来说,一共有 3 个 cells,这三个 cells 的含义如下:
第一个 cells:中断类型,0 表示 SPI 中断,1 表示 PPI 中断。 第二个 cells:中断号,对于 SPI 中断来说中断号的范围为 32-287(256 个),对于 PPI 中断来说中断号的范围为 16-31,但是该 cell 描述的中断号是从 0 开始。 第三个 cells:标志,bit[3:0]表示中断触发类型,为 1 的时候表示上升沿触发,为 2 的时候 表示下降沿触发,为 4 的时候表示高电平触发,为 8 的时候表示低电平触发。bit[15:8]为 PPI 中断的 CPU 掩码。 第 4 行,interrupt-controller 节点为空,表示当前节点是中断控制器。
- 《STM32MP157 参考手册》第“21.2 GIC Interrupts”小节中的表 117。找到SPI6 对应的中断号
2.3 EXTI控制器节点
- 对于 GPIO 中断而言,要用到 EXTI,所以我们接下来看一下 EXTI 设备节点。打开stm32mp151.dtsi 文件,其中的 exti 节点就是 EXTI 的中断控制器节点
- 第1340行,
表明 exti 节点是个中断控制器。 - 第1341行,interrupt-cells=2,表明 exti 的子节点里面第一个 cell 表示为中断号,也可以叫 EXTI事件编号,第二个 cell 表示中断标志位。
2.3.1 GPIO的中断和EXTI联系起来
- pinctrl 节点,此节点有 11 个子节点,gpioa-gpiok,分别对应 GPIOA-GPIOK这 11 组 IO。第 1819 行,通过 interrupt-parent 属性指定 pinctrl 所有子节点的中断父节点为 exti,这样 GPIO 的中断就和 EXTI 联系起来了。
- 第1824行为gpioa节点,第1827行表明gpioa节点也是个中断控制器
- 第1828行设置
interrupt-cells为2,那么对于具体的 GPIO 而言,interrupts 属性第一个 cell 为某个 IO 在所处组的编号,第二个 cell 表示中断触发方式。比如现在要设置 PA1 这个引脚为下降沿触发,那么就要interrupts = <1 IRQ_TYPE_EDGE_FALLING>
2.3.2 具体HDMI应用开发
2.3.4 总结