arm linux 中断初始化
来源:互联网 发布:visio 软件框架图 编辑:程序博客网 时间:2024/06/05 03:59
中断机制的核心数据结构是 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 中,不再详述。
至此,中断机制的初始化工作已完成。
- arm linux 中断初始化
- arm linux 中断初始化的简要
- ARM Linux中断机制之中断的初始化
- ARM Linux中断机制之中断的初始化
- arm linux 下中断流程简要分析--初始化
- ARM linux的中断向量表初始化分析
- ARM Linux对中断的处理--中断管理系统的初始化
- ARM Linux对中断的处理--中断管理系统的初始化
- Linux中断子系统-中断初始化
- ARM Linux 外部中断
- ARM Linux中断分析
- ARM Linux 中断分析
- ARM-Linux时钟初始化
- ARM-Linux时钟初始化
- ARM Linux中断机制之中断处理
- linux-arm中断系统之中断过程
- ARM Linux中断机制之中断处理
- ARM非向量中断初始化程序和向量初始化程序
- 什么是是JAVA构造函数
- (阿里云 淘宝 百度 腾讯)到此一游
- Java_10_12课堂总结
- 笔记本上安装并设置 minicom
- Java中的环境配置及其[could not open C:/program files/java/jre6/lib/i386/jvm.cfg ]
- arm linux 中断初始化
- Request的getParameter()和getAttribute()方法的区别
- 常用积分公式
- Delphi COM编程技术四自动化技术
- web开发
- Set another viewer for auctex in emacs
- 主成分分析
- Java_10_17课堂总结
- 用 cin 输入整数死循环问题