FPGAメモリを読み込もうとしています。ザイリンクス Zynq ボード(zc702) RTEMS ドライバを Linux に移植するプロセスの一部です。使っています開発メモリ2そしてmmap_test私は開発ボード用のプログラムをクロスコンパイルするためにYoctoクロスコンパイラを使用します。ボードには1GBの汎用メモリがあります。これは、0x0と0x40000000の間のすべての読み取りが有効なメモリを返すことを意味します。ただし、問題は、0x7AA00000から読み取ると、カーネルパニックメッセージを端末(minicomとsshのあるシリアルポート)に印刷せず、すぐにカーネルがクラッシュすることです。そのアドレスから読み取ってkprintを使用するための小さなサンプルカーネルモジュールも書いていますが、同じ競合が発生しました。このドライバはRTEMSで動作するため、物理メモリアドレスが正しいことが確認されました。
Linuxの競合なしでFPGAメモリ/レジスタからデータを読み取るには、どのような手順を実行する必要がありますか?
ベストアンサー1
ついに私がなぜ衝突し続けるのかがわかりました。これは2つの要素の組み合わせです(邪悪な問題の場合と同様)。
- これによるメモリアクセスは
/dev/mem
ページ整列する必要があります。 - FPGAメモリにアクセスするときは、ビットストリームを最初にロードする必要があります。
最初は、FPGAビットストリームをロードしてからcat stream.bit > /dev/xdevcfg
(マッピングなし)、物理アドレスを直接逆参照してレジスタにアクセスしようとしました。後で読み取りにdevmem2を使用することを検討しましたが、/dev/mem
ビットストリームはロードされませんでした。どちらも同様のエラー、プログラムのクラッシュ、カーネルの停止が発生し、2つのエラーがあることを発見するのに時間がかかりました。