2

Linuxから移植して、イーサネットカード用のRTEMSドライバーを実装しています。ほとんどの作業が完了し、プロセッサ IO モードは正常に動作し、割り込み処理も行われています。現在、DMA の実装に問題があります。

具体的には、私がベースとして使用している Linux ドライバーでは、関数 dma_alloc_coherent() が使用されています。この関数は 2 つの異なるアドレスを返します。1 つはドライバー コード (ホスト CPU) が参照するアドレスで、もう 1 つはカードが DMA 中に PCI 経由で同じメモリ領域にアクセスするために使用するアドレスです。

適切な代替関数を見つけるのに問題があります。最初に malloc() を使用し、次に pci_pci2cpu を使用してこのアドレスを 1 つのカードがアクセスできるアドレスに変換することを考えましたが、pci_pci2cpu は IO に対して 0xFFFFFFFF を返し、残りの 2 つのモードに対して 0x0 を返します。

私が検討した2番目のアプローチは、デュアルポートメモリマネージャーを使用することですが、その使用法の有用な例が見つかりません。たとえば、rtems_port_create() 関数にはポインター *internal_start と *external_start を指定する必要がありますが、このポインターがどこから来ているのかわかりません。

Gaisler RTEMS バージョン 4.11 と Sparc アーキテクチャ (LEON3 cpu) を使用しています。

ベスト、イヴァン

4

2 に答える 2

3

わかりました基本的に私はこれを理解しました。

まず、RTEMS にはフラット メモリ モデルがあるため、malloc() が返すアドレスはメモリ内の実際の物理アドレスです。つまり、malloc() は既に同じことを行っているため、dma_alloc_coherent() は必要ありません。アラインされたメモリには、サポートされている posix_memalign() を使用しました。

次に、カードとメモリ間のアドレス変換があるかどうかを確認する必要がありました。これは RTEMS とは関係ありませんが、システム アーキテクチャに関係しているため、GRLIB のユーザー マニュアルと grpci2 コアの RTEMS 初期化コードを調べたところ、メモリ変換がないことがわかりました (1:1 に設定されています)。

要するに、単純な malloc でバッファーを割り当て、そのアドレスを PCI カードに与えると、このバッファーにアクセス (読み取り/書き込み) できるようになります。

これらはすべて私が最初に想定したことでしたが、最終的に私の問題は DMA チップの故障にありました。:)

于 2016-04-25T12:56:36.490 に答える
0

質問が正しいかどうかはわかりませんが、とにかく:

RTEMS は、LEON ファミリ DMA のハンドラを実装していません。DMA を使用するには、leon.h ヘッダー ファイルにある LEON 構造を利用する必要があります。その構造体は、LEON3 プロセッサのメモリ アドレスにリンクされています。または、レジスタを直接アドレス指定することもできます。

その後、http: //www.gaisler.com/index.php/products/components/ut699 にアクセス して、UT699 の機能マニュアルをダウンロードする必要があります (または、使用している SoC を検索してください:) )

そこには、PCI ターゲットとの間の DMA 転送を開始するために正しい順序でレジストリを書き込む方法が記載されています。

乾杯

于 2016-02-28T21:14:51.787 に答える