Vectored Interrupt Controller (VIC)
中断向量控制器Vectored Interrupt Controller (VIC) 控制32个中断请求输入,并且可编程的将这些中断分成三类:FIQ, vectored IRQ, and non-vectored IRQ 。
快速中断请求Fast Interrupt reQuest (FIQ)有最高的优先级。如果有一个以上的请求被分配到FIQ,VIC将它们的请求相或以产生FIQ信号给ARM处理器。当只有一个中断请求分配给FIQ时,将会产生一个最短的可能的FIQ延时(即达到最快的中断请求时间),因为FIQ服务程序单单处理这个中断。但是如果多个中断分配给FIQ,FIQ服务程序必需读VIC寄存器以识别是哪个中断产生了FIQ请求。
Vectored IRQs处于中等优先级,但32个中断请求中只有16个可以分配到这个类中。32个中断请求中的任何一个都可以分配到16个vectored IRQ slots中的任意一个。这些槽(slots)中的slot 0具有最高优先级而slot 15为最低优先级。
Non-vectored IRQs 处于最低优先级。
VIC将所有的Vectored IRQs和Vectored IRQs请求相或后产生的IRQ信号传递给ARM处理器。IRQ服务程序通过读VIC的相关寄存器并开始跳转。如果vectored IRQs产生请求,VIC将提供具有最高优先级的IRQs服务程序的地址,否则它会提供所有non-vectored IRQs共用的默认程序地址。默认程序可以读出另一个VIC寄存器看看是哪个IRQs激活了。
/* Vectored Interrupt Controller (VIC) */
/* 向量中断控制器(VIC)的特殊寄存器 */
#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))
// IRQ状态寄存器,该寄存器可以读出使能并且分配给IRQ的中断请求
#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004))
// FIQ状态寄存器,该寄存器可以读出使能并且分配给FIQ的中断请求
#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008))
//原始中断状态寄存器,不论使能和分类,该寄存器都可读出所有32个中断请求/软件中断的情况
#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C))
//中断选择寄存器,将32个中断分类为IRQ或者FIQ
#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010))
//中断使能寄存器
#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014))
//中断清除寄存器,写1清除相应中断请求
#define VICSoftInt (*((volatile unsigned long *) 0xFFFFF018))
//软件中断寄存器,该寄存器内容与32个来自各种外设功能的中断请求相或
#define VICSoftIntClear (*((volatile unsigned long *) 0xFFFFF01C))
//软件中断清除寄存器,相应位写1清除软件中断寄存器中的一位或多位
#define VICProtection (*((volatile unsigned long *) 0xFFFFF020))
//保护使能寄存器,该寄存器允许允许在特权模式下限制访问VIC寄存器
#define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030))
//向量地址寄存器,IRQ中断发生时,IRQ服务程序跳转到该寄存器读出的值
#define VICDefVectAddr (*((volatile unsigned long *) 0xFFFFF034))
//默认向量地址寄存器,该寄存器保存non-vectored IRQs的中断服务程序(ISR)地址
#define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100))
//向量地址0寄存器,0-15分别保存16个vectored IRQ slots的中断服务程序(ISR)地址
#define VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104))
//向量地址1寄存器
#define VICVectAddr2 (*((volatile unsigned long *) 0xFFFFF108))
//向量地址2寄存器
#define VICVectAddr3 (*((volatile unsigned long *) 0xFFFFF10C))
//向量地址3寄存器
#define VICVectAddr4 (*((volatile unsigned long *) 0xFFFFF110))
//向量地址4寄存器
#define VICVectAddr5 (*((volatile unsigned long *) 0xFFFFF114))
//向量地址5寄存器
#define VICVectAddr6 (*((volatile unsigned long *) 0xFFFFF118))
//向量地址6寄存器
#define VICVectAddr7 (*((volatile unsigned long *) 0xFFFFF11C))
//向量地址7寄存器
#define VICVectAddr8 (*((volatile unsigned long *) 0xFFFFF120))
//向量地址8寄存器
#define VICVectAddr9 (*((volatile unsigned long *) 0xFFFFF124))
//向量地址9寄存器
#define VICVectAddr10 (*((volatile unsigned long *) 0xFFFFF128))
//向量地址10寄存器
#define VICVectAddr11 (*((volatile unsigned long *) 0xFFFFF12C))
//向量地址11寄存器
#define VICVectAddr12 (*((volatile unsigned long *) 0xFFFFF130))
//向量地址12寄存器
#define VICVectAddr13 (*((volatile unsigned long *) 0xFFFFF134))
//向量地址13寄存器
#define VICVectAddr14 (*((volatile unsigned long *) 0xFFFFF138))
//向量地址14寄存器
#define VICVectAddr15 (*((volatile unsigned long *) 0xFFFFF13C))
//向量地址15寄存器
#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200))
//向量控制0寄存器,向量控制寄存器0-15分别控制16个16 vectored IRQ slots
#define VICVectCntl1 (*((volatile unsigned long *) 0xFFFFF204))
//向量控制1寄存器
#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF208))
//向量控制2寄存器
#define VICVectCntl3 (*((volatile unsigned long *) 0xFFFFF20C))
//向量控制3寄存器
#define VICVectCntl4 (*((volatile unsigned long *) 0xFFFFF210))
//向量控制4寄存器
#define VICVectCntl5 (*((volatile unsigned long *) 0xFFFFF214))
//向量控制5寄存器
#define VICVectCntl6 (*((volatile unsigned long *) 0xFFFFF218))
//向量控制6寄存器
#define VICVectCntl7 (*((volatile unsigned long *) 0xFFFFF21C))
//向量控制7寄存器
#define VICVectCntl8 (*((volatile unsigned long *) 0xFFFFF220))
//向量控制8寄存器
#define VICVectCntl9 (*((volatile unsigned long *) 0xFFFFF224))
//向量控制9寄存器
#define VICVectCntl10 (*((volatile unsigned long *) 0xFFFFF228))
//向量控制10寄存器
#define VICVectCntl11 (*((volatile unsigned long *) 0xFFFFF22C))
//向量控制11寄存器
#define VICVectCntl12 (*((volatile unsigned long *) 0xFFFFF230))
//向量控制12寄存器
#define VICVectCntl13 (*((volatile unsigned long *) 0xFFFFF234))
//向量控制13寄存器
#define VICVectCntl14 (*((volatile unsigned long *) 0xFFFFF238))
//向量控制14寄存器
#define VICVectCntl15 (*((volatile unsigned long *) 0xFFFFF23C))
//向量控制15寄存器
Vector Control registers 0-15 (VICVectCntl0-15 - 0xFFFF F200-23C)
位 |
信号 |
描述 |
复位值 |
4:0 |
Int_request/ Sw_int_assig |
该数值对应的中断分配到该 vectored IRQ slot中 |
0 |
5 |
IRQslot_en |
置1表示该vectored IRQ slot使能 |
0 |
31:6 |
|
保留 |
NA |
Protection Enable register (VICProtection - 0xFFFF F020)
位 |
信号 |
描述 |
复位值 |
0 |
VIC_access |
0——用户模式和特权模式下均可访问VIC寄存器 1——只有在特权模式下才可访问VIC寄存器 |
0 |
31:1 |
|
保留 |
NA |