【问题标题】:How to trigger a function in kernel module interrupt如何在内核模块中断中触发函数
【发布时间】:2018-08-15 22:31:18
【问题描述】:

我正在尝试编写一个 linux 内核模块,它等待硬件触发,然后通过 DMA 将一些数据移动到外部存储器。

我已经在我的内核模块中识别了硬件触发器,现在我需要让它执行 DMA。问题是执行 DMA 的函数涉及到它在 DMA 完成之前休眠的点。这在中断中是不允许的,所以我不能直接在我的中断服务例程中调用该函数。

有没有一种方法可以设置某种信号,以便我的内核模块知道下次有机会调用 DMA 函数,但在中断上下文中不这样做?

【问题讨论】:

标签: linux kernel interrupt-handling


【解决方案1】:

建议您通过注册回调来使用下半部分。 Linux 以这种方式工作,上半部分/下半部分。

上半部分服务中断并清除中断控制寄存器,并将注册的回调排队,即你的下半部分,它可以休眠。

建议您在 robert love 的书中阅读有关它的内容。这是一个很好的起点。

https://doc.lagout.org/operating%20system%20/linux/Linux%20Kernel%20Development%2C%203rd%20Edition.pdf

检查 linuxkernel org 源上的任何 i2c 客户端驱动程序以供参考。

https://elixir.bootlin.com/linux/latest/source/drivers/misc/fsa9480.c#L394

在那里注册您的回调以进行 DMA 后数据处理。

这只是关于下半部分如何帮助您开发驱动程序的要点。 希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2014-03-22
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多