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