如何在linux内核中使用DMA?

时间:2013-07-06 14:11:53

标签: c linux-kernel memcpy dma

我正在尝试在linux内核中使用DMA引擎。

我的机器是x86 64位平台,我只想将简单的memcpy操作卸载到DMA引擎。 我想知道以下序列是否适合于活动DMA引擎 并使其进行memcpy操作。

dmaengine_get();
dma_cap_zero(mask);
dma_cap_set(DMA_MEMCPY,mask);
chan = dma_request_channel(mask,NULL,NULL);
if(chan)
    printk(KERN_ALERT "dma channel %s\n", dma_chan_name(ptr_DP->chan));

cookie_temp = dma_async_memcpy_pg_to_pg(chan, dest_pg, 0, src_pg, 0, 0x1000);
if(cookie_temp)
    printk(KERN_ALERT "copy pass?\n")

.....
.....

curr_stat = dma_async_is_tx_complete(chan, cookie_temp, NULL, NULL);
printk(KERN_ALERT "check DMA stat (%d)\n", curr_stat);

/*
tx=async_memcpy(pages, pages, 0, 0, 4096, NULL);
printk(KERN_ALERT "DMA descriptor = %p\n",tx);
if(tx)
    printk(KERN_ALERT "Working!\n");
else 
    printk(KERN_ALERT "No luck...\n");
*/
  1. 使用dmaengine_get
  2. 获取dmaengine
  3. 使用dma_request_channel(mask, fn, fn_param)
  4. 的请求渠道
  5. 使用dma_async_memcpy_pg_to_pg执行页面到页面的memcpy操作
  6. 使用dma_async_is_tx_complete检查复制操作是否已完成
  7. 编辑7/7 7:21 PM 我检查了DMA通道可以在dma_find_channel()找到。 但是我的内核仍然无法与dma_async_memcpy_pg_to_pg很好地工作...... 当我通过dma_async_is_tx_complete检查DMA通道的当前状态时, 大部分时间它仍在进行中。 这有点奇怪,因为我只是复制一页......

0 个答案:

没有答案