如何在用户空间中分配DMA通道?

时间:2015-04-14 13:26:25

标签: linux-kernel raspberry-pi dma

我是open source project that relies on the DMA controller to do PWM on Raspberry Pi IO pins的维护者。该技术需要使用一个DMA通道。我们历史上对DMA通道0进行了硬编码,但是有多个错误报告表明当X同时运行时程序无法正常运行(错误报告:herehere,{{3 }})。

我们在Raspberry PI固件中找到了etc,其中包含一个用于管理共享资源(如DMA通道)的API,并找出哪些可用。

Pattrick Hueper Mailbox API但它仍然报告频道0可用。也许X不使用此API来宣布它正在使用哪个频道。

我发现dma_request_channel()用于内核空间程序,但在用户空间中不可用。

在计算机上做好公民并避免与其他工具发生冲突时,从用户空间使用DMA通道的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我能够确认以下内容:

您包括:

#include <mach/dma.h>

...
int rc = bcm_dma_chan_alloc(
  BCM_DMA_FEATURE_NORMAL,  /* Features found in mach/dma.h */
  &dma_base,
  &dma_irq
);
如果发生错误,则

rc返回负数。当rc> = 0时,它是dma通道 返回。

void __iomem *dma_base; /* returned */
int dma_irq;            /* returned */

要发布:

bcm_dma_chan_free(dma_chan);

到目前为止,它已经返回DMA通道2:

[   99.372778] chan = rc = 2, dma_base=f3007200, IRQ=77
[   99.372790] Returned DMA channel 2.
[  103.971670] Releasing DMA Channel 2

和4(当我离开DMA 2未发布时)。