【ARM】Exynos 4412 中断控制器相关计算

来源:互联网 发布:萧山华数传媒网络号码 编辑:程序博客网 时间:2024/05/21 07:08

由于引入了GIC,在设置中断控制器的时候不免产生各种计算,各种寄存器编号换算比较繁琐,在此提供一种计算方式。

GIC处理中断的流程


GIC中由成百上千的寄存器,要理清寄存器的设置思路,必须要理解GIC是如何处理中断源发来的中断信号的。

  1. 首先,GIC有一个全局开关——ICDDCR。这个寄存器决定了GIC是否会处理外围的中断信号,因此必须先将它打开。

  2. 中断信号到来后,第一个要面对的是GIC的中断源屏蔽,这里GIC提供了两种策略:白名单——ICDISER_CPU,以及黑名单—— ICDICER_CPU。

    在白名单中,相应的中断源位置1表示允许这个中断;在黑名单中,相应的中断源位置1表示禁止这个中断。一般情况下,我们都是使用白名单。

  3. OK,现在许多的中断信号都被允许进入GIC了,接下来中断信号们面对的是GIC的优先级处理系统。这个优先级的处理简单的说就是:谁的优先级高,就先响应谁;低于最低优先级的中断信号将被阻止。

  4. 经过了两轮过滤,剩下的中断信号都将交给CPU处理。那么又出现了一个先后顺序的问题。FIQ优先级高于IRQ这是一定的,另外,在GIC中可以设置每一个中断源的优先级,GIC将根据优先级高低,依次将信号传送给CPU。

  5. 对于一个将要传送给CPU的中断信号,我们是要将它给哪个CPU呢?因为多核处理器有很多的CPU。仍然是通过寄存器来设置。

  6. 到了最后一关,前面只是中断信号自己“一厢情愿”的想要交给CPUn处理,但是CPUn就一定要处理吗?不一定!在这里我们仍然可以操作寄存器将中断信号阻断在从GIC到CPUn的路上,不过这个操作会导致CPUn无法接受到任何中断信号,具有全局属性。

相关计算


在设置GIC之前,你要先知道你要使用的中断的SPI Port No或者PPI Port No,以及ID,可以在GIC Interrupt Table中找到。如下图:

GIC Interrupt Table

下面,以EINT[9]为例,看一下配置寄存器时涉及到的一些计算。

EINT9

SPI Port NO25ID         : 57

中断使能寄存器 ICDISER


ICDISER

可以看到,共有5个寄存器管理了160个中断信号的使能。第一个寄存器负责SGI和PPI,后面四个寄存器负责SPI。

由于我们的SPI号是25,并且SPI编号从0开始,所以应该对应的是第一个寄存器的第26位:

ICDISER1 |= 1<<25;//寄存器的位编号也从0开始

CPU目标选择寄存器 ICDIPTR


从下面的图可以看出,对于每个中断源,使用8位来标识将其送给哪个CPU。因此一个寄存器可以管理4个中断源,160个中断源需要40个寄存器。

Meaning of CPU Targets Field Bit Values

下面的图展示了不同的中断源的寄存器分配情况,SPI中断是从第九个寄存器(ICDIPTR8)开始的。那么怎样算出我们的EINT9中断源在第几个寄存器的第几位呢?下面来分析一下。

因为EINT9的SPI编号是25,所以应该是第26个SPI中断源。并且每个寄存器管理4个中断源,做以下计算:

26 ÷ 4 = 6 ~ 2

那么,如果只看管理SPI的寄存器,EINT9所在的寄存器前面应该有6个寄存器,第一个是ICDIPTR8,所以EINT9所在的寄存器就是8+6=14,即ICDIPTR14的第二个字节。

ICDIPTR14[15:8]

CDIPTRn Address Map

原创粉丝点击