[笔记分享] [中断] MSM7201 Interrupt study report

来源:互联网 发布:钢笔淘宝 编辑:程序博客网 时间:2024/06/06 00:40

Overview

Scope

本文主要介绍MSM7201平台中断机制,适合大多数开发平台。开头还介绍了一般ARM中断的原理。另外还分别介绍了MSM7201的PIC和VIC两种控制器来控制中断的原理以及他们的不同部分。
具体的MSM8x60的中断是如何处理的(包括原理、寄存器设置等)相关的文档还没找到。不过原理应该和MSM7201是差不多的。注意MSM7201和MSM8x60不同部分对中断的影响:
1. MSM7201的modem部分用的是ARM926EJ,ARMv5/ARMv4架构。
2. MSM8x60的mdoem部分用的是ARM11, ARMv6架构。


Interrupt overview

IRQ/FIQ handling it ARM processor

在讨论MSM的中断控制器之前,我们先说下一般ARM是如何处理IRQ/FIQ的。

这里写图片描述

通过上图可知,多种中断源通过中断控制器送到ARM的。寄存器用来保存中断设置、状态等信息。
如果一个中断配置使能而且没有被屏蔽,当其触发时,ARM设置PC跳到异常向量表,表中IRQ或者FIQ地址存放的是一条分支跳转指令,跳转到IRQ/FIQ分支处理程序。由于FIQ是放在异常向量表的最后一个,所以FIQ的处理程序可以直接放在FIQ异常地址的后面,省去跳转所带来的延时。
当IRQ/FIQ跳转到相应处理程序的时候,ARM也会转换成相应的工作模式(IRQ/FIQ)。

这里写图片描述

如上图所看到的,中断是可以嵌套的。假设中断b优先级比a高,当中断a处于中断处理程序在处理中断的时候,这时中断b发生了,那么中断a就会被打断先去处理中断b的ISR, 当中断b处理完后然后再处理中断a。
当中断发生时,处理器处理以下任务:
1.开关中断—如果嵌套不允许,那么就在中断来之后关闭中断直到处理完成。如果允许嵌套,那么在处理一些关键操作如保存中断上下文时要关闭以下中断。
2.保存上下文—保存当前处理模式和nonbanked寄存器。
3.依靠中断控制器来判断哪个中断源发生,找到其ISR。
4.完成ISR后恢复中断上下文。前提是没有其他pending interrupt,如果有的话继续处理,直到全部完成。

Interrupt controllers in MSM7201

MSM7201包含两种中断控制器,一种是优先级中断控制器(PIC),给MSS用。另一种是向量中断控制器(VIC),给ASS使用。两种的IRQ都按优先级顺序触发如果有两个IRQ同时发生的话。当中断源以index number出现时,指的是PIC;当以full ISR address handle出现时,指的是VIC。
两种控制器都有8种优先级中断。FIQ总比IRQ快,和IRQ优先级设置无关。
另外,MPM中断是在MSM休眠的时候用来唤醒MSM用的。只支持某些引脚来唤醒MSM。如下图
这里写图片描述

我当IRQ/FIQ发生时,PIC/VIC会通知相应的处理器。当ASS没工作时,中VIC中的中断会被送到MSS中。当ASS没有工作或者ASS和MSS都没工作时,中断先被送到MPM,MPM先唤醒MSM,然后MSM再处理中断。


Prioritized interrupt controller

Overview

PIC有以下特征:
1. 有58个IRQ中断,8个可编程优先级
2. 最高优先级可从IRQ_VEC_INDEX_RD_REG寄存器读取
3. 允许嵌套中断
4. round-robin算法用来处理同一级中断

Software interface

PIC在接收到多个中断源后,选出优先级最高的,然后为ARM产生一个IRQ_N信号。同时,最高优先级中断源的vector index被更新到IRQ_VEC_INDEX_RD 和 IRQ_VEC_INDEX_PEND_RD中。处理器从这两个寄存器中读取下个vector index然后选择相应的ISR来处理。
当处理器在处理更高优先级的中断时,低优先级中断所产生的IRQ_N信号不会被插入处理。这些有由硬件实现。
PIC通过IN_STACK和IN_SERVICE来跟踪处理器当前的stack和level。IN_SERVICE每个位表示相应级别中断是否有嵌套,IN_STACK表示相应级别中断是否被放到中断stack。当读取IRQ_VEC_INDEX_RD和 IRQ_N的值时这两个寄存器会更新。
软件ISR处理IRQ如下:
1. 保存上下文,从IRQ_VEC_INDEX_RD读取vector index,然后跳转到相应的处理程序。
2. 在执行中断处理程序时,IRQ_N要使能允许更高优先级中断。

在ISR结束时,软件读取IRQ_VEC_INDEX_PEND_RD,在读之前IRQ_N要禁止。如果没探测到新的中断产生,就返回上一级被嵌套的中断。如果有探测到,那么执行新的ISR。
新的ISR优先级要比上一级更高。这样循环到全部执行完成。


Vectored interrupt controller

Overview

VIC的特征包括:
1. 48个中断源,8种优先级中断级别可设置
2. 可通过VICIRQ_VEC_RD 或者 VICIRQ_VEC_PEND_RD寄存器使用AHB来读取最高优先级的interrupt vector
3. 允许嵌套中断
4. round-robin算法处理相同优先级的中断
5. 从中断捕捉到中断处理需最大只有5个HCLK的延时
6. 通过VICIRQ_STATUS_0, VICIRQ_STATUS_1和VICIRQ_VEC_RD_REG记录IRQ
7. 支持非嵌套模式
8. 支持边沿和电平触发

Software interface

ARM11中通过判断CP15 c1 VE位是否被写“1”来决定VIC port的使用,IRQ方式如下:
这里写图片描述

对于FIQ,地址是从0xffff001c 和0x0000001c。
MSM7201配置:
a) high vectors没被使能
b) ARM11中的VIC port没被使用

Software interface without using ARM11 VIC port

当不使用VIC时,中断控制器运行起来像PIC。可通过下面的例子明白,异常表地址是0x0:

为了降低对AXI访问的延迟,可将下面几步方在boot的时候处理:
1. 重新映射异常向量表到高端内存(0XFFFF0000)
2. 重映射指令相关的内存(ITCM)到高内存
3. 将跳转表放到ITCM

下面是异常表被重映射到0XFFFF0000的延迟:

这里写图片描述
当ISR结束时之后的处理步骤和PIC部分原理是一样的,只是这里的处理由内置软件自动处理了。
下面是中断执行的流程图:

这里写图片描述

Software interface using ARM11 VIC port

当使用VIC port的时候,延迟得到解决。访问IRQ异常向量表和用AHB读取VICIRQ_VEC_RD这些工作都没必要了。当IRQ_N来的时候,硬件自动处理加载PC。如下图:

这里写图片描述

MPM interrupt controller

MPM部分的中断主要是为了处理再MSM休眠模式时通过中断对MSM进行唤醒用的。当要进入休眠模式时,ARM在讲时钟源转到TCXO之后关闭所有的时钟和PLL。然后MPM开启32kHz的休眠时钟和关闭TCXO。
MPM里有一个简单的中断控制器来处理MSM唤醒任务。在进入休眠模式之前,所有配置被保存到寄存器中。当休眠时中断被触发了,MPM就开启TCXO,中断又被从MPM复制送到ARM。ARM中断控制器发现中断后触发时钟模块从而使能全局时钟,然后处理中断。
另外,SDRAM也可有必要从自刷新模式切回工作模式。


Comparison of interrupt controller

PIC和VIC有些地方不同,这里一一列举:
1. 中断源表不同
2. 双层和单层表。
MSS有双层表。主要中断源由次要中断源触发,次要中断源需要被检查是否是实际中断。ASS没有次要中断表,所以即使代码设置了也不会运行。
3. 硬件访问。
ASS和MSS使用不同的中断寄存器来访问相关中断相关信息,各自独立。而在软件部分,PIC和VIC相同功能的寄存器被映射成相同名字的,这样对于软件部分来讲可以通用地操作了。如下表:

这里写图片描述

  1. 硬件初始化。
    主要差在BOOT部分,包括FIQ初始化和次要中断初始化。
原创粉丝点击