arm linux 中断初始化

中断机制的核心数据结构是 irq_desc,它完整地描述了一条中断线(或称为“中断通道” ) 。

irq_desc 结构在 include/linux/irq.h 中定义在 kernel/irq/handle.c 中

有个全局 irq_desc 数组,描述了系统中所有的中断线:
handle_irq,这是个函数指针,指向的是一个高层次的中断事件处理函数,定义了处理中断事件的一种策略。
在 kernel/irq/chip.c 中实现了 5 个函数:handle_simple_irq(),handle_level_irq(),
handle_irq 指针可handle_edge_irq(),handle_fasteoi_irq()以及 handle_percpu_irq()。
以指向这 5 个函数中的一个,选择一种中断事件处理策略,这是通过函数 set_irq_handler()完成的。



接下来是 chip,   这是个 irq_chip 结构指针。irq_chip 结构定义了对中断线的底层硬件操作,
在 include/linux/irq.h 中:


最后的数据成员是 action,这是个 irq_action 结构指针。 irq_action 结构定义了安装在中
断线上的一个中断处理程序,在 include/linux/interrupt.h 中


init/main.c
asmlinkage void __init start_kernel(void)
{
......
584   setup_arch(&command_line);//{750   init_arch_irq = mdesc->init_irq;} 对627行调用的init_arch_irq函数指针赋值。
......
/* 重定位中断向量表,修改中断向量表占用页面的访问权限 */
606   trap_init();
....
/* 这个函数首先把irq_desc数组中的所有元素的status设为IRQ_NOREQUEST|IRQ_NOPROBE(没有请求,没有检测),然后调用init_arch_irq()*/
627   init_IRQ();//{init_arch_irq();...}

}
init_arch_irq()在setup_arch()中被赋值,指向machine_desc中定义的init_irq函数指针。AT91SAM9260EK 平台上,就指向了 arch/arm/mach-at91/board-sam9260ek.c 中定义的函数ek_init_irq()。ek_init_irq() 又 调 用 了 arch/arm/mach-at91/at91sam9260.c中的at91sam9260_init_interrupts()。(这个machine_desc的赋值在arch/arm/mach-at91/board-sam9260ek.c最后几行中MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK").....其中就有.init_irq = ek_init_irq。)
接下来 arch/arm/mach-at91/irq.c 中 的 at91_aic_init()进行AIC初始化,调用arch/arm/mach-at91/gpio.c 中的 at91_gpio_irq_setup()进行GPIO的中断初始化。
arch/arm/mach-at91/irq.c
static struct irq_chip at91_aic_chip = {
    .name   = "AIC",
    .ack    = at91_aic_mask_irq,
    .mask   = at91_aic_mask_irq,
    .unmask   = at91_aic_unmask_irq,
    .set_type = at91_aic_set_type,                                                                      
.>  .set_wake = at91_aic_set_wake,
  };
132 void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS])
这个函数主要是写了 AIC 的一些寄存器,还为每个中断线设置了 chip(指向at91_aic_chip) 和 handle_irq ( 指 向 handle_level_irq ) 然 后 把 中 断 线 的 状 态 修 改 为IRQF_VALID | IRQF_PROBE(已有效&以检测),at91_aic_chip 定义的底层操作函数也在arch/arm/mach-at91/irq.c 中,不再详述。
至此,中断机制的初始化工作已完成。

阅读更多
个人分类: Linux Kernel ARM
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