从内核模块向用户空间通知gpio中断

时间:2013-11-06 18:44:03

标签: linux linux-kernel linux-device-driver embedded-linux gpio

我有一个代码可以检测内核模块中的GPIO中断。现在,我正在寻找一种机制,在检测到来自内核模块的gpio中断时通知用户空间。任何在不同选项中具有某些优点/缺点的示例/代码段?非常感谢您的回复。

3 个答案:

答案 0 :(得分:1)

查看GPIO键盘驱动程序(drivers/input/keyboard/gpio_keys.c)。这是你的问题的一个很好的起点。

在用户空间中,您可以收听(例如,某些阻止阅读或仅tail进行测试)至/dev/input/yourevent的事件。

答案 1 :(得分:1)

您可以从内核API向用户空间线程发送信号,这可以帮助您运行非阻塞:

send_sig(int sig, struct task_struct *p, int priv)

但是有一个限制:你需要知道内核中用户线程的pid。您可以通过/ proc编写用户进程的pid然后读取pid的内核来实现此目的。通过这种安排,当存在中断时,内核可以向用户线程发送信号。如果您的进程重新启动或被杀死,您将必须通过proc更新pid。

如果我是你,我宁愿这样做,除非我不想将数据从内核传输到用户。对于数据传输要求,我会使用Netlink或其他一些机制。

答案 2 :(得分:1)

您可以: (1)向用户应用程序发送信号,或 (2)实现file_operations-> poll方法,使用poll_wait和wait队列在中断发生时唤醒用户应用程序。