まず、私は Linux プログラミングに慣れていないので、これが意味をなさない場合、または間違ったツリーを吠えている場合は謝罪し、正しい方向に向けてください。
ユーザーランドで、pci バスを介して FPGA と通信する cpp アプリを作成しようとしています。
これまでに作成したコードは、ディレクトリを列挙し/sys/bus/pci/devices
てデバイスとベンダー ファイルをチェックし、正しいファイルを見つけます。
デバイスを見つけたら、書き込む必要があるマップされた領域が resource[n] ファイルで何らかの形で表されていることがわかりますが、それらを使用して値を読み書きする方法がわかりません。
PCIデバイスのBAR1と通信したいことがわかっている別のOS用に書かれたコードから、これを行う(試みた)方法はmmapを使用することです(これは正しい方法ですか?)。/sys/bus/pci/devices/[device_addr]/resource1
最初にwithへのファイルハンドルを取得し、次のようO_RDWR
に呼び出します。mmap
char *map = (char*)mmap(NULL, FPGA_MEM_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
fd
open からのファイル記述子はどこにありますか。
私はこれを正しい方法で行っていますか、それともより良い関数/呼び出しを使用していますか? これを行うためのカーネル モジュールを作成できることはわかっていますが、まだカーネル モジュールのプログラミングに取り掛かる必要はありません。
それが役立つ場合は、しばらくの間コードを貼り付けることができますが、コードの批評を実際に行っているわけではなく、それを行うための最良の方法に関するいくつかのポインターです。
不足している詳細がある場合は、お問い合わせください。
ubuntu 11.04(ライブUSBで実行)に基づく2.6 Linuxカーネルを使用しています。ハードウェアはx86ベースです。
ありがとう
更新:コードについてさらにグーグルで試行錯誤した後、私はそれを機能させました。
私が従った手順:
- を使用してデバイスを識別します
/sys/bus/pci/devices/[device]/[vendor|device]
- Parse
/sys/bus/pci/devices/[device]/resource
、各行の最初の列はマップされた領域の開始アドレスで、2 番目の列は終了アドレスです。BAR1
2行目に必要な値が含まれるようにしたかったのです。 open("/dev/mem", O_RDWR)
ファイル記述子 fd を取得する- 上記のように呼び出します
mmap
が、開始アドレスをオフセット (最後の引数) として渡し、開始アドレスと終了アドレスを使用してマップされた領域のサイズを取得します (2 番目の引数)。