Interrupt 借由 Interrupt controller 向 pxa270 發出 request,取得該 pin 腳的 GPIO number,再透過 arch/arm/mach-pxa/include/mach/gpio.h 的 gpio_to_irq 取得 irq number,再指向在
arch/arm/mach-pxa/pxa27x.c 中的 pxa27x_init_irq 與
arch/arm/plat-pxa/gpio.c 中的 pxa_init_gpio 初始化時指定的 gpio 與 irq chip,最後註冊 irq chip 內的 chained_handler ...
Linux 使用 irq_desc 表示某一個 irq,chip level ISR 實作可能是舊式的 __do_IRQ 或採用新的 irq_desc->handle_irq() ,到上一層透過 irq_desc->chip 呼叫不同的 handler
kernel/irq/handle.c 定義了 irq_desc[NR_IRQS], NR_IRQS, nr_irqs 代表目前 Linux kernel 擁有的 irq 總數
另外相關的部份:
arch/arm/plat-pxa/gpio.c
arch/arm/kernel/calls.S 處理的 system call interface
arch/arm/kernel/entry-armv.S 定義 irq_handler, interrupt vector table, dispatcher table
arch/arm/mach-pxa/irq.c 處理的 irq interface
https://www.kernel.org/doc/htmldocs/genericirq/index.html
linux kernel source base: 3.1.0-rc1
參考:
ARM中斷流程
沒有留言:
張貼留言