我正在进行一个项目,其中模块a有一个内存缓冲区,该缓冲区包含DMA内容,并调用模块B的函数来执行DMA操作。简单地说,它看起来如下:
模块A:
void get_info()
{
void *outBuffer = kmalloc(10);
void *inBuffer = kmalloc(10);
perform_dma(outBuffer); // function from module B
read_output(&inBuffer); // function from module B
}
模块B:
void perform_dma(void *outBuffer)
{
void *dma_buffer = dma_alloc_coherent() // <-- allocate a new DMA buffer
memcpy(dma_buffer, outBuffer, 10);
do_dma(); // <-- after this is done, dma_buffer has the content module A needs.
}
void read_output(void **inBuffer)
{
memcpy(*inBuffer, dma_buffer, 10);
}
我知道这可能效率不高,但我不能更改模块B,只能使用提供的API。在最好的情况下,我可以将B的perform_dma(void *outBuffer)
原型更改为perform_dma(void **outBuffer)
。它在大多数情况下都能工作,但在某种情况下(由于整个项目中涉及的所有中断/队列事件(,我将无法显式调用read_output()
并提供inBuffer
来读回内容,但只能在将其发送到B后访问outBuffer
地址。
有没有一种方法可以将outBuffer
从模块a映射到分配在模块B中的dma_buffer
,以便能够从相同的outBuffer
读回输出?
我已经发现dma_map_single((/dma_unmap_single((在我的情况下有效。根本不需要更改功能原型。只需在perform_da((内部使用dma_map_single(outBuffer….,dma_BIDIRECTIONAL(即可获得总线地址并将其传递给dma控制器,因此dma完成后,outBuffer将从dma控制器返回内容。