tech-sjh

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

http://www.kernel.org/doc/htmldocs/genericirq.html

linux kernel source base: 3.1.0-rc1

參考:

ARM中斷流程

沒有留言:

張貼留言

版權宣告、免責聲明


姓名標示、非商業性、相同方式分享3.0台灣授權條款授權。
免責聲明: 本文所載資料僅供參考,並不構成投資建議,
讀者閱讀或使用該資料所導致結果需要自擔風險與責任,
作者概不承擔閱讀人行為之任何風險與責任。
除非有特別宣稱,作者言論並不代表所屬任何團體、公司、或其他人意見。