2011年8月16日 星期二

Linux gpio & irq mapping

arch/arm/plat-pxa/gpio.c 定義了 pxa_gpio_chip 指的是某一個管理 gpio interrupt 的 register 而一個 register 是 4 bytes,所以最多管 32 根 gpio (irq),例如 pxa270 的 Section 24. Interrupt Controller 定義了 0~39 (扣除 reserved 也用到 33,第 34 根 GPIO),因此保留兩個 gpio_chip 的空間 32*2= 64 個位置給 gpio 對應的 irq number。

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中斷流程