6

我正在为 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 调用我的用户空间应用程序?

我知道我可以从驱动程序中保存一个标志并将其方向从用户应用程序映射到轮询它,但我想知道是否有更快/更正确的方法。

先感谢您

4

1 回答 1

5

有几种从内核调用用户空间函数的方法,通常命名为向上调用:http: //lkml.iu.edu/hypermail/linux/kernel/9809.3/0922.html;还要检查https://lwn.net/Articles/127698/ “处理用户空间中的中断”和 2008 年的http://wiki.tldp.org/kernel_user_space_howto概述,部分“将信号从内核发送到用户空间” .

为了更容易编写驱动程序,现在内核中有 UIO 框架:https ://unix.stackexchange.com/questions/136274/can-i-achieve-functionality-similar-to-interrupts-in-linux-userspace https: //lwn.net/Articles/232575/ https://yurovsky.github.io/2014/10/10/linux-uio-gpio-interrupt/ https://www.osadl.org/fileadmin/dam/rtlws/ 12/Koch.pdf http://www.hep.by/gnu/kernel/uio-howto/

使用 UIO,您可以阻止或轮询特殊文件描述符以等待中断(使用 syscall 阻止;使用read()syscall 进行轮询poll): https ://lwn.net/Articles/232575/

在用户空间方面,第一个 UIO 处理的设备将显示为 /dev/uio0(假设是正常的 udev 设置)。用户空间驱动程序将打开设备。读取设备会返回一个 int 值,该值是设备看到的事件计数(中断数);如果自上次读取后没有中断进入,则操作将阻塞,直到发生中断(尽管通常也支持非阻塞操作)。文件描述符可以传递给 poll()。

include/linux/uio_driver.h在 linux 内核中已经存在很多年了,这里是3 年。4.内核版本。

于 2017-03-14T14:33:37.380 回答