1. 程式人生 > >uboot中斷功能實現

uboot中斷功能實現

支持 中斷控制器 make 編寫 項目 size gpio loop log

uboot中實現irq中斷(uboot version2015.04)
1.實驗目的:實現GPIO_2的外部中斷

2.實驗步驟:
a.GPIO_2(GPIO1_IO02)為中斷源, 首先需要設置這個pad為GPIO模式, 即把該pad復用為GPIO, 所以只需在board/freescale/mx6sabresd/mx6sabresd.c中設置自己的pad, 這裏在iomux_v3_cfg_t const yaxon_pads[]中添加MX6_PAD_GPIO_2__GPIO1_IO02
b.讓u-boot支持irq/fiq中斷, 首先需要在配置文件中定義幾個宏,我在我的板子的配置文件include/configs/mx6sabresd.h中定義了如下宏:

#define CONFIG_USE_IRQ
#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack*/
#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack*/
c.在異常向量表中有異常處理arch/arm/lib/vectors.S, 其中do_irq是irq異常對應的異常處理入口
d.具體的do_irq本來是在arch/arm/lib/interrupts.c(對於#ifdef CONFIG_USE_IRQ的在這個文件中), 項目中自定義的do_irq放在arch/arm/cpu/armv7/mx6/interrupt.c文件裏, 所以把arch/arm/lib/interrupts.c中的do_irq函數註釋掉, 又由於在編譯過程中arm/arm/lib/interrupts.c中的interrupt_init函數中的arch_interrupt_init()未實現會報錯, 所以把該行語句註釋掉,換成return 0;
4.在arch/arm/cpu/armv7/mx6/目錄下實現了gic中斷控制器的相關接口(cortex_a9.c gic.c interrupt.c, 以及相關頭文件(cortex_a9.h gic_register.h gpio_register.h gic.h gpio_interrupt.h interrupt.h)放在頂層目錄的include目錄下), 並在arch/arm/cpu/armv7/mx6目錄下Makefile中添加obj-y +=gic.o, obj-y +=interrupt.o, obj-y +=cortex_a9.o. 註意自己編譯的源代碼, 頭文件可以放在include目錄下, 源文件可以放在任何目錄, 只需在源文件(c文件)的目錄下編寫Makefile文件使它編譯進uboot
5.在common/board_r.c文件中, 在init_sequence_r函數指針數組中的run_main_loop()函數之前添加irq_init(就是irq中斷相關的代碼), 然後實現irq_init()函數, 具體見common/board_r.c中irq_init函數實現

參考文檔:http://www.cnblogs.com/pengdonglin137/p/3820574.html#_label0

uboot中斷功能實現