GIC系列文章:

  • arm GIC介绍之一
  • arm GIC介绍之二
    S5P4418裸机开发(十三):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裸机开发(十三):GIC

S5P4418的芯片手册只说明了通过VIC配置中断,尝试着通过GIC来配置中断一直没成功。但是使用VIC必须失能GIC,CPU才会响应VIC的中断。
另外A的GIC好像是PL390。GICv1。
S5P4418裸机开发(十三):GIC
手册中提示参考文档 Cortex A9 MP Core Technical Reference Manual

绕过GIC,GICC_CTLR[0] = 0

GICC_CTLR寄存器地址偏移为0x00,而基值在PERIPHBASE[31:13]中。
S5P4418裸机开发(十三):GIC
S5P4418裸机开发(十三):GIC
S5P4418裸机开发(十三):GIC
通过协处理器CP15 c15来获取基值。
Cortex-A9 Technical Reference Manual 中有具体说明。
S5P4418裸机开发(十三):GIC
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)

相关文章: