2014-03-13 102 views
0

我只是通过下面的线程说,内核头文件不想公开irq的模块。为什么内核头文件不想公开irq的模块?

Accessing IRQ description array within a module and displaying action names

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

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

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

那么,这是怎么回事,设备如何选择不被中断驱动?

+0

lm73只是插在i2c子系统的顶部,而i2c驱动程序(其中有很多不同的变体)很可能是中断驱动的。 – nos

+0

@nos但是应该有一些方法让设备也可以中断它的总线。不是这种情况吗? –

+0

也许吧。这取决于子系统。如果你正在编写一个位于i2c层之上的模块,你应该调用i2c层定义的函数。而且,如果需要,该层将负责处理总线,无论是否需要中断。这样你就不会被绑定到任何特定的i2c芯片。 lm73模块就是这种情况,它是i2c总线远端传感器的驱动程序,它不需要知道i2c总线的本地端如何工作,只要它能发送消息到另一端。 – nos

回答

1

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

IRQ号码本身用于任何具有request_threaded_irq()和其功能的模块。通常,驱动程序通过platform_data或设备树传递IRQ数字。

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

+0

感谢@artlessnoise并刚刚通过答案。我在这里有一个疑问,我看到在我的环境中使用request_threaded_irq()而不是request_irq()的大部分模块都有相同的特定原因吗? –

+0

只是''request_threaded_irq()'是更新的版本,允许快速的第一部分后跟第二个'螺纹'部分。最初的'request_irq()'只是为* thread *传递NULL。 –