6

我发布了这是讨论 request_threaded_irq 的线程,但我没有得到任何回复。所以我是新鲜发布的。

我正在为电容式触摸屏开发触摸屏驱动程序。它使用 request_threaded_irq() 调用而不是 request_irq()。我无法理解两者之间的基本区别。它说 :-

姓名

request_threaded_irq — 分配中断线

概要

int request_threaded_irq (unsigned int irq, irq_handler_t handler,irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id);

论据

  1. irq - 要分配的中断线
  2. handler - 发生 IRQ 时要调用的函数。线程中断的主处理程序如果 NULL 和 thread_fn != NULL,则安装默认的主处理程序
  3. thread_fn - 从 irq 处理程序线程调用的函数 如果为 NULL,则不创建 irq 线程
  4. irqflags - 中断类型标志
  5. devname - 声明设备的 ascii 名称
  6. dev_id - 传回处理函数的 cookie

Handler 和 Thread_fn 参数是令人困惑的参数。驱动程序中也没有定义工作函数。

这是我所指的驱动程序。

有人可以帮助我理解这一点吗?

4

2 回答 2

11

添加了 request_threaded_irq() 函数以允许开发人员将中断处理代码分成两部分。一部分将在中断被阻塞的情况下执行,第二部分可以由内核线程完成而不会阻塞中断。有关原因的详细信息,您可以阅读以下内容:

http://lwn.net/Articles/302043/

在您的情况下,您链接到的驱动程序执行此操作:

err = request_threaded_irq(client->irq, NULL, cy8ctmg110_irq_thread,
                           IRQF_TRIGGER_RISING, "touch_reset_key", ts);

通过为第二个参数“handler”传递 NULL,thread_fn 的参数或函数 cy8ctmg110_irq_thread() 将在检测到中断时被调用。

对您而言,选择哪个请求 irq 函数将取决于您的驱动程序需要在中断上下文中执行的操作。

于 2011-11-18T20:24:11.000 回答
1

另一个重要方面:“如果你想为你的设备设置一个线程中断处理程序,那么你需要提供处理程序和thread_fn。处理程序仍然在硬中断上下文中调用,并且必须检查中断是否来自设备。如果是的话需要禁用设备上的中断并返回 IRQ_WAKE_THREAD 这将唤醒处理程序线程并运行 thread_fn。”

来源:https ://www.kernel.org/doc/htmldocs/genericirq.html

于 2013-04-09T22:54:19.057 回答