val*_*iki 7 linux irq linux-kernel interrupt-handling embedded-linux
什么是链式IRQ?做什么chained_irq_enter和chained_irq_exit做什么,因为在中断发生后IRQ线被禁用,但是chained_irq_enter调用与屏蔽中断有关的功能.如果该行已被禁用,为什么要屏蔽中断?
Sam*_*nko 11
什么是链式irq?
如何在父(中断控制器)设备的IRQ处理程序中为子设备调用中断处理程序有两种方法.
链式中断:
generic_handle_irq() 用于中断链接嵌套中断
handle_nested_irq() 用于创建嵌套中断handle_nested_irq(); 我们需要它们在进程上下文中运行,以便我们可以调用休眠总线函数(如可能睡眠的I2C函数)说到上面讨论的驱动程序:
irq-gic驱动程序使用CHAINED GPIO irqchips方法处理具有多个GIC的系统; 此提交添加了该功能gpio-omap驱动程序(如上所述)使用GENERIC CHAINED GPIO irqchips方法.看到这个提交.它是从使用常规转换而来的CHAINED GPIO irqchips,在实时内核上它将线程化IRQ处理程序,但在非RT内核上它将是硬IRQ处理程序NESTED THREADED GPIO irqchips方法做什么
chained_irq_enter和chained_irq_exit做什么
这些功能实现硬件中断流控制,即通知中断控制器芯片何时屏蔽和取消屏蔽当前中断.
对于FastEOI中断控制器(最现代的方式):
chained_irq_enter() 没做什么chained_irq_exit()调用irq_eoi()回调告诉中断控制器中断处理完成对于具有掩码/取消掩码/确认功能的中断控制器
chained_irq_enter() 屏蔽当前中断,并在设置了ack回调时对其进行确认chained_irq_exit() 揭露中断因为在中断发生后,irq线被禁用,但是
chained_irq_enter如果线路已经被禁用,则调用与屏蔽中断相关的功能为什么屏蔽中断?
IRQ线被禁用.但是我们仍然需要在中断处理结束时写入EOI寄存器.或者发送ACK用于边沿级中断.
这解释了为什么在中断处理程序中禁用中断.
阅读 Linux 内核文档本身以了解这些 API:
https://www.kernel.org/doc/Documentation/gpio/driver.txt
链式 GPIO irqchip:这些通常是嵌入在 SoC 上的类型。这意味着 GPIO 有一个快速 IRQ 处理程序,该处理程序从父 IRQ 处理程序(最常见的是系统中断控制器)以链方式调用。这意味着 GPIO irqchip 是使用 irq_set_chained_handler() 或相应的 gpiochip_set_chained_irqchip() 辅助函数注册的,并且 GPIO irqchip 处理程序将立即从父 irqchip 调用,同时保持 IRQ 禁用。然后,GPIO irqchip 将在其中断处理程序中调用类似以下序列的内容:
Run Code Online (Sandbox Code Playgroud)static irqreturn_t tc3589x_gpio_irq(int irq, void *data) chained_irq_enter(...); generic_handle_irq(...); chained_irq_exit(...);