2012-12-29 17 views
2

最近幾天我正在學習很多關於linux第10章書ldd3的知識。我有一些疑問請澄清他們。有些是我的分析,如果他們錯了,請提出建議。啓動代碼 - linux的IRQ中斷手柄ARM

對於ARM有一箇中斷向量表地址 - 中斷IRQ - 0x00000018 然後,芯片的製造商可具有用於有一個獨立的中斷線路硬件等USART,SPI,I2C,外部中斷 - 並將它們複用到ARM的單個IRQ線路。 並有(他們選擇的)寄存器來確定哪一個觸發中斷。

此外,如果有例如有一箇中斷線可用於GPIO引腳電平變化中斷。 按照以下鏈接,可以由不同設備驅動程序的許多處理程序共享鏈接的單箇中斷線。

fiq & irq handler -- arm 通常情況下,中斷控制器是一個硬件單元,它將許多中斷線路複用在一起,產生一條到CPU的線路。當發生中斷時,控制器斷言IRQ線路。 CPU停止執行並通過IRQ向量(位置變化)跳轉到中斷處理程序。中斷處理程序通過讀取中斷控制器上的寄存器來確定中斷線,並調用正確的中斷處理程序,然後清除中斷 - 從而允許另一中斷髮生。

http://www.makelinux.net/ldd3/chp-10-sect-2 如何註冊中斷處理程序在此鏈接中描述。

https://unix.stackexchange.com/questions/47306/how-does-the-linux-kernel-handle-shared-irqs Linux調用同一共享線路的所有intruppt處理程序。

我的問題是作爲一個設備驅動程序員我只打電話.... request_irq()。

誰在提供通用代碼--IRQ中斷@ 0x00000018地址 - 它正在讀取供應商特定的寄存器以確定哪個中斷線引發了IRQ。 然後告訴linux功能 - 調用所有共享中斷處理程序註冊的IRQ行?

是GCC編譯器的芯片組啓動代碼爲我們做這項工作嗎?

回答

6

實際的中斷處理由linux/arch/arm/kernel/entry-armv.S設置。那麼解碼和運行中斷處理程序就會涉及很長的代碼鏈。

實際的request_irq是通用代碼,它在linux/include/linux/irqdesc.h中定義了一個「描述符」irq_desc。

在板的特定設置中配置了「哪個中斷是哪個」的實際處理。我在這裏給出了一個omap2/omap3板的例子(隨機選擇,因爲我曾與這些板,但在Linux中): linux/arch/arm/mach-omap2/irq.c

我希望這有助於。

1

在入門armv。S檔,可以定位所述代碼用於填充IRQ線folows:

/* 
* Interrupt handling. Preserves r7, r8, r9 
*/ 
.macro irq_handler 
get_irqnr_preamble r5, lr 
1: get_irqnr_and_base r0, r6, r5, lr 
movne r1, sp 
@ 
@ routine called with r0 = irq number, r1 = struct pt_regs * 
@ 
adrne lr, BSYM(1b) 
bne asm_do_IRQ 

get_irqnr_and_base宏被suposed是機器特定,因此包含在文件arch /臂/ mach_ /包含/入門macro.S。 您可以看到,對於基於arm的不同機器,這個宏以不同的方式實現。所以這就是如何根據不同的HW來完成IRQ線的識別。