【问题标题】:relationship between controller interrupt no and interrupt no in linux kernellinux内核中控制器中断号和中断号的关系
【发布时间】: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、遗留)。

标签: linux linux-kernel kernel linux-device-driver interrupt-handling


【解决方案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 模块中配置了自己的过滤器。这就是为什么我们想找我们自己的司机。对不起,因为我不在车站,所以延迟回复
猜你喜欢
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多