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的中斷。
另外A的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)