MPC8245的EPIC中断控制器采用了OpenPIC的体系结构。EPIC支持5个外部中断和1个串行类型的中断(16个中断以串行方式分发),并支持Pass-Through模式(中断不经过EPIC而直接传给内核进行处理),还支持6个内部中断,还有4个能产生中断的定时器。
EPCI有以下特性:
l OpenPIC 编程模型
l 5个外部中断和一个串行中断(16个源)
l 4个全局可结合并可产生中断的定时器
l 可控制IIC,DUART,DMA和MU单元产生的中断
l 支持外部可编程中断控制器,如8259
l 在Pass-Through模式,外部中断控制器的中断信号直接传给内核
l 可以通过内部的PI寄存器对内核进行软重启
l 16个可编程中断优先级
l 全功能嵌套中断分发
EPIC中断控制器框图:
(年后再上图)
EPIC寄存器是要映射到内存空间上才能使用的,通过EUMBBAR寄存器设置映射的位置。具体偏移地址参见MPC8245的数据手册。
各中断优先级用0-15表示。0最低,15最高。
各中断的优先级顺序:
Timer0-timer3。DMA0,DMA1,MU,IIC,UART1,UART2,IRQ[0:4](或串行中断)
用户可以通过PCTPR寄存器设置系统任务的中断优先级为15来阻止其它中断打断任务。
中断应答:EPIC通过INT#信号来通知内核处理中断,中断处理程序通过读取IACK寄存器来响应中断,读取到的是一个8位的中断向量。这时候中断被认为是正在处理中,只有内核能写EOI寄存器,这个从响应到写EOI的过程叫EOI周期。
中断嵌套:EPIC能够允许高优先级的中断打断低优先级的中断(前提是MSR[EF] = 1 和不在一个EOI周期中)。
一个中断在EPIC内部的处理过程:
(年后再上图)
IPR寄存器:先通过读取相应VPR寄存器的mask位,判断该中断是否要被处理。mask被置位,该中断都不被处理。
IS寄存器:也就是中断判优寄存器。需要两个clock周期。
IRR寄存器:产生INT#信号并传递中断向量到内核的寄存器。
ISR寄存器:当中断in-server的时候。ISR寄存器在EOI周期接收一个bit-set命令来禁止该中断的向量和优先级被修改(因为这是该向量和优先级正在被使用中)。
Pass-Througt模式:硬件重启后的默认模式。在这个模式中,只有timers,MU(watchpoint,DUART,和DMA),IIC和外部中断控制器的中断会被传到内核中。其它的不被处理,通过(GCR[M] = 0)来允许Pass-Through模式。
Direct Interrupt模式:外部中断是通过5个IRQ VPR寄存器来控制的。EICR[SIE] = 0允许该模式。并且GCR[M] = 1。
EPIC串行中断接口:16个中断通过四个信号(S_INT,S_CLK,S_RST,S_FRAME#)串行传递。
EPIC Timers:4个定时器各自都由4个控制寄存器。
l 当前计数器GTCCR:记录当前递减数
l 基础计数器GTBCR:递减开始的数
l 向量优先级寄存器GTVPR:该定时器优先级和中断向量基址
l 目标寄存器GTDR:只读,表示这个定时器属于那个内核,MPC8245只有一个内核。
EPIC编程指导:
使用EPIC,包括中断和定时器的初始化,读取IACK会返回将要处理的中断的向量偏移值。外部中断和16个串行中断源可以被设置为电平触发和边沿触发。并且设置优先级。
大多数的EPIC的控制和状态寄存器读取时都会返回最后写入的值。下面是一些例外;
l EOI寄存器,读取的时候总是为0。
l VPR寄存器中的Activity bit(A),返回的是当前中断源的状态(in-server or no)
l IACK寄存器,返回的是虚假的向量或者是最高优先级中断的向量。
l 保留位,返回值很难确定。
写寄存器的最好方法,先读取,修改想写的位。写回。
当EPIC被设置成mixed模式时,需要注意一下几点:
l 如果MMU被允许,请确保EPIC的寄存器定位在一个不被缓存的区域。
l EUMB的范围要合适,限制在0x8000_0000 到 0xFDFF_FFFF。
l 这里描述的EPIC寄存器是假设为小端模式下的。如果你是在大端模式环境下请自行通过软件进行转换。
以下是被推荐的初始化步骤:
1. 设置所有中断的VPR寄存器,保留M bit的值(如果中断正在被使用)
2. 设值PCTPR寄存器,使当前任务的优先级为0。
3. 设置GCR[M] = 1,使EPIC处于mixed模式。
4. 如果使用direct模式,清ICR[SIE]位。如果是serial模式,设置ICR[R]得到想要的S_CLK周期,置位ICR[SIE]。
5. 清除想要使用中断的M bit。
6. 清除所有的pending中断。确保所有的pending和in-server寄存器被清除。
7. 重新设置PCTPR寄存器到想要的优先级。
寄存器定义:
FRR:指示所支持的中断个数。这里为26个。
GCR:控制EPIC重启。设置是Pass-Through模式还是mixed模式
EICR:指定mixed模式是direct模式还是serial模式,如果是serial模式还要在本寄存器的R字段配置S_CLK的频率。
EVI:EPIC的一些版本信息。
PI:用来产生一个软重启。要在中断处理程序及时对P0字段清零。
SVR:当中断IACK寄存器正在读取的时候。获取的其它中断的向量会被放到这里来。
定时器相关寄存器:
TFRR:没什么用,这个提供给用户使用,可以写入时钟源的频率,需要时直接在这里读取。
TCR:这个寄存器可以使多个定时器联合在一起,从而实现很长的定时时间。
GTCCRn:当GTBCRn的CI字段清零时,这个寄存器的COUNT字段开始递减。到0时会产生一个中断
GTBCRn:GTCCRn寄存器的初始值。并通过CI字段控制GTCCRn寄存器递减。
GTVPRs:包括了中断源的掩码位M,in-service位A,优先级和中断向量。每个中断源都有一个这样的寄存器。
GTDRs:指示定时器属于那个内核,MPC8245只有一个内核。
外部中断寄存器:
IVPRs,SVPRs:5个IVPRs,16个SVPRs。包括了中断源的掩码位M,in-service位A,中断触发的种类,优先级和中断向量。每个中断源都有一个这样的寄存器。
IDRs,SDRs:5个IDRs,16个SDRs。指示了这个中断源时属于那个内核。MPC8245只有一个内核。
内部中断寄存器:
IIVPRs:6个,作用和外部中断寄存器的一样。
IIDRs:6个,作用和外部中断寄存器的一样。
内核相关的寄存器:
PCTPR:任务的优先级。MPC8245重启的时候这个值为F,最大的优先级。
在为F的时候,没有中断可以打断这个任务。
IACK:当中断被响应的时候,这个寄存器保存了这个中断的偏移量。读取这个寄存器时,IPR寄存器相应的位会被清零。ISR会被更新,内部的INT#信号取消。
EOI:当in-service状态要结束的时候。内核就会写这个寄存器。表示这个最高优先级的中断信号发出了。这时内核读取IACK处理这个中断。现在系统又回到了可以响应中断的状态了。
文章转载请注明出处。