All*_*lan 2 linux arm linux-device-driver interrupt-handling
在过去的几天里,我正在研究很多关于linux第10章的书ldd3.我有一些疑问请澄清一下.有些是我的分析,如果他们错了,请建议.
对于ARM,有一个中断向量表地址 - IRQ中断 - 0x00000018然后芯片制造商可以为USART,SPI,I2C,外部中断等硬件提供单独的中断线 - 并将它们复用到单个IRQ线臂.并有(他们选择的)寄存器来确定哪一个触发了中断.
此外,如果有一个中断线可用于GPIO引脚电平变化中断.如下所示,链路的单个中断线可以由不同设备驱动程序的许多处理程序共享.
fiq&irq handler - arm 通常,中断控制器是一个硬件单元,它将许多中断线复用在一起,为CPU产生单线.发生中断时,控制器会断言IRQ线.CPU停止执行并跳过IRQ向量(位置变化)到中断处理程序.中断处理程序读取中断控制器上的寄存器以确定中断线,然后调用正确的中断处理程序,然后清除中断 - 允许另一个中断发生.
http://www.makelinux.net/ldd3/chp-10-sect-2 此链接中描述了如何注册中断处理程序.
https://unix.stackexchange.com/questions/47306/how-does-the-linux-kernel-handle-shared-irqs Linux为同一共享线路调用所有intruppt处理程序.
我的问题是作为一个设备驱动程序程序员我只调用.... request_irq().
谁提供通用的代码 - IRQ中断@ 0x00000018地址 - 它正在读取供应商特定寄存器以确定哪个中断线引发了IRQ.然后告诉linux功能 - 调用为该IRQ线路注册的所有共享中断处理程序?
是芯片组的GCC编译器启动代码为我们做这项工作吗?
实际的中断处理由linux/arch/arm/kernel/entry-armv.S设置.然后,在解码和运行中断处理程序时涉及长链代码.
实际的request_irq是通用代码,它设置了一个"描述符"irq_desc,在linux/include/linux/irqdesc.h中定义.
在电路板的特定设置中配置"哪个中断是哪个"的实际处理.我在这里给出一个omap2/omap3板的例子(随机选择,因为我使用过这些板,但不是在Linux中): linux/arch/arm/mach-omap2/irq.c
我希望这有帮助.