問題タブ [dma]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - dma_pool_alloc によって与えられる DMA アドレスの種類を制御する
2 種類の RAM を搭載した ARM プラットフォームを使用しています。いくつかの SDRAM と内部 SRAM があります。プラットフォーム上の USB コントローラーは、内部 SRAM にのみ存在する DMA アドレスを必要とします。現時点では、呼び出しから使用可能な DMA アドレスを取得する汎用ドライバーを使用していますdma_pool_alloc
。
SDRAM ではなく内部 SRAM にある DMA アドレスのみを USB ドライバに与えるようにカーネルに指示する方法はありますか?
intel - dma_map_single および dma_map_page
大きなフレーム(ジャンボ)を送信するために複数のフレームのdmaを実行したい。通常の額縁(サイズ1500)でお送りできます。dmaについて少し疑問があります。
他の API に対する dma_map_single() の本当の利点は何ですか。dma_map_page ですべてを行うことができますよね?
driver で大きなフレーム (ジャンボ) を送信する必要があり、このフレームを複数のバッファーに格納したとします。これらのバッファーは、物理メモリまたは仮想メモリ内で連続していません。ただし、これらのバッファーはカーネル空間にあります。どうすればそれを 1 フレームとして送信できますか。scatter-gather dma を使用する必要がありますか? これは他の dma_api で可能ですか?
c - ハードウェア コントローラ レジスタへの書き込みと DMA は ARM アーチ マシンでどのように機能しますか?
この関数を呼び出している間:
- アドレスは絶対アドレスですか、それとも MMU を通過しますか?
- DMA - アドレスへの書き込みは MMU によって変換されますか?
- システムのレジスタ アドレスがここに記載されていないのはなぜですか?
linux-kernel - get_user_pages - VM_GROWSDOWN フラグが設定されていないために発生した EFAULT エラー
私はFGPA ドライバーの作業を続けています。
今、OpenCL サポートを追加しています。だから私は次のテストを持っています。同じバッファの書き込みおよび読み取り要求を NUM_OF_EXEC 回追加し、その後完了を待つだけです。
各書き込み/読み取り要求はドライバーでシリアル化され、DMA トランザクションとして順次実行されます。DMA 関連のコードは、ここで表示できます。
したがって、ドライバーはトランザクションを受け取り、それを実行し (rsp_setup_dma および fpga_push_data_to_device)、FPGA からの割り込みを待機し (fpga_int_handler)、リソースを解放し (fpga_finish_dma_write)、新しいリソースを開始します。NUM_OF_EXEC が 1 の場合はすべて機能しているように見えますが、増やすと問題が発生します。ある時点で、(rsp_setup_dma で) get_user_pages が -EFAULT を返します。カーネルをデバッグすると、割り当てられた vma に VM_GROWSDOWN フラグが設定されていないことがわかりました (mmap.c の find_extend_vma で)。しかし、この時点で私は立ち往生しました。なぜなら、このフラグが必要な理由を理解しているかどうかも、設定されていない理由もわからないからです。上記の症状で get_user_pages が失敗するのはなぜですか? どうすればこれをデバッグできますか?
memory-management - 大きなファイルを書き込むと、大きなブロックのDMA割り当てが防止されます
Linux(3.0.35)を実行しているARMベースのプロセッサを搭載したボードを使用しています。ボードには1GBのRAMが搭載されており、高速SSDHDと5MPカメラに接続されています。
私の目標は、高解像度の画像をキャプチャして、それらをディスクに直接書き込むことです。
非常に長いビデオ(1GBを超えるデータ)を保存しようとするまでは、すべてうまくいきます。
大きなファイルを保存した後、カメラドライバーをリロードできないようです。ストリーミング用に十分な大きさのDMAメモリブロックを割り当てることができません(dma_alloc_coherent()を呼び出す場合)。
Linuxが起動し(ほとんどのメモリが使用可能な場合)、ランダムなデータを大きなファイル(> 1GB)に書き込もうとすると、カメラドライバーを読み込めないというシナリオに絞り込みました。
私の質問に-
書き込み用にファイルを開いたり、大量のデータを書き込んだり、ファイルを閉じたりすると、HDへのデータ書き込みに使用していたメモリが解放されるのではないでしょうか。
HDアクセス中にメモリが断片化する理由は理解できますが、HDへのトランザクションが完了すると、メモリがまだ断片化されているため、15MBの連続RAMを割り当てることができないのはなぜですか?
ありがとう
linux - device_create を使用した dma_alloc_coherent の構造体デバイス作成
char ドライバーの DMAble メモリに mmap メソッドを実装したいと考えています。まずはDMA APIで実現してからPCIデバイスで実現したいと考えています。
dma_alloc_coherent の最初の引数は、構造体デバイスへのポインターです。ISA または EISA の場合は NULL にすることができますが、DMA をサポートする有効なデバイスが必要です。次のコードは機能するはずですが、割り当ては失敗します。
dma_supported が 1 を返し、is_dma_capable_returns が 0 を返すのはなぜですか? dma_alloc_coherent をサポートするには、デバイスをどのように作成すればよいですか?
linux - LINUX -- データ転送用の DMA -- SPI から読み取り --- tx から usart - RPi
DMAが実際にどのように機能するかは、私が知っている理論です;-- http://en.wikipedia.org/wiki/Direct_memory_access
しかし、プログラミングでは、それをどのように管理しなければならないのでしょうか?
私は RPI を使用しており、DMA を使用して次の操作を実装することを楽しみにしています。
SPI ---- TX 読み取りデータ --- USART を使用して SD カードから読み取りたいとします。
データ転送用のルーチンを作成して dma に渡す必要がありますか、それとも DMA tx & rx チャネルによって処理されますか?
それに使用するLinuxの内部構造は何ですか?
この点に関して、何人かの専門家がどのような手順に従うべきかを教えていただけますか。私はDMAプログラミングが初めてです.lin
linux - Linux DMA 操作 - 転送を開始する方法
Linux Device Driver LDD3、DMA-API.txt、DMA-HOWTO.txt を読み、drivers/dma/dmatest.c も調べましたが、dma 転送を開始する方法がわかりませんでした。メモリのマッピングについてはすべて議論されていますが、トランザクションを開始する方法については議論されていません。PCI サンプル ドライバーには転送機能がありますが、「特定の」DMA 操作を使用しており、ハードウェアに依存しない、より一般的で移植性の高い実装を見つけようとしています。
私は次のようなものを作ろうとしています
- dma_map_single()
- 読み取り/書き込みトランザクションを開始する
- トランザクションが終了したことを中断する、ハンドラーを使用する、または wait_event_freezable_timeout
- dma_unmap_single()
マップしたメモリに読み書きするだけですか? コールバック ハンドラを登録するにはどうすればよいですか?
編集: もう少し詳しく説明すると、私は ARM プラットフォームで作業しています。
dma - DMAでデータを受信する
簡単な理論上の質問があります。私が知っているDMAには、通常、半分完全または完全な割り込みがあります。周辺機器からのデータ転送にDMAを使用する場合、データがdma転送境界にない可能性があるため、すべてのデータを確実に取得するにはどうすればよいですか。
たとえば、シリアルポートが5バイトを送信する場合、最初の4つを組み合わせて(dmaサイズが4と仮定して)割り込みを取得しますが、5番目のバイトは何も送信しません。そのような問題を解決するために人々が通常使用する方法は何ですか。
linux - DMA エンジン API と DMA API の比較
誰かが両方の使用法とその違いを簡単に説明できますか?
注:Linuxのドキュメントを読みました