S5P4418裸机开发(十三):GIC
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
,< opcode_1>,GICC_CTLR寄存器地址偏移为0x00,而基值在PERIPHBASE[31:13]中。
通过协处理器CP15 c15来获取基值。
Cortex-A9 Technical Reference Manual 中有具体说明。
MRC指令格式:
MCR{
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)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
