【问题标题】:Why kernel headers don't want to expose irq's to modules?为什么内核头文件不想将 irq 暴露给模块?
【发布时间】:2014-03-14 17:50:15
【问题描述】:

我只是通过下面的线程,它说内核头不想将 irq 暴露给模块。

Accessing IRQ description array within a module and displaying action names

但我不知道为什么会这样?

另外,我看到一些驱动程序不使用 irq 的,这是否意味着这些设备不是中断驱动的?

这样的驱动程序之一是用于 lm73 传感器 linux/drivers/hwmon/lm73.c,它主要绑定到 i2c 总线并且再次是一个模块。

那么,这一切是如何发生的,设备如何选择不被中断驱动?

【问题讨论】:

  • lm73 只是插在 i2c 子系统之上,而 i2c 驱动程序(其中有许多不同的变体)很可能是中断驱动的。
  • @nos 但是设备也应该有一些方法来中断它的总线。不是这样吗?
  • 也许吧。这取决于子系统。如果您正在编写一个位于 i2c 层之上的模块,您宁愿调用 i2c 层定义的函数。而且,如果需要,该层将负责处理总线,无论是否需要中断。这样你就不会被绑定到任何特定的 i2c 芯片。 lm73模块就是这种情况,它是i2c总线远端传感器的驱动程序,它不需要知道i2c总线的本地端是如何工作的,只要它可以发送消息到另一端。
  • 感谢@nos 制作了这个有价值的 cmets 。如果您可以将其添加为 lm73 上的答案和图片视图,这将非常有帮助,就像驱动程序从远程端与 i2c 总线通信一样。
  • ok @nos,没问题。

标签: c linux-kernel linux-device-driver


【解决方案1】:

您可以在模块中使用IRQ 数字。这个问题有两个概念;一个是IRQ descripton,这是 Linux 内核用来管理中断的。

IRQ 编号本身用于任何带有request_threaded_irq() 的模块,并具有类似的功能。驱动程序通常通过 platform_data 或设备树传递 IRQ 编号。

可能不会在模块中使用 IRQ 描述(我不知道您为什么要这样做)。更准确地说,不允许将IRQ 编号转换为模块中的 IRQ 描述。通常,描述只是一个由 IRQ 编号索引的大数组,因此 irq_to_desc() 在某些情况下是一个宏,并且永远不会被导出。

【讨论】:

  • 感谢@artlessnoise,刚刚完成了回答。我在这里有一个疑问,我看到在我的环境中的大多数模块都使用 request_threaded_irq() 而不是 request_irq()。这是什么特殊原因一样吗?
  • 只是,request_threaded_irq() 是较新的版本,允许快速的第一部分,然后是第二个“线程”部分。原来的request_irq() 只是将NULL 传递给线程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2019-06-25
  • 1970-01-01
  • 2011-10-11
  • 2021-07-16
  • 2011-09-07
相关资源
最近更新 更多