我试图编写一个等待硬件触发的linux内核模块,然后通过DMA将一些数据移到外部存储器中。
我的内核模块中识别出硬件触发器,现在我需要让它执行DMA。问题是执行DMA的函数涉及到睡眠的点,直到DMA完成。中断时不允许这样做,因此我无法在中断服务程序中直接调用该函数。
有没有办法可以设置某种信号,以便我的内核模块知道下次有机会调用DMA函数,但是在中断上下文中是不是这样做了?
答案 0 :(得分:1)
建议您通过注册回调来使用下半部分。 Linux以这种方式工作,上半部分/下半部分。
上半部分服务中断并清除中断控制寄存器,并将注册后的回调排队,这是你的下半部分,它可以睡眠。
建议你在罗伯特爱的书中读一读。这是一个很好的起点。
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后期数据处理的回调。
这只是关于下半部分如何帮助您开发驱动程序的要点。 希望它对你有任何帮助。