第 6 章 ドライバの作成
6.2 DriverWizard を使わずにドライバを記述するには
DriverWizard を使用せずに直接ドライバを記述する場合、以下のステップに従って新しいドライバ プロジェ
クトを作成するか、または、記述するドライバに最も近いサンプルに修正を加えてください。
6.2.1 必要な WinDriver ファイルのインクルード
PCI / ISA の場合
1. 関連した WinDriver ヘッダー ファイルをプロジェクトにインクルードします (すべてのヘッダー ファイル は WinDriver\include ディレクトリに保存されています)。すべての WinDriver プロジェクトには windrvr.h ヘッダー ファイルが必要です。
PCI / ISA の場合
WDC_xxx API を使用する場合、wdc_lib.h および wdc_defs.h ヘッダー ファイル (これらの ファイルは既に windrvr.h をインクルードしています) をインクルードします。
USB の場合
WDU_xxx WinDriver USB API を使用する場合、wdu_lib.h ヘッダー ファイル (このファイルは 既に windrvr.h をインクルードしています) をインクルードします。
コードから使用する API を提供するその他のヘッダー ファイルをインクルードします (たとえば、
WinDriver\samples\shared ディレクトリからのファイルは便利な診断関数があります)。
2. ソース コードから関連したヘッダー ファイルをインクルードします。
PCI / ISA の場合
たとえば、windrvr.h ヘッダー ファイルからAPI を使用するには、コードに次の行を追加しま す。
#include "windrvr.h"
USB の場合
たとえば、wdu_lib.h ヘッダー ファイルから USB API を使用するには、コードに次の行を追加 します。
#include "wdu_lib.h"
3. コードを WDAPI (Windows の場合) / 共有オブジェクト (Linux の場合) にリンクします。
Windows の場合: WinDriver\lib\<CPU>\wdapi1170.lib にリンクします。CPU ディレ
クトリは、x86 (32 ビット プラットフォーム対応 32 ビット バイナリ)、am64 (64 ビット プラット フォーム対応 64 ビット バイナリ)、または am64\x86 (64 ビット プラットフォーム対応 32 ビット バイナリ)。
Windows CE の場合: WinDriver\lib WINCE\<CPU>\wdapi1170.lib
Linux の 場 合: WinDriver/lib/ デ ィ レ ク ト リ - libwdapi1170.so ま た は libwdapi1170_32.so (64 ビット プラットフォームをターゲットとする 32 ビット アプリケー ションの場合)。
注意: libwdapi1170_32.so を使用する場合、まず初めに、異なるディレクトリにこのファイル をコピーし、ファイル名を libwdapi1110.so に変更し、対象のコードにリンクします。
ライブラリにリンクする代わりに、WinDriver/src/wdapi ディレクトリから、ライブラリのソース ファイルをインクルードすることもできます。
注意: wdapi1170 ライブラリまたは共有オブジェクトをリンクする際、ドライバと共に wdapi1170 の DLL または共有オブジェクトを配布する必要があります。
Windows で は 、WinDriver\redist デ ィ レ ク ト リ に あ る wdapi1170.dll ま た は wdapi1170_32.dll (64 ビット プラットフォームをターゲットとする 32 ビット アプリケーションの 場合) を配布します。
Linux で は 、WinDriver/lib デ ィ レ ク ト リ に あ る libwdapi1170.so ま た は
libwdapi1170_32.so (64 ビット プラットフォームをターゲットとする 32 ビット アプリケーション の場合) を配布します。
注意: Windows および Linux の 64 ビット プラットフォームで 32 ビット アプリケーション用の DLL / 共有ライブラリを使用する場合 (wdapi1170_32.dll / libwdapi1170_32.so)、_32 の部分 を削除して、配布パッケージに含めるファイル名を変更します。配布手順に関する詳細は、第 14 章を参照してください。
4. コードで使用する API を実装するその他の WinDriver ソース ファイルを追加します (たとえば、
WinDriver\samples\shared ディレクトリからのファイル)。
6.2.2 コードの作成 : PCI / CardBus / PCMCIA ドライバの場合
このセクションでは、WDC_xxx API を使用した際の呼び出し順序を説明します。
1. WDC_DriverOpen() を呼び出し、WinDriver および WDC ライブラリのハンドルを開きます。ロードした
ドライバとドライバ ソース ファイルのバージョンを比較し、(登録ユーザー用の) WinDriver ライセンスに 登録します。
2. PCI / CardBus / PCMCIA デバイスでは、WDC_PciScanDevices() /
WDC_PcmciaScanDevices() を呼び出して、PCI / PCMCIA バスをスキャンしデバイスの場所を検 出します。
3. PCI / CardBus / PCMCIA デバイスでは、WDC_PciGetDeviceInfo() /
WDC_PcmciaGetDeviceInfo() を呼び出して、選択したデバイスのリソース情報を取得します。
ISA デバイスでは、WD_CARD 構造体でリソース自身を定義します。
4. デバイスに適切な関数 (WDC_PciDeviceOpen() / WDC_PcmciaDeviceOpen() /
WDC_IsaDeviceOpen()) を呼び出し、デバイスのリソース情報を関数へ渡します。これらの関数 は、デバイスのハンドルを返します。その後、WDC_xxx API を使用してデバイスと通信ができます。
5. WDC_xxx API を使用してデバイスと通信します。
割り込みを有効にするには、WDC_IntEnable() を呼び出します。
Plug-and-Play お よ び パ ワ ー マ ネ ー ジ メ ン ト イ ベ ン ト 用 の 通 知 受 け 取 り を 登 録 す る に は 、 WDC_EventRegister() を呼び出します。
6. 終了する場合、WDC_IntDisable() を呼び出し、割り込み処理を無効にします (有効だった場合)。
WDC_EventRegister() を呼び出し、Plug-and-Play および パワー マネージメント イベント処理の登 録を取り消します (登録されていた場合)。最後にデバイスに適切な関数 (WDC_PciDeviceClose() / WDC_PcmciaDeviceClose() / WDC_IsaDeviceClose()) を呼び出し、デバイスのハンドルを 閉じます。
7. WDC_DriverClose() を呼び出し、WinDriver および WDC ライブラリのハンドルを閉じます。
6.2.3 コードの作成: USB ドライバの場合
1. 対象の USB デバイスに対し WinDriver を初期化するプログラムの初めに WDU_Init() を呼び、デバ イス アタッチのコースバックを待機します。関連するデバイスの情報は、このアタッチのコールバックで 取得することになります。
2. アタッチのコールバックを受信するば、WDU_Transfer() 系の関数のいずれかを使用して、データ の送受信が始められます。
3. 終了する場合は、WDU_Uninit() を呼んで、デバイスの登録解除を行います。
6.2.4 設定とコードのビルド
必要なファイルと記述したコードを含めた後、必要なビルド フラグを設定し、開発変数を設定してあることを 確認して、コードをビルドしてください。
注意: コードをビルドする前に、WD_BASEDIR 環境変数が WinDriver のインストール ディレクトリに設定さ れていることをご確認ください。
Windows、Windows CE および Linux では、WD_BASEDIR 環境変数をグローバルに定義可能です – 第 3 章の説明のとおり。