Module 使用DMA内核模块从保留内存复制数据

Module 使用DMA内核模块从保留内存复制数据,module,kernel,fpga,dma,Module,Kernel,Fpga,Dma,我们正在开发一个自定义模块,该模块将读取由FPGA写入保留内存位置的数据。一旦数据准备就绪,就会触发一个中断,以警告模块它可能读取数据(读取部分在tasklet中完成) 目前,我们正在使用memremap将物理地址映射到虚拟地址。之后,我们使用memcpy将缓冲区数据复制到内核中的缓冲区中 主要的问题是memcpy太慢(对于1280*480像素、每像素8位的图像,我们无法每秒读取60帧)。似乎正确的方法是使用DMA引擎来加速拷贝 尽管搜索了很长一段时间,我还是找不到一个例子来演示如何做到这一点?

我们正在开发一个自定义模块,该模块将读取由FPGA写入保留内存位置的数据。一旦数据准备就绪,就会触发一个中断,以警告模块它可能读取数据(读取部分在tasklet中完成)

目前,我们正在使用memremap将物理地址映射到虚拟地址。之后,我们使用memcpy将缓冲区数据复制到内核中的缓冲区中

主要的问题是memcpy太慢(对于1280*480像素、每像素8位的图像,我们无法每秒读取60帧)。似乎正确的方法是使用DMA引擎来加速拷贝

尽管搜索了很长一段时间,我还是找不到一个例子来演示如何做到这一点? 我看到如果你保留了内存,你可以使用dma_alloc_分配一些内存。但是我想指定保留内存中物理缓冲区的偏移量(就像我使用memremap时那样)

我目前的情况是:

    dma_cap_mask_t              _dma_cap_mask;
    struct dma_chan             *_dma_channel;
    struct dma_slave_config     _dma_cfg;

    dma_cap_zero(_dma_cap_mask);
    dma_cap_set(DMA_MEMCPY, _dma_cap_mask);
    _dma_channel = dma_request_channel(_dma_cap_mask, NULL, NULL);
    if (!p3v4l2fg._dma_channel) {
        PRINT_ERROR("Cannot request DMA channel\n");
        ret = -ENODEV;
        goto failure;
    }

    _dma_cfg.direction = DMA_MEM_TO_MEM;
    _dma_cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_32_BYTES;

    dmaengine_slave_config(_dma_channel, &_dma_cfg);
根据我的理解,执行前面的代码可以让我拥有DMA通道,但正如我在上面解释的那样,我有点迷路了:|

我如何替换下面的逻辑

void * data = buf->data;
vaddr = memremap(paddr, singleBufferSize, MEMREMAP_WB);
memcpy(data, vaddr, singleBufferImSize);
用DMA传输?(paddr是保留内存范围内的物理地址,singleBufferSize是我必须复制的字节数)

非常感谢有人能给我的任何帮助

你的

Pi-r