私はこれに苦労してきました。本当に助けていただければ幸いです。At91sam9g45 の内部 SRAM (足がかり - 起動後は使用されません) を使用して、集中的な計算を高速化したいのですが、次のすべての条件を満たしていません。
メモリはユーザー空間からアクセスできます。これは、ユーザー空間を使用して
mmap()
からカーネルを使用すると簡単でしremap_pfn_range()
た。返されたポインターを使用して、ユーザー空間プログラムは SRAM の読み取り/書き込みを行うことができます。カーネル DMA API 呼び出し
dma_async_memcpy_buf_to_buf()
を使用して、DMA を使用して memcpy を実行します。私の基本的なドライバー内で、この操作を呼び出して、データを DDR ( kmalloc() で割り当てられた) から SRAM バッファーにコピーしたいと考えています。
したがって、私の問題は、ユーザー空間と物理アドレスがありますが、カーネル空間の DMA API に適したマッピングがないことです。
ioremap を使用して、に提供された固定仮想アドレスを使用してみましたiotable_init()
。これらのいずれも、次のようなもので使用できるカーネル仮想アドレスにはならないようですvirt_to_bus
(これはkmallocアドレスで機能し、DMA API内で使用されていると思います)。
方法はありますが、物理アドレスを使用して DMA を手動でトリガーするだけですが、これを試して理解したいと思います。私はLDD3とグーグルを読んでいますが、DMA API(PCIバスを除く)にkmalloc以外のメモリを使用する例は見当たりません。