在ARM Linux上注册多个快速中断源

时间:2013-02-18 12:58:01

标签: arm linux-device-driver embedded-linux

我一直在使用ARM上的Linux中断:

  • request_irq()可用于注册中断。

在单个中断线上,您可以使用SHA_SHIRQ注册多个中断,即正常的IRQ。

  • 在特定的中断线上Linux是否允许注册多个SA_INTERRUPT?
  • 那我们可以为ARM 快速中断FIQ注册多个中断处理程序吗?

2 个答案:

答案 0 :(得分:4)

IRQ一样,FIQ从向量表中只有一个入口点。您必须根据位/编号检查中断控制器和分支以处理特定的FIQ。对于FIQ,这往往会否定存储寄存器,因为两个例程都必须共享它们。可以让一个FIQ例程拥有存储寄存器,其他人明确保存它们。

current Linux FIQ code支持堆叠FIQ处理程序,而不支持多个同时FIQ来源。您的代码可以使用set_fiq_regs()初始化FIQ个寄存器。您可以分配一个中断控制器基址,并使用代码检查interrupt source并分支到相应的处理程序。 注意:,内核不会向FIQ提供任何communication mechanism。你必须编写自己的联锁。我认为FIFO实现应该是FIQ安全的以及其他lock free内核模式。

修改:以下是主线代码中FIQ的示例。它是IMX SSI驱动程序。 SSI assemblerSymbol interfacemain fileFIQ也称为软DMA FIQ延迟非常小,应该允许高服务频率。通常只有一个设备需要这种关注。您可以在处理程序中解复用(分支/函数调用/指向源编号)。 FIQ通常用汇编程序编写的原因是,如果使用它, performance 是隐式的。此外,FIQ通常不会屏蔽,并且会为系统的其余部分增加IRQ 延迟。通过在汇编程序中编码来加快速度,可以减少IRQ 延迟

另请参阅:FIQ-IRQ difference

答案 1 :(得分:1)

在同一个IRQ上注册的所有中断处理程序都放在列表中。当中断触发时,内核依次调用每个中断处理程序(最后一个首先注册或首先注册 - 我不记得哪个随意)。 FAST_IRQ在这方面并不特别。

每个中断处理程序都有责任检查其硬件是否需要处理任何事情。如果没有,只需返回,以便下一个处理程序可以看。