2016-09-06 11 views
1

これは愚かな質問かもしれませんが、私はこれまでDMAに関してこれを得ていません。
メモリ間DMAを行う場合は、DMAバッファ (たとえば、dma_alloc_coherent())を割り当てる必要があります。転送ごとに、割り当てられたメモリ(ソースバッファ)にバッファをコピーし、次にDMAトランザクションをトリガする必要があります。DMAトランザクションは毎回バッファにコピーする必要がありますか?

したがって、トランザクションごとに追加のmemcpy()が必要な場合は、DMAを使用すると、 のメリットはありますか?先にソースをコピーする

ステップ - DMAなし:ソースから宛先に

  1. コピーバッファ(memcpy()

ステップ先にソースをコピーする - DMAで:

  1. コピーバッファ(memcpy()) 宛先バッファに最終的にバッファをコピーしなければならないソースDMAバッファへ
  2. トリガDMAトランザクション()

からこの問題の例は、に受け取っsk_bufからコピーする必要がイーサネットドライバでありますFPGAの物理アドレス。この場合、第一(dma_alloc_coherent()から)DMA転送元バッファにsk_bufをコピーする必要がなければなりません。

+0

正確ドライバーは、あなたが話しているのはどれですか?メインラインのカーネル**にいくつかの実際のコード**を表示できますか?問題がどこにあるのでしょうか? –

+0

カーネルで簡単な例を見つけるのは少し難しいです。私は自分のイーサネットドライバを書いていますが、私が書いたのと同じように、dmaの使用が有効であるかどうかはわかりません。私の質問や前提に間違いがある場合、私は知りたいです。 – ransh

答えて

2

dma_map_single()sk_bufポインタを使用できる場合は、dma_alloc_coherent()で割り当てられたバッファにコピーする必要はありません。ネットワークデバイスドライバには、これの多くの例があります。

int dma_len = skb->len; 
dma_addr_t dma_addr = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE); 

// error checking code here 
// then send the dma_addr to the drvice 
// when it is done, unmap it 
dma_unmap_single(dev, dma_addr, dma_len, DMA_TO_DEVICE); 

詳細については、DMA Mapping API documentationを参照してください。

+0

しかし私はメモリにメモリを使用しています(fpgaスペースはマップされています)ので、私はDMA_TO_DEVICEを使用すべきかどうかわかりませんか?私は読んDMAマッピングAPIドキュメントをしましたが、それは、メモリ・ツー・メモリであるべきとき、あなたは両側のメモリを使用する場合にのみ、メモリへ/からデバイス – ransh

+1

*メモリ - メモリが*発生したときには(明確にしませんでした**増分**アドレスとそれに対応するバス幅を持ちます** FIFO **固定**アドレスの場合は、メモリ対デバイス*と*デバイス対メモリ*転送を使用する必要があります – 0andriy

+0

これはicrementedアドレスどのように私はそれがメモリ・ツー・メモリであることを指定します – ransh

関連する問題