linux内核中控制器中断号和中断号的关系

Posted

技术标签:

【中文标题】linux内核中控制器中断号和中断号的关系【英文标题】:relationship between controller interrupt no and interrupt no in linux kernel 【发布时间】:2019-07-27 23:24:00 【问题描述】:

我正在 i.mx6 处理器中开发我们自己的 CAN 内核模块。现在我们要为 CAN TX 和 RX 编写 ISR。我们可以编写 ISR,但我的问题是使用 request_irq 函数注册我的 ISR,我必须给出的 irq no 是什么。控制器数据表中指定的中断号与上述函数中的中断号有什么关系。

提前致谢, 神经网络

【问题讨论】:

您必须提供 Linux IRQ 编号。每个架构都有自己的规则如何将 hardware IRQ 转换为 Linux 一个。它取决于总线类型和资源提供者(DT、ACPI、遗留)。 【参考方案1】:

我们是在谈论片上 FlexCAN 还是像 MCP2515 这样的外部连接 CAN 控制器?内核中已经有一个可用的 FlexCAN 驱动程序。对于片上外设,IRQ 已在技术参考手册中定义。对于 iMX6D/Q,请查看第 3 章中断和 DMA 事件。中断在设备树中指定并使用 request_irq 检索。对于 CAN 控制器,假设通过 SPI 连接,GPIO 可以用作中断,并且可以使用“interrupt-parents”和“interrupts”属性在设备树中指定中断。

对于确切的关系,让我们考虑一个例子。 CAN1 节点是here,其“中断”属性的编号为 110。如果您查看 TRM 的第 3 节,则假设 FlexCAN1 的 IRQ 编号为 142。由于 ARM Cortex A9 域编号从 32 开始,只需从 142 中减去它即可得到 110 的数量。

编辑:似乎我并没有完全清楚并从设备树 POV 进行交谈。 request_irq 的 IRQ 编号应该来自对 platform_get_irq 的调用,它返回 Linux IRQ 编号。另见this。

【讨论】:

阅读我上面的评论。 我根据您的输入修改了它 感谢您的回复。在我们的 dts 文件中,IRQ no 是 110。我们得到了我们在下面的代码中使用的 irq no,无论我们的方法是否正确,我们都不知道。请核实并回复。结构设备节点* np = NULL; np = of_find_node_by_name(NULL,"flexcan"); if (np == NULL) printk("找不到错误节点\n"); else virq = irq_of_parse_and_map(np,0); dev->irqno = virq; printk("CAN: Can 0 irq no: %d\n",virq); 已经有 FlexCAN 的驱动程序。你为什么要编写你的 flexcan 驱动程序? 我们在 CAN 模块中配置了自己的过滤器。这就是为什么我们想找我们自己的司机。对不起,因为我不在车站,所以延迟回复

以上是关于linux内核中控制器中断号和中断号的关系的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核中断系统

Linux内核中的软中断tasklet和工作队列具体解释

初步了解Linux内核中断初始化

求 Linux 内核中断 INT 80H 详细资料

Linux 内核中断内幕

Linux内核分析:中断和异常