c-将内存从一个内核模块重新映射到另一个模块中的DMA缓冲区



我正在进行一个项目,其中模块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。在最好的情况下,我可以将Bperform_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控制器返回内容。

相关内容

  • 没有找到相关文章

最新更新