Linux 内核:从内核空间调用用户空间中的回调函数



我正在编写Linux用户空间应用程序。 我想从内核空间调用用户空间区域中注册的回调函数。

即到达 GPIO 引脚的中断(开关按下事件(和在用户空间中调用注册函数。

有什么方法可以做到这一点。

谢谢

经过大量挖掘,我找到了下面的代码,非常适合我。

处理来自 GPIO 的中断 在许多情况下,可以将 GPIO 输入配置为在 更改状态,允许您等待中断而不是轮询 低效的软件循环。如果 GPIO 位可以生成中断,则文件边缘 存在。最初,它的值为 none ,这意味着它不会产生中断。 要启用中断,可以将其设置为以下值之一: • 上升:上升沿中断 • 下降:下降沿中断 • 两者:上升沿和下降沿中断 • 无:无中断(默认( 您可以使用 poll(( 函数以 POLLPRI 作为事件来等待中断。如果 您想等待 GPIO 48 上的上升沿,首先启用中断:

#echo 48>/sys/class/gpio/export

#echo 上升>/sys/class/gpio/gpio48/edge

然后,使用 poll(( 等待更改,如以下代码示例所示:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <poll.h>>
int main(void) {
int f;
struct pollfd poll_fds [1];
int ret;
char value[4];
int n;
f = open("/sys/class/gpio/gpio48", O_RDONLY);
if (f == -1) {
perror("Can't open gpio48");
return 1;
}
poll_fds[0].fd = f;
poll_fds[0].events = POLLPRI | POLLERR;
while (1) {
printf("Waitingn");
ret = poll(poll_fds, 1, -1);
if (ret > 0) {
n = read(f, &value, sizeof(value));
printf("Button pressed: read %d bytes, value=%cn", n, value[0]);
}
}     
return 0; 
}

必须在内核模块中实现一个处理程序,例如 char 设备。从用户空间可以通过轮询访问它(例如ioctl()电话(。看来这是目前唯一的办法。

最新更新