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