admin管理员组

文章数量:1794759

Exynos

Exynos

目录

一、中断控制器

中断控制器的作用:

二、Exynos_4412下的中断控制器

它支持三种类型的中断

可以编程设置:

三、中断控制器详解

四、中断控制器编程


一、中断控制器

外设产生的中断信号,先要经过中断控制器,中断是异常的一种,如果没有中断控制器,多个外设一起产生中断我们该执行哪一个?在中断处理程序中又收到了中断应该打断吗?

在处理IRQ的时候,会将CPSR写入IRQ_SPSR,然后将CPU切换为IRQ模式,把状态改成ARM状态,把I位写成1禁止全部的IRQ,所以中断这样是我们不想要的。4412是一个四核的CPU,在发送中断前要确定发送给哪个CPU。任何一个外部设备都能触发FIQ和IRQ,只是FIQ速度快一些。还有很多问题,为了解决这些问题,三星公司在设计时就加了一个中断控制器

中断优先级只是决定排队的先后,但是高优先级的不能打断低优先级的中断。

中断控制器的作用:

多个中断同时产生时可对这些中断挂起排队,然后按照优先级依次发送给CPU处理 可以为每一个中断分配一个优先级 一个中断正在处理时若又产生其它中断,可将新的中断挂起,待CPU空闲时再发送 可以为每一个中断选择一个CPU处理 可以为每一个中断选择一个中断类型(FIQ或IRQ) CPU接收到中断信号后并不能区分是哪个外设产生的,此时CPU可查询中断控制器 来获取当前的中断信号是由哪个硬件产生的,然后再进行对应的处理 可以打开或禁止每一个中断 ... ...

二、Exynos_4412下的中断控制器

它支持三种类型的中断

SGI:软中断,不是ARM架构里的那个SWI,这个是多核处理器之间用的比较多,一般操作系统内核中会使用。

PPI:私有外设中断

SPI:共享外设中断可以发送给任何一个CPU去执行。

可以编程设置:

安全模式和非安全模式:安全状态可以触发FIQ和IRQ,非安全状态只可以触发IRQ,咱们一般只使用IRQ

配置中断优先级:

打开或者关闭一些中断:

接收中断的处理器:

 中断状态说明:可以选择这几种状态

一共有160个中断信号

中断控制器(GIC)有0-159个中断信号ID,只是起到标识作用没有其它作用

128个SPI   16个PPI     16个SGI

我们这次使用的GPIO中断是EINT[9],也就是外部中断9

 

三、中断控制器详解

真正做开发时这些中断控制器的配置其实是不需要自己写的,ARM-cortex-A9系列的控制器一般都要跑个Linux或者Android操作系统,而这些东西操作系统都为我们写好了,直接调就行。但现在是裸机开发,所以把相关的寄存器找到配置一次

写0忽略全部的外部中断信号,并且不将挂起的中断转发到CPU的接口

写1 监控所有的外部中断,并将挂起的中断转发到CPU的接口

相当于GIC(中断控制器)的总开关。

5个32位的寄存器控制这160个中断 

 下面这个寄存器用来为每一个中断选择处理他的CPU

 4412是一个四核的CPU所以高四位是没有用的。

 

一共需要40个寄存器来管理这160个中断归属于哪一个CPU处理

 正常上电只能使用CPU0,想使用其它的CPU要设置很多CPU相关的寄存器。

上面是中断控制器和CPU之间的接口,他就像一个开关用哪个就要打开哪个

不设置FIQ和IRQ默认是给IRQ所以我们就不设置了,因为本来就是要做IRQ的实验

然后因为只有一个中断所以也不需要设置中断优先级。

所以我们一共需要设置4个寄存器就可以了

ICDDCR:中断总开关

ICDISER:每个中断的小开关,我们要打开57号中断的开关

ICDIPTR:确定我们的57号中断发送给哪个CPU处理,暂时只能是CPU0

ICCICR:中断控制器和CPU之间的接口

四、中断控制器编程

#include "exynos_4412.h"int main()
{GPX1.CON = GPX1.CON | (0xF << 4);EXT_INT41_CON = EXT_INT41_CON & (~(0x7 << 4)) | (0x2 << 4);EXT_INT41_MASK = EXT_INT41_MASK & (~(1 << 1));ICDDCR = ICDDCR | 1;ICDISER.ICDISER1 = ICDISER.ICDISER1 | (1 << 25);ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & (~(0xFF << 8)) | (0x01 << 8);CPU0.ICCICR = CPU0.ICCICR | 1;return 0;
}

本文标签: Exynos