PowerPC-MPC603e内核学习笔记之mpc8245中断控制器

   

MPC8245EPIC中断控制器采用了OpenPIC的体系结构。EPIC支持5个外部中断和1个串行类型的中断(16个中断以串行方式分发),并支持Pass-Through模式(中断不经过EPIC而直接传给内核进行处理),还支持6个内部中断,还有4个能产生中断的定时器。

EPCI有以下特性:

l        OpenPIC 编程模型

l        5个外部中断和一个串行中断(16个源)

l        4个全局可结合并可产生中断的定时器

l        可控制IICDUARTDMAMU单元产生的中断

l        支持外部可编程中断控制器,如8259

l        Pass-Through模式,外部中断控制器的中断信号直接传给内核

l        可以通过内部的PI寄存器对内核进行软重启

l        16个可编程中断优先级

l        全功能嵌套中断分发

 

EPIC中断控制器框图:

 (年后再上图)

EPIC寄存器是要映射到内存空间上才能使用的,通过EUMBBAR寄存器设置映射的位置。具体偏移地址参见MPC8245的数据手册。

各中断优先级用0-15表示。0最低,15最高。

各中断的优先级顺序:

Timer0-timer3DMA0DMA1MUIICUART1UART2IRQ[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模式:硬件重启后的默认模式。在这个模式中,只有timersMU(watchpointDUART,和DMA)IIC和外部中断控制器的中断会被传到内核中。其它的不被处理,通过(GCR[M] = 0)来允许Pass-Through模式。

Direct Interrupt模式:外部中断是通过5IRQ VPR寄存器来控制的。EICR[SIE] 0允许该模式。并且GCR[M] = 1

 

EPIC串行中断接口:16个中断通过四个信号(S_INT,S_CLK,S_RST,S_FRAME#)串行传递。

 

EPIC Timers4个定时器各自都由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中断。确保所有的pendingin-server寄存器被清除。

7.        重新设置PCTPR寄存器到想要的优先级。

 

寄存器定义:

FRR:指示所支持的中断个数。这里为26个。

GCR:控制EPIC重启。设置是Pass-Through模式还是mixed模式

EICR:指定mixed模式是direct模式还是serial模式,如果是serial模式还要在本寄存器的R字段配置S_CLK的频率。

EVIEPIC的一些版本信息。

PI:用来产生一个软重启。要在中断处理程序及时对P0字段清零。

SVR:当中断IACK寄存器正在读取的时候。获取的其它中断的向量会被放到这里来。

 

 

定时器相关寄存器:

TFRR:没什么用,这个提供给用户使用,可以写入时钟源的频率,需要时直接在这里读取。

TCR:这个寄存器可以使多个定时器联合在一起,从而实现很长的定时时间。

GTCCRn:当GTBCRnCI字段清零时,这个寄存器的COUNT字段开始递减。到0时会产生一个中断

GTBCRnGTCCRn寄存器的初始值。并通过CI字段控制GTCCRn寄存器递减。

GTVPRs:包括了中断源的掩码位Min-serviceA,优先级和中断向量。每个中断源都有一个这样的寄存器。

GTDRs:指示定时器属于那个内核,MPC8245只有一个内核。

 

外部中断寄存器:

IVPRsSVPRs5IVPRs16SVPRs。包括了中断源的掩码位Min-serviceA,中断触发的种类,优先级和中断向量。每个中断源都有一个这样的寄存器。

IDRsSDRs5IDRs16SDRs。指示了这个中断源时属于那个内核。MPC8245只有一个内核。

 

内部中断寄存器:

IIVPRs6个,作用和外部中断寄存器的一样。

IIDRs6个,作用和外部中断寄存器的一样。

 

内核相关的寄存器:

PCTPR:任务的优先级。MPC8245重启的时候这个值为F,最大的优先级。

在为F的时候,没有中断可以打断这个任务。

IACK:当中断被响应的时候,这个寄存器保存了这个中断的偏移量。读取这个寄存器时,IPR寄存器相应的位会被清零。ISR会被更新,内部的INT#信号取消。

EOI:当in-service状态要结束的时候。内核就会写这个寄存器。表示这个最高优先级的中断信号发出了。这时内核读取IACK处理这个中断。现在系统又回到了可以响应中断的状态了。

 

 

 

文章转载请注明出处。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

goodlinux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值