WinDriver を使用して Xilinx Virtex-6 搭載 PCI Express 評価ボードの DMA 転送ドライバーを
7 ステップで開発する手順を解説します。
Jungo 社の WinDriver PCI を使用し、PCI / PCI Express ボードの DMA 転送テストアプリケーションを作成する手順を紹介します。 DMA コントローラー(DMAC)がボード側の FPGA または PCI Express インターフェイスチップに搭載されている必要があります。
本記事では、東京エレクトロン デバイス社製の inrevium(Xilinx FPGA Virtex-6 搭載 PCI Express タイプ評価ボード)をターゲットとして使用します。 付属の FPGA サンプルデザインにより DDR3 SDRAM からホスト PC への 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 |
ターゲットの PCI Express ボードをスロットに装着したホスト PC へ WinDriver をインストールすると、WinDriver のカーネルモジュールが PCI Express バスに接続されたデバイスへのアクセスを提供します。 付属の GUI ツール DriverWizard を使用してデバイスの動作確認を行い、ドライバーの雛形コードを生成します。 以下の 7 ステップで DMA 転送テストプログラムを作成します。
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();
ドライバーアプリケーションをビルドしてターゲット デバイスにアクセスします。DMA 転送を実行し、DMA バッファにデータが読み込まれていることが確認できれば成功です。
下図は DMA 転送で読み込まれたダミーデータを、4 バイトを 1 ピクセルの色情報として表示させた例です。
WinDriver を使用すると、WDK や OS の内部構造を学習しなくても高性能なドライバーアプリケーションを短期間で開発できます。 ユーザーモードでドライバー開発を行うためデバッグが容易であることも大きな特徴です。 また、WinDriver で開発したドライバーコードはサポートするすべての OS 間でソース互換性があります。