デバッグ用PCには現在使用していないPCが1セットあるのでそれを使うことにした。
PCにVersa Kitを装着し、火入れしたところ。
lspciでボードが認識されているか確認、、、されている。
この手のボード用のデバイスドライバは数年前に作成したことがあり、今回はそれをベースにして自作するつもりでいるが、今日のところは環境も含めて簡単な動作確認をしたかったので、LatticeのDesign sampleを用いて動作確認を行うことにした。Design sampleはここから入手できる。これらのsampleの内、PCIe DemoにPCI用デバイスドライバと簡単なテストアプリが入っているが、バージョンが古くてLinux 3.0に対応しておらず、若干の修正が必要だった。デバイスドライバはlscdma_Linux26とlscpcie2_Linux26が存在するが、今日は簡単な動作確認をしたかったので、lscpcie2_Linux26で動作確認した。
具体的な修正箇所は以下の3項目だ。
1. file_operaions 構造体のioctlをunlocked_ioctlに修正
(unlocked_ioctl自体の情報はこれが参考になる。)
lscpcie2_ioctlはlscpcie2_unlocked_ioctlを介してコールする。
lscpcie2_unlocked_ioctlはmutexで排他処理を行っている。
また、unlocked_ioctlの引数にはinodeが無くなっているので、lscpcie2_ioctlからinode参照部を削除した。lscpcie2_ioctlではデバッグメッセージの表示要素で参照しているだけなので、削除しても問題は無い。
2. 1199行のclass_device_create、1273行のclass_device_destroy APIはdeivce_create、device_destroyに変更になっているので修正する。
3. 594行のDMA_32BIT_MASKをDMA_BIT_MASK(32)に修正する。
以上の修正を行った結果、コンパイルが通り、insmodでモジュールをinsert出来た。
lscpcie2_Linux26/testsに簡単なテストアプリがあるが、これも若干の修正が必要だった。
具体的には、78行目の"/dev/LSC_PCIe/%s"を"/dev/%s"に修正した。
このプログラムを実行してみた結果、無事ボードの制御が出来ることが確認できた。
プログラムが動作している様子
PCI側の動作確認も一応できたので、後は色々作って実装するのみだ。このボードは拡張用コネクタがピンヘッダになっている点もいい感じだ。抵抗ラダー式のVGA変換基板を追加すれば、VGAボードもどきの実験も出来そうだ。 (ECP3というFPGAは高速シリアルI/F部のドライバがPCMLになっていて、これを使ってHDMIやDVI(TMDS)相当を出力することもできるのだが、Versa Kitに搭載されているECP3-35は入出力ともに4CHのみであり、あいにくその内の1CHをPCI expressに使ってしまっている。) また、DAC基板を作って以前作成したDDS IPを実装すればファンクションジェネレータボードが出来そうだし、ADC基板を作成しDFT IPを実装し、x1ではあるがPCIe busのバンド幅を活かして高速なスペクトル解析ボードも出来るかも知れない。 色々と楽しめそうな気がする。