【发布时间】:2017-03-13 14:13:47
【问题描述】:
我正在为 FPGA 中的合成设备编写驱动程序。该设备有几个 IRQ,并已在我的驱动程序上请求它们:
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
rc = request_irq(irq, &Custom_driver_handler,IRQF_TRIGGER_RISING , DRIVER_NAME, base_addr);
我的问题是我希望 irq_handler 调用用户空间应用程序的函数。有什么方法可以从内核空间驱动程序的 irq_handler 调用我的用户空间应用程序??
我知道我可以从驱动程序中保存一个标志并将其方向从用户应用程序映射到轮询它,但我想知道是否有更快/更正确的方法。
提前谢谢你
【问题讨论】:
-
大约二十年前,这在 Linux 内核中被称为“upcall”:lkml.iu.edu/hypermail/linux/kernel/9809.3/0922.html。十年前这篇文章发布在lwn.net/Articles/127698处理用户空间中的中断。现在有了UIO框架:UIO(用户I/O)unix.stackexchange.com/questions/136274/…lwn.net/Articles/232575yurovsky.github.io/2014/10/10/linux-uio-gpio-interruptosadl.org/fileadmin/dam/rtlws/12/Koch.pdfhep.by/gnu/kernel/uio-howto
-
据我了解,使用 UIO 驱动程序检测中断正在轮询内存方向。不是吗?? UIO驱动使用示例:int32_t irq_count; int fd = open("/dev/uio0", O_RDWR);无效 map_addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); / 总是准确地读取 4 个字节! */ while (read(fd, &irq_count, 4) == 4) { printf(中断号 %d\n, irq_count); }
-
不,你的理解不完整:在没有中断的情况下,此读取不会将控制权返回给用户程序:lwn.net/Articles/232575"用户空间驱动程序将打开设备(/dev /uio0). 读取设备返回一个 int 值,该值是设备看到的事件计数(中断数);如果自上次读取后没有中断,操作将阻塞,直到发生中断(尽管通常也支持非阻塞操作)。"
标签: linux driver handler irq userspace