uboot中斷功能實現

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

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函數

相關文章
相關標籤/搜索