我是open source project that relies on the DMA controller to do PWM on Raspberry Pi IO pins的维护者。该技术需要使用一个DMA通道。我们历史上对DMA通道0进行了硬编码,但是有多个错误报告表明当X同时运行时程序无法正常运行(错误报告:here和here,{{3 }})。
我们在Raspberry PI固件中找到了etc,其中包含一个用于管理共享资源(如DMA通道)的API,并找出哪些可用。
Pattrick Hueper Mailbox API但它仍然报告频道0可用。也许X不使用此API来宣布它正在使用哪个频道。
我发现dma_request_channel()
用于内核空间程序,但在用户空间中不可用。
在计算机上做好公民并避免与其他工具发生冲突时,从用户空间使用DMA通道的正确方法是什么?
答案 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未发布时)。