【问题标题】:IRQ Handling from User Space Linux来自用户空间 Linux 的 IRQ 处理
【发布时间】: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 driver handler irq userspace


【解决方案1】:

有几种方法可以从内核调用用户空间函数,通常命名为向上调用: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概述,部分"Sending Signals from the Kernel to the User Space"

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

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

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

include/linux/uio_driver.h 在 linux 内核中已存在多年,它适用于 3.4. 版本的内核。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多