問題タブ [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.

0 投票する
2 に答える
9855 参照

c - Receiving SPI data via DMA on PIC32

I know that this topic (DMA & SPI) has already been talked about on numerous threads in the microchip forum, actually i've read all the 15 pages in result of the search with keyword "dma" and read all the topics about dma & spi.

And I am still stuck with my problem I hope someone can help me :)

Here is the problem.

My chip is a PIC32MX775F512H. I am trying to receive (only receive) data using SPI via DMA. Since you cannot "just" receive in SPI, and that the SPI core starts toggling the SPI clock only if you write into the SPIBUF (SPI1ABUF for me) I am trying to receive my data using 2 DMA channels. DMA_CHANNEL1 for the transmitting part. DMA_CHANNEL2 for the receiving part.

I copy pasted the code from http://www.microchip.com/forums/tm.aspx?tree=true&high=&m=562453&mpage=1#

And tried to make it work without any luck. It only receives several bytes (5 or 6).

I've set the Event Enable Flags to DMA_EV_BLOCK_DONE for both dma channels, no interrupt occurs.

Do you have any idea ?

Here is the code I am using :

with those two interrupt handlers :

So I end up waiting forever at the line : while(!DmaRxIntFlag);

I have put breakpoints in the interrupt vectors, they are never called.

This is the state of several registers during the ever lasting wait :

DMACON 0x0000C800
DMASTAT 0x00000001

I am using SPI1A port, so SPI1ABUF and _SPI1A_RX_IRQ

DCH1SPTR 0x5
DCH1SSIZ 0x2B

DCH2DPTR 0x6
DCH2DSIZ 0x2B

DCH2CON 0x00008083
DCH2ECON 0x1B10
DCH2INT 0x00800C4
DCH2SSA 0x1F805820
DCH2DSA 0x00000620

Channel 1 is used to transmit
Channel 2 is used to receive

0 投票する
6 に答える
41264 参照

linux - デバイスからユーザースペースメモリへのDMAへのLinuxカーネルデバイスドライバー

DMA対応のPCIeハードウェアデバイスからユーザースペースにできるだけ早くデータを取得したい。

Q:「DMA転送を使用した/および経由したユーザースペースへのダイレクトI/O」を組み合わせるにはどうすればよいですか。

  1. LDD3を読んでみると、いくつかの異なるタイプのIO操作を実行する必要があるようです!?

    dma_alloc_coherentハードウェアデバイスに渡すことができる物理アドレスを教えてくれます。get_user_pagesただし、転送が完了したら、セットアップを行い、copy_to_userタイプコールを実行する必要があります。これは無駄のように思われます。デバイスにDMAをカーネルメモリ(バッファとして機能)に要求し、それを再びユーザースペースに転送します。LDD3 p453:/* Only now is it safe to access the buffer, copy to user, etc. */

  2. 私が理想的に欲しいのは、次のような記憶です。

    • ユーザースペースで使用できます(たぶん、ioctl呼び出しを介してドライバーを要求してDMA可能なメモリ/バッファーを作成しますか?)
    • から物理アドレスを取得してデバイスに渡すことができるので、ユーザースペースで行う必要があるのはドライバーで読み取りを実行することだけです。
    • readメソッドは、DMA転送をアクティブにし、DMAの完全な割り込みの待機をブロックし、後でユーザースペースの読み取りを解放します(ユーザースペースはメモリを安全に使用/読み取ることができます)。

シングルページストリーミングマッピング、セットアップマッピング、およびでマッピングされたユーザースペースバッファーが必要get_user_pages dma_map_pageですか?

これまでの私のコードは、ユーザースペースから指定されたアドレスに設定さget_user_pagesれています(これをDirect I / O部分と呼びます)。次に、dma_map_pageからのページでget_user_pagesdma_map_pageDMA物理転送アドレスとしてデバイスに戻り値を与えます。

いくつかのカーネルモジュールを参照として使用しています:drivers_scsi_st.cおよびdrivers-net-sh_eth.c。インフィニバンドコードを調べますが、どれが最も基本的なものかわかりません。

よろしくお願いします。

0 投票する
1 に答える
7053 参照

linux - カーネル空間への DMA への Linux カーネル デバイス ドライバー

dma_map_singleパラメータとして渡されたバッファを使用したLDD3 (p:453) のデモ。

Q1 : このバッファーはどこから来たのですか?

kmalloc?

Q2 : DMA-API-HOWTO.txt に rawkmallocを DMA に使用できると記載されているのはなぜですか?

フォームhttp://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt

L:51 ページ アロケータ kmalloc() を介してメモリを取得した場合は、これらのルーチンから返されたアドレスを使用して、そのメモリとの間で DMA を実行できます。

L:74 kmap() 呼び出しと DMA のリターンを取得することはできません。

  1. から返されたアドレスkmallocをハードウェアデバイスに渡すことができますか?
  2. それとも最初に実行する必要がありvirt_to_busますか?
  3. または、これをに渡す必要がありdma_map_singleますか?

Q3 : DMA 転送が完了したら、アドレス経由でカーネル ドライバのデータを読み取ることはできkmallocますか?

Q4 : これをユーザー空間に移動する最良の方法は何ですか?

  1. copy_to_user?
  2. kmallocメモリをmmapしますか?
  3. 他?
0 投票する
1 に答える
449 参照

linux - ドライバーからの udp 送信

次のことが必要なドライバーがあります。

  1. FPGAからデータを受け取る
  2. エンコーディングのための別の別のデバイス (DSP) への DMA データ
  3. エンコードされたデータを UDP 経由で外部ホストに送信する

当初の計画では、アプリケーションでステップ 3 を処理する予定でしたが、FPGA から次のデータ セットが到着する前に、アプリケーションがデータを処理するのに間に合うようにプロセッサを取得できませんでした。

