5

我有一个代码可以检测内核模块中的 GPIO 中断。现在,我正在寻找一种机制来在检测到内核模块的 gpio 中断时通知用户空间。与不同选项相比具有某些优点/缺点的任何示例/代码片段?我会很感激你的回应。

4

3 回答 3

1

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

于 2013-11-08T08:24:46.133 回答
1

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

然后在用户空间中监听(例如一些阻塞读取,或者只是tail为了测试)/dev/input/yourevent事件。

于 2013-11-06T19:09:45.377 回答
1

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

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

但是有一个限制:你需要知道内核中用户线程的 pid。您可以通过 /proc 写入用户进程的 pid 然后内核读取 pid 来解决这个问题。通过这种安排,当有中断时,内核可以向用户线程发送信号。如果您的进程重新启动或被杀死,您将不得不通过 proc 更新 pid。

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

于 2013-11-07T00:01:14.500 回答