我读到ARM中软件生成的中断被用作处理器间中断。我还可以看到其中5个中断已经在使用中。我也知道ARM提供了16个软件生成的中断。
在我的应用程序中,我在ARM-cortex内核和Linux上运行裸机应用程序。我想将运行裸机应用程序的核心数据传递给运行Linux的核心。我计划将数据复制到片上存储器(共享),然后我将在Core上运行一个SGI(运行linux),以指示一些数据可供它处理。现在我能够从核心(运行裸机应用程序)生成SGI。但是为了处理linux端的中断,我不确定SGI IRQ号是免费的,我也不确定我是否可以直接使用IRQ号(一般SGI是0-15)。有没有人知道如何在Linux中为SGI编写处理程序?
修改:这是上述文字的重新措辞,因为SSCE reasons的问题已经结束。 Cortex-A CPU用于多CPU系统。 ARM 通用中断控制器(GIC)监视所有全局中断并将它们分派给特定的CPU。为了使各个CPU相互发信号,将软件生成的中断(SGI)从一个内核发送到另一个内核;这使用外围专用中断(PPI)。这个问题是,
如何实现可以将SGI作为PPI接收的Linux内核驱动程序?
答案 0 :(得分:6)
有没有人知道如何在Linux中为SGI编写处理程序?
由于您没有提供Linux版本,我将假设您使用最新版本(或至少是最近版本)。 ARM GIC有device tree bindings。通常,您需要在设备树节点中指定SGI中断号,
ipc: ipc@address {
compatible = "company,board-ipc"; /* Your driver */
reg = <address range>;
interrupts = <1 SGI 0x02>; /* SGI is your CPU interrupt. */
status = "enabled";
};
interrupt 节中的第一个数字表示 PPI 。 SGI 可能介于0-15之间,因为这是SGI中断的路由(至少在Cortex-A5上)。
然后您可以使用驱动程序中的platform_get_irq()
来获取 PPI (外设专用中断)。我想地址是您希望进行通信的共享内存(物理);也许reg
不合适,但我认为它会起作用。该区域将由Linux MMU重新映射,您可以将其与
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
mem = devm_ioremap_resource(dev, res);
上面设备树中的地址是物理地址的十六进制值。 platform_get_irq()
应返回 irq number ,您可以将其与request_irq()
系列函数一起使用。只需将其连接到您的日常工作中即可。
编辑:不幸的是,Linux irq-gic.c禁止低于16的中断。例如,gic_handle_irq()
将处理程序限制为16到1020之间的中断。如果启用了SMP,则会为感兴趣的中断调用handle_IPI()
。 gic_raise_softirq()
可用于发出中断信号。要使用当前Linux处理 SGI ,smp.c需要额外的enum ipi_msg_type
值和代码才能在handle_IPI()
中处理这些值。看起来更新的内核(可能是3.14+?)可能会将set_ipi_handler()
添加到 smp.c ,以便不需要这样的修改。
答案 1 :(得分:2)
我想补充一点,这种核间通信的例子可以在TI多核SoC(即OMAP3530)中找到。前一段时间,当我使用这种机制时,TI提供了手段。具体来说,正是DSPLink Linux设备驱动程序提供了这样的功能。当时,不幸的是,它不是一个开源解决方案,但也许有一些来自TI的技术论文描述它是如何工作的......只是你可以进一步调查的方向:)
编辑:与此同时,似乎他们已经把它变成了开源。那么,如果您正在寻找,那么您可以查看:DSPLink和SysLink (successor of DSPLink)