GIC系列文章:
- arm GIC介绍之一
- arm GIC介绍之二
GIC由Distributor和CPU interface组成;
Group0,Secure accesses,FIQ驱动
Group1,Non-secure accesses,IRQ驱动
VIC和GIC:VIC可以用传统单片机中断的思维去理解,GIC应该从Linux系统的角度去考虑。
VIC中外设的中断号n
对应到GIC中是32 + n
,GIC中SGI(ID0-ID15),PPI(ID16-ID31),SPI(ID16~ID1019)。
S5P4418的芯片手册只说明了通过VIC配置中断,尝试着通过GIC来配置中断一直没成功。但是使用VIC必须失能GIC,CPU才会响应VIC的中断。
另外A9的GIC好像是PL390。GICv1。
手册中提示参考文档 Cortex A9 MP Core Technical Reference Manual
-
GICD相关寄存器(Distributor)
-
GICC相关寄存器(CPU interface)
-
这里还有一个命名的问题
-
ARM® Generic Interrupt Controller Architecture Specification 中有对各寄存器详细描述
绕过GIC,GICC_CTLR[0] = 0
GICC_CTLR
寄存器地址偏移为0x00,而基值在PERIPHBASE[31:13]
中。
通过协处理器CP15 c15来获取基值。
Cortex-A9 Technical Reference Manual 中有具体说明。
MRC指令格式:
MCR{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}
u32 periphbase;
__asm__(
"MRC p15, 4, %0, c15, c0, 0\n"
:"=r"(periphbase)
);
printf("PERIPHBASE:%x\r\n", periphbase);
这样就获取到基值了0xF0000000
#define PERIPHBASE 0xF0000000 // "MRC p15, 4, %0, c15, c0, 0\n"
#define GICC_ADDR (PERIPHBASE + 0x0100)
#define GICD_ADDR (PERIPHBASE + 0x1000)
#define GICC_CTLR __REG(GICC_ADDR + 0x00)