私はFreescale MPC8308プロセッサ(PowerPCアーキテクチャに基づいています)でPCI-eポートを使用していますが、使用する際にいくつか問題があります。エンドポイントPCI-eデバイスのメモリ容量は256 MBです。私は "pciutils"パッケージを使って、エンドポイントデバイスのコンフィギュレーションスペースを簡単に読み書きできます。mmapを使用したPCI-eメモリ空間アクセス
コンフィギュレーションレジスタに正しい値を書き込み、メモリ空間にアクセスする許可を得た後、私はCで「のmmap()」関数を使用して、メモリ空間をアクセスしようと位置ファイル記述子を使用する:
「/sys/devices/pci0000:00/0000:00:00.0/resource0」
これはちょうど256MB(エンドポイントデバイスのメモリスペースに等しい)だったので、ファイル記述子に正しいパスを使用しているようです。ここでは、https://github.com/billfarrow/pcimemで述べたように「)(MMAP」を使用して私のコードを見つけることができます。
https://github.com/billfarrow/pcimem/blob/master/pcimem.c
しかし残念ながら、私は「のmmap()」関数の戻りアドレスを使用して、メモリ空間を使用するようにしてください。エンドポイントデバイスの読み取り専用レジスタを正しく読み取れません。また、 "0x7FFFFFC"より大きいアドレスを読み込むと、MPC8308が再起動します。 上記の状況を考慮して、PCI-eインターフェイスを初期化するための手順がありませんか? LinuxカーネルイメージやU-Bootコードで何かを変更する必要がありますか? PowerPC PCI-eをmmap()で使用するのに何か別のものはありますか? PCI-eメモリ空間の読み込みに役立つサンプルコードはありますか?
ありがとうございました
エンドポイントのメモリ容量が大きすぎるようです。私のプロセッサ(i.MX6)では、16MBを超えるエンドポイントを持つことはできません。 PCIeのLinuxブートでinitエラーがありますか? PCI-eメモリデバイスとは何ですか?それはFPGAですか? – FabienM
はい、あまりにも私には多すぎるようでしたが、Linuxの起動には何のエラーもなく、/ proc/iomemで見ることができるようにデバイス用に256 MBのメモリを捧げました。エンドポイントデバイスはFPGAではありません。 PCI-eインターフェイスを備えたASICです。 –
別のルートは、デバイスの基本物理アドレスとその限界を見つけて、/ dev/memにマップすることです。 (正直なところ、これがうまくいくかどうかは保証できませんが、私には分かりません。) – ruthafjord