(ドライバから) スケジューラに強制的にアプリケーションを実行させる方法はありますか?

そうでない場合は、ワーク キューを使用する必要があるソリューションである可能性が高いと思いますが、ワーク キューからの UDP 転送を実行するためにネットワーク スタック/ドライバーを呼び出す方法/場所がわかりません。

何か案は?

0 投票する
2 に答える
628 参照

linux - LinuxでPCI経由でビデオデータをデバイスに転送する最良の方法

Linux 環境で、PCI を介して FPGA デバイスとの間でビデオ データ転送する必要があります。FPGA でサードパーティの PCI マスター コアを使用しています。これまでのところ、連続する PCI 書き込みバーストを使用して、FPGA から CPU にデータを転送する単純な DMA コントローラーを FPGA に実装しまし

次に、ビデオ データを CPU から FPGA に転送する必要があります。これについて最善の方法は何ですか?

PCI 経由で大量のバースト読み取りを実行するモジュールを FPGA に実装する必要があります。または、PCI 書き込みバーストを使用して、CPU が FPGA のメモリにデータを効率的に書き込む方法はありますか?

私の帯域幅要件は、両方向で約 30 MB/秒です。

ありがとう。

0 投票する
2 に答える
2627 参照

linux - O_DIRECTを使用してカーネルスペースメモリ(物理アドレス)をファイルに書き込む方法は?

物理メモリをファイルに書き込みたい。O_DIRECTメモリ自体は二度と触れられないので、最高の書き込みパフォーマンスを得るために使用したいと思います。

私の最初のアイデアは/dev/mem、メモリを開いてmmapし、すべてをファイルに書き込むことでした。ファイルは。で開かれO_DIRECTます。EFAULTmmapによって返されたメモリアドレスで書き込み呼び出しが失敗します( )。を使用しないO_DIRECTと、結果になりmemcpyます。

次のステップは、メモリ転送を処理するcharデバイスまたはblockデバイスを作成することです。しかし、copy_to_userをバイパスする方法は?ターゲットシステムは組み込みのPowerPCアーキテクチャですが、RAMからRAMへのmemcpyよりもユーザーメモリのハードドライブへの書き込み(DMAコントローラを使用)が高速であるという欠点があります。したがって、ページキャッシュをバイパスする必要があります。

よろしくお願いします

フリードリヒ

0 投票する
2 に答える
14891 参照

linux - DMA キャッシュ コヒーレンス管理

私の質問は次のとおり[pci_]dma_sync_single_for_{cpu,device}です。デバイス ドライバーで正しく使用しているときに、キャッシュ スヌーピングを無効にしても安全な時期をどのように判断できますか?

私は、PCI Express (DMA) 経由で RAM に直接書き込むデバイスのデバイス ドライバーに取り組んでおり、キャッシュ コヒーレンスの管理に関心があります。DMA を開始するときに、DMA 中のキャッシュ スヌーピングを有効または無効にするために設定できる制御ビットがあります。

pci_dma_sync_single_for_cpu()DMA バッファを切り替えるときに、必要に応じて割り込みルーチンを呼び出します..._for_device()が、32 ビット Linux 2.6.18 (RHEL 5) では、これらのコマンドは何も展開されないマクロであることがわかります...これは、デバイスがガベージを返す理由を説明していますこのカーネルでキャッシュスヌーピングが無効になっている場合!

カーネル ソースの歴史を調べてみたところ、2.6.25 までは 64 ビット x86 だけが DMA 同期用のフックを持っていたようです。2.6.26 か​​ら、 のフィールドをinclude/asm-generic/dma-mapping-common.h介した DMA 同期 (現在は )のための一般的な統合間接メカニズムがあるようですが、これまでのところ、これらの操作の定義を見つけることができませんでした。sync_single_for_{cpu,device}dma_map_ops

0 投票する
2 に答える
784 参照

linux-kernel - splice()のDMAコピー

Linuxカーネルは初めてです。そして最近、カーネル2.6.33でsendfileシステムコールを実行しました。以下は私の旅のシーケンスです:

このシーケンス全体を通して、スプライスがDMAコピーを使用する場所は見つかりませんでした。では、DMAコピーはどこで行われているのでしょうか。

0 投票する
2 に答える
292 参照

c - メモリキャッシュが適切に無効化されていることを確認する

したがって、次のようなコードがあります。

問題のバッファは、ハードウェア デバイスによって書き込まれています。ある時点 (おそらくループを開始する前、または開始した後) で、ハードウェアはその場所と残りのバッファーに書き込みます。

現在、__sync_synchronize を使用してメモリ バリアを発行しています。これは、コンパイラがそのメモリ領域の残りの部分を以前からキャッシュする方法がないことを確認したいからregion[0] == 1です。

バッファ全体を揮発性としてマークできることは承知しています。ただし、この関数から不揮発性バッファを返せるようにしたいと考えています。

だから、それを行う方法はありますか__sync_synchronize、しかしそれは私が指定したメモリの範囲だけを対象にしています。この場合、[region, region + 1024)?からのメモリ

余談ですが、このコードはユーザー空間に存在します。メモリ バッファは、カーネル モジュールで割り当て、ユーザー空間にマップし、FPGA に最終的に DMA するように指示したメモリの固定領域です。これは本質的に、DMA 転送を完了する FPGA にポーリング メカニズムを実装しようとしています。

0 投票する
1 に答える
314 参照

memory-management - DMAコントローラには独自のレジスタがありますか?

DMAコントローラーがどのように機能するかを理解しようとしています。

私は8237DMAコントローラーを見ています。ここのいくつかの情報には、レジスタ値を持ついくつかのテーブルがあります。

それらはDMA自身のレジスタですか、それともCPUのレジスタですか?