Jungo 社の WinDriver PCI を使用し、PCI/PCI-Express ボードの DMA 転送のテスト アプリケーションを作成する手順を紹介します。DMA コントローラー (DMAC) がボード側に搭載されている必要があります。FPGA または PCI-Express インターフェイスチップに搭載されている必要があります。本記事では、ターゲットに東京エレクロトン デバイス社製の inreviumを使用して紹介します。Xilinx FPGA Virtex-6 搭載の PCI-Express タイプの評価ボードです。提供される FPGA サンプルデザインにより、DDR3 SDRAM からホスト PC へ DMA 転送が可能ですので、テストには最適です。下表はそのレジスタ仕様です。
ターゲットの PCI-Express ボードをスロットに装着したホスト PC へ WinDriver ツールキットをインストール後、WinDriver のカーネル モジュールがホスト PC の PCI-Express バスに接続されたデバイスへのアクセスを提供します。ツールキットに付属の GUI ベースの DriverWizard を使用して、ターゲットのデバイスの動作確認を行い、ドライバの雛形となるコードを生成します。以下の 7 つの手順でターゲット デバイスの DMA 転送テスト プログラムを作成します。
オフセット | レジスタ内容 | レジスタ名 |
---|---|---|
0x00 | V サイズ | DMA_VSIZE |
0x04 | H サイズ | DMA_HSIZE |
0x08 | バッファ物理アドレス | DMA_ADRS |
0x0c | パケット長 | DMA_BLEN |
0x10 | DMA スタート | DMA_START |
0x14 | DMA ステータス | DMA_STS |
0x18 | マスク | DMA_MASK |
0x1c | FTIME | DMA_FTIME |
0x20 | LED | DMA_LED |
DriverWizard を起動し、Select Your Device 画面にホスト PC に接続されたすべての Plug-and-Play デバイスが表示されるので、その一覧からターゲット デバイスを選択します。
WinDriver を使用してターゲット デバイスと正しく通信するには、INF ファイルをインストールする必要があります。DriverWizard を使用して INF ファイルを自動的に生成し、そしてインストールします。
DriverWizard はデバイスのリソースを自動的に検出します。開発者は、ボードの仕様に応じてレジスタ名やオフセット値などレジスタへのアクセス定義を行います。この定義は、後で自動生成されるコードに反映されます。
割り込み処理を DriverWizard を使用して定義します。一般的な処理として、ボードからの割り込みを検知した場合には、ステータスをクリアするなど応答の処理をする必要があります。このボードの場合には、ステータス・レジスタのあるビットに書き込むことで、ステータスをクリアします。この定義も、後で自動生成されるコードに反映されます。
DriverWizard の機能で、Visual Studio での開発向けにドライバ アプリケーションを自動的に生成します。一般的な開発環境、開発言語に対応しています。ANSI C や C# ベースのドライバ アプリケーションのソースコードとプロジェクトファイルが自動生成され、即ビルド可能です。
DriverWizard で自動生成されたコードの一部を DMA 転送サンプル・プログラムに置き換え、また、手順 3 で定義したレジスタ アクセス関数を利用して、転送データサイズ、DMA バッファ物理アドレス、割り込み許可マスク、DMA 転送開始フラグなどへのアクセスを、仕様に合わせて実装します。下記コードには、必要最小限の使用が必要な WinDriver が提供する API と実装のポイントについて記載します。
サンプル・プログラムのコード例
WDC_DriverOpen(WDC_DRV_OPEN_DEFAULT, NULL);
...
WDC_DeviceScan(VID, DID, ...);
hDev = WDC_PciDeviceOpen(...);
dwStatus = WDC_IntEnable(hDev, NULL, 0, 0, interrupt_handler, (PVOID)hDev, FALSE);
...
MyDeviceStartDMA(hDev); /* 仕様依存の実装 */
sleep(1); /* 仕様依存の実装 */
MyDeviceStopDMA(hDev); /* 仕様依存の実装 */
...
WDC_IntDisable(hDev);
MyDataProcess(); /* データ表示や処理など仕様依存の実装 */
WDC_PciDeviceClose(hDev);
...
WDC_DriverClose();
DriverWizard で自動生成したドライバ アプリケーションをビルドすれば、ターゲット デバイスにアクセス可能です。そして、改造したコードでデバイスが期待通りに動作するのか、デバッグ作業を進められます。作成したドライバ アプリケーションを起動し、DMA 転送を実行、そして DMA バッファにデータが読み込まれていることが確認できれば成功です。
そして例えば、下記では DMA 転送によって読み込まれたダミーデータを、4 バイトで 1 ピクセルの色情報として表示させた場面です。
ここまででも、ハードウェアの性能を十分に引き出すことができますが、更にチューニングを行えば、カーネルモード レベルの最高のパフォーマンスを引き出すことが可能です。
このように WinDriver を使用すると、WDK や OS の内部構造を学習しなくても、高性能なドライバ アプリケーションを短期間で簡単に開発することができます。また、ユーザーモードでドライバ開発を行うので、デバッグが容易であることも大きな特徴です。WinDriver で開発したドライバ コードはサポートするすべての OS 間で、ソース互換性があります。
WinDriver はフル機能を備えた体験版を提供しています。是非お試しください。弊社 Web サイトから無償でダウンロードできます。
また、弊社主催の無償セミナー「WinDriver 製品説明会」にて、この WinDriver と inrevium 評価ボードを用意した実機環境で、DMA 転送の様子をご覧いただけます。その他、割り込み処理についてなど、実践的なテクニック TIPS について説明させていただきます。是非ご参加下さい。