技術記事 FPGA / DMA

FPGA 搭載 PCI Express ボード向け
DMA 転送ドライバー開発例

WinDriver を使用して Xilinx Virtex-6 搭載 PCI Express 評価ボードの DMA 転送ドライバーを
7 ステップで開発する手順を解説します。

Xilinx Virtex-6 評価ボード
WinDriver PCI for Windows に戻る

概要

Jungo 社の WinDriver PCI を使用し、PCI / PCI Express ボードの DMA 転送テストアプリケーションを作成する手順を紹介します。 DMA コントローラー(DMAC)がボード側の FPGA または PCI Express インターフェイスチップに搭載されている必要があります。

本記事では、東京エレクトロン デバイス社製の inrevium(Xilinx FPGA Virtex-6 搭載 PCI Express タイプ評価ボード)をターゲットとして使用します。 付属の FPGA サンプルデザインにより DDR3 SDRAM からホスト PC への DMA 転送ができます。下表はそのレジスタ仕様です。

評価ボードのレジスタ仕様
オフセット レジスタ内容 レジスタ名
0x00V サイズDMA_VSIZE
0x04H サイズDMA_HSIZE
0x08バッファ物理アドレスDMA_ADRS
0x0cパケット長DMA_BLEN
0x10DMA スタートDMA_START
0x14DMA ステータスDMA_STS
0x18マスクDMA_MASK
0x1cFTIMEDMA_FTIME
0x20LEDDMA_LED

ターゲットの PCI Express ボードをスロットに装着したホスト PC へ WinDriver をインストールすると、WinDriver のカーネルモジュールが PCI Express バスに接続されたデバイスへのアクセスを提供します。 付属の GUI ツール DriverWizard を使用してデバイスの動作確認を行い、ドライバーの雛形コードを生成します。 以下の 7 ステップで DMA 転送テストプログラムを作成します。

開発手順

1

ターゲット デバイスの選択

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

DriverWizard デバイス選択画面
2

INF ファイルの生成とインストール

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

3

レジスタの定義

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

DriverWizard レジスタ定義画面
4

割り込み処理の定義

割り込み処理を DriverWizard で定義します。ボードからの割り込みを検知した際にステータスをクリアするなどの応答処理が必要です。本ボードではステータスレジスタの特定ビットへの書き込みでクリアします。この定義も自動生成コードに反映されます。

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

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

ドライバーアプリケーションをビルドしてターゲット デバイスにアクセスします。DMA 転送を実行し、DMA バッファにデータが読み込まれていることが確認できれば成功です。

DMA 転送テスト実行画面

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

DMA 転送データ表示例

まとめ

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

ここまでの実装でハードウェアの性能を十分に引き出せますが、さらに Kernel PlugIn を活用すれば、カーネルモードレベルの最高パフォーマンスを引き出すことができます。