PCIバスにザイリンクスFPGA PCIeエンドポイントがあります。 Linuxはデバイスをよく認識し、lspciのすべてが完璧に見えます。
私の質問は、ユーザースペースPCIアクセスオプションと良い点と悪い点についてです。
オプション1:/sys/.../resource0による直接アクセス
(私はこれまで1つのことをしてきました)
/sys/bus/pci/devices/XXXX:XX:XX.X/resource0 を開いて mmap と言ってから mmap して読み書きをすることができます。まず、権限を変更するだけです。私の質問はこれが良いアプローチですか、それとも悪いアプローチですか?これがPCIアドレス空間にアクセスするのに好ましい方法ではないかもしれないと思いますか?
オプション2:uio_pci_genericの使用
このドライバが実際に接続できるようにFPGAを正常に設定しましたが、割り込みが必要であるという事実は本当に迷惑です。これは承認割り込みにアクセスしてメモリスペースを設定できないようです。これは私にとってあまり役に立たなかったようですか?私は何を逃したことがありませんか?
オプション3:独自のUIOドライバを作成する
たぶんこれは合理的な選択でしょうか?これがどれほど難しいのかよくわかりません。これの可能な利点の1つは、DMAにアクセスできるため、作業速度が大幅に向上することです。
オプション4:完全にカスタマイズされたLinux PCIドライバを作成する
可能であれば、このオプションは避けたいと思います。
私の質問は、最善のアプローチが何であり、オプション1の具体的な欠点は何ですか?それとも別の方法を考慮する必要がありますか?
(私はDebianを実行しており、カーネルは3.14.15 rtにパッチされています)
答え1
オプション1(/sys/.../resource0 経由で直接アクセス)
テストに適しており、機能的に問題はありませんが、高度な操作を実行できず、ドライバ層の抽象化はありません。私はこのアプローチがユーザープログラムがsysfsと対話する方法を迷惑にすると思いますが、それはおそらく私の個人的な意見です。
オプション2(uio_pci_genericを使用)
uio_pci_genericが何をしているのかわかりませんが、ユーザープログラムがpciレガシー割り込みにアクセスできるようにする以外に、多くの機能を追加しないようです。とにかくMSIが最高の選択であるので、それは悪いです。
オプション3(カスタムUIOドライバ)
これは試していませんが、オプション4に比べると少し時間が無駄になると思います。
オプション4(カスタムカーネルドライバ)
これが本当に最高のソリューションであり、正しく実行できる唯一の方法です。 DMAやMSIなどの項目を適切に処理し、文字デバイスの抽象化を必要なだけ提供できるドライバが必要です。ただし、PCIカードドライバをオンラインで書く方法に関する多くの文書があり、カーネルは管理のための多くのサポートを提供しています。