rt5350 中断初始化
linux 下的中斷初始化,實際就是對 irq_desc 這個結構體進行初始化,其中最關鍵莫過于
irq_flow_handler_t?? ?handle_irq??????????? 中斷處理函數
struct irqaction?? ????? *action?????????????????? 用戶自己設置的處理函數鏈表,由handle_irq調用
struct irq_chip?? ??? ?*chip??????????????????????? 硬件相關的操作,比如設置管腳為中斷模式,使能中斷等等。
這三個結構體成員變量的賦值了,其中handle_irq和chip一般官方的bsp里會為我們設置好,而action鏈表是我們自己的中斷處理函數,handle_irq會去遍歷action鏈表并執行。系統中每一個中斷號會對應一個irq_desc結構體。
在kernel/irq/handle.c 中,系統為我們定義并初始化了一個irq_desc的結構體數組,中斷號為數組下標。也就是
說每一個中斷號會對應一個irq_desc結構體。linux整個中斷機制實際就是圍繞這個結構體數組進行的,即,
賦值,調用等等。
1. arch/mips/kernel/irq_cpu.c
??? mips_cpu_irq_init
??????????? for (i = irq_base + 2; i < irq_base + 8; i++)
?? ??? ???????????? set_irq_chip_and_handler(i, &mips_cpu_irq_controller,handle_level_irq);
???????? irq_base為0,實際上注冊了2 -- 7 中斷號的處理函數
2. kernel/irq/chip.c
??? set_irq_chip_and_handler
?????????? __set_irq_handler
??????????????? desc->handle_irq = handle
?????? 最終是把handle_level_irq作為這個6個中斷號的中斷處理函數
handle_level_irq
1.? kernel/irq/chip.c
???? handle_level_irq
??????????? handle_IRQ_event(irq, action)
2.kernel/irq/handle.c
????? handle_IRQ_event
?????????????????? do {
?? ??? ?????????????? ret = action->handler(irq, action->dev_id);
?? ??? ? ? ? ? ? ? ? if (ret == IRQ_HANDLED)
?? ??? ??? ????????????????? status |= action->flags;
?? ??? ?????????????? retval |= ret;
?? ??? ????????????? action = action->next;
?? ??????????? } while (action);
???????????????? 這里挨個調用desc中action鏈表中的處理函數進行真正的中斷處理
下面分析rt5350中對gpio中斷的初始化,從 include/asm-mips/rt2880/surfboardint.h 中可以看到
#define SURFBOARDINT_GPIO?? ? 6?? ?/* GPIO */
說明GPIO中斷的中斷號為6,這塊和三星的芯片差別比較大,三星的芯片有專門的外部中斷管腳(雖然也是
GPIO管腳復用),但是每個外部中斷管腳對應一個中斷號。而且ralink的是所有的GPIO復用中斷管腳共用一個
中斷號6. 而且ralink的bsp中給6號中斷已經注冊了action鏈表,那,我想我們就不用自己調用request_irq函數去
給他注冊action鏈表了吧,直接修改ralink_gpio_irqaction應該就行了吧
1. arch/mips/kernel/head.S
??? j?? ??? ?start_kernel
2. init/main.c
????? start_kernel
???????????????????? init_IRQ
3.? arch/mips/kernel/irq.c
???? init_IRQ
??????????????????? arch_init_irq
4.? arch/mips/rt2880/irq.c
??????? arch_init_irq
?????????????????? ralink_gpio_init_irq
5. drivers/char/ralink_gpio.c??????? ralink_gpio_init_irq
???????????? setup_irq(SURFBOARDINT_GPIO, &ralink_gpio_irqaction);
??????????? 實際上request_irq也是調用setup_irq來注冊中斷處理函數,那么我們就不應該再去調用request_irq了,實際上系統已經為我們做好了6號中斷的注冊,我們應該只需要將我們需要的GPIO管腳設置為中斷模式即可。
???????????? 其中SURFBOARDINT_GPIO=6,在這個函數中注冊action,以供handle_IRQ_event調用
? 使用cat /proc/interrupts命令可以看到gpio中斷號的確是6
總結
以上是生活随笔為你收集整理的rt5350 中断初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AM335X 分配大于4M的frameb
- 下一篇: 直播:央视端午晚会正式开场 完整节目单出