我发布这是讨论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);
参数
Handler和Thread_fn参数是令人困惑的。此外,驱动程序中没有定义工作功能。
Here is the driver which I am refering to.
有人可以帮我理解这个吗?
答案 0 :(得分:7)
添加了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);
通过为第二个arg传递NULL,“handler”,thread_fn的参数或函数cy8ctmg110_irq_thread()将在检测到中断时被调用。
对于您来说,选择哪个请求irq函数将取决于您的驱动程序在中断上下文中需要做什么。
答案 1 :(得分:0)
另一个重要方面:“如果你想为你的设备设置线程irq处理程序,那么你需要提供处理程序和thread_fn。仍然在硬中断上下文中调用处理程序,并且必须检查中断是否来自设备。如果是,则需要在设备上禁用中断并返回IRQ_WAKE_THREAD,这将唤醒处理程序线程并运行thread_fn 。“