WinDriver を使った FPGA 搭載 PCI Express ボード向け DMA 転送ドライバー プログラム開発例

WinDriver を使った DMA 転送ドライバー プログラム開発例

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

手順 1. ターゲット デバイスの選択

DriverWizard を起動し、Select Your Device 画面にホスト PC に接続されたすべての Plug-and-Play デバイスが表示されるので、その一覧からターゲット デバイスを選択します。

手順 2. INF ファイルの生成とインストール

WinDriver を使用してターゲット デバイスと正しく通信するには、INF ファイルをインストールする必要があります。DriverWizard を使用して INF ファイルを自動的に生成し、そしてインストールします。

手順 3. レジスタの定義

DriverWizard はデバイスのリソースを自動的に検出します。開発者は、ボードの仕様に応じてレジスタ名やオフセット値などレジスタへのアクセス定義を行います。この定義は、後で自動生成されるコードに反映されます。

手順 4. 割り込み処理の定義

割り込み処理を DriverWizard を使用して定義します。一般的な処理として、ボードからの割り込みを検知した場合には、ステータスをクリアするなど応答の処理をする必要があります。このボードの場合には、ステータス・レジスタのあるビットに書き込むことで、ステータスをクリアします。この定義も、後で自動生成されるコードに反映されます。

手順 5. ドライバ アプリケーションの自動生成

DriverWizard の機能で、Visual Studio での開発向けにドライバ アプリケーションを自動的に生成します。一般的な開発環境、開発言語に対応しています。ANSI C や C# ベースのドライバ アプリケーションのソースコードとプロジェクトファイルが自動生成され、即ビルド可能です。

手順 6. コードの改造

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();

手順 7. アプリケーションのビルドとデバッグ

DriverWizard で自動生成したドライバ アプリケーションをビルドすれば、ターゲット デバイスにアクセス可能です。そして、改造したコードでデバイスが期待通りに動作するのか、デバッグ作業を進められます。作成したドライバ アプリケーションを起動し、DMA 転送を実行、そして DMA バッファにデータが読み込まれていることが確認できれば成功です。

そして例えば、下記では DMA 転送によって読み込まれたダミーデータを、4 バイトで 1 ピクセルの色情報として表示させた場面です。

ここまででも、ハードウェアの性能を十分に引き出すことができますが、更にチューニングを行えば、カーネルモード レベルの最高のパフォーマンスを引き出すことが可能です。


このように WinDriver を使用すると、WDK や OS の内部構造を学習しなくても、高性能なドライバ アプリケーションを短期間で簡単に開発することができます。また、ユーザーモードでドライバ開発を行うので、デバッグが容易であることも大きな特徴です。WinDriver で開発したドライバ コードはサポートするすべての OS 間で、ソース互換性があります。

WinDriver はフル機能を備えた体験版を提供しています。是非お試しください。弊社 Web サイトから無償でダウンロードできます。

また、弊社主催の無償セミナー「WinDriver 製品説明会」にて、この WinDriver と inrevium 評価ボードを用意した実機環境で、DMA 転送の様子をご覧いただけます。その他、割り込み処理についてなど、実践的なテクニック TIPS について説明させていただきます。是非ご参加下さい。