JUNGO WinDriver ユーザーズ ガイド エクセルソフト株式会社 JUNGO LTD. COPYRIGHT Copyright (c) 1997 – 2005 Jungo Ltd. All Rigths Reserved. Jungo Ltd. POB 8493 Netanya Zip - 42504 Israel Phone (USA) 1-877-514-0537 (WorldWide) +972-9-8859365 Fax (USA) 1-877-514-0538 (WorldWide) +972-9-8859366 ご注意 このソフトウェアの著作権はイスラエル国 Jungo Ltd. 社にあります。 このマニュアルに記載されている事項は、予告なしに変更されることがあります。 このソフトウェアおよびマニュアルは、本製品のソフトウェア ライセンス契約に基づき、登 録者の管理下でのみ使用することができます。 このソフトウェアの仕様は予告なしに変更することがあります。 このマニュアルの一部または全部を、エクセルソフト株式会社の文書による承諾なく、無断 で複写、複製、転載、文書化することを禁じます。 WinDriver および KernelDriver はイスラエル国 Jungo 社の商標です。 Windows、Win32、Windows 98、Windows Me、Windows CE、Windows NT、Windows 2000、Windows XP および Windows Server 2003 は米国マイクロソフト社の登録商標です。 その他の製品名、機種名は、各社の商標または登録商標です。 エクセルソフト株式会社 〒108-0014 東京都港区芝 5-1-9 ブゼンヤビル 4F TEL 03-5440-7875 FAX 03-5440-7876 E-MAIL: xlsoftkk@xlsoft.com Home Page: http://www.xlsoft.com/ Rev. 7.0 – 4/2005 目 次 目次 目次 ............................................................................................................3 図表 ..........................................................................................................17 第 1 章 WinDriver の概要.........................................................................19 1.1 はじめに ................................................................................................................................19 1.2 背景 ........................................................................................................................................20 1.2.1 チャレンジ.......................................................................................................... 20 1.2.2 WinDriver の特長................................................................................................ 20 1.3 WinDriver の処理速度 ..........................................................................................................21 1.4 最後に ....................................................................................................................................21 1.5 WinDriver の利点 ..................................................................................................................22 1.6 WinDriver のアーキテクチャ...............................................................................................23 1.7 WinDriver がサポートするプラットフォーム ...................................................................24 1.8 評価版 (Evaluation Version) の制限 .....................................................................................24 1.9 WinDriver を使用してドライバを開発するには ...............................................................24 1.10 1.9.1 Windows 98 / Me / NT / 2000 / XP / Server 2003 / Linux および Solaris .......... 24 1.9.2 Windows CE ........................................................................................................ 25 1.9.3 VxWorks .............................................................................................................. 25 WinDriver ツールキットの内容...........................................................................................25 1.10.1 WinDriver のモジュール.................................................................................... 26 1.10.2 ユーティリティ .................................................................................................. 27 1.10.3 特定チップセットのサポート .......................................................................... 27 1.10.4 サンプル.............................................................................................................. 28 1.11 WinDriver で作成したドライバを配布できますか ...........................................................28 1.12 適切なツールの使用.............................................................................................................28 第 2 章 デバイス ドライバの理解.............................................................30 3 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 2.1 デバイス ドライバの概要....................................................................................................30 2.2 機能によるドライバの分類.................................................................................................30 2.3 2.2.1 モノリシック ドライバ ..................................................................................... 30 2.2.2 レイヤード ドライバ ......................................................................................... 31 2.2.3 ミニポート ドライバ ......................................................................................... 32 OS によるドライバの分類...................................................................................................33 2.3.1 WDM ドライバ................................................................................................... 33 2.3.2 VxD ドライバ ..................................................................................................... 33 2.3.3 Unix デバイス ドライバ .................................................................................... 34 2.3.4 Linux デバイス ドライバ................................................................................... 34 2.3.5 Solaris デバイス ドライブ ................................................................................. 34 2.4 ドライバのエントリー ポイント ........................................................................................35 2.5 ハードウェアとドライバの連結 .........................................................................................35 2.6 ドライバとの通信.................................................................................................................35 第 3 章 WinDriver USB の概要 ................................................................37 3.1 USB の概要............................................................................................................................37 3.2 WinDriver USB の利点..........................................................................................................38 3.3 USB のコンポーネント ........................................................................................................38 3.4 USB デバイスのデータ フロー ...........................................................................................39 3.5 USB データ交換....................................................................................................................39 3.6 USB データ転送タイプ ........................................................................................................40 3.7 USB 設定................................................................................................................................41 3.8 WinDriver USB.......................................................................................................................42 3.9 WinDriver USB のアーキテクチャ ......................................................................................44 3.10 WinDriver USB を使って作成できるドライバ ..................................................................45 第 4 章 WinDriver のインストール ..........................................................46 4.1 4.2 4 動作環境 ................................................................................................................................46 4.1.1 Windows 98 / Me ................................................................................................. 46 4.1.2 Windows NT / 2000 / XP / Server 2003............................................................... 46 4.1.3 Windows CE ........................................................................................................ 46 4.1.4 Linux .................................................................................................................... 46 4.1.5 Solaris................................................................................................................... 47 4.1.6 VxWorks .............................................................................................................. 47 WinDriver のインストール...................................................................................................48 目 次 4.2.1 Windows 98 / Me / NT / 2000 / XP / Server 2003 にインストールするには ... 48 4.2.2 WinDriver CE のインストール.......................................................................... 51 4.2.3 Linux に WinDriver をインストールするには................................................. 52 4.2.4 Solaris に WinDriver をインストールするには ............................................... 55 4.2.5 DriverBuilder for VxWorks をインストールするには ..................................... 57 4.3 アップグレード版のインストール .....................................................................................58 4.4 インストールの確認.............................................................................................................59 4.5 4.4.1 Windows、Linux および Solaris コンピュータの場合.................................... 59 4.4.2 Windows CE コンピュータの場合 .................................................................... 59 4.4.3 VxWorks の場合 ................................................................................................. 60 WinDriver をアンインストールするには...........................................................................60 4.5.1 Windows 98 / Me / NT / 2000 / XP および Server 2003 からアンインストール するには.............................................................................................................. 60 4.5.2 Linux から WinDriver をアンインストールするには..................................... 62 4.5.3 Solaris から WinDriver をアインストールするには ....................................... 62 4.5.4 DriverBuilder for VxWorks をアインストールするには ................................. 63 第 5 章 DriverWizard ...............................................................................64 5.1 DriverWizard の概要 .............................................................................................................64 5.2 DriverWizard の使い方..........................................................................................................65 5.3 DriverWizard ノート .............................................................................................................76 5.3.1 リソースの共有 .................................................................................................. 76 5.3.2 リソースの無効化 .............................................................................................. 76 5.3.3 WinDriver API 呼び出しのログ......................................................................... 76 5.3.4 DriverWizard のログ........................................................................................... 77 5.3.5 自動コード生成 .................................................................................................. 77 第 6 章 ドライバの作成 ............................................................................79 6.1 WinDriver でデバイス ドライバを開発するには ..............................................................79 6.2 DriverWizard を使わずにドライバを記述するには ..........................................................80 6.2.1 必要な WinDriver ファイルのインクルード ................................................... 80 6.2.2 コードの作成: PCI/ISA ドライバの場合.......................................................... 81 6.2.3 コードの作成: USB ドライバの場合................................................................ 82 6.3 Windows CE で開発を行うには...........................................................................................82 6.4 Visual Basic および Delphi で開発を行うには ...................................................................83 6.4.1 DriverWizard を使用する ................................................................................... 83 5 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 6.4.2 サンプル.............................................................................................................. 83 6.4.3 Kernel PlugIn ....................................................................................................... 83 6.4.4 ドライバを生成するには .................................................................................. 83 第 7 章 デバッグ.......................................................................................85 7.1 ユーザー モード デバッグ...................................................................................................85 7.2 Debug Monitor........................................................................................................................85 7.2.1 グラフィック モードで Debug Monitor を使用するには ............................... 85 7.2.2 コンソール モード Debug Monitor を使用するには ....................................... 87 第 8 章 特定 PCI および USB チップ セット サポート ............................89 8.1 概要 ........................................................................................................................................89 第 9 章 実行に当たっての問題 .................................................................91 9.1 9.2 9.3 9.4 DMA の実行 ..........................................................................................................................91 9.1.1 Scatter/Gather DMA............................................................................................. 92 9.1.2 Contiguous Buffer (連続バッファ) DMA........................................................... 95 9.1.3 SPARC での DMA の実行 ................................................................................. 97 割り込み処理.........................................................................................................................97 9.2.1 一般的な割り込み処理 ...................................................................................... 97 9.2.2 ISA / EISA および PCI 割り込み..................................................................... 102 9.2.3 VxWorks での割り込み処理率の向上 ............................................................ 104 9.2.4 Windows CE の割り込み.................................................................................. 104 USB コントロール転送 ......................................................................................................106 9.3.1 USB データ交換 ............................................................................................... 106 9.3.2 コントロール転送の詳細 ................................................................................ 107 9.3.3 セットアップ パケット ................................................................................... 108 9.3.4 USB セットアップ パケットのフォーマット............................................... 108 9.3.5 標準デバイスが要求するコード .................................................................... 109 9.3.6 セットアップ パケットの例 ........................................................................... 110 WinDriver でコントロール転送を行う.............................................................................111 9.4.1 DriverWizard でのコントロール転送 ............................................................. 111 9.4.2 WinDriver API でのコントロール転送........................................................... 113 9.5 64 ビット OS のサポート...................................................................................................114 9.6 バイト オーダー..................................................................................................................114 9.6.1 6 エンディアンネスとは .................................................................................... 114 目 次 9.6.2 WinDriver のバイト オーダー マクロ ............................................................ 115 9.6.3 PCI ターゲット アクセスのマクロ ................................................................ 115 9.6.4 PCI マスター アクセスのマクロ .................................................................... 116 第 10 章 パフォーマンスの向上 .............................................................118 10.1 概要 ......................................................................................................................................118 10.1.1 10.2 パフォーマンスを向上させるためのチェックリスト................................. 118 ユーザー モード ドライバのパフォーマンスの向上 .....................................................120 10.2.1 メモリにマップされた領域への直接アクセス............................................. 120 10.2.2 I/O にマップされた領域へのアクセス .......................................................... 120 10.2.3 64-ビット データ転送を行う .......................................................................... 121 第 11 章 Kernel PlugIn について...........................................................122 11.1 Kernel PlugIn の概要 ...........................................................................................................122 11.2 Kernel PlugIn を作成する前に ...........................................................................................122 11.3 期待される効果...................................................................................................................123 11.4 開発プロセスの概要...........................................................................................................123 11.5 WinDriver Kernel PlugIn の構造 .........................................................................................123 11.6 11.5.1 構造の概要........................................................................................................ 123 11.5.2 WinDriver Kernel と Kernel Plugin のインターフェイス .............................. 124 11.5.3 Kernel Plugin コンポーネント......................................................................... 125 11.5.4 Kernel PlugIn イベント シーケンス................................................................ 125 Kernel PlugIn の仕組み .......................................................................................................128 11.6.1 Kernel PlugIn ドライバの作成に必要な条件 ................................................. 128 11.6.2 Kernel PlugIn の実装 ........................................................................................ 129 11.6.3 Kernel PlugIn ドライバの生成されたコードとサンプル コード ................ 133 11.6.4 Kernel PlugIn のサンプル コードと生成されたコードのディレクトリ構造134 11.6.5 Kernel PlugIn での割り込み処理..................................................................... 136 11.6.6 メッセージの受け渡し .................................................................................... 139 第 12 章 Kernel PlugIn の作成 ..............................................................141 12.1 Kernel PlugIn が必要かどうかを確認する........................................................................141 12.2 ユーザー モードのソース コードを用意する .................................................................141 12.3 Kernel PlugIn プロジェクトの新規作成............................................................................142 12.4 Kernel PlugIn へのハンドルの作成 ...................................................................................143 12.5 Kernel PlugIn での割り込み処理の設定............................................................................143 7 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 12.6 Kernel PlugIn での I/O 処理の設定 ....................................................................................144 12.7 Kernel PlugIn ドライバのコンパイル................................................................................144 12.8 12.7.1 Windows でのコンパイル................................................................................ 144 12.7.2 Linux でのコンパイル...................................................................................... 146 12.7.3 Solaris でのコンパイル .................................................................................... 147 Kernel PlugIn ドライバのインストール............................................................................147 12.8.1 Win32 プラットフォームの場合 .................................................................... 147 12.8.2 Linux の場合 ..................................................................................................... 148 12.8.3 Solaris の場合.................................................................................................... 148 第 13 章 ドライバの動的ロード .............................................................150 13.1 なぜ動的にロード可能なドライバが必要なのか ...........................................................150 13.2 Windows NT / 2000 / XP / Server 2003 および 98 / Me .....................................................150 13.2.1 Windows ドライバの種類................................................................................ 150 13.2.2 WDREG ユーティリティ................................................................................. 150 13.2.3 windrvr6.sys INF ファイルの動的ロード / アンロード ................................ 154 13.2.4 Kernel PlugIn ドライバを動的にロード / アンロード .................................. 155 13.3 Linux.....................................................................................................................................155 13.4 Solaris ...................................................................................................................................156 第 14 章 ドライバの配布 ........................................................................157 14.1 WinDriver の有効なライセンスを取得するには .............................................................157 14.2 Windows 98 / Me および 2000 / XP / Server 2003 の場合.................................................157 14.3 14.4 8 14.2.1 配布パッケージの用意 .................................................................................... 158 14.2.2 ターゲット コンピュータにドライバをインストール................................ 158 14.2.3 ターゲット コンピュータに Kernel PlugIn をインストール ....................... 160 Windows NT 4.0 の場合 ......................................................................................................160 14.3.1 配布パッケージの用意 .................................................................................... 161 14.3.2 ターゲットコンピュータにドライバをインストール................................. 161 14.3.3 ターゲットコンピュータに Kernel PlugIn をインストール ........................ 161 INF ファイルを作成する ...................................................................................................162 14.4.1 なぜ INF ファイルを作成する必要があるのか ............................................ 162 14.4.2 ドライバがないときに INF ファイルをインストールするには................. 163 14.4.3 INF ファイルを使用して既存のドライバを置き換えるには...................... 164 14.5 Windows CE の場合 ............................................................................................................166 14.6 Linux の場合 ........................................................................................................................167 目 次 14.6.1 WinDriver Kernel モジュール .......................................................................... 167 14.6.2 ユーザーモード ハードウェア コントロール アプリケーション / 共有オブ ジェクト............................................................................................................ 168 14.6.3 Kernel Plugin モジュール................................................................................. 168 14.6.4 インストール スクリプト ............................................................................... 168 14.7 Solaris の場合 ......................................................................................................................168 14.8 VxWorks の場合 ..................................................................................................................169 第 15 章 WinDriver USB Device ...........................................................170 15.1 WinDriver USB Device の概要 ...........................................................................................170 15.2 必要なシステムおよびハードウェア ...............................................................................171 15.3 WinDriver デバイス ファームウェア (WDF) ディレクトリの概要...............................171 15.4 15.3.1 cypress ディレクトリ ....................................................................................... 172 15.3.2 silabs ディレクトリ .......................................................................................... 173 15.3.3 WinDriver USB Device ファームウェア ライブラリ .................................... 174 15.3.4 サンプル コードのビルド ............................................................................... 174 WinDriver USB Device の開発プロセス............................................................................175 15.4.1 Device USB インターフェースの定義 ........................................................... 175 15.4.2 デバイス ファームウェア コードの生成....................................................... 180 15.4.3 デバイス ファームウェアの開発 ................................................................... 182 15.4.4 ハードウェアのデバッグ ................................................................................ 184 15.4.5 USB ホスト デバイス ドライバの開発.......................................................... 184 付録 A 関数リファレンス .......................................................................186 A.1 一般用法 ..............................................................................................................................186 A.1.1 WinDriver のコール順序 − 一般用法 ............................................................ 186 A.1.2 WD_Open() ........................................................................................................ 187 A.1.3 WD_Version() .................................................................................................... 187 A.1.4 WD_Close() ....................................................................................................... 188 A.1.5 WD_Debug() ...................................................................................................... 189 A.1.6 WD_DebugAdd() ............................................................................................... 190 A.1.7 WD_DebugDump() ............................................................................................ 191 A.1.8 WD_Sleep()........................................................................................................ 192 A.1.9 WD_License() .................................................................................................... 193 A.1.10 WD_LogStart()................................................................................................... 195 A.1.11 WD_LogStop()................................................................................................... 196 9 W I N D R I V E R ユ ー ザ ー ズ A.1.12 10 ガ イ ド WD_LogAdd() ................................................................................................... 196 A.2 PCI/ISA/PCMCIA/CardBus - WDC ライブラリの概要.........................................................197 A.3 PCI/PCMCIA/ISA - WDC の高水準 API............................................................................198 A.3.1 構造体、型、および一般的な定義 ................................................................ 198 A.3.2 WDC_DriverOpen() ........................................................................................... 204 A.3.3 WDC_DriverClose()........................................................................................... 205 A.3.4 WDC_PciScanDevices() .................................................................................... 206 A.3.5 WDC_PcmciaScanDevices().............................................................................. 206 A.3.6 WDC_PciGetDeviceInfo() ................................................................................. 207 A.3.7 WDC_PcmciaGetDeviceInfo()........................................................................... 210 A.3.8 WDC_PciDeviceOpen() ..................................................................................... 213 A.3.9 WDC_PcmciaDeviceOpen() .............................................................................. 215 A.3.10 WDC_IsaDeviceOpen() ..................................................................................... 217 A.3.11 WDC_PciDeviceClose()..................................................................................... 221 A.3.12 WDC_PcmciaDeviceClose() .............................................................................. 222 A.3.13 WDC_IsaDeviceClose() ..................................................................................... 222 A.3.14 WDC_CallKerPlug() .......................................................................................... 223 A.3.15 WDC_ReadMemXXX()..................................................................................... 224 A.3.16 WDC_WriteMemXXX() .................................................................................... 224 A.3.17 WDC_ReadAddrXXX() ..................................................................................... 225 A.3.18 WDC_WriteAddrXXX() .................................................................................... 226 A.3.19 WDC_ReadAddrBlock() .................................................................................... 227 A.3.20 WDC_WriteAddrBlock() ................................................................................... 228 A.3.21 WDC_MultiTransfer()........................................................................................ 229 A.3.22 WDC_AddrSpaceIsActive()............................................................................... 231 A.3.23 WDC_PciReadCfgBySlot()................................................................................ 232 A.3.24 WDC_PciWriteCfgBySlot()............................................................................... 233 A.3.25 WDC_PciReadCfgBySlotXXX() ....................................................................... 234 A.3.26 WDC_PciWriteCfgBySlotXXX() ...................................................................... 235 A.3.27 WDC_PciReadCfg()........................................................................................... 236 A.3.28 WDC_PciWriteCfg().......................................................................................... 237 A.3.29 WDC_PciReadCfgXXX() .................................................................................. 238 A.3.30 WDC_PciWriteCfgXXX() ................................................................................. 239 A.3.31 WDC_PcmciaReadAttribSpace() ....................................................................... 240 A.3.32 WDC_PcmciaWriteAttribSpace() ...................................................................... 241 A.3.33 WDC_PcmciaSetWindow()................................................................................ 241 目 次 A.4 A.5 A.3.34 WDC_PcmciaSetVpp() ...................................................................................... 242 A.3.35 WDC_DMAContigBufLock()............................................................................ 243 A.3.36 WDC_DMASGBufLock().................................................................................. 246 A.3.37 WDC_DMABufUnlock() ................................................................................... 248 A.3.38 WDC_DMASyncCpu() ...................................................................................... 249 A.3.39 WDC_DMASyncIo() ......................................................................................... 250 A.3.40 WDC_IntEnable() .............................................................................................. 251 A.3.41 WDC_IntDisable() ............................................................................................. 255 A.3.42 WDC_IntIsEnabled().......................................................................................... 255 A.3.43 WDC_EventRegister() ....................................................................................... 256 A.3.44 WDC_EventUnregister() .................................................................................... 257 A.3.45 WDC_EventIsRegistered()................................................................................. 258 A.3.46 WDC_SetDebugOptions().................................................................................. 259 A.3.47 WDC_Err()......................................................................................................... 260 A.3.48 WDC_Trace()..................................................................................................... 260 A.3.49 WDC_GetWDHandle() ...................................................................................... 261 A.3.50 WDC_GetDevContext() ..................................................................................... 261 A.3.51 WDC_GetBusType().......................................................................................... 262 A.3.52 WDC_Sleep() ..................................................................................................... 262 PCI/PCMCIA/ISA - WDC の低水準 API............................................................................263 A.4.1 WDC_ID_U Union............................................................................................. 263 A.4.2 WDC_ADDR_DESC ......................................................................................... 264 A.4.3 WDC_DEVICE .................................................................................................. 265 A.4.4 PWDC_DEVICE................................................................................................ 267 A.4.5 WDC_MEM_DIRECT_ADDR() ....................................................................... 267 A.4.6 WDC_ADDR_IS_MEM().................................................................................. 267 A.4.7 WDC_ADDR_SPACE_IS_ACTIVE()............................................................... 268 A.4.8 WDC_GET_ADDR_DESC() ............................................................................. 268 A.4.9 WDC_IS_KP() ................................................................................................... 269 PCI/PCMCIA/ISA - WD_xxx 関数......................................................................................270 A.5.1 WinDriver のコール順序 − PCI / PCMCIA / ISA .......................................... 270 A.5.2 WD_PciScanCards()........................................................................................... 271 A.5.3 WD_PciGetCardInfo() ....................................................................................... 272 A.5.4 WD_PciConfigDump()....................................................................................... 276 A.5.5 WD_PcmciaScanCards() .................................................................................... 278 A.5.6 WD_PcmciaGetCardInfo()................................................................................. 280 11 W I N D R I V E R A.6 A.7 A.8 A.9 12 ユ ー ザ ー ズ ガ イ ド A.5.7 WD_PcmciaConfigDump() ................................................................................ 284 A.5.8 WD_IsapnpScanCards() ..................................................................................... 286 A.5.9 WD_IsapnpGetCardInfo() .................................................................................. 288 A.5.10 WD_IsapnpConfigDump() ................................................................................. 292 A.5.11 WD_CardRegister()............................................................................................ 294 A.5.12 WD_CardCleanupSetup()................................................................................... 298 A.5.13 WD_CardUnregister() ........................................................................................ 300 A.5.14 WD_Transfer() ................................................................................................... 301 A.5.15 WD_MultiTransfer() .......................................................................................... 303 A.5.16 WD_DMALock() ............................................................................................... 306 A.5.17 WD_DMAUnlock()............................................................................................ 310 A.5.18 WD_DMASyncCpu()......................................................................................... 311 A.5.19 WD_DMASyncIo() ............................................................................................ 312 A.5.20 WD_PcmciaControl()......................................................................................... 312 A.5.21 InterruptEnable() ................................................................................................ 314 A.5.22 InterruptDisable() ............................................................................................... 317 PCI/PCMCIA/ISA - 低水準 WD_xxx 関数 .........................................................................319 A.6.1 WinDriver のコール順序 - 低水準................................................................... 319 A.6.2 WD_IntEnable() ................................................................................................. 319 A.6.3 WD_IntWait() .................................................................................................... 322 A.6.4 WD_IntCount() .................................................................................................. 323 A.6.5 WD_IntDisable() ................................................................................................ 325 WinDriver USB (WDU) ライブラリの概要 .......................................................................326 A.7.1 WinDriver USB のコール順序 ......................................................................... 326 A.7.2 WD_xxx USB API から WDU_xxx API へのアップグレード ...................... 329 USB – ユーザー コールバック関数 ..................................................................................331 A.8.1 WDU_ATTACH_CALLBACK() ...................................................................... 331 A.8.2 WDU_DETACH_CALLBACK() ...................................................................... 332 A.8.3 WDU_POWER_CHANGE_CALLBACK() ...................................................... 332 USB − 関数.........................................................................................................................333 A.9.1 WDU_Init() ........................................................................................................ 333 A.9.2 WDU_SetInterface() .......................................................................................... 334 A.9.3 WDU_GetDeviceAddr()..................................................................................... 335 A.9.4 WDU_GetDeviceInfo() ...................................................................................... 336 A.9.5 WDU_PutDeviceInfo()....................................................................................... 336 A.9.6 WDU_Uninit().................................................................................................... 337 目 次 A.10 A.11 A.12 A.13 A.9.7 WDU_Transfer() ................................................................................................ 337 A.9.8 WDU_Wakeup() ................................................................................................ 339 A.9.9 WDU_TransferDefaultPipe() ............................................................................. 340 A.9.10 WDU_TransferBulk()......................................................................................... 340 A.9.11 WDU_TransferIsoch()........................................................................................ 341 A.9.12 WDU_TransferInterrupt () ................................................................................. 342 A.9.13 WDU_HaltTransfer() ......................................................................................... 342 A.9.14 WDU_ResetPipe().............................................................................................. 343 A.9.15 WDU_ResetDevice().......................................................................................... 344 A.9.16 WDU_GetLangIDs() .......................................................................................... 344 A.9.17 WDU_GetStringDesc () ..................................................................................... 346 USB – 構造...........................................................................................................................347 A.10.1 WDU_MATCH_TABLE Elements.................................................................... 348 A.10.2 WDU_ EVENT_TABLE Elements.................................................................... 348 A.10.3 WDU_DEVICE Elements .................................................................................. 349 A.10.4 WDU_CONFIGURATION Elements ................................................................ 349 A.10.5 WDU_INTERFACE Elements........................................................................... 349 A.10.6 WDU_ALTERNATE_SETTING Elements....................................................... 350 A.10.7 WDU_DEVICE_DESCRIPTOR Elements ........................................................ 350 A.10.8 WDU_CONFIGURATION_DESCRIPTOR Elements ...................................... 351 A.10.9 WDU_INTERFACE_DESCRIPTOR Elements................................................. 351 A.10.10 WDU_ENDPOINT_DESCRIPTOR Elements................................................... 352 A.10.11 WDU_PIPE_INFO Elements ............................................................................. 352 プラグアンドプレイおよびパワー マネージメント ......................................................353 A.11.1 コール順序........................................................................................................ 353 A.11.2 EventRegister()................................................................................................... 353 A.11.3 EventUnregister() ............................................................................................... 357 Kernel PlugIn − ユーザー モード関数..............................................................................358 A.12.1 WD_KernelPlugInOpen().................................................................................. 358 A.12.2 WD_KernelPlugInClose() ................................................................................. 359 A.12.3 WD_KernelPlugInCall().................................................................................... 360 A.12.4 WD_IntEnable() ................................................................................................ 361 Kernel PlugIn − カーネル モード関数..............................................................................362 A.13.1 KP_Init() ........................................................................................................... 363 A.13.2 KP_Open() ........................................................................................................ 364 A.13.3 KP_Close() ........................................................................................................ 366 13 W I N D R I V E R A.14 A.15 A.16 ユ ー ザ ー ズ ガ イ ド A.13.4 KP_Call() .......................................................................................................... 366 A.13.5 KP_Event()........................................................................................................ 368 A.13.6 KP_IntEnable().................................................................................................. 369 A.13.7 KP_IntDisable()................................................................................................. 371 A.13.8 KP_IntAtIrql() ................................................................................................... 371 A.13.9 KP_IntAtDpc() .................................................................................................. 373 A.13.10 COPY_TO_USER_OR_KERNEL、COPY_FROM_USER_OR_KERNEL().. 374 Kernel PlugIn − 構造体リファレンス...............................................................................375 A.14.1 WD_KERNEL_PLUGIN .................................................................................. 375 A.14.2 WD_INTERRUPT ............................................................................................ 375 A.14.3 WD_KERNEL_PLUGIN_CALL...................................................................... 376 A.14.4 KP_INIT............................................................................................................ 376 A.14.5 KP_OPEN_CALL ............................................................................................. 377 WinDriver ステータス / エラー コード.............................................................................378 A.15.1 はじめに........................................................................................................... 378 A.15.2 WinDriver が返すステータス コード ............................................................ 378 A.15.3 USBD が返すステータス コード................................................................... 380 ユーザーモード ユーティリティ関数 ..............................................................................384 A.16.1 Stat2Str() ........................................................................................................... 384 A.16.2 get_os_type()..................................................................................................... 385 A.16.3 ThreadStart() ..................................................................................................... 385 A.16.4 ThreadWait() ..................................................................................................... 386 A.16.5 OsEventCreate() ................................................................................................ 387 A.16.6 OsEventClose() ................................................................................................. 387 A.16.7 OsEventWait()................................................................................................... 388 A.16.8 OsEventSignal() ................................................................................................ 388 A.16.9 OsEventReset().................................................................................................. 389 A.16.10 OsMutexCreate() ................................................................................................ 389 A.16.11 OsMutexClose() ................................................................................................. 390 A.16.12 OsMutexLock() .................................................................................................. 391 A.16.13 OsMutexUnLock() ............................................................................................. 391 A.16.14 PrintDbgMessage()............................................................................................. 392 付録 B WinDriver USB Device Cypress EZ-USB FX2LP CY7C68013A API の リファレンス .......................................................393 B.1 ファームウェア ライブラリの API .......................................................................................393 14 目 次 B.1.1 型および一般的な定義 .................................................................................... 393 B.1.2 WDF_EP1INConfig() / WDF_EP1OUTConfig() .............................................. 394 B.1.3 WDF_EP2Config / WDF_EP6Config() ............................................................. 395 B.1.4 WDF_EP4Config / WDF_EP8Config() ............................................................. 395 B.1.5 WDF_FIFOReset() ............................................................................................. 396 B.1.6 WDF_SkipOutPacket()....................................................................................... 397 B.1.7 WDF_FIFOWrite()............................................................................................. 397 B.1.8 WDF_FIFORead().............................................................................................. 398 B.1.9 WDF_FIFOFull() ............................................................................................... 398 B.1.10 WDF_FIFOEmpty() ........................................................................................... 399 B.1.11 WDF_SetEPByteCount() ................................................................................... 399 B.1.12 WDF_GetEPByteCount()................................................................................... 400 B.2 DriverWizard で生成されたファームウェアの API..............................................................401 B.2.1 WDF_Init()......................................................................................................... 401 B.2.2 WDF_Poll() ........................................................................................................ 401 B.2.3 WDF_Suspend() ................................................................................................. 402 B.2.4 WDF_Resume().................................................................................................. 402 B.2.5 WDF_GetDescriptor()........................................................................................ 402 B.2.6 WDF_SetConfiguration() ................................................................................... 403 B.2.7 WDF_GetConfiguration() .................................................................................. 403 B.2.8 WDF_SetInterface() ........................................................................................... 403 B.2.9 WDF_GetInterface() .......................................................................................... 404 B.2.10 WDF_GetStatus() ............................................................................................... 404 B.2.11 WDF_ClearFeature().......................................................................................... 405 B.2.12 WDF_SetFeature() ............................................................................................. 405 B.2.13 WDF_VendorCmnd()......................................................................................... 405 付録 C WinDriver USB Device Silicon Laboratories C8051F320 API の リファレンス..........................................................................................407 C.1 ファームウェア ライブラリの API .......................................................................................407 C.1.1 wdf_silabs_lib.h の型および一般的な定義 ..................................................... 407 C.1.2 c8051f320.h の型および一般的な定義 ........................................................... 408 C.1.3 WDF_EPINConfig()........................................................................................... 410 C.1.4 WDF_EPOUTConfig()....................................................................................... 411 C.1.5 WDF_HaltEndpoint() ......................................................................................... 412 C.1.6 WDF_EnableEndpoint()..................................................................................... 413 15 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド C.1.7 WDF_SetEPByteCount() ................................................................................... 413 C.1.8 WDF_GetEPByteCount()................................................................................... 414 C.1.9 WDF_FIFOClear() ............................................................................................. 414 C.1.10 WDF_FIFOFull() ............................................................................................... 415 C.1.11 WDF_FIFOEmpty() ........................................................................................... 415 C.1.12 WDF_FIFOWrite()............................................................................................. 416 C.1.13 WDF_FIFORead().............................................................................................. 416 C.1.14 WDF_GetEPStatus() .......................................................................................... 417 C.2 DriverWizard で生成されたファームウェアの API..............................................................417 C.2.1 WDF_USBReset().............................................................................................. 417 C.2.2 WDF_SetAddressRequest()................................................................................ 418 C.2.3 WDF_SetFeatureRequest()................................................................................. 418 C.2.4 WDF_ClearFeatureRequest() ............................................................................. 418 C.2.5 WDF_SetConfigurationRequest() ...................................................................... 419 C.2.6 WDF_SetDescriptorRequest()............................................................................ 419 C.2.7 WDF_SetInterfaceRequest() .............................................................................. 419 C.2.8 WDF_GetStatusRequest() .................................................................................. 420 C.2.9 WDF_GetDescriptorRequest() ........................................................................... 420 C.2.10 WDF_GetConfigurationRequest()...................................................................... 420 C.2.11 WDF_GetInterfaceRequest().............................................................................. 421 付録 D トラブルシューティングとサポート ..........................................422 付録 E 評価版 (Evaluation version) の制限 ..........................................423 付録 F .....................................................................................................425 WinDriver の購入.............................................................................................................................425 ドライバの配布 ‐ 法律問題 .........................................................................................................426 16 目 次 図表 図 1.1: WinDriver アーキテクチャ ...................................................................................................23 図 2.1: モノリシック ドライバ ........................................................................................................31 図 2.2: レイヤード ドライバ ............................................................................................................32 図 2.3: ミニポート ドライバ ............................................................................................................33 図 3.1: USB エンドポイント ............................................................................................................39 図 3.2: USB パイプ ............................................................................................................................40 図 3.3: WinDriver USB アーキテクチャ ..........................................................................................44 図 5.1: デバイスの選択 .....................................................................................................................66 図 5.2: DriverWizard INF ファイル情報...........................................................................................67 図 5.3: DriverWizard のマルチ インターフェース デバイスの INF ファイル情報 (特定のイン ターフェースをそれぞれ設定する場合)............................................................................68 図 5.4: DriverWizard のマルチ インターフェース デバイスの INF ファイル情報 (1 つのイン ターフェースを設定する場合)............................................................................................69 図 5.5: USB デバイスの設定 ............................................................................................................70 図 5.6: PCI 診断画面.........................................................................................................................71 図 5.7: USB 要求一覧 ........................................................................................................................72 図 5.8: パイプへの書き込み .............................................................................................................73 図 5.9: コード オプションの生成 ....................................................................................................73 図 5.10:ドライバの種類を選択 ........................................................................................................74 図 5.11: コード生成のオプション ...................................................................................................75 図 5.12: 通知イベント .......................................................................................................................75 図 7.1: Debug Monitor の起動 ...........................................................................................................86 図 7.2: Trace Options の設定 .............................................................................................................86 図 9.1: USB データ交換 ..................................................................................................................107 図 9.2: USB のリードとライト ......................................................................................................108 図 9.3: カスタム要求 .......................................................................................................................111 図 9.4: 要求一覧 ...............................................................................................................................112 図 9.5: ログ スクリーン ..................................................................................................................113 図 11.1: KernelPlugIn の構造...........................................................................................................124 図 11.2: Kernel PlugIn なしでの割り込みの処理 ..........................................................................137 17 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 図 11.3: Kernel PlugIn ありでの割り込み処理 ..............................................................................139 図 15.1: デバイス ファームウェア プロジェクトの作成............................................................176 図 15.2: 開発ボードの選択 .............................................................................................................176 図 15.3: デバイス ディスクリプタの編集 ....................................................................................177 図 15.4: デバイスの設定 .................................................................................................................177 図 15.5: インターフェースの定義 .................................................................................................178 図 15.6: エンドポイントの定義 .....................................................................................................178 図 15.7: EZ-USB エンドポイント バッファ .................................................................................180 図 15.8: Cypress EZ-USB FX2LP CY7C68013A ファームウェア コード生成 ...........................181 図 15.9: Silicon Laboratories C8051F320 ファームウェア コード生成........................................181 18 第 1 章 W I N D R I V E R の 概 要 第1章 WinDriver の概要 この章では、WinDriver の使い方を紹介し、ドライバ作成の基本的なステップを学習しま す。 1.1 はじめに WinDriver はデバイス ドライバを短期間に作成することを目的に設計された、開発ツールキットです。 WinDriver は、自動的にハードウェアを検出し、アプリケーションからハードウェアにアクセスするド ライバを生成するウィザードおよびコード生成機能を持っています。WinDriver を使用して開発された ドライバは、サポートされているすべてのオペレーティング システムでソース コード互換になりま す。現在 WinDriver は、Windows 98 / Me / NT / 2000 / XP / CE / CE.NET / Server 2003、Linux、Solaris およ び VxWorks をサポートします。また、ドライバは Windows / 98 / Me / NT / 2000 / XP / Server 2003 ではバ イナリ互換になります。バス アーキテクチャのサポートは、PCI / ISA / ISAPnP / EISA / CompactPCI / PCI Express (PCMCIA は Windows 2000/XP/Server 2003 でのみサポートされています) および USB です。 WinDriver は割り込みや I/O を最適に処理するハイパフォーマンスなドライバ作成のソリューションを 提供します。 WinDriver を使用すれば、デバイス ドライバの開発に数ヶ月要していたものが、数時間で簡単に行えま す。このマニュアルは、上級者ユーザー向けの機能を多く紹介しています。しかし、多くの開発者は、 この章を読み、DriverWizard と関数リファレンスの章を見れば、ドライバの記述に成功できるでしょう。 WinDriver は、USB と PCI ブリッジをサポートします。また、PLX、Altera、Marvell、AMCC、 QuickLogic、Xilinx、Cypress、STMicroelectronics、Texas Instruments、Silicon Laboratories、 および National Semiconductors に関してはより詳細なサポートを行っています。各チップセッ トに関する詳細は第 8 章を参照してください。第 10 章では WinDriver の Kernel PlugIn 機能を使用し て、ドライバ コードを最適化する方法を説明しています。ここで WinDriver の Kernel PlugIn 機能が 詳しく説明されています。この機能を使用すると、開発者はすべてのコードをユーザー モードで開 発し、後でパフォーマンスに関わる部分をカーネル モードに移動できます。Kernel PlugIn の概要は 第 11 章および第 12 章を参照してください。 WinDriver およびその他の開発ツールに関する最新情報を入手するには、エクセルソフト(株) のホーム ページ (http://www.xlsoft.com/) および開発元の Jungo 社のホームページ (http://www.jungo.com/) を定期 的に参照することを推奨します。 19 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 1.2 背景 1.2.1 チャレンジ 保護されたオペレーティング システム (Windows、Linux および Solaris) では、通常開発が行われるアプ リケーション レベル (ユーザー モード) から直接ハードウェアにアクセスできません。ハードウェアへ のアクセスは、オペレーティング システムが「デバイス ドライバ」と呼ばれるソフトウェア モジュー ルを使ってアクセスする必要があります (カーネル モード または Ring 0)。アプリケーション レベルか らカスタム ハードウェア デバイスにアクセスするには、プログラマは次の事柄を行う必要があります: 1. オペレーティング システムの内部情報 (98 / Me / NT / XP/ CE/ CE.NET / Server 2003、Linux、 Solaris および VxWorks) を学習する。 2. デバイス ドライバの記述方法を習得する。 3. カーネル モードでの開発、デバッグに使用するツール (DDK、ETK、DDI、DKI など) を 習得する。 4. ハードウェアの基本的な入出力を行うカーネル モードのデバイス ドライバを記述する。 5. カーネル モードで記述したデバイス ドライバでハードウェアにアクセスする、ユーザー モードでアプリケーションを記述する。 6. コードを実行するオペレーティング システムに対して、それぞれステップ 1 から 4 を繰 り返す。 1.2.2 WinDriver の特長 容易な開発 - WinDriver は、短時間で PCI / PCMCIA / CardBus / ISA / ISAPnP / EISA / CompactPCI / PCI Express および USB ベースのデバイス ドライバを開発できるように設計された、デバイス ドラ イバ開発用ツールキットです。WinDriver を利用すると MSDEV、Visual C/C++、Borland、Delphi、Visual Basic、GCC などの 32 ビット コンパイラを使って「ユーザー モード」でドライバを作成できます。 WinDriver を使用することにより、オペレーティング システムの内部、カーネル プログラミングなど の知識を必要とせずにデバイス ドライバを作成できます。 クロス プラットフォーム - WinDriver で作成されたドライバは Windows 98 / Me / NT / 2000 / XP / CE / CE.NET / Server 2003、Linux、Solaris および VxWorks で動作します。そのため、一度コードを記述 すれば他のプラットフォームでも動作します。 ユーザー フレンドリーなウィザード - DriverWizard は、対象のハードウェアのデバイス ドライバを開 発する前にそのハードウェアに読み書きを行うグラフィカルな診断プログラムです。ハードウェアの メモリ範囲、レジスタ、割り込みなどが確認されます。デバイスが完全に動作していることを確認し た後、DriverWizard はハードウェアのすべてのリソースにアクセス可能なデバイス ドライバの雛形を 作成します。 カーネル モードのパフォーマンス - WinDriver の API はパフォーマンス向上のため、最適化されていま す。ユーザー モードでは達成できないパフォーマンスの向上を図る場合、WinDriver の 「WinDriver 20 第 1 章 W I N D R I V E R の 概 要 Kernel PlugIn」を利用します。WinDriver Kernel PlugIn を利用するには、まず通常の WinDriver ツールを 利用してドライバをユーザー モードで作成します。次にパフォーマンスに大きく関わるコード (割り 込みハンドラ、I/O にマップされたメモリ領域へのアクセスなど) をWinDriver の Kernel PlugIn に移動し ます。Kernel PlugIn に移動したモジュールはカーネル モードで実行するので、実行までのオーバーヘッ ドがなくなります。この機能を利用することにより、開発が容易なユーザー モードで開発を行い、必 要な箇所のパフォーマンスを向上することができます。速度を向上させる箇所だけをカーネル モード に移動できるため、開発期間を短縮できるほか、作成するデバイス ドライバのパフォーマンスを犠牲 にすることもありません。この機能に関する詳細は第 11 章を参照してください。 このユニークな機能により、開発者はカーネルの動作を習得する必要もなく OS カーネル内でユーザー モード コードを実行できます。Windows CE および VxWorks の場合、ユーザー モードとカーネル モー ドの境界がないため、Kernel PlugIn を使用する必要はありません。そのため、ユーザー モードから最 適なパフォーマンスを達成できます。セクション [9.2.3] では、Kernel PlugInドライバーの代わりとなる VxWorks における割り込み処理率を改良する WinDriver の使用方法を説明します。 1.3 WinDriver の処理速度 PCI ドライバの場合、WinDriver Kernel PlugIn は、カスタム カーネル ドライバと同程度の処理速度を期 待できます。その処理速度は、オペレーティング システムとハードウェアの制限によって異なります。 大雑把に見積もって、Kernel PlugIn を使って毎秒約 100,000 回の割り込み処理ができます。USB ドライ バの場合、カスタム カーネル ドライバと同程度の転送速度を期待できます。USB 1.1 または USB 2.0 の 最大限の性能を引き出します。 1.4 最後に WinDriver を使用して、カスタム ハードウェアにアクセスするアプリケーションを作成するために必要 な手順をまとめます: DriverWizard を実行し、ハードウェアとそのリソースを検出します。 DriverWizard を使って、デバイス ドライバのコードを自動生成します。または、WinDriver の サンプルの 1 つをアプリケーションの基礎として使用します。各 PCI チップセットへの拡張 サポートに関する詳細は第 7 章、各 USB チップセットへの拡張サポートに関する詳細は第 8 章を参照してください。 アプリケーションに実装する機能を適用するために、生成された関数またはサンプルの関数 を使用して、ユーザー モード アプリケーションを必要に応じて修正してください。 これで、すべての Windows プラットフォーム (Windows CE を含む) および Linux、Solaris、VxWorks (再 コンパイルが必要です) から新しいハードウェアにアクセスするアプリケーションを作成できます。 (コードは Windows 98/Me/NT/2000/XP/Server 2003 プラットフォームでバイナリ互換性があります。その ため、これらの OS 間でドライバを移植する場合は再ビルドする必要はありません。) 21 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 1.5 WinDriver の利点 ユーザー モードで容易にドライバを開発。 Kernel PlugIn で高性能なドライバを開発。 ユーザー フレンドリーな DriverWizard はコードを記述する前に、ハードウェアの診断を行い、 ドライバ コードの大部分を DriverWizard が自動的に生成します。 DriverWizard で C、Delphi (Pascal) または Visual Basic のドライバ コードを自動的に生成します。 PCI / PCMCIA / CardBus /ISA / ISAPnP / EISA / CompactPCI / PCI Express および USB デバイスを 製造元に関わらずサポートします。 PLX / Altera / Marvell / AMCC / QuickLogic / Xilinx などの PCI チップをサポートします。そのた め、開発者は PCI チップの詳細を特に知る必要はありません。 USB 実装の詳細が分かりづらい、Cypress、STMicroelectronics、Texas Instruments、National Semiconductors などの USB コントローラを拡張サポートします。 作成されるアプリケーションは Windows 98 / Me / NT / 2000 / XP / Server 2003 でバイナリ互換で す。 作成されるアプリケーションは Windows 98 / Me / NT / 2000 / XP / CE / CE.NET / Server 2003、 Linux、Solaris および VxWorks でソース コード互換です。 MSDEV、Visual C/C++、Borland Delphi、Borland C++、Visual Basic、GCC などの 32 ビット コン パイラを含む一般的な開発環境で使用可能です。 DDK、ETK、DDI などのシステム レベル プログラムに関する知識を必要としません。 I/O、DMA、割り込み処理、メモリ マップされた カードへのアクセスをサポートしています。 マルチ CPU、マルチ PCI バス プラットフォーム (PCI / PCMCIA / CardBus / ISA / ISAPnP / EISA / CompactPCI / PCI Express) をサポートします。 64 ビット PCI データ転送をサポートします。 ダイナミック ドライバ ローダーを含んでいます。 詳細なマニュアルとヘルプ ファイルが用意されています。 C、Delphi、Visual Basic の詳細なサンプルが用意されています。 2 ヶ月間の無料テクニカルサポート (インストール、ライセンス、配布に関する質問) 作成したドライバを無料で使用、配布できます。 22 第 1 章 W I N D R I V E R の 概 要 1.6 WinDriver のアーキテクチャ WinDriver コンポーネント アプリケーション ( YourApp.EXE ) 記述するコンポーネント ドライバ コード WinDriver ユーザーモード ライブラリ ユーザー モード カーネル モード Kernel PlugIn (SYS, VXD) パフォーマン WinDriver ス上の重要な Kernel PlugIn 関数 WinDriver カーネル windrvr6.* ハードウェア (VXD, SYS, DLL, 0) 図 1.1: WinDriver アーキテクチャ ハードウェアにアクセスする場合、アプリケーションは WinDriver ユーザー モード ライブラリ (windrvr.h) から WinDriver 関数を呼び出します。ユーザー モード ライブラリがハードウェアにネイティ ブ コールでアクセスする WinDriver カーネルを呼び出します。 WinDriver は、ユーザー モードで実行されてもパフォーマンスにあまり影響しないように設計されてい ます。しかし、ハードウェアによってはユーザー モードでは得られないほど高いパフォーマンスを必 要とする場合があります。このような場合、ユーザー モードで開発したコードからパフォーマンスが 必要なモジュール (割り込みハンドラ等) のコードを変更せずに WinDriver の Kernel PlugIn に移動しま す。これにより、WinDriver カーネルがカーネル モードでこのモジュールを呼び出し、パフォーマンス を向上させます。そのため、ユーザー モードで容易にドライバの開発、デバッグを行い、必要な部分 のパフォーマンスを向上できます。Kernel PlugIn に関する詳細は第 11 章を参照してください。Windows CE および VxWorks の場合、ユーザー モードとカーネル モードの境界がないため、Kernel PlugIn を使 用する必要はありません。そのため、ユーザー モードから簡単に最適なパフォーマンスを達成できま す。 23 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 1.7 WinDriver がサポートするプラットフォーム WinDriver は Windows 98 / Me / NT / 2000 / XP / CE / CE.NET / Server 2003、Solaris、Linux および VxWorks を サポートします。同じソース コードがサポートするすべてのプラットフォーム上で実行できます。ま た、作成した実行ファイルは、Windows 98 / Me / NT / 2000 / XP / Server 2003 で動作します。これらの中 の 1 つのオペレーティング システム用に作成したドライバであっても、WinDriver を使用することによ り、コードの変更を行わずに他のオペレーティング システムに移行できます。 1.8 評価版 (Evaluation Version) の制限 すべての評価版は、フル機能を装備しています。制限される機能はありません。以下に登録版と評価 版の違いを記述します。 毎回 WinDriver を起動すると評価版であることを示すメッセージが表示されます。 DriverWizard を使用しているとき、評価版が実行していることを知らせるダイアログ ボック スが、ハードウェアと相互作用するたびに表示されます。 Linux、Solaris、VxWorks および CE 版では、60 分間動作した後、停止します。再度評価する には、再ロードする必要があります。 Windows の評価版はインストール後、30 日間使用できます。 詳細は、付録 E の「評価版 (Evaluation Version) の制限」の章を参照してください。 1.9 WinDriver を使用してドライバを開発するには 1.9.1 1. Windows 98 / Me / NT / 2000 / XP / Server 2003 / Linux および Solaris DriverWizard を起動し、デバイスを診断します。詳細は第 5 章「DriverWizard」を参照し てください。 2. 雛型となるコードを生成するか、または WinDriver のサンプルをドライバ アプリケー ションの雛型とします。各チップセット特有の拡張サポートに関する詳細は第 8 章を参 照してください。 3. DriverWizard が生成するコードを修正してアプリケーションに必要な機能を作成してく ださい。 4. ユーザー モードでドライバのテストやデバッグを行います。 5. コードにパフォーマンス的に重要な部分が含まれている場合、第 10 章「パフォーマンス の向上」を参考にパフォーマンスを向上することもできます。 24 第 1 章 W I N D R I V E R の 概 要 注意: DriverWizard で作成したコードは、検出または定義したリソースへの read および write を行う関数を持つ診断プログラムで、対象のカードの割り込み、Listen、USB パイ プのアクセスなどが行えます。 1.9.2 Windows CE 1. Windows ホスト マシンにあなたのハードウェアを装着します。 2. DriverWizard でハードウェアを診断します。 3. ドライバ コードの雛形を DriverWizard で生成します。 4. ドライバ コードの雛形を DriverWizard で生成します。 5. ハードウェアの仕様にあわせて、Visual C++ でこのコードを修正します。Platform Builder を使用している場合、ワークスペースへ 生成された *.pbp を挿入します。 6. ホスト マシン上で実行する CE エミュレーションでコードとハードウェアをテストおよ びデバッグします。 注意: ISAPnP は、Windows CE でサポートされていません。 ヒント: Windows のホスト マシンにハードウェアを装着できない場合、DriverWizard を使用してす べてのリソースを手動で入力する必要があります。DriverWizard でコードを生成し、ハードウェア をシリアル接続でテストします。生成したコードが正しく動作することを確認したら、ハードウェ アの仕様にあわせて修正します。また、サンプルのファイルを雛形として使用することもできます。 1.9.3 VxWorks 1. ハードウェアを Windows ホスト マシンに接続します。 2. Windows の DriverWizard を使用してハードウェアを診断します。第 5 章「DriverWizard」を参照し てください。 3. DriverWizard でドライバの雛型コードを作成して Tornado 用の プロジェクト makefile を作成しま す。 4. Tornado 環境へコードを移動して、コンパイルします。 5. Tornado 開発環境または 32 ビット開発環境を使用してこのコードを修正します。 1.10 WinDriver ツールキットの内容 WinDriver CD 印刷マニュアル 2 ヶ月間のインストール、ライセンスおよび配布に関する質問 (FAX、電子メール) 25 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド WinDriver モジュール ユーティリティ サポートする API チップセット サンプル ファイル 1.10.1 WinDriver のモジュール WinDriver (\WinDriver\include): 汎用ハードウェア アクセス ツールキット。 − − windrvr.h: WinDriver API の宣言および定義します。 wdu_lib.h: ラッパー USB API を提供する WinDriver USB (WDU) ライブラリの宣 言および定義します。 − wdc_lib.h and wdc_defs.h: PCI/PCMCIA/CardBus/ISA/ISAPnP/EISA/CompactPCI/PCI Express デバイスへアクセス するラッパー API を提供する WinDriver Card (WDC) ライブラリの宣言および定義し ます。詳細は付録 [A.2] を参照してください。 − windrvr_int_thread.h: 割り込み処理を簡略化するラッパー 関数の定義をして います。 − windrvr_events.h: イベント処理および PnP 通知を実装する関数を含みます。 − utils.h: 一般的なユーティリティ関数を宣言します。 − status_strings.h: WinDriver のステータス コードをエラー メッセージに変換す る API を宣言します。 DriverWizard ([スタート] メニュー - [プログラム] - [WinDriver] - [Wizard] - [DriverWizard] からア クセスできます): ハードウェアを診断し、ドライバを簡単にコード化するグラフィカルな ツール (第 5 章「DriverWizard」を参照してください)。 Graphical Debugger ([スタート] メニュー - [プログラム] - [WinDriver] - [util] - [wddebug_gui] から アクセスできます): ドライバの実行中にデバッグ情報を収集するグラフィカルなデバッグ ツール。 WinDriver は、Windows CE または VxWorks などの GUI サポートが無いプラット フォームで使用可能なプログラム (WinDriver/util/wddebug) のコンソール版を含んでいます。 Debug Monitor に関する詳細はセクション [7.2] を参照してください。 WinDriver 配布用パッケージ (\windriver\redist): ユーザーに配布するファイル。 WinDriver Kernel PlugIn: Kernel PlugIn を作成するためのファイルとサンプル。詳細は第 11 章を 参照してください。 本書: PDF フォーマット、Windows HELP (chm)、HTML 形式の WinDriver マニュアル。これら は WinDriver/docs/ ディレクトリに保存されています。 26 第 1 章 1.10.2 W I N D R I V E R の 概 要 ユーティリティ PCI_SCAN.EXE (\WinDriver\util\pci_scan.exe): インストールされている PCI カードおよびその カードに割り当てられたリソースのリストを得るためのユーティリティ。 PCI_DUMP.EXE (\WinDriver\util\pci_dump.exe): インストールされている PCI カードの PCI 設定 レジスタを出力するためのユーティリティ。 PCMCIA_SCAN.EXE (/WinDriver/util/pcmcia_scan.exe) – インストールされている PCMCIA カー ドおよびそれらに割り当てられているリソースのリスト。 USB_DIAG.EXE (\WinDriver\util\usb_diag.exe): インストールされている USB デバイスのリス ト、各デバイスに割り当てられたリソースの取得、USB デバイスのアクセスを行うユーティ リティ。 CE バージョンに添付 \REDIST\...\X86EMU\WINDRVR_CE_EMU.DLL: Windows CE の X86 HPC エミュレーション モード 用 Windriver カーネル と通信する DLL。 \REDIST\...\X86EMU\WINDRVR_CE_EMU.LIB: Windows CE の X86 HPC エミュレーション モードでコンパイルした WinDriver アプリケーションをリンクするためのインポート ライブ ラリ。 1.10.3 特定チップセットのサポート WinDriver はカスタム ラッパー API と以下のチップセットを含む主要な PCI チップセット用 (第 7 章を 参照) のサンプルコードを提供します。 PLX 9030、9050、9052、9054、9080、9056、および 9656 – これらは WinDriver/plx ディレ クトリに保管されています。 Marvell GT64 - WinDriver/marvell/gt64 に保管されています。 WinDriver AMCC API (AMCC S5933 PCI ブリッジ用) - WinDriver/amcc に保管されています。 Altera pci_dev_kit - WinDriver/altera に保管されています。 Xilinx VirtexII - WinDriver/xilinx/VirtexII に保管されています。 これらのディレクトリには次のサブ ディレクトリが含まれます。 <vendor>/lib/ - WinDriver API で記述された拡張サポート チップ用の特定のチップセット API。 <chip>/\xxx_diag/ - lib/ ディレクトリのカスタム API を使用して書かれた特定チップ セット用のサンプル診断アプリケーション。このアプリケーションはコンパイル後、そのま ま実行できます。 27 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド WinDriver はカスタム ラッパー API と以下のコントローラを含む主要な USB コントローラ用 (第 8 章 を参照) のサンプルコードを提供します。 Cypress EZ-USB - WinDriver/cypress に保管されています。 Texas Instruments TUSB3410、TUSB3210、TUSB2136、TUSB5052: - WinDriver/ti に保管さ れています Silicon Laboratories C8051F320 USB - WinDriver/silabs に保管されています。 これらのディレクトリには次のサブ ディレクトリが含まれます。 <vendor>/lib/ - WinDriver API で記述された拡張サポート チップ用の特定のチップセット API。 <chip>/<sample_name>/ - lib/ ディレクトリのカスタム API を使用して書かれた特定チッ プセット用のサンプル診断アプリケーション。このアプリケーションはコンパイル後、その まま実行できます。 1.10.4 サンプル 特定のチップセット用のサンプルに加え、WinDriver にはデバイスと通信したり、さまざまなタスクを 実行する WinDriver API の使用方法のデモンストレーション用のサンプルが含まれています。 WinDriver/samples - C のサンプル。 このサンプルには、[1.10.2] で紹介したユーティリティのソースコードも含まれています。 WinDriver/delphi/samples - Delphi (Pascal) のサンプル WinDriver/vb/samples - Visual Basic のサンプル 1.11 WinDriver で作成したドライバを配布できますか はい、可能です。WinDriver 開発用ツールキットとして購入されている WinDriver を使用して作成され たデバイス ドライバはロイヤリティ フリーでコピーを無制限に配布することができます。詳細につい ては契約同意書 (\WinDriver\docs\license.txt) を参照してください。 1.12 適切なツールの使用 開発元の Jungo 社では、WinDriver および KernelDriver の 2 つのドライバ開発製品を提供しています。 WinDriver は、モノリシック タイプのユーザー モード ドライバ用に設計されたツールです。WinDriver は、カーネル モード デバイス ドライバを記述せずに、ユーザー モードのアプリケーション内から直 接ハードウェアをアクセスすることを可能にします。WinDriver を使用して、ユーザー モードのアプリ ケーションから直接ハードウェアにアクセスしたり、複数の異なるアプリケーションからコールでき る DLL を記述できます。 28 第 1 章 W I N D R I V E R の 概 要 WinDriver は、ドライバのパフォーマンスを向上させるためのソリューションを提供します。WinDriver の Kernel PlugIn を使用して、カーネルからあなたのユーザー モード コードを実行し、カーネル プログ ラミングをしなくてもカーネル モードのパフォーマンスを達成できます。 WinDriver を使って作成したドライバは Windows 98 / Me / NT / 2000 / XP / CE / CE.NET / Server 2003、Linux、Solaris、VxWorks および Windows CE / CE.NET 上で動作します (PCMCIA は Windows 2000/XP/Server 2003 でのみサポートされています。ISAPnP は Windows CE ではサポートされていま せん。)。ドライバ作成の知識がない開発者でも数週間を要するカーネル モード ドライバの開発と比 較して、数時間で動作するドライバを作成できます。 KernelDriver は、カーネルでハードウェア アクセスを行い、OS と通信し実装する必要がある標準的 な OS のインターナル ドライバを作成する際に使用します。 KernelDriver で作成したドライバは、Windows 98 / Me / NT / 2000 / Server 2003 / CE および Linux で動作 します。カーネルモードでハードウェアへアクセスする API を提供することによって、カーネル モー ドのデバイス ドライバを作成する際の難しい作業を劇的に簡易化します。この API は、対応する OS 間 で互換性があります。 29 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 第2章 デバイス ドライバの理解 この章では、一般的なデバイス ドライバの手引き紹介し、デバイス ドライバの構造的な 要素を説明します。 2.1 デバイス ドライバの概要 デバイス ドライバは、端末、ディスク、テープ ドライブ、ビデオ カードおよびネットワーク メディ アなどの特定のハードウェア デバイスと OS 間のインターフェースを提供するソフトウェアの一種で す。デバイス ドライバは、デバイスへサービスを提供し、ハードウェア引数を設定し、カーネルから デバイスへデータを転送し、カーネルへ戻ってきたデータを渡し、デバイスのエラーを処理したりし ます。ドライバは、デバイスとプログラム間の翻訳機のような役割をします。各デバイスは、そのド ライバのみが理解できるような特別なコマンドのセットを持っています。対照的に、多くのプログラ ムは、汎用的なコマンドを使用してデバイスにアクセスします。よって、ドライバはプログラムから 汎用的なコマンドを受信し、それをデバイスが理解できる特別なコマンドに翻訳します。 2.2 機能によるドライバの分類 機能に応じて、さまざまなドライバの種類が存在します。このセクションでは、最も一般的な 3 つの ドライバの種類を簡単に紹介します。 2.2.1 モノリシック ドライバ モノリシック ドライバは、ハードウェア デバイスをサポートするのに必要なすべての機能を持ったデ バイス ドライバです。モノリシック ドライバは 1 つ、または複数のユーザー アプリケーションにより アクセスされ、ハードウェア デバイスを直接制御します。ドライバは IO コントロール コマンド (IOCTL) を通してアプリケーションと通信し、DDK、ETK、DDI/DKI 関数を使用してハードウェアを 制御します。 30 第 2 章 デ バ イ ス ド ラ イ バ の 理 解 アプリケーション ユーザー モード カーネル モード ドライバ HW 図 2.1: モノリシック ドライバ モノリシック ドライバは、すべての Windows プラットフォームおよび UNIX プラットフォームを含む オペレーティング システムに存在します。 2.2.2 レイヤード ドライバ レイヤード ドライバは、IO 要求を他のデバイス ドライバと一緒に処理するデバイス ドライバのス タックの一部です。例えば、レイヤード ドライバは、ディスクへの呼び出しを横取りし、ディスクへ / から転送されるすべてのデータを暗号 / 復号化するドライバです。このようなドライバは既存のドラ イバの上位の位置し、暗号化 / 復号化のみを行います。 レイヤード ドライバはフィルタ ドライバとしても知られています。これらは、Windows プラット フォームおよび UNIX プラットフォームを含むすべての OS でサポートされています。 31 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド アプリケーション ユーザー モード カーネル モード レイヤード ドライバ ドライバ HW 図 2.2: レイヤード ドライバ 2.2.3 ミニポート ドライバ ミニポート ドライバは、ミニポート ドライバをサポートするクラス ドライバへの add-on です。その クラス用のドライバが必要とするすべての関数をミニポート ドライバによって実装しなくても済むよ うに使用します。クラス ドライバは、ミニポート ドライバの基本的なクラスの機能を提供します。ク ラス ドライバは、すべての HID デバイスまたはネットワーク デバイスなどの共通的な機能のデバイス のグループをサポートするドライバです。 ミニポート ドライバは、ミニクラス ドライバまたはミニドライバとも呼ばれ、Windows NT (または 2000) ファミリ、Windows NT / 2000 / XP および Server 2003 でサポートされています。 Windows NT / 2000 / XP / Server 2003 は、その他にもクラスの共通的な機能をハンドルするドライバ ク ラス (ポートと呼ばれる) を提供します。ユーザーに応じて、特定のハードウェアの内部的な動作を行 う必要がある機能のみを追加します。 NDIS ミニポート ドライバはそれらのクラスの一例です。NDIS ミニポート フレームワークを使用し て、NT の通信スタックに接続するネットワーク ドライバを作成します。よって、そのネットワーク ド ライバは、アプリケーションで使用する共通的な通信の呼び出しにアクセスできます。Windows NT の カーネルは、さまざまな通信スタック用のドライバと一般的な通信カードのコードを提供します。 NDIS フレームワークによって、ネットワーク カードの開発者は、このコードをすべて記述する必要 はありません。開発を行うネットワーク カードの独自のコードのみを記述します。 32 第 2 章 アプリケーション デ バ イ ス ド ラ イ バ の 理 解 ユーザーモード カーネル モード NDIS フレームワーク ミニポート ドライバ HW 図 2.3: ミニポート ドライバ 2.3 OS によるドライバの分類 2.3.1 WDM ドライバ WDM (Windows Driver Model) ドライバは、Windows NT および Windows 98 OS ファミリのカーネル モー ド ドライバです。Windows NT ファミリとは、Windows NT / 2000 / XP / Server 2003 で、Windows 98 ファ ミリとは、Windows 98 と Windows Me を指します。WDM は、OS に統合されるコードの一部としてデ バイス ドライバの動作をチャネリングすることによって、動作します。これらのコードの一部は、DMA および Plug-and-Play (Pnp) デバイスのエミュレーションを含む、低レベルなバッファ管理を行います。 WDM ドライバは、電源管理プロトコルをサポートし、モノリシック ドライバ、レイヤード ドライバ およびミニポート ドライバを持つ PnP ドライバです。 2.3.2 VxD ドライバ VxD ドライバは、Windows 95 / 98 / Me の Virtual Device Drivers で、ファイル名の終わりが .vxd 拡張子な ので VxDs を呼ばれています。VxD ドライバは、典型的なモノリシックです。VxD ドライバは、ハー ドウェアへの直接アクセスと権限を持った OS の機能を提供します。VxD ドライバをあらゆる種類に スタックまたはレイヤとすることがでますが、ドライバの構造自体は、レイヤ化しません。 33 W I N D R I V E R 2.3.3 ユ ー ザ ー ズ ガ イ ド Unix デバイス ドライバ クラシックな Unix ドライバ モデルでは、デバイスは次の 3 つのカテゴリのうちの 1 つに属します: キャラクタ (Char) デバイス、ブロック デバイスおよびネットワーク デバイス。これらのデバイスを実 行するドライバは同様にキャラクタ ドライバ、ブロック ドライバまたはネットワーク ドライバとして 知られています。Unix では、ドライバはカーネルにリンクしているコード ユニットで、特権を持つ カー ネル モードで実行します。一般的に、ドライバ コードはユーザー モード アプリケーションに代わっ て実行されます。ユーザー モード アプリケーションから Unix ドライバへのアクセスは、ファイル シ ステムを経由して提供されます。つまり、デバイスは開くことが可能な特別なデバイス ファイルとし てアプリケーションから見えます。 Unix デバイス ドライバは、レイヤードまたはモノリシック ドライバのいずれかです。モノリシック ド ライバは、1 レイヤのレイヤード ドライバとして知られています。 2.3.4 Linux デバイス ドライバ Linux デバイス ドライバは、クラシックな Unix デバイス ドライバ モデルが基となっています。さらに、 Linux は独自の特長を持っています。 Linux では、ブロック デバイスはキャラクタ デバイスのようにアクセスすることができますが、ユー ザーやアプリケーションに対して見えないブロック指向インターフェイスを持っています。 通常、Unix では、デバイス ドライバはカーネルにリンクされ、また、新しいデバイスをインストール した後にシステムを停止させ、再起動します。Linux はモジュールと呼ばれる動的にロードすることが できるドライバの概念を持っています。Linux モジュールは、システムをシャットダウンすることなく モジュールを動的にロードしたり削除することができます。すべての Linux ドライバは書き込み可能 なため、静的にリンクさせたり、モジュラー フォームに書き込むことができ、これにより動的にロー ド可能となります。これは、モジュールが検索しているハードウェアが見つからない場合、モジュー ルはハードウェアを検索して、モジュール自体をアンロードするように記述されることができるので、 Linux のメモリの使用を効果的にします。 Unix のデバイス ドライバのように、Linux デバイス ドライバは、レイヤードまたはモノリシック ドラ イバのいずれかです。 2.3.5 Solaris デバイス ドライブ Solaris デバイス ドライバも Linux ドライバのようにクラシックな Unix デバイス ドライバ モデルが基 となっています。Linux ドライバのように、Solaris ドライバをカーネルに静的にリンクするか、カーネ ルから動的にロードまたは削除する場合があります。 Unix と Linux デバイス ドライバのように、Solaris デバイス ドライバは、レイヤードまたはモノリシッ ク ドライバのいずれかです。 34 第 2 章 デ バ イ ス ド ラ イ バ の 理 解 2.4 ドライバのエントリー ポイント すべてのデバイス ドライバは、C コンソール アプリケーションの main() 関数のような main のエント リー ポイントを 1 つ持っています。このエントリー ポイントを Windows では、DriverEntry() と呼び、 Linux では、init_module() と呼びます。OS がデバイス ドライバをロードする際に、このドライバのエン トリー処理を呼びます。 初めてドライバをロードする際に、すべてのドライバが一度のみ実行する必要があるグローバルな初 期化があります。このグローバルな初期化が DriverEntry() / init_module() ルーティンの役割をします。 エントリ関数はまた、OS がどのドライバ コールバックを呼ぶかを登録します。これらのドライバ コー ルバックは、ドライバからのサービスで、OS の要求です。Windows の場合、これらのコールバックを dispatch routines と呼び、Linux の場合、file operations と呼びます。たとえば、ハードウェアの切断など、 ある規定の結果として、各登録されたコールバックを OS が呼びます。 2.5 ハードウェアとドライバの連結 OS がデバイスをそのドライバにどのようにリンクさせるかは、OS によって異なります。Windows の 場合、INF ファイルによって、そのリンクを行います。INF ファイルが、デバイスをドライバと動作す るように登録します。この連結を DriverEntry() を呼ぶ前に実行します。OS がデバイスを認識し、デバ イスと関連付けている INF ファイル内のデータベースを探し、INF ファイルによって、ドライバのエン トリー ポイントを呼びます。 Linux の場合、デバイスとドライバ間のリンクを init_module() ルーティンで定義します。Init_module() ルーティンは、指定したドライバがどのハードウェア処理する示すコールバックを持っています。コー ドの定義を基にして、OS はドライバのエントリー ポイントを呼びます。 2.6 ドライバとの通信 ドライバはインスタンスを作成できるので、アプリケーションがドライバと通信をできるよに、ア プリケーションでドライバへのハンドルを開くことができます。アプリケーションは、ファイル ア クセス API (Application Program Interface) を使用するドライバと通信します。アプリケーションは、 ファイル名としてデバイスの名前を持った、CreateFile() (Windows の場合) の呼び出し、または open() (Linux の場合) の呼び出しを使用するドライバへのハンドルを開きます。デバイスからの read およ びデバイスへの write を行うために、アプリケーションは ReadFile() および WriteFile() (Windows の 場合) または read() および write() (Linux の場合) を呼びます。送信する要求をDeviceIoControl() (Windows の場合) および ioctl() (Linux の場合) と呼ばれる I/O コントロールの呼び出しを使用して実 現します。この I/O コントロールの呼び出しで、アプリケーションは以下の内容を指定します: 呼び出し (デバイスのハンドルを提供することによって) を作成するデバイス デバイスが実行すべき関数を記述する IOCTL コード 実行される要求のデータを持ったバッファ 35 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド IOCTL コードは、ドライバとリクエスタが共通のタスクとして同意する数です。 ドライバとアプリケーション間で渡されるデータを構造体でカプセル化します。Windows の場合、 この構造体を I/O Request Packet (IRP) と呼び、I/O Manager がカプセル化します。この構造体をデバ イス ドライバへ渡します。デバイス ドライバはそれを編集し、他のデバイス ドライバへ渡す場 合もあります。 36 第 3 章 W I N D R I V E R U S B の 概 要 第3章 WinDriver USB の概要 この章では、USB バスの基本的な特徴や WinDriver USB の特徴およびアーキテクチャを 説明します。 注意: この章の WinDriver USB ツールキットのリファレンスは、USB ホスト ドライバ開発用のスタン ダード WinDriver USB ツールキットと関連しています。 USB デバイス ファームウェア開発用の WinDriver USB Device ツールキットに関する詳細は第 15 章を 参照してください。 3.1 USB の概要 USB (Universal Serial Bus) は、周辺機器をコンピュータに接続することを想定して PC アーキテクチャに 追加された規格です。ユニバーサル シリアル バスは、Intel、Compaq、Microsoft、NEC などの PC 業界、 テレコミュニケーションのリーダーにより 1995 年に開発されました。USB の開発時には、一般的な周 辺機器の安価な接続方法を提供すること、PC の構成を簡単に変更できること、多くの周辺機器を接続 可能なことなどがその目標として掲げられました。 USB インターフェイスは、以上の必要性をすべてクリアしています。ひとつの USB ポートには、最大 で 127 個の周辺デバイスを接続可能です。USB はまた、プラグ アンド プレイやホット スワップをサ ポートしており、USB 1.1 では等時性データ転送や非同期データ転送、倍速データ転送をサポートして います。低速の USB デバイスでは 1.5Mbps (メガビット毎秒)、高速 USB デバイスでは 12Mbps を達成 しています (これもオリジナルのシリアル ポートよりも大幅に速度が向上しています)。デバイスと PC を接続するケーブルの長さは、最長で 5m です。USB はバスに接続された低電力デバイスに対して電 力供給することが可能です (最大 500mA)。以上の利点により、USB は現在様々なマーケットで活用さ れています。 USB2.0 は、USB 1.1 よりも 40 倍高速な 480Mbs (メガビット毎秒) を達成します。USB 2.0 は USB 1.1 と 完全に互換性を保っているため、同じケーブルやコネクタ、ソフトウェアを使用することが可能です。 USB2.0 はより高性能な帯域幅、PC 周辺機器の機能とのコネクションをサポートします。また、同時 進行している周辺機器との互換性を保ちます。 USB2.0 は、対話式ゲーム、広帯域インターネット アクセス、デスクトップおよび Web パブリッシン グ、インターネット サービスおよびインターネット会議など、多くのアプリケーションの使用が可能 となります。 37 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 3.2 WinDriver USB の利点 最大限に簡単に使用できる外部接続方法。 デバイスのドライバを自動的にマッピングし、自動設定を行います。 コンピュータの動作中にデバイスを接続しても周辺機器を再設定します。 データ転送率が Kb/s から Mb/s のデバイスに適しています。 同じケーブルで等時性転送と非同期転送をサポートします。 複数のデバイスの同時処理をサポートします (複数接続可能)。 USB 2.0 デバイス (高速) を公式にサポートしている OS で、USB 2.0 デバイスをサポートしま す。 転送率や短い待ち時間が保証されます (等時性転送は、転送率のほとんどを使用します)。 柔軟性: 幅広い範囲のパケット サイズや、データ レートをサポートします。 強固性: プロトコルにエラー処理機能が組み込まれているため、動的にデバイスを追加した り、取り外したりしてもリアルタイムでデバイスの状況が監視されます。 PC 業界の標準です。 周辺機器とホスト ハードウェアの統合に最適化されています。 実装にかかるコストが小さいため、安価な周辺機器の開発に適しています。 ケーブルやコネクタも安価です。 電源管理や電源供給機能が組み込まれています。 3.3 USB のコンポーネント USB ホスト: USB ホスト コントローラがインストールされていて、クライアント ソフトウェアやデ バイス ドライバが動作する USB ホスト コンピュータです。USB ホスト コントローラは、ホストと USB 機器のインターフェイスです。ホストは、USB 機器の検出や、ホストとデバイスのコントロール、デー タ フローの管理を行います。また、電力を USB 機器に供給するなどの機能もあります。 USB ハブ: USB ホストの 1 つの USB ポートに複数の USB デバイスを接続する際に使用する USB デバ イスです。ホストに搭載されたハブを特にルート ハブと呼びます。これ以外のハブは、外部ハブです。 USB 機能: データの送受信や、バスの情報をコントロールして機能を提供する USB デバイスです。複 合デバイスは、複数の機能を USB バスに提供します。 38 第 3 章 W I N D R I V E R U S B の 概 要 3.4 USB デバイスのデータ フロー USB デバイスの操作を行う際、データはクライアント ソフトウェアとデバイスの間でデータが交換さ れます。このデータは、ホストで動作しているソフトウェアのメモリ バッファとデバイスのエンドポ イント間を動作するパイプを使って転送されます。 エンドポイントは、USB デバイスのユニークな識別が可能なものであり、デバイスとのデータ フロー の始点と終点を識別する目的で使用されます。各 USB デバイスには、論理的、または物理的なエンド ポイントが複数存在します。各エンドポイントの属性には、バス アクセスの周波数、必要な転送率、 エンドポイント番号、エラー処理機構、エンドポイントが送受信可能な最大パケット サイズ、転送タ イプ、転送方向などが存在します。 パイプとは、USB デバイスのエンドポイントとホストのソフトウェアの関連を表す論理的なコンポー ネントです。デバイスとのデータのやり取りは、パイプを通して行われます。パイプには、パイプで 転送されるデータの種類によってストリーム パイプとメッセージ パイプの 2 種類が存在します。割り 込み、バルク、等時性のデータを送信するパイプは、ストリーム パイプです。これに対し、コントロー ル転送タイプはメッセージ パイプでサポートされます。これらの USB 転送タイプは、次に説明します。 エンドポイント メモリ バッファー USB ホスト デバイス データパイプ/ データ転送 図 3.1: USB エンドポイント 3.5 USB データ交換 USB の標準ではホストとデバイスの間で機能的データ交換とコントロール交換の 2 種類のデータ交換 をサポートしています。 機能的データ交換はデバイスからまたはデバイスへのデータの移動に使用されます。バルク 転送、割り込み転送、等時性転送の 3 種類のデータ転送があります。 コントロール交換は最初に接続された際にデバイスを設定するために使用され、デバイス上 の他のパイプのコントロールを含む、その他のデバイス特有の目的にも使用することができ ます。コントロール交換はコントロール パイプ (一般的にはデフォルトで、Pipe 0 です) を経 由して転送されます。コントロール交換は、セットアップ ステージ (セットアップ パケット 39 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド はホストからデバイスに送られます)、オプショナル データ ステージ、およびステータス ス テージから構成されます。 セットアップ パケットの送信によりコントロール転送を実行する方法についての詳細は、第 9 章の「実 行に当たっての問題」を参照してください。 次の図は、両方向のコントロールと 3 つの機能的データ転送パイプおよびエンドポイントを持つ USB デバイスを示しています。 図 3.2: USB パイプ 3.6 USB データ転送タイプ USB デバイス (機能) は、ホストのメモリ バッファとデバイスのエンド ポイントの間をパイプを通して 通信を行います。USB はデバイスとソフトウェアの使用目的にあわせて 4 つの転送タイプを用意して います。エンドポイントの転送タイプは、エンドタイプ ディスクリプタで決定されます。 USB の仕様では、4 種類のデータ転送が定義されています: コントロール転送 (Control Transfer): コントロール転送は、ホストのソフトウェアとデバイスとの間 で主に設定操作、コマンド操作、ステータス操作をサポートするために使用されます。各 USB デバイ スには、設定情報、ステータス情報、コントロール情報にアクセスするために最低 1 つのパイプ (デフォ ルト パイプ) が用意されています。コントロール パイプは双方向のパイプです。コントロール転送は、 非定期的な転送に使用されます。コントロール転送にはまた、頑強なエラー検出、エラー リカバリ、 40 第 3 章 W I N D R I V E R U S B の 概 要 再発信する機能が実装されており、これはドライバと独立してリトライを行います。コントロール転 送は、低速デバイスと高速デバイスの両方で使用されます。 等時性転送 (Isochronous Transfer): マルチメディアのストリームやテレフォニーなど、時間に依存す る情報を扱う転送タイプです。転送は定期的に連続的に行われます。等時性パイプは単方向であり、 エンドポイントは情報の送信か受信のどちらかしかできません。双方向の等時性通信では、各方向ご とに等時性パイプを使用する必要があります。USB の等時性転送は決まった待ち時間の範囲内で USB の転送率を保証します。また、少ないデータが転送される場合を除いてデータ転送レートが守られる ことを保証します。最大で 90% の USB フレームは、定期的な転送 (等時性転送と割り込み転送) に割 り当てられます。設定時に当時性バスに十分なバス タイムがない場合、設定は行われません。この種 類の転送ではデータの正当性よりも時間の方が重要なため、データ転送中にバスでエラーが発生して もリトライは行われません。等時性転送は、高速デバイスでのみ使用されます。 割り込み転送 (Interrupt Transfer): 割り込み転送は、少量のデータを送受信したり、非同期のタイム フ レームで情報をやり取りするデバイスに使用されます。割り込み転送タイプは、最大のサービス ピリ オドと、バスにエラーがあった場合、次のピリオドで転送が再試行されることが保証されています。 割り込みパイプは、等時性パイプと同じ単方向です。バス アクセス タイム ピリオド (高速デバイスは 1-255ms、低速デバイスは 10-255 ms) は、割り込みパイプのエンドポイントで指定されます。ホストと デバイスはエンドポイントに示されたタイム ピリオドに依存するしかないのですが、システムは 1 ms までの短いピリオドを提供できます。 バルク転送 (Bulk Transfer): バルク転送は、非定期的に大きなパケットを通信する転送タイプです。 バルク転送は、一般的に大量の時間に依存しないデータを転送するデバイスでサポートされます。こ の際、使用可能な転送率をすべて使用するため、プリンタやスキャナなどのデバイスに使用されます。 バルク転送は、使用可能なバスを使用するため、データ転送は保証しますが待ち時間は保証しません。 エラー検出機能が組み込まれているので再試行も行われます。他の転送に USB の転送率が使われてい ない場合は、システムはそれをバルク転送に使用します。ストリーム パイプ (等時性、割り込み) と同 じように、バルク パイプは単方向です。バルク転送は、高速デバイスでのみ使用されます。 3.7 USB 設定 USB 機能 (またはデバイスの機能) を操作する前に、デバイスを設定する必要があります。ホストが USB デバイスから設定情報を取得して設定を行います。USB デバイスはディスクリプタで属性をレ ポートします。USB ディスクリプタの詳細は USB の仕様の第 9 章を参照してください (完全な仕様書 は、http://www.usb.org を参照してください)。 USB ディスクリプタは 4 レベルの階層構造として説明できます: デバイス レベル 設定レベル インターフェース レベル (このレベルには代替レベルというサブレベルを使用できます)。 エンドポイント レベル 41 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 各 USB デバイスのデバイス ディスクリプタはひとつしかありません。各デバイスにはひとつ以上の設 定があり、各設定にはひとつ以上のインターフェイスがあり、各インターフェイスにはエンドポイン トが存在します (存在しない場合もあります)。 デバイス レベル: デバイス ディスクリプタには、すべてのデバイス設定のグローバル情報である一般 的な情報が存在します。デバイス ディスクリプタには、デバイス クラス (HID デバイス、ハブ、ロケー タ デバイスなど)、サブクラス、プロトコル コード、ベンダー ID、デバイス ID などの情報が含まれて います。各 USB デバイスには、必ずデバイス ディスクリプタが存在します。 設定レベル: USB デバイスにはひとつ以上の設定ディスクリプタが存在します。各設定ディスクリプ タは、設定のインターフェイスと電源属性を表します (セルフパワー、リモート Wakeup、最大電力消 費値など)。設定は、ひとつずつしか使用できません。ISDN アダプタはひとつの 128Kbps インターフェ イスとふたつの 64Kbps インターフェイスを同じデバイスで設定可能な例になります。 インターフェース レベル: インターフェイスとは関連するエンドポイントの集合であり、デバイスの 特定機能を表します。 各インターフェイスは独立して動作する場合もあります。 インターフェイス ディ スクリプタは、インターフェイスの数、このインターフェイスが使用するエンドポイントの数、イン ターフェイス特有のクラス、サブクラスと、インターフェイスが単独で動作した場合のプロトコルの 値を表します。さらに、インターフェイスには代替設定が可能です。代替設定は、デバイスを設定し た後にエンドポイントやエンドポイントの特徴を変化できます。 エンドポイント レベル: エンドポイント ディスクリプタが一番ロー レベルになります。エンドポイン ト ディスクリプタはホストにこのエンドポイントのデータ転送タイプ、 各エンドポイントの転送率 (特 定のエンドポイントの最大パケット サイズ) を表します。等時性エンドポイントは、この値を使って データ転送に必要なバス時間の予約を行います。他のエンドポイントの属性は、バス アクセスの周波 数、エンドポイントの数、エラー処理の仕組みや、転送の方向を表します。 WinDriver は USB の設定を自動化します。DriverWizard と USB 診断アプリケーションが USB バスをス キャンして、すべての USB デバイスを検出し、各デバイスの設定、インターフェース、エンドポイン トを検出します。開発者はドライバの開発を開始する前に必要な設定を選択できます。WinDriver は、 エンドポイント ディスクリプタに定義されているエンドポイント転送タイプを識別します。WinDriver が作成したドライバには、この段階で取得した設定情報がすべて含まれます。 3.8 WinDriver USB WinDriver USB を使用すると、USB の仕様や OS の内部を把握しなくても、高性能な USB ベースのデ バイスのドライバを簡単に開発できます。WinDriver USB を使用することにより DDK (Microsoft Driver Development Kit) や WDM (Win32 ドライバ モジュール) の知識がなくても USB ドライバの開発が可能 になります。 WinDriver USB で開発したドライバ コードは、Windows 98、Windows Me、Windows 2000 、Windows XP と Windows Server 2003 でバイナリ互換があります。ソース コードは、WinDriver USB がサポートして いるすべてのオペレーティング システム (Linux および Windows CE を含む) でコード互換です。 WinDriver USB がサポートするオペレーティング システムの最新情報に関しては、エクセルソフト社 の Web サイトを参照してください (http://www.xlsoft.com/)。 42 第 3 章 W I N D R I V E R U S B の 概 要 WinDriver USB は、USB の仕様やアーキテクチャをカプセル化して、アプリケーションのロジックの 開発に集中できるように設計されています。WinDriver USB の DriverWizard でハードウェアを検出、設 定、テストなどをコードを記述する前に行えます。DriverWizard は必要な設定、インターフェイス、代 替設定をグラフィカル ユーザー インターフェイスでまず設定可能にします。USB デバイスを検出し、 設定を行ったらテストを行います。パイプに対してパケットの読み書きを行い、ハードウェアのリソー スが正しく動作しているかを確認できます。WinDriver USB は、すべてのベンダーの USB デバイスを サポートするツールキットです。 ハードウェアの診断を終了したら、DriverWizard は C 、Delphi または Visual Basic でデバイス ドライバ のソース コードを自動的に生成します。WinDriver USB には、ハードウェアに対するユーザー モード API を用意して、アプリケーションから呼び出せるようにします。WinDriver USB API は対象の USB デ バイス特有のもので、reset-pipe や reset-device などの USB 特有の操作を行えます。デバイス API に加え て、WinDriver USB は診断プログラムを作成します (コンパイルする必要があります)。このアプリケー ションをドライバの雛型として使用して、開発サイクルを開始してください。WinDriver USB API は Visual Basic および Delphi でも使用可能なので、VB または Delphi を使ってドライバを開発することも 可能です。 DriverWizard は .INF ファイルの生成も自動的に作成します。.INF ファイルは、Windows 98 / Me / 2000 / XP / Server 2003 のプラグ アンド プレイ機能で、新しくインストールされたドライバをロードする際に使 用されるテキスト ファイルです。.INF ファイルには、デバイスに関するすべての必要な情報とインス トールする必要がある ファイルの情報が含まれています。.INF ファイルは、USB や PCI など自分自身 を識別するハードウェアに必要です。場合によっては、対象のデバイスの .INF ファイルがオペレー ティング システムに附属されている可能性がありますが、これ以外の場合は対象のデバイス用に .INF ファイルを作成しなければなりません。WinDriver は、この操作を自動化します。DriverWizard を使っ て .INF ファイルを作成する方法の詳細は、第 5 章の「DriverWizard」を参照してください。.INF ファイ ルのインストール方法は、第 14 章の「ドライバの配布」を参照してください。 WinDriver USB を使用すると、すべての開発をユーザー モード、使い慣れた開発環境、デバッグ ツー ルおよびコンパイラ (MSDEV、Visual C / C++、Borland Delphi、Borland C++、Visual Basic など) を使用し て行えます。 43 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 3.9 WinDriver USB のアーキテクチャ 記述するコンポーネント アプリケーション (Your App.EXE) WinDriver コンポーネント ドライバコード OS コンポーネント High-level API ハードウェア コンポーネント Low-level API ユーザー モード WinDriver API カーネル モード WinDriver カーネル モジュール WinDriver6 USB ドライバ インターフェイス USBD USB ハブドライバ ホスト コントローラ ドライバ インターフェイス OHCI ドライバ UHCI ドライバ ハードウェア ホストコントローラ デバイス ホスト コントロール ドライバ (HCD) ハブ デバイス デバイス 図 3.3: WinDriver USB アーキテクチャ ハードウェアをアクセスするには、アプリケーションが WinDriver USB API に含まれる関数を使用する WinDriver カーネル モジュールを呼び出します。高水準関数は低水準関数を利用します。そして、 WinDriver カーネル モジュールとユーザー モード アプリケーション間の通信を可能にする IOCTL を 使用します。WinDriver カーネル モジュールは、USB デバイスのリソースをネイティブなオペレー ティング システム コールでアクセスします。 44 第 3 章 W I N D R I V E R U S B の 概 要 USB デバイスと USB デバイス ドライバを抽象化するため、2 つのレイヤーがあります。上位のものが USB ドライバ レイヤー (USB ドライバ (USBD) と USB ハブ ドライバ)、下位のものがホスト コントロー ラ ドライバ レイヤー HCD になります。HCD と USBD の境界線は、オペレーティング システムに依存 するため定義されていません。HCD と USBD の両方とも、ソフトウェア インターフェイスであり、オ ペレーティング システムのコンポーネントですが、HCD レイヤーが抽象化すると下位に表されます。 HCD は、ホスト コントローラ ハードウェアの抽象化を行うソフトウェア レイヤーです。また USBD は、USB デバイス自体とホスト ソフトウェアと USB デバイスの機能を抽象化します。 USBD はクライアント (特定のデバイス ドライバなど) と、USB ドライバ インターフェイス (USBDI) を 使ってコミュニケートします。よりロー レベルでは USBD と USB ハブ ドライバが、ホスト コントロー ラ ドライバ インターフェイス (HCDI) を使って HCD とコミュニケートして、ハードウェアのアクセス とデータの転送を行います。 USB ハブ ドライバは、特定のハブに追加したり取り外したデバイスを検知する機能を持っています。 ハブ ドライバがデバイスを追加、または取り外したことを伝える信号を受け取ると、ホスト ソフト ウェアと USBD を追加して、デバイスを検出、設定します。設定を行うソフトウェアは、ハブ ドライ バ、デバイス ドライバなどのソフトウェアに実装します。 WinDriver USB は、以上に説明した設定手順とハードウェア アクセスを抽象化します。WinDriver USB API を使用することにより、説明した手順をマスターすることなく、ハードウェア関連の操作を行う ことが可能です。 3.10 WinDriver USB を使って作成できるドライバ WinDriver USB を使用すると、ほとんどのモノリシック ドライバ (特定の USB デバイスにアクセスす るドライバ) を作成可能です。NDIS ドライバ、SCSI ドライバ、ディスプレイ ドライバ、USB-シリア ル ポート変換ドライバ、USB レイヤード ドライバなどの標準的なドライバを作成する場合は、 KernelDriver USB をご利用ください。 開発時間を短縮したい場合は、KernelDriver USB よりも WinDriver USB を推奨します。 45 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 第4章 WinDriver のインストール この章では、WinDriver のインストール手順や正常にインストールされたかどうかを確認 する方法を紹介します。この章の最後では、アンインストールの方法も記述しています。 4.1 動作環境 4.1.1 Windows 98 / Me x86 プロセッサ C、Visual Basic、または Delphi をサポートする 32 ビット開発環境。 4.1.2 Windows NT / 2000 / XP / Server 2003 x86 プロセッサ C、Visual Basic、または Delphi をサポートする 32 ビット開発環境。 Windows NT: Service Pack 3 以上(Service Pack 6 推奨) 4.1.3 Windows CE An x86 / MIPS / ARM Windows CE 4.x - 5.0 (.Net) ターゲット プラットフォーム Windows NT / 2000 / XP / Server 2003 ホスト開発プラットフォーム Microsoft eMbedded Visual C++ と対応するターゲット SDK または Microsoft Platform Builder とターゲット プラットフォーム用の対応する BSP (Board Support Package) 4.1.4 Linux Linux 2.2、2.4 または 2.6 x86 プロセッサ または PowerPC (Linux 2.4) 46 第 4 章 W I N D R I V E R の イ ン ス ト ー ル GCC コンパイラ - WinDriver のインストールおよび Kernel PlugIn 用 注意: カーネルと同じバージョンの GCC コンパイラをご使用ください。 C (GCC など) をサポートする 32 ビット開発環境 – ユーザー モード用 開発用 PC: glibc2.3.x 4.1.5 Solaris Solaris 8.0 / 9.0 注意: Solaris 8 には、アップデート 3 以降 (http://www.sun.com) をご使用ください。 Sparc プラットフォームの 64 ビットまたは 32 ビット カーネル または Intel x86 プラットフォームの 32 ビット カーネル C (GCC など) をサポートする 32 ビット開発環境 Intel x86 プラットフォームの Solaris 2.6 / 7.0 32 ビットは、WinDriver v5.22 で対応します。 注意: GCC 以外の開発環境を選択した場合、ご使用のコンピュータに libgcc がインストールされて いることをご確認ください。次のサイトからダウンロード可能です http://www.sunfreeware.com 以下のように、libgcc の場所を LD_LIBRARY_PATH へ設定します: LD_LIBRARY_PATH= /usr/local/lib:/usr/local/lib/sparcv9 4.1.6 VxWorks VxWorks 5.4 Windows ホスト開発プラットフォーム Tornado 2.0 IDE ターゲット プラットフォーム: DriverBuilder (VxWorks 用の WinDriver の製品名称です) がサ ポートする CPU / BSP (Board Support Package) の組み合わせのリストと互換性のある BSP を持 つプロセッサが必要です。 下記の URL で最新のリストを参照してください: http://www.xlsoft.com/jp/products/windriver/db-vxworks.html BSP の互換性についての詳細は、Wind River System 社のテクニカル サポートにお問い合わせ ください。 47 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 4.2 WinDriver のインストール WinDriver CD には、各オペレーティング システム用の WinDriver が収録されています。CD のルート ディレクトリには、Windows 98 / Me / NT / 2000 / XP / Server 2003 用の WinDriver が収められており、CD ドライブに CD を 挿入すると自動的にインストールが開始されます。他の WinDriver バージョンは、 サブ ディレクトリ (\Linux、Wince など) に含まれています。 4.2.1 Windows 98 / Me / NT / 2000 / XP / Server 2003 にインストール するには 注意: WinDriver を Windows 98 / Me / NT / 2000 / XP / Server 2003 にインストールするには、システムの管 理者権限のあるユーザーで行う必要があります。 1. WinDriver CD を CD-ROM ドライブに挿入します (WinDriver CD からインストールせず に、ダウンロードした WinDriver をインストールする場合は、ダウンロードした WinDriver ファイル (WDxxx.exe) をダブルクリックして、手順 3 に進んでください)。 2. インストール プログラムが自動的に起動します。自動的に起動しない場合は、 WDxxx.exe (xxx はバージョン番号) ファイルをダブルクリックしてください。[Install WinDriver] ボタンをクリックしてください。 3. 画面に表示されるライセンス同意書をお読みください。[Yes] を選択してライセンスに同 意してください。 4. WinDriver をインストールする場所を選択してください。 5. [Setup Type] ダイアログボックスで、次のいずれかを選択します: Typical – すべての WinDriver モジュールをインストールします (WinDriver ツールキットと特 定チップセット用の API)。 Compact – WinDriver ツールキットだけをインストールします。 Custom – インストールする WinDriver のモジュールを選択します。 6. インストーラがファイルのコピーを完了後、チュートリアルを開始するか選択します。 7. セットアップを完了したら、コンピュータを再起動してください。 登録版ユーザーの場合: 次の手順で、エクセルソフト株式会社から受け取ったライセンス コードを入力して WinDriver を登 録します。 1. [スタート] メニューから、[プログラム] - [WinDriver] - [DriverWizard] の順に選択して、 DriverWizard を起動します。 2. [File] メニューから [Register WinDriver] を選択して、[License Information] ダイアログボッ クスを表示します。 48 第 3. 4 章 W I N D R I V E R の イ ン ス ト ー ル 以前のバージョンのライセンス コードが登録されている場合、[Cancel license registration] ボタンをクリックして、以前のバージョンのライセンス コードを解除します。 4. [Please enter your license string] 入力ボックスにエクセルソフト株式会社から受け取ったラ イセンス コードを入力して、[Activate license] をクリックし、ライセンス コードを登録し ます。 5. 試用期間中に開発したソース コードを有効にするには、次のセクションを参照してくだ さい: • セクション A.1.9「WD_License() 」関数 • セクション A.9.1「WDU_Init() 」関数 エクセルソフト株式会社から受け取ったライセンス コードを使用して上記の関数で登録 することによって、評価版で作成したサンプルを有効にします。 49 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 注意: カーネル上の現在のライセンスをチェックするには、[WinDriver Wizard] を実行して、[File] メ ニューから [Register WinDriver] を選択してください。現在、カーネルに設定されている有効なライセン スが表示されます。 ライセンス コードには、スペースおよびピリオドなども含まれますのでライセンス登録の際には、電 子メールで受け取ったこの文字列を「コピー&貼り付け」し、手入力によるミスを防いでください。 WinDriver をあなたのプログラムで使用するために WinDriver ウィザードを使用しないで、あなたのプログラムから直接 WinDriver カーネルをアクセスす るには、WD_License 関数を使用してライセンスをプログラム内で登録します。 以下の RegisterWinDriver() をソースに組み込み、main() または WinMain() の先頭でコールしてください。 void RegisterWinDriver() { HANDLE hWD; WD_LICENSE lic; hWD = WD_Open(); if (hWD!=INVALID_HANDLE_VALUE) { // 以下の文字列にあなたのライセンスコードを入れてください。 strcpy(lic.cLicense, "12345abcde12345.Company Name"); WD_License(hWD, &lic); WD_Close(hWD); } } 評価版で作成したソース コードを製品版として使用する場合にもこの記述を追加してください。 WinDriver のライセンス取得について WinDriver 正式登録版を使用するには、「ライセンス コード」が必要です。「ライセンス コード」を 取得していないお客様および代理店から購入されたお客様は別紙の『ユーザー登録のお願いとライ センスコードのご案内』に必要事項をご記入の上、エクセルソフト (株) までご返送ください。正式登 録に必要なライセンス コードを発行致します。 注意: 現在、ライセンスコードには、ソフトウェア保護のため開発者の会社名 (必要に応じて部門名/ 開 発者名) が登録されます。このライセンスコードはインストールするマシンの情報をもとに開発元の Jungo 社から発行されますので、ライセンス コード申請時にマシン情報 (DriverWizard の Your registration code) と社名の英語表記もあわせてお知らせください。 連絡先: 〒108 - 0014 東京都港区芝 5 - 1 - 9 ブゼンヤビル 4F エクセルソフト株式会社 50 電話: 03 - 5440 - 7875 E-mail: xlsoftkk@xlsoft.com Fax: 03 - 5440 - 7876 第 4.2.2 4 章 W I N D R I V E R の イ ン ス ト ー ル WinDriver CE のインストール 新規の CE ベース プラットフォームを開発する際に WinDriver をインストールする場合: 次の説明は、Windows CE Platform Builder を使用して WinCE カーネル イメージをビルドするプラット フォーム開発者向けです。 注意: インストール前に Windows CE と デバイス ドライバ の統合について Microsoft のドキュメントを よくお読みください。 1. Microsoft Platform Builder を実行してプラットフォームを開きます。 2. [Build] メニューから [Open Build Release Directory] を選択します。 3. WinDriver CE カーネル ファイル \WinDriver\redist\TARGET_CPU\windrvr6.dll を開発プラットフォーム上の %_FLATRELEASEDIR% サブディレクトリにコピーします。 4. \WinDriver\samples\wince_install\PROJECT_WD.REG ファイルの内容 を %_FLATRELEASEDIR% サブディレクトリの PROJECT.REG ファイルに追加します。 注意: 非 x86 プラットフォームの PCI に限り、コメント文字を削除し、カード特有の情報を 挿入した後、PCI を指定した行を Project_WD.REG から Project.REG へコピーしてください 。 5. \WinDriver\samples\wince_install\PROJECT_WD.BIB ファイルの内容 を %_FLATRELEASEDIR% サブディレクトリの PROJECT.BIB ファイルに追加します。 WinDriver CE カーネル ファイル (WINDRVR6.DLL) を永続的に Windows CE イメージ (NK.BIN) の一部とする場合にのみこのステップが必要です。例えば、フロッピーディス クを使用してターゲット プラットフォームにカーネル ファイルを移す場合などがこれ にあたります。オン デマンドで CESH/PPSH サービスを通して WINDRVR6.DLL をロード する場合、永続カーネルをビルドするまでこのステップを実行する必要はありません。 6. [Build] メニューより [Make Image] を選択し、新たなイメージ名 [NK.BIN] を指定します。 7. 新規カーネルをターゲット プラットフォームにダウンロードして初期化します。 ([Target] メニューより [Download / Initialize] を選択します。あるいはフロッピー ディスク を使用します) 8. ターゲット CE プラットフォームを再起動します。WinDriver CE カーネルが自動的にロー ドされます。 9. サンプル プログラムをコンパイルして起動し、WinDriver CE がロードされ、正常に動作 するのを確認してください。(インストールの確認方法は、セクション 4.4 「インストー ルの確認」を参照してください。) 51 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド Windows CE ベース コンピュータ用のアプリケーションを開発する際に WinDriver を インストールする場合: メモ: この手順は、WinCE カーネルをビルドするのではなく、ドライバのダウンロードのみ行うドラ イバ開発者、または ready-made WinCE プラットフォームに Microsoft eMbedded Visual C++ を使用してビ ルドするドライバ開発者向けです。 1. WinDriver CD を Windows ホスト マシンの CD ドライブにセットします。 2. 自動インストールを終了します。 3. CD の \Wince ディレクトリにある Cd_setup.exe をダブル クリックします。このプロ グラムは、必要な WinDriver のファイルをホスト開発プラットフォームにコピーします。 4. WinDriver CE カーネル ファイル \WinDriver\redist\TARGET_CPU\windrvr6.dll をターゲットの CE コンピュータの \WINDOWS サブディレクトリにコピーします。 5. ターゲット CE コンピュータ上で Windows CE リモート レジストリ エディタ ツール (ceregedt.exe) または Pocket Resistry Editor (pregedt.exe) を使用して WinDriver CE カーネルが適切にロードされるようにレジストリを修正します。 \WinDriver\samples\wince_install\PROJECT_WD.REG ファイルに適切な変更点 が記載されています。 6. ターゲット CE コンピュータを再起動します。WinDriver CE カーネルは自動的にロード します。suspend/resume ではなく、システムの再起動を行ってください (ターゲット CE コンピュータのリセットまたは電源ボタンを使用します) 。 7. サンプル プログラムをコンパイルして起動し、WinDriver CE がロードされ、正常に動作 するのを確認してください。インストールの確認方法は、セクション 4.4 「インストー ルの確認」を参照してください。 4.2.3 Linux に WinDriver をインストールするには インストールするシステムの用意 Linux では、カーネル自身をコンパイルしたのと同じヘッダー ファイルでカーネル モジュールをコン パイルする必要があります。WinDriver は、カーネル モジュール windrvr6.o/.ko をインストールするた め、インストールの際に windrvr6.o/.ko を Linux カーネルのヘッダー ファイルでコンパイルする必要が あります。 そのため、WinDriver for Linux をインストールする前に、Linux ソース コードおよび versions.h ファイル がご使用のマシンにインストールされていることを確認してください: Linux カーネル ソース コードのインストール Linux をインストールする際に [Custom] を選択してインストールしてからソース コードの インストールを選択します。 52 第 4 章 W I N D R I V E R の イ ン ス ト ー ル Linux がコンピュータにインストールされている場合、Linux ソース コードがインストールさ れているか確認します。/usr/src ディレクトリの 'linux' をご確認ください。ソース コードがイン ストールされていない場合、上記で説明したように Linux をソース コードつきで再インス トールするか、次の手順でソースコードをインストールすることができます: 1. スーパー ユーザーでログインします。 2. 次を入力します: rpm -i /<source location>/<Linux distributor>/RPMS/kernel-source-<version number> 例 - RedHat 7.1 の Linux インストール CD-ROM からソース コードをインストー ルするには次を入力します: rpm -i /mnt/cdrom/RedHat/RPMS/kernel-source-2.4.2.-2.i386rpm ヒント: ソース コードの RPM がない場合、次のサイトからダウンロード可能 です: http://rpmfind.net/linux/RPM/ version.h のインストール version.h ファイルは、Linux カーネル ソース コードを最初にコンパイルしたときに作成され ます。version.h がないコンパイルされたカーネルが提供される場合があります。このファイ ルを確認するには /usr/src/linux/include/linux/ を参照します。このファイルがない場合は次の手 順を行います: 1. 'make xconfig' と入力します。 2. 'Save and Exit' を選択して設定情報を保存します。 3. 'make dep' と入力します。 インストールを行う前に、'linux' シンボリック リンクがあることを確認します。ない場合は作成しま す: ln -s <target kernel>/ linux 例えば、Linux 2.4 カーネルの場合、次を入力します: ln -s linux-2.4/ linux インストール 1. WinDriver CD を Linux マシン CD ドライブに挿入するか、またはダウンロードしたファ イルを適当なディレクトリに保存します。 2. インストール を行うディレクトリに移動します。(例 /home/username/) /$ cd /home/username 3. WDxxxLN.tgz ファイルを解凍します (xxx はバージョン番号です): ~$ tar -xvzf /<file location>/WDxxxLN.tgz 例: − CD の場合: ~$ tar xvzf /mnt/cdrom/LINUX/WDxxxLN.tgz 53 W I N D R I V E R − ユ ー ザ ー ズ ガ イ ド ダウンロードファイルの場合: ~$ tar xvzf /home/username/WDxxxLN.tgz 4. WinDriver ディレクトリに移動します。(このディレクトリは tar によって作成されたディ レクトリです) ~$ cd WinDriver/ 5. WinDriver をインストールします。 ~/WinDriver/redist> ./configure 注意: configure スクリプトは、特定の実行中のカーネルを基に makefile を作成します。 -with-kernel-source=<path> フラグを configure スクリプトへ追加して、インストール されたその他のカーネルを基に configure スクリプトを実行することもできます。<path> はカーネル ソース ディレクトリへのフルパスです。デフォルトのカーネル ソース ディレク トリは /usr/src/linux です。 ~/WinDriver/redist> make 'スーパー ユーザー' になります: ~/WinDriver/redist> su ドライバをインストールします: ~/WinDriver/redist> make install 6. シンボリック リンクを作成し、DriverWizard GUI を簡単に起動できるようにし ます ~/WinDriver$ ln -s <WinDriver の絶対パス>/WinDriver/wizard/wdwizard/ usr/bin/wdwizard 7. wdwizard ファイルに read (読み取り) / excute (実行) の権限を設定し、ほかのユーザーがプ ログラムにアクセスできるようにします。 8. ユーザーおよびグループ ID を変更します。必要に応じて read (読み取り) / write (書き込 み) 権限をデバイス ファイル /dev/windrvr に与え、ユーザーにデバイスを介してハード ウェアにアクセスできるようにします。 9. WinDriver を使用して、ハードウェアにアクセスを開始し、ドライバ コードを 生成します。 登録版ユーザーの場合: 次の手順で、エクセルソフト株式会社から受け取ったライセンス コードを入力して WinDriver を登 録します。 1. DriverWizard GUI を起動します。 ~/WinDriver/wizard$ ./wdwizard 54 第 2. 4 章 W I N D R I V E R の イ ン ス ト ー ル [File] メニューから [Register WinDriver] オプションを選択して、[License Information] ダイ アログボックスを表示します。 3. 以前のバージョンのライセンス コードが登録されている場合、[Cancel license registration] ボタンをクリックして、以前のバージョンのライセンス コードを解除します。 4. [Please enter your license string] 入力ボックスにエクセルソフト株式会社から受け取ったラ イセンス コードを入力して、[Activate license] をクリックし、ライセンス コードを登録し ます。 5. 評価版 WinDriver を使用して作成したソースコードを登録するには、セクション A.1.9 の 「WD_License() 関数」 を参照してください。 Linux でハードウェアへのアクセスを制限するには 注意: /dev/windrvr6 は、ユーザー プログラムへの直接的なハードウェア アクセスを与えるため、マル チ ユーザー Linux システムの安定性に影響する可能性があります。DriverWizard へのアクセスおよびデ バイス ファイル /dev/windrvr6 へのアクセスを信頼できるユーザーのみに制限してください。 セキュリティのため、WinDriver インストール スクリプトは、/dev/windrvr6 および DriverWizard 実行 ファイル (wdwizard) への権限の変更を自動的に行いません。 4.2.4 Solaris に WinDriver をインストールするには WinDriver のインストールは、カーネル モジュール windrvr6.o をインストールするため、スーパー ユー ザーまたはルート権限を持つユーザーによってインストールする必要があります。 1. WinDriver CD を Solaris マシンの CD ドライブに挿入するか、 適当なディレクトリ (例 /home/username/) にダウンロードファイルをコピーします。 2. インストレーションを行うディレクトリに移動します: (例 /home/username) /$ cd /home/username 3. WDxxxSLS.tgz ファイルをカレント ディレクトリにコピーします (xxx はバージョン番号 です。例 500): ~$ cp /home/username /WDxxxSLS.tgz ./ 4. ファイルを展開します。 ~$ gunzip -c WDxxxSLS.tgz | tar xvf - 5. WinDriver ディレクトリに移動します。 6. WinDriver for Solaris をインストールします。 インストールの際に、デバイスの Vendor ID と Device ID (16 進数) を定義して、どの PCI カードを対象にするか決定する必要があります。二つの方法があります。 • インストールを実行する前にインストーラ ファイルを編集し、WinDriver をインス トールします。 55 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド (a) install_windrvr を開き編集します。 PCI デバイスが 1 つの場合、既存の DEFAULT_VENDOR_ID および DEFAULT_DEVICE_ID 変数を PCI カードの識別変数へ変更します。 PCI デバイスが複数の場合、PCI デバイスのリストと共に add_drv コマンド を使用します。たとえば、PCI デバイスが 2 つ (ベンダー/デバイス ID が 10b5/401 (PLX 9080) および 10b5/1860 (PLX 9054) である PLX 9080 および PLX 9054) の場合、add_drv コマンドを次のように変更します。 # /usr/sbin/add_drv -v -m "* 0666 root sys" -i "pci10b5,401 pci10b5,1860" windrvr6 (b) WinDriver をインストールします ~/WinDriver# ./install_windrvr • コマンド ラインで以下のコマンドを実行し、一度でデバイスの ID 値を変更し、ド ライバをインストールします。 ~/WinDriver# VENDOR_ID=XXXX DEVICE_ID=XXXX ./install_windrvr 注意: 5.x 以降のバージョンでは、ディレクトリは tar によって自動作成されますが 、5.x 以 前のバージョンの場合、WinDriver ディレクトリは作成されません。したがって、4.33 バー ジョンのような以前のバーションをインストールする場合、まず最初にディレクトリ (例 WinDriver) を作成してからインストレーションを開始する必要があります。(/$ mkdir ~/WinDriver) 7. libgcc パッケージをインストールします (http://www.sunfreeware.com/ よりダウンロー ドすることができます)。 8. 環境変数を追加します。 • SPARC 32 ビット および x86 プラットフォームの場合: LD_LIBRARY_PATH=/usr/local/bin • SPARC 64 ビット プラットフォームの場合: LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/sparcv9 以下の手順はオプションです 9. シンボリック リンクを作成し、DriverWizard GUI を簡単に起動できるようにします。 ~/WinDriver# ln -s TILDE/WinDriver/wizard/wdwizard /usr/bin/wdwizard 10. wdwizard ファイル の read (読み取り) および excute (実行) の権限を変更し、一般ユーザー がプログラムにアクセスできるようにします。 11. ユーザーおよびグループ ID を変更し、さらに必要に応じて read (読み取り) / write (書き込 み) 権限をデバイス ファイル /dev/windrvr6 に与え、ユーザーにデバイスを通じハード ウェアにアクセスできるようにします。 12. WinDriver を使用してハードウェアにアクセスしてドライバ コードを生成できます。 56 第 4 章 W I N D R I V E R の イ ン ス ト ー ル 以下のステップは登録版ユーザー用です 次の手順で、エクセルソフト株式会社から受け取ったライセンス コードを入力して WinDriver を登 録します。 1. DriverWizard GUI を起動します。 ~/WinDriver/wizard$ ./wdwizard 2. [File] メニューから [Register WinDriver] を選択して、[License Information] ダイアログボッ クスを表示します。 3. 以前のバージョンのライセンス コードが登録されている場合、[Cancel license registration] ボタンをクリックして、以前のバージョンのライセンス コードを解除します。 4. [Please enter your license string] 入力ボックスにエクセルソフト株式会社から受け取ったラ イセンス コードを入力して、[Activate license] をクリックし、ライセンス コードを登録し ます。 5. 評価版 WinDriver を使用中に作成したソースコードを登録するには、A.1.9 にある 「WD_License()」を参照してください。 Solaris でハードウェアへのアクセスを制限する 注意: /dev/windrvr6 は、ユーザー プログラムへの直接的なアクセスを与えるため、マルチ ユーザー Solaris システムの安定性に影響する可能性があります。DriverWizard およびデバイス ファイル /dev/windrvr6 へのアクセスを信頼するユーザーのみに制限してください。 セキュリティのため、WinDriver インストレーション スクリプトは、/dev/windrvr6 および DriverWizard 実 行ファイル (wdwizard) への権限の変更を自動的に行いません。 4.2.5 DriverBuilder for VxWorks をインストールするには DriverBuilder for VxWorks のインストレーションを下記に説明します。DriverBuilder 開発環境は、Tornado 2 for Windows (x86 プラットフォーム上) でのみ動作します。DriverBuilder の 5.x 以降のバージョンで作 成されたドライバは、Intel x86 BSP (pc486、pcPentium および pcPentiumPro)、PPC 821/860 with MBX821/860 および PPC 750 (IBM PPC 604) with MCP750上で動作します。最新情報については、次の URL を参照し てください: http://www.xlsoft.com/jp/products/windriver/db-vxworks.html DriverBuilder をインストールするには: 1. DriverBuilder for VxWorks をダウンロードします。 2. DriverBuilder 用に適切なルート ドライブに移動します。 例: \> c:\ 3. ダウンロードしたファイルを解凍します。 57 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 例: \> unzip -d DBxxxVX.zip c:\ (xxx はバージョン番号です。例 500) 注意: この解凍で DriverBuilder というディレクトリが DriverBuilder のインストレーション ファイルがあるディレクトリ内に作成されます。(これは、バージョン 5.00 に追加された機能 です。以前のバージョンをお持ちの方は、DriverBuilder 用にディレクトリを作成する必要が あります: "\> c:\cd_vxworks" に移動し、ファイルをそのディレクトリに解凍します: "\> unzip -d DBxxxVX.zip c:\db_vxworks") 注意: VxWorks の WinDriver サンプルファイルの拡張子は、.out です。例、pci_diag.out. これら のプログラムを起動するには、Windsh を使用しプログラムをロードし xxx_main ルーティン を実行します。例: wddebug.out: wddebug_main pci_diag.out: pci_diag_main ヒント: DriverBuilder は、Jungo WinDriver の製品群です。WinDriver の Windows バージョンを ダウンロードし、WinDriver のグラフィカルな開発環境を使用して、ハードウェアの診断およ び自動コード生成を行うことで開発時間を大幅に短縮することができます。次のステップを 実行してください。 1. DriverBuilder for VxWorks をダウンロードし、インストールします。 2. WinDriver for Windows をダウンロードし、インストールします。 (これは、省略 しないでください。) 3. デスクトップに DriverWizard (C:\WinDriver\wizard\wdwizard.exe) のショートカッ トを作成し、GUI DriverWizard を簡単に起動できるようにします。 4.3 アップグレード版のインストール Windows 版 WinDriver を新しいバージョンにアップグレードするには、Windows 98 / Me / NT / 2000 / XP / Server 2003 に WinDriver をインストールする手順が説明されているセクション 4.2.1 の「Windows 98 / Me / NT / 2000 / XP / Server 2003 にインストールするには」にあるステップを実行します。既存のイン ストールを上書きするか、別のディレクトリにインストールすることができます。 インストール後、DriverWizard を起動し、(ライセンスをお持ちの場合) ライセンス文字列を入力します。 これで WinDriver のアップグレードは終了です。 ソース コードをアップグレードするには、新しいライセンス文字列をパラメータとして WD_License に渡します。詳細は、セクション A.1.9 の「WD_License()」を参照してください。 他のオペレーティング システムでインストールをアップグレードするには、上記と同じ手順で行いま す。インストールの詳細については、各インストール セクションを参照してください。 58 第 4 章 W I N D R I V E R の イ ン ス ト ー ル 4.4 インストールの確認 4.4.1 1. Windows、Linux および Solaris コンピュータの場合 Windows の場合 [スタート] メニューから [プログラム] - [WinDriver] - [DriverWizard] を選 択して DriverWizard を実行するか、またはデスクトップに作成されたショートカットを 使用します。コマンド プロンプトから wdizard.exe を実行して DriverWizard を開始するこ ともできます。 Linux および Solaris では、wizard のサブディレクトリからファイル マネージャを使用し て、ウィザード アプリケーションへアクセスすることができます。 2. 3. または、shell から ウィザード アプリケーションへアクセスすることもできます。 WinDriver のライセンスを確認します(セクション 4.2 の「WinDriver のインストール」を 参照してください)。評価版を使用している場合、ライセンスをインストールする必要は ありません。 4. PCI カードの場合 – PCI バスにカードを挿入します。Driver Wizard が検出するのを確認 します。 5. ISA カードの場合 – ISA バスにカードを挿入します。DriverWizard をカードのリソースに 合わせて設定し、DriverWizard からカードを読み書きできるかどうかを確認してくださ い。 4.4.2 1. Windows CE コンピュータの場合 Windows ホスト マシンの [スタート] メニューから [プログラム] - [WinDriver] [DriverWizard] を選択して、DriverWizard を実行してください。 2. 登録ユーザーの場合、WinDriver ライセンスがインストールされているか確認してくださ い。評価版を使用している場合はライセンスをインストールする必要はありません。 3. Plug-and-Play デバイス (PCI、PCMCIA、または CardBus) の場合、デバイスを適切なバス ス ロットへ挿入し、DriverWizard を検出するかを互角にください。 4. ISA カードの場合、カードを ISA バスに挿入し、DriverWizard をカードのリソースに合わ せて設定し、DriverWizard からカードを読み書きできるかどうかを確認してください。 5. Visual C++ for CE をアクティブにします。 6. WinDriver サンプル (例: \WinDriver\samples\speaker\speaker.dsw) をロードします。 7. Visual C++ WCE 設定ツールバーで、ターゲット プラットフォームを x86em に選択しま す。 8. スピーカー サンプルのコンパイルし、実行をします。Windows ホスト マシンのスピー カーが CE エミュレーション環境でアクティブになるはずです。 59 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 注意: ISAPnP は、Windows CE でサポートされていません。 4.4.3 1. VxWorks の場合 x86 のみ: MMU がベーシック サポートに設定してあるかを確認します ("hardware/memory/MMU/MMU Mode")。 2. DriverBuilder をロード、オブジェクト ファイルをダウンロードします。 (DriverBuilder \redist\eval\intelx86\PENTIUM\windrvr6.o) 3. WindShell から DriverBuilder を初期化します: => drvrInit() function returned (return value = 0) => 4. サンプル ドライバを実行します: WindShell から C:\DriverBuilder \samples\pci_diag\PENTIUM\pci_diag.out をロードします => pci_diag_main() 5. PCI バスをスキャンし、カードを開きアクセスします。 4.5 WinDriver をアンインストールするには 評価版または登録版の WinDriver をアンインストールする必要がある場合は、このセクションを参照し てください。 4.5.1 1. Windows 98 / Me / NT / 2000 / XP および Server 2003 からアン インストールするには 開いている WinDriver アプリケーション (DriverWizard、Debug Monitor およびその他の WinDriver アプリケーション) を閉じます。 2. Kernel PlugIn ドライバを作成した場合には、以下を実行します: • 作成した Kernel PlugIn ドライバをインストールしてる場合、以下を実行して案イン ストールします: wdreg -name <Kernel PlugIn name> uninstall 注意: Kernel PlugIn の名前は、*.sys 拡張子無しで指定してください。 • 3. Kernel PlugIn ドライバを %windir%\system32\drivers ディレクトリから削除します。 windrvr6.sys がインストールされたすべての Windows プラットフォームの場合 (Windows NT 4.0 を除く): • INF ファイルを通じて WinDriver と動作するように登録された Plug-and-Play デバイ ス (USB/PCI/PCMCIA/CardBus) をアンインストールします。 60 第 4 章 W I N D R I V E R の イ ン ス ト ー ル Windows 2000/XP/Server 2003 では、以下のように実行します: wdreg -inf <対象のデバイスの *inf ファイルへのフルパス> uninstall Windows 98/Me では、デバイス マネージャから対象のデバイスを アンインス トール (削除) します。 • %windir%\inf ディレクトリまたは %windir%\inf\other ディレクトリ (Windows 98/Me) に、WinDriver (windrvr6.sys) と動作するように登録した デバイスの *.inf ファイルが 存在しないことをご確認ください。 4. WinDriver のカーネル モジュール (windrvr6.sys) をアンインストールします。 注意: WinDriver のカーネル モジュール (windrvr6.sys) をアンインストールすることは 推 奨いたしません。WinDriver は汎用的なドライバ モジュールなので、 システムで他のデ バイスが使用してる可能性があります。 WinDriver のカーネル モジュールをアンインス トールせずに、 WinDriver の使用を停止するには、このステップをスキップして、 次の ステップに進んでください。 • Windows 98 / Me / 2000 / XP / Server 2003 上で、windrvr6.sys をアンインストールする には、 以下のように実行します: wdreg -inf <windrvr6.inf へのパス> uninstall 注意: このコマンドを実行する際には、windrvr6.sys と windrvr6.inf ファイルが同じ ディレクトリにある必要があります。 Windows NT 4.0 で windrvr6.sys をアンインストールするには、 以下のように実行します: wdreg uninstall • 以下のファイルが存在する場合は、削除します: %windir%\system32\drivers\windrvr6.sys (すべての Windows) %windir%\inf\windrvr6.inf (Windows 2000/XP/Server 2003) %windir%\inf\Jungowindrvr6.inf (Windows 98/Me) 5. このステップは、WinDriver ツールキット全体をインストールしたコンピュータのみ、対 象となります。 • アプリケーションの追加と削除から WinDriver ツールキットをアンインストールし ます: [スタート] – [設定] – [コントロール パネル] – [アプリケーションの追加と削除] • 6. WinDriver インストール ディレクトリを削除します。 WinDriver DLL を削除します。 61 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 注意: このステップを実行することは推奨いたしません。 DLL を削除すると、システム で起動してる他の WinDriver ベースの アプリケーションに影響を与える可能性がありま す。 以下の DLL ファイルが存在する場合、削除します: \system32\wd_utils.dll \system32\wdlib.dll 7. 4.5.2 コンピュータを再起動します。 Linux から WinDriver をアンインストールするには 注意: アンインストール手順を実行するには、root でログインする必要があります。 1. WinDriver のモジュールが他のプログラムに使用されていないか確認します。 モジュールを使用しているプログラムとモジュールのリストを表示します。 /# /sbin/lsmod WinDriver のモジュールを使用しているアプリケーションをすべて閉じます。 WinDriver のモジュールを使用しているモジュールをすべてアンロードします。 /sbin# rmmod 2. WinDriver のモジュールをアンロードします。 /sbin# rmmod windrvr6 3. /dev ディレクトリ以下の古いデバイス ノードを削除します。 /# rm –rf /dev/windrvr6 4. Kernel PlugIn を作成している場合は、同様に削除します。 5. /etc ディレクトリにある .windriver.rc ファイルを削除します。 /# rm -rf /etc/.windriver.rc 6. $HOME にある .windriver.rc ファイルを削除します。 /# rm -rf $HOME/.windriver.rc 7. DriverWizard へのシンボリック リンクを作成した場合、リンクを削除します。 /# rm -f /usr/bin/wdwizard 8. Windriver インストレーション ディレクトリを削除します。 /# rm -rf ~/WinDriver 4.5.3 Solaris から WinDriver をアインストールするには 注意: アンインストール手順を実行するには、root でログインする必要があります。 62 第 1. 4 章 W I N D R I V E R の イ ン ス ト ー ル 他のプログラムで WinDriver もモジュールが使用されていないことを確認してください: • モジュールのリストおよび使用されるプログラムを表示します: /# /sbin/lsmod • WinDriver のモジュールを使用しているアプリケーションを閉じます。 • WinDriver のモジュールを使用しているモジュールをアンロードします: /sbin# rmmod 2. Unload the WinDriver のモジュールをアンロードします: /sbin# rmmod windrvr6 3. /dev directory にある古いデバイス ノードを削除します: /# rm -rf /dev/windrvr6 4. Kernel PlugIn を作成した場合、Kernel PlugIn も削除します。 5. /etc directory から .windriver.rc ファイルを削除します: /# rm -rf /etc/.windriver.rc 6. $HOME から .windriver.rc ファイルを削除します: /# rm -rf $HOME/.windriver.rc 7. DriverWizard へのシンボリック リンクを作成した場合、リンクを削除します: /# rm -f /usr/bin/wdwizard 8. Windriver インストレーション ディレクトリを削除します: /# rm -rf ~/WinDriver 4.5.4 1. DriverBuilder for VxWorks をアインストールするには DriverBuilder のインストール ディレクトリ (例 C:\DriverBuilder) を Windows Explorer を使 用し削除します。 2. デスクトップ上に DriverWizard へのショートカットを作成した場合、ショートカットを 削除します。 63 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 第5章 DriverWizard この章では WinDriver DriverWizard のハードウェア診断およびドライバ コード生成の機 能について説明します。 デバイス ファームウェア開発用の WinDriver USB Device DriverWizard に関する詳細は 第 15 章を参照してください。 注意: CardBus デバイスは WinDriver の PCI API を通して扱われます。そのため、この章の PCI への言及 には CardBus が含まれます。 5.1 DriverWizard の概要 (WinDriver ツールキットに含まれる) DriverWizard は、デバイス ドライバのコードを生成する前にその ハードウェアに実際にアクセスする GUI ベースの診断およびドライバを生成するツールです。メモリ 範囲の読み込み、レジスタのトグル、割り込みの確認などの診断をグラフィック ユーザ インターフェ イスを通して行います。カードおよびデバイスが正しく動作していることを確認すると、DriverWizard は、すべてのハードウェア リソースにアクセス可能な関数を持つドライバ ソース コードの雛形を生成 します。 WinDriver がサポートする USB または PCI チップ セット (PLX 9030、9050、9052、9054、9056、9080、 9656、Marvell gt64、Altera、Xilinx VirtexII、QuickLogic PBC/QuickPCI、AMCC 5933、Cypress EZ-USB ファ ミリ、Texas Instruments TUSB3410、TUSB3210、TUSB2136、TUSB5052 Silicon Laboratories C8051F320) が ベースのカードのドライバを開発する前に、特定の チップセットのサポートについて説明している第 8 章「特定の PCI および USB チップ セット サポート」を参照することを推奨します。 DriverWizard は、ハードウェアを診断および Windows 98 / Me / 2000 / XP / Server 2003 オペレーティング システムで動作するハードウェアの INF ファイルを生成するのに使用することができます (Windows NT では、ハードウェアの INF ファイルを生成しません) 。上記の特定の PCI および USB チップセット [8] の一つをベースとしたカードのコードを生成する際には、DriverWizard を使用しないでください。 DriverWizard は汎用的なコードを生成するので、カードの特定の機能に応じて DriverWizard が生成した コードを修正する必要があります。多くの PCI チップセット用に作成された、(パッケージに添付され ている) ソース コード ライブラリおよびサンプル アプリケーションを使用することを推奨します。 DriverWizard を利用して開発を行うと、次の利点があります: ハードウェアの診断: ハードウェア開発の終了後、ハードウェアを適切なスロット (PCI / CardBus / ISA / ISAPnP / EISA / CompactPCI) に挿入するか、USB デバイスの場合は、USB ポートに挿入しま す。DriverWizard を使ってハードウェアが正しく動作しているかどうか確認します。 64 第 5 章 D R I V E R W I Z A R D コードの生成: ドライバ コードを開発する際に、DriverWizard がドライバ コードの雛形を生成しま す。 DriverWizard が生成するコードには、次のものが含まれます: デバイスのリソースの各要素にアクセスするためのライブラリ関数 (メモリ範囲、I/O 範囲、 レジスタ、割り込み)。 デバイスの診断を行う 32 ビット コンソール アプリケーション。このアプリケーションは DriverWizard が生成したライブラリ関数を利用します。この診断プログラムをデバイス ドラ イバの雛形として使用してください。 開発環境にプロジェクト情報やファイルのすべてを自動的にロードするプロジェクト ワー クスペース / ソリューション。WinDriver Linux、WinDriver Solaris および DriverWizard は、そ れぞれオペレーティング システムにあった makefile を生成します。 5.2 DriverWizard の使い方 次に DriverWizard の使い方を説明します: 1. ハードウェアをコンピュータに接続します: カードの場合、コンピュータの適切なスロットに接続します。USB デバイスの場合、コン ピュータの USB ポートに接続します。 または DriverWizard を使用して、実際のデバイスをインストールすることなく、PCI デバイスの コードを生成するオプションがあります。このオプションを選択すると、DriverWizard は 仮想 PCI デバイスのコードを生成します。 注意: 仮想 PCI デバイス オプションを選択した場合、 デバイスのリソースの定義を行い ます。IO/メモリ範囲を指定すると、ランタイム レジスタ (オフセットは、BARs に関連 しています) をさらに細かく定義することも可能です。また、ランタイム レジスタを通 じて割り込みを認識するコードを生成したい場合、IRQ を指定する必要があります。IRQ ナンバーと IO/メモリ範囲のサイズは無関係です。これらは、物理デバイスをインストー ルしたときに、DriverWizard により自動的に認識されます。 2. ウィザードを実行してデバイスを選択します: (a) [スタート] メニューから [プログラム] - [WinDriver] - [DriverWizard] を選択する か、デスクトップの [DriverWizard] アイコンをダブル クリックします。または /WinDriver/wizard/ ディレクトリから wdwizard ユーティリティを実行 します。 (b) [Choose Your Project] ダイアログ ボックスで [Next] をクリックします。 (c) DriverWizard が検出したデバイスの一覧からデバイスを選択します。PCI の場 合、Plug-and-Play カードを選択します。Plug-and-Play カード以外の場合、ISA を 65 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 選択します。接続していないデバイスのコードを生成する場合、PCI: VIRTUAL DEVICE を選択します。 図 5.1: デバイスの選択 注意: Windows 98 の場合、一覧に対象の USB デバイスがない場合、USB デバイスを再接 続して [新しいハードウェアの検出] ウィザードを表示します。次の手順でデバイスの INF が生成されるまでダイアログ ボックスを開いたままにします。 3. DriverWizard で INF ファイルを作成します。 プラグ アンド プレイ Windows オペレーティング システム (Windows 98、ME、2000、XP または Server 2003) 用のドライバを開発する場合は、対象のデバイスの INF ファイルを インストールする必要があります。このファイルは、windrvr6.sys ドライバと動作するよ うにプラグ アンド プレイ デバイスを登録します。このステップで DriverWizard が生成し たファイルは、Windows 98 / Me / 2000 / XP / Server 2003 を使用しているユーザーに配布す る際に、その PC にインストールする必要があります。 また、生成した INF ファイルは、DriverWizard がデバイスの診断を行う際に使用します (たとえば、PCI / USB デバイス用のドライバがインストールされていない場合で使用し ます)。上記で説明したとおり、これは、WinDriver を使用して、プラグ アンド プレイ シ ステム (Windows 98 / Me / 2000 / XP / Server 2003) でプラグ アンド プレイ デバイス (PCI / PCMCIA / USB) をサポートする場合のみ必要です。INF ファイルの必要性は、セクション 14.4.1 で説明します。 INF ファイルを生成する必要がない場合 (DriverWizard を Linux で使用している場合など) は、以下のステップをスキップしてください。 以下のステップで、DriverWizard で INF ファイルを生成します。 66 第 5 章 D R I V E R W I Z A R D (a) [Select Your Device] 画面で、[Generate .INF file] ボタンまたは [Next] ボタンを押し ます。 (b) DriverWizard は、Vendor ID、Device ID、Device Class、メーカー名およびデバイ ス名を含むデバイスに関する情報を問い合わせます。メーカーおよびデバイス 名、およびデバイスのクラス情報を変更することができます。 図 5.2: DriverWizard INF ファイル情報 (c) マルチ インターフェースの USB デバイスの場合、各インターフェースに対し て別々に INF ファイルを作成するか、すべてまたはマルチ インターフェースに 対して 1 つの INF ファイルを作成するかを選択することができます。 各インターフェースの USB デバイスに対して別々に INF ファイルを作成する場 合、 [Enter Information for INF File] ダイアログで各インターフェースに対する INF ファイルを設定します。 67 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 図 5.3: DriverWizard のマルチ インターフェース デバイスの INF ファイル情報 (特定のインターフェースをそれぞれ設定する場合) マルチ インターフェースに対して 1 つの INF ファイルを作成する場合、[Enter Information for INF File] ダイアログでルート デバイス用の INF ファイルの生成、 または特定のインターフェース用の INF ファイルの生成を選択することができ ます。 68 第 5 章 D R I V E R W I Z A R D 図 5.4: DriverWizard のマルチ インターフェース デバイスの INF ファイル情報 (1 つのインターフェースを設定する場合) (d) [Next] を押して、生成される INF ファイルを保存するディレクトリを選択しま す。DriverWizard は、自動的に INF ファイルを生成します。 Windows 2000 / XP / Server 2003 上では、DriverWizard で [Automatically Install INF file] オプションをオン (USB デバイスでは、このオプションはデフォルトでオン です) にすることによって INF ファイルを自動的に DriverWizard からインス トールできます。Windows 98 / Me 上では、Windows の [新規ハードウェアの追 加ウィザード] または [デバイス ドライバの更新ウィザード] を使用して INF ファイルを手動でインストールする必要があります。セクション 14.4 で説明し ます。Windows 2000 / XP / Server 2003 上で INF ファイルの自動インストールに 失敗した場合、DriverWizard は手動での INF ファイルのインストール方法を表 示します。 (e) INF ファイルのインストールが終了すると、[Select Your Device] 画面の一覧から デバイスを選択して開きます。 4. デバイスの INF ファイルのアンインストールします。 アンインストール オプションを使用して、対象の PnP デバイス (PCI / PCMCIA / USB) の INF ファイルをアンインストールします。INF ファイルをアンインストールすると、そ 69 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド のデバイスは windrvr6.sys と動作するように登録されず、Windows のルート ディレクト リから INF ファイルを削除します。 INF ファイルをアンインストールする必要がない場合、このステップをスキップしてく ださい (a) [Select Your Device] 画面で、[Uninstall .INF file] ボタンをクリックします。 (b) INF ファイルを選択し、削除します。 5. USB デバイスにおける代替設定を選択します。 図 5.5: USB デバイスの設定 リストから、代替設定を選択してください (注意: DriverWizard はサポートするすべてのデバ イスの代替設定を読み込み表示します。設定されている代替設定が一つしかない USB デバイ スの場合、DriverWizard は自動的に検出された代替設定を選択するので、[Select Device Interface] ダイアログは表示されません)。 6. デバイスを診断します。 デバイス ドライバのコードを記述する前に、ハードウェアが正常に動作することを確認 します。DriverWizard を使用してハードウェアを診断します。すべてのアクティビティ は DriverWizard のログに残るので、テスト結果を分析できます。 a. 70 PCI デバイスの I/O、メモリ範囲、レジスタ、割り込みを定義および検証します。 第 5 章 • D R I V E R W I Z A R D DirverWizard は自動的に PnP ハードウェア リソース (I/O 範囲、メモリ範囲、割り 込み) を検出します。レジスタを手動で定義します。 • 非 PnP ハードウェアの場合、ハードウェアのリソースを手動で定義します。 • I/O ポート、メモリ スペース、定義したレジスタへの読み込みと書き込みをします。 注意: [Register Information] ウィンドウの [Auto Read] チェック ボックスがあります。 [Auto Read] チェック ボックスを ON にしたレジスタを Wizard で実行したレジスタ の read (読み込み) / write (書き込み) で実行自動的に読み込みます (Wizard の [Log] ウィンドウに読み込み結果を表示します)。 図 5.6: PCI 診断画面 • ハードウェアの割り込みを ‘Listen’ (確認) します。 注意: メモリ マップされた領域にアクセスする際には、Linux PowerPC は、PCI バ ス (リトル エンディアンを使用) とは対照的に、メモリ ストレージを処理するの にビッグ エンディアンを使用します。リトル / ビッグ エンディアンに関 する詳細情報はセクション [9.6] を参照してください。 b. USB デバイス のパイプを検証します。 DriverWizard は、選択した configuration\interface\alternate setting により検出したパイプを 表示します。データ転送を行う場合は、次の手順にしたがってください: i ii 使用するパイプを選択します。 コントロール パイプ (双方向パイプ) の場合、[Read/Write to Pipe] を選択します。 新しいダイアログ ボックスが表示され、標準 USB 要求 (図 5.7 を参照) を選択ま たはカスタム要求を入力できます。標準 USB 要求を選択すると、セットアップ 71 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パケットの配列を自動的に入力し、オペレーション データを書き込みます。セッ トアップ パケットは 8 バイト長 (リトル エンディアン) にし、USB 設定パラメー タ (bmRequestType、bRequest、wValue、wIndex、wLength) を設定します。 図 5.7: USB 要求一覧 注意: 標準 USB 要求の詳細は、セクション 9.3 「USB コントロール転送」およびセ クション 9.4 「WinDriver でコントロール転送を行う」を参照してください。 iii 入力パイプ (データをデバイスからホストに転送) の場合、[Listen to Pipe] を選択 します。HID 以外のデバイスでこの操作を正しく行うには、まずデバイスがデー タをホストに送るかどうかを確認する必要があります。 データが送信されない場 合、しばらく listening をしたあとに「Transfer Failed」と表示されます。 iv 読み込みを中止する場合は、[Stop Listen to Pipe] をクリックします。 v 出力パイプ (データをホストからデバイスに転送) の場合、[Write to Pipe] を選択 します。新しいダイアログ ボックス (図 5.8 を参照) が表示され、書き込みデータ を入力します。DriverWizard はこの操作の結果を記録します。 72 第 5 章 D R I V E R W I Z A R D 図 5.8: パイプへの書き込み 7. 雛型となるドライバ コードを生成します。 (a) [Build] メニューから [Generate Code] を選択、または [Define and Test Resources for Your Device] ダイアログから [Next] を押します。 図 5.9: コード オプションの生成 (b) [Choose Type of Driver] ダイアログ ボックスで [WinDriver] を選択します。 [KernelDriver] を選択すると、フル カーネル モード ドライバをデザインしたカーネ ル ソース コードを生成します。KernelDriver の詳細は Web サイト (http://www.xlsoft.com/jp/products/windriver/kerneldriver.html) を参照してください (注意: このダイアログ ボックスは、WinDriver と KernelDriver の両方をコンピュータ にインストールしたときのみ表示されます) 。 73 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 図 5.10:ドライバの種類を選択 (c) [Select Code Generation Options] ダイアログボックスが表示されます。生成されるコー ドの言語と各種のオペレーティング システム用の開発環境を選択します。 74 第 5 章 D R I V E R W I Z A R D 図 5.11: コード生成のオプション (d) [Next] を選択して、プラグアンドプレイ イベントおよびパワーマネージメント イ ベントを処理するか選択し、また、 KernelPlugIn コードを生成するか選択します。 図 5.12: 通知イベント 注意: Kernel PlugIn を使用する場合、Kernel PlugIn コードを生成する前に適切な Microsoft DDK をインストールする必要があります。 (e) プロジェクトを保存します。[OK] を押して生成したドライバの開発環境を開きま す。 75 W I N D R I V E R (f) 8. ユ ー ザ ー ズ ガ イ ド USB の場合のみ – DriverWizard を終了します。 生成されたコードをコンパイルし、実行します。 このコードをデバイス ドライバの雛形として使用します。ドライバの特有の機能 を実行する場合には、必要に応じて修正します。 DriverWizard が生成したソース コードは 32 ビット コンパイラでコンパイル可能 で、コードの修正をせずに対応するすべてのプラットフォーム (Windows 98 / NT / Me / 2000 / XP / CE / CE.NET / Server 2003、Linux、Solaris および VxWorks) で動作し ます。 5.3 DriverWizard ノート 5.3.1 リソースの共有 複数のドライバが同じリソースを共有する場合は、そのリソースを「shared」として定義する必要があ ります。リソースを shared として定義するには: 1. リソースを選択します。 2. リソースを右クリックします。 3. メニューから [Share] を選択します。 注意: 新しく定義した割り込みのデフォルトは Shared です。共有しない割り込みとして定義する場合 は、次に説明する手順にしたがってください。 5.3.2 リソースの無効化 カードの診断中にリソースを無効に設定することによって、そのリソースに対するコードを自動生成 しないように設定できます。 リソースを無効化するには: 1. リソースを選択します。 2. リソースを右クリックします。 3. メニューから [Disable] を選択します。 5.3.3 WinDriver API 呼び出しのログ DriverWizard には、API 呼び出しの入力および出力パラメータを含む、すべての WinDriver API 呼び出 しのログを採取するオプションがあります。[Tools] メニューの [Log API calls] オプションを選択する か、DriverWizard のツールバーの [Log API calls] アイコンをクリックしてこのオプションを選択します。 76 第 5 章 5.3.4 D R I V E R W I Z A R D DriverWizard のログ 新しいプロジェクトを開く際に、[Device Resources] ダイアログと一緒に表示されるブランク ウィンド ウに DriverWizard のログが記録されます。ログは、診断中に行ったすべての入出力を記録するため、 あとからデバイスのパフォーマンスを解析できます。あとで参照できるようにログを保存できます。 プロジェクトを保存すると、このログも保存されます。ログはプロジェクトごとに作成されます。 5.3.5 自動コード生成 デバイスの診断が終了したら、デバイスが仕様どおりに動作することを確認したら、ドライバのコー ドを生成します。 コードを生成する [Build] メニューから [Generate Code] を選択します。DriverWizard はドライバのソース コードを生成し、 プロジェクト ファイル (xxx.wdp、xxx はプロジェクト名) と同じディレクトリに作成します。 DriverWizard が生成するディレクトリに [Generate Code] ダイアログ ボックスで選択した開発環境とオ ペレーティング システム用にファイルを保存します。 PCI / PCMCIA / ISA コードを生成する DriverWizard により作成された API 用の型の定義および関数の宣言が含まれた xxxlib.h ファイル、およ び生成されたデバイスを特定した API が適応された xxx_lib.c ソース ファイルがソース コード ディレ クトリに新規に作成されます。 さらに、main() 関数を含む xxx_diag.c ソース ファイルも作成されます。この関数はデバイスと通信す るために DriverWizard で生成された API を利用するサンプル診断アプリケーションを実行します。 DriverWizard が生成するコードには、次のものが含まれます (“xxx” は DriverWizard のプロジェクト名を 表します): カードのリソースにアクセスするためのライブラリ関数 (メモリ範囲、I/O 範囲、レジスタ、 割り込み)。 xxx_lib.c –WinDriver Card (WDC) API [A.1] を利用して、xxx_lib.h の中にあるハードウェア 特有の API の実行します。 xxx_lib.h - xxx_lib.c ソース ファイルで実装される API 用の型の定義および関数の宣言を 含んでいます。DriverWizard によって生成される API を使用するために、このファイルをソー ス ファイルに含める必要があります。 xxx_lib.h で宣言される DriverWizard で生成された API がデバイスと通信するため使用さ れる診断プログラム [xxx_diag.c] 生成された診断コンソール アプリケーションのソース コード。 この診断プログラムをデバイス ドライバの雛形として使用してください。 作成されたすべてのファイルのリストは xxx_files.txt に作成されます。 コードの生成が終了したら Win32 コンパイラを使ってコンパイルしてください。 77 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド main() 関数を変更してドライバに必要な機能を追加できます。 USB コードを生成する ソース コード ディレクトリに xxx_diag.c ソース ファイルが新規に作成されます (xxx は DriverWizard プロジェクトで選択した名前です)。このファイルは、USB デバイスの場所を見つけて通 信を行う WinDriver の USB API の使用方法を示す USB アプリケーション診断を実行します。この診断 には、Plug-and-Play イベント (デバイスの取り付け/取り外しなど) の検出、パイプの読み書き転送の実 行、パイプのリセット、デバイスの動的な代替設定の変更が含まれています。 生成されたアプリケーションは複数の同一 USB デバイスの処理をサポートします。 生成されたコードをコンパイルする Windows 98、Me、NT、2000、XP、CE および Server 2003 (MSDEV 使用) 1. Windows プラットフォームでは、DriverWizard はプロジェクト ファイルを生成します (MSDEV 4、5、6 および 7 (.NET)、Borland C/C++ Builder、Visual Basic および Delphi)。コー ドを生成すると、選択した IDE (統合開発環境) が自動的に起動します。すぐに、生成さ れたコードをコンパイルおよび実行できます。 Visual Basic または Delphi コードの作成 Visual Basic または Delphi のプロジェクトとファイルを生成します。これらは上記の説明した PCI と USB の生成された MSDEV プロジェクトと似ています。 Linux と Solaris の場合 1. DriverWizard は、プロジェクトの makefile を作成します。 2. DriverWizard が生成した makefile を使用してソース コードをコンパイルします。 3. GCC を使用して、コードをビルドします。 他の OS および IDE の場合 1. IDE (統合開発環境) で新規プロジェクトを作成します。 2. DriverWizard で作成したソース ファイルをプロジェクトに追加します。 3. プロジェクトをコンパイルし、実行します。 4. プロジェクトには DriverWizard が生成したカスタム関数が含まれています。これを雛形 として使用して必要な機能を追加してください。 78 第 6 章 ド ラ イ バ の 作 成 第6章 ドライバの作成 この章では、WinDriver を使用した開発サイクルを紹介します。 注意: デバイスが WinDriver が拡張サポートする次のチップセット (PLX 9030、9050、9052、9054、9056、 9080、9656、Marvell gt64、Altera、Xilinx VirtexII、QuickLogic PBC/QuickPCI、AMCC 5933、Cypress EZ-USB ファミリ、Texas Instruments TUSB3410、TUSB3210、TUSB2136、TUSB5052、Silicon Laboratories C8051F320) を使用している場合、まず次の概要を参照してください。次に第 8 章をお読みください。 6.1 WinDriver でデバイス ドライバを開発するには DriverWizard を使ってカードの診断を行います。カードがサポートする IO、メモリ範囲、レ ジスタおよび USB デバイスのパイプを読み書き、PCI 設定レジスタ情報の表示、カードのレ ジスタのおよびレジスタの読み書きの定義、割り込みを聞きます。デバイスが期待通りの動 作をするかどうかを確認します。 DriverWizard を使ってデバイス ドライバの雛形となるコードを C、Delphi または Visual Basic で作成します 。DriverWizard についての詳細は、第 5 章の「DriverWizard」を参照してくださ い。 サポートしているチップセット (PLX 9030、9050、9052、9054、9056、9080、9656、Marvell gt64、 Altera、Xilinx VirtexII、QuickLogic PBC / QuickPCI、AMCC 5933、Cypress EZ-USB ファミリ、 Texas Instruments TUSB3410、TUSB3210、TUSB2136、TUSB5052、Silicon Laboratories C8051F320) を USB チップセットまたは PCI チップセットに使用する場合は、使用するチップの特定の サンプル コードをドライバ コードの雛形として使用することを推奨します。WinDriver がサ ポートする特定の PCI および USB チップセットに関する詳細は、第 8 章の「特定 PCI チップ セット サポート」を参照してください。 32 ビット コンパイラ (MSDEV、Visual C/C++、Borland Delphi、Borland C++、Visual Basic、GCC など) で必要な雛型ドライバをコンパイルします。 Linux および Solaris の場合、GCC を使用してコードをビルドします。 これでユーザー モード ドライバの作成は完了です。作成したドライバのパフォーマンスを向 上させるには、第 10 章の「パフォーマンスの向上」を参照してください。 WinDriver の PCI/ISA/PCMCIA API および USB API に関する詳細は付録 A、DriverWizard を自動に処理 しない方法は第 8 章、転送のコントロールの実装方法については第 9 章を参照してください。 79 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 6.2 DriverWizard を使わずにドライバを記述するには DriverWizard を使用せずに直接ドライバを記述する場合、Windows ホストではなく VxWorks で開発を 行う際には、DriverBuilder では DriverWizard ユーティリティを使用できないので、DriverWizard を使用 せずに直接ドライバを記述します。この場合、以下のステップを進んでください。または、記述する ドライバに最も近いサンプルに修正を加えてください。VxWorks についての詳細は、セクション 4.2.5 「DriverBuilder for VxWorks をインストールするには」および セクション 4.5.4「DriverBuilder for VxWorks をアンインストールするには」を参照してください。 6.2.1 必要な WinDriver ファイルのインクルード PCI / ISA の場合 1. 関連した WinDriver ヘッダー ファイルをプロジェクトにインクルードします (すべての ヘッダー ファイルは /WinDriver/include ディレクトリに保存されています)。 すべての WinDriver プロジェクトには windrvr.h ヘッダー ファイルが必要です。 PCI / ISA の場合 WDC_xxx API [A.2] を使用する場合、wdc_lib.h および wdc_defs. ヘッダー ファイル (これらのファイルはすでに windrvr.h をインクルードしています) をインクルードしま す。 USB の場合 WDU_xxx WinDriver USB API [A.7] を使用する場合、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" 80 第 3. 6 章 ド ラ イ バ の 作 成 コードを /WinDriver/lib/wd_utils.lib ライブラリにリンクするか、または WinDriver/src/ディレクトリから関連した WinDriver ソース ファイルをインクルード します。 (wd_utils.lib ライブラリを使用する際、ドライバと共に /WinDriver/redist/wd_utils.dll を配布する必要があります。詳細は第 14 章を参 照してください)。 4. コードで使用する API を実装する その他の WinDriver ソース ファイルを追加します (例え ば、/WinDriver/samples/shared/ ディレクトリからのファイル)。 6.2.2 コードの作成: PCI/ISA ドライバの場合 このセクションでは、WDC_xxx API [A.2] を使用した際の呼び出し順序を説明します。 1. WDC_DriverOpen() [A.3.2] を呼び出し、WinDriver および WDC ライブラリのハンドルを開 きます。ロードしたドライバとドライバ ソース ファイルのバージョンを比較し、(登録 ユーザー用の) WinDriver ライセンスに登録します。 2. PCI/CardBus/PCMCIA デバイスでは、WDC_PciScanDevices() [A.3.4] / WDC_PcmciaScanDevices() [A.3.5] を呼び出して、PCI/PCMCIA バスをスキャンしデバイス の場所を検出します。 3. PCI/CardBus/PCMCIA デバイスでは、 WDC_PciGetDeviceInfo() [A.3.6] / WDC_PcmciaGetDeviceInfo() [A.3.7] を呼び出して、選択したデバイスのリソース情報を取 得します。 ISA デバイスでは、WD_CARD 内でリソース自身を定義します。 4. デバイスに適切な関数 (WDC_PciDeviceOpen() [A.3.8] / WDC_PcmciaDeviceOpen() [A.3.9] / WDC_IsaDeviceOpen() [A.3.10]) を呼び出し、デバイスのリソース情報の関数を渡します。 これらの関数はハンドルからWDC_xxx API を使用するデバイスと通信するのに使用す るデバイスへ返ります。 5. WDC_xxx API (詳細は付録 A を参照してください) を使用するデバイスと通信します。 割り込みを有効にするには、WDC_IntEnable( ) [A.3.40] を呼び出します。 Plug-and-Play および パワー マネージメント イベント用の通知受け取りを登録するには、 WDC_EventRegister() [A.3.43] を呼び出します。 6. 終了する場合、WDC_IntDisable() [A.3.41] を呼び出し、割り込み処理を無効にします (有 効だった場合)。WDC_EventRegister() [A.3.43] を呼び出し、Plug-and-Play および パワー マ ネージメント イベント処理の登録を取り消します (登録されていた場合)。最後にデバイ スに適切な関数 (WDC_PciDeviceClose() [A.3.11] / WDC_PcmciaDeviceClose() [A.3.12] / WDC_IsaDeviceClose() [A.3.13]) を呼び出し、デバイスのハンドルと閉じます。 7. WDC_DriverClose ( ) [A.3.3] を呼び出し、WinDriver および WDC ライブラリのハンドルを 閉じます。 81 W I N D R I V E R 6.2.3 1. ユ ー ザ ー ズ ガ イ ド コードの作成: USB ドライバの場合 対象の USB デバイスに対し WinDriver を初期化するプログラムの初めに WDU_Init [A.6.1] を呼び、device-attach callback を待機します。各デバイス情報を attach callback で取 得します。 2. attach callback を受信すると、WDU_Transfer [A.6.7] 関数の一つを使用して、データの送受 信ができます。 3. 終了する場合は、WDU_Uninit [A.6.6] を呼んで、デバイスから登録解除を行います。 6.3 Windows CE で開発を行うには Windows CE でドライバの開発を行うには、初めにデバイスを WinDriver で動くように登録する必要が あります。これはWindows (Windows 98、Me、2000、XP、または Server 2003) の Plug-and-Play 用のドラ イバを開発する際にデバイス用の INF ファイルをインストールするのに似ています。INF ファイルに 関する詳細はセクション [14.4] を参照してください。 PCI の場合 次のレジストリの例は、PCI バス ドライバへデバイスを登録する方法を示しています (platform.reg ファイルへ追加することもできます)。 [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\PCI\Template\MyCard] "Class"=dword:04 "SubClass"=dword:01 "ProgIF"=dword:00 "VendorID"=multi_sz:"1234","1234" "DeviceID"=multi_sz:"1111","2222" 詳細は MSDN ライブラリの PCI バス ドライバ レジストリの設定セクションを参照してください。 USB の場合 WinDriver で動作するように USB デバイスを登録するには: • Windows CE システムにデバイスを差し込む前に WDU_Init() [A.9.1] を呼び出します。 または • レジストリに次のように追加します (platform.regファイルへ追加することもできま す) 。 [HKEY_LOCAL_MACHINE\DRIVERS\USB\LoadClients\<ID>\Default\Default\WDR]: "dll"="windrvr6.dll" <ID> は アンダースコア (_) で区切られた vendor ID および product ID で構成されています (例: <MY VENDOR ID>_<MY PRODUCT ID>)。 82 第 6 章 ド ラ イ バ の 作 成 このキーへデバイス特有の情報を入力します。このキーはデバイスを Windows CE Plug-and-Play (USB ドライバ) として登録し、起動時にデバイスを認識します。WDU_Inti() を 呼び出した後、レジストリを参照することができます。その後このキーは存続します。これ によりデバイスは Windows CE で認識されます。デバイスが永続的なレジストリの場合、こ の追加情報は削除するまで残ります。 詳細は MSDN ライブラリの USB ドライバ レジストリの設定セクションを参照してくださ い。 6.4 Visual Basic および Delphi で開発を行うには Visual Basic および Delphi でドライバを開発するには、WinDriver API を使用します。 6.4.1 DriverWizard を使用する DriverWizard を使用して、ハードウェアを診断したり、コーディングを始める前にハードウェアが正常 に動作しているか確認します。DriverWizard の自動ソース コード生成は、C、Delphi および Visual Basic でのみコードを生成します。 C、Delphi または Visual Basic でドライバ コードの生成方法は、第 5 章の「DriverWizard」を参照してく ださい。 6.4.2 サンプル Delphi または Visual Basic で WinDriver API を使用して記述したサンプルが以下にあります。 1. \WinDriver\delphi\samples 2. \WinDriver\vb\samples ドライバ開発の第一歩として、これらのサンプルを使用します。 6.4.3 Kernel PlugIn Kernel PlugIn を生成するのに Delphi および Visual Basic を使用できません。ユーザー モードで Delphi ま たは VB で WinDriver を使用している開発者は、Kernel PlugIn を記述するときは、C を使用する必要が あります。 6.4.4 ドライバを生成するには Visual Basic での開発方法は、DriverWizard の自動コード生成機能を使用する C での開発方法と同じで す。 以下の手順に従ってください。 • DriverWizard を使用して、ハードウェアの診断を行います。 • ハードウェアが正常に動作しているかを確認します。 83 W I N D R I V E R ユ ー ザ ー ズ • ドライバ コードを生成します。 • ドライバをアプリケーションに統合します。 • WinDriver のサンプルを WinDriver API を取得およびドライバ コードの雛型として使用 できます。 84 ガ イ ド 第 7 章 デ バ ッ グ 第7章 デバッグ この章では、ハードウェアにアクセスするアプリケーションをデバッグ方法について説明 します: 7.1 ユーザー モード デバッグ WinDriver はユーザー モードからアクセスされるので、デバッグには標準のデバッグ ソフト ウェアを使用してください。 デバッグ モニタ [6.2] が作動している場合、WinDriver のカーネル モジュールは、WD_Transfer [A.2.11] を使用している場合のメモリ範囲の有効性を確認します。すなわち、メモリからの読 み出し、またはメモリへの書き込みがカードへ定義される範囲内にあるかどうかを確認しま す。 デバッグ処理でメモリとレジスタの値をチェックするには、DriverWizard を使用します。 7.2 Debug Monitor Debug Monitor は、WinDriver カーネル (windrvr6.sys / windrvr6.vxd / windrvr6.dll / windrvr6.o) が処理するす べてのアクティビティを監視する、強力なツールです。このツールを使用して、各コマンドがどのよ うにカーネルに送られて処理されているのかを監視できます。 Debug Monitor には、グラフィック モードとコンソール モードの 2 つがあります。次に各モードでの Debug Monitor の操作方法を説明します。 7.2.1 グラフィック モードで Debug Monitor を使用するには Windows 98、Me、NT、2000、XP、Server 2003、Linux および Solaris で使用できます。Windows 2000/XP/Server 2003 で Windows CE エミュレータ上で動作する Windows CE ドライバ コードも Debug Monitor でデバッ グ可能です。Windows CE をターゲットにしている場合は、コンソール モードの Debug Monitor を使用 してください。 1. Debug Monitor を実行する • DebugMinitor ("wddebug_gui.exe") は、WinDriver \ Util ディレクトリにあります。 • Debug Monitor は、DriverWizard の [Tool] メニューから起動することができます。 85 W I N D R I V E R • ユ ー ザ ー ズ ガ イ ド [スタート] メニューから [プログラム] - [WinDriver] - [Monitor Debug Messages] を選択し て、Debug Monitor を起動できます。 図 7.1: Debug Monitor の起動 2. [View] - [Debug Options] メニューか、[Change Status] ボタンをクリックして、調査するト レース レベルを設定し有効にします。 図 7.2: Trace Options の設定 86 第 7 章 デ バ ッ グ • Status - トレースを [ON] または [OFF] にセットします。 • Section - 監視する WinDriver API の一部を選択します。PCI カードの割り込み処理に問題 がある場合は、[Int] と [PCI] チェック ボックスを選択してください。 USB デバイスのドライバをデバッグする場合は、[USB] ボックスを選択してください。 ヒント: 監視するオプションを選択するときは慎重に行ってください。必要以上にオプション を選択すると、情報が多すぎて、問題を見つけるのが困難になります。 • Level - 定義されたリソースから調査するメッセージ レベルを選択します。 Error を選択すると、トレースは最小限に表示されます。 Trace を選択すると、WinDriver カーネルのすべての操作が表示されます。 • OS カーネル デバッガにデバッグ メッセージを送る場合、"Send WinDriver debug messages to kernel debugger" チェックボックスを選択します。 このオプションは、WinDrinver のカーネル モジュール (WD_DebugAdd()) から受け取った 全てのデバッグ情報を外部のカーネル デバッガへ送れるようにします。アプリケー ションを実行して問題を再現し、外部カーネル デバッガのログでデバッグ情報を参照し ます。Windows ユーザーの場合は、Microsoft の WinDbg ツールを使用することができま す。WinDbg ツールは、Microsoft の Web サイトより Microsoft のドライバ開発キット (DDK) と共に提供されています。(Microsoft デバッグ ツール ページを参照してください)。 3. トレースする部分とレベルを決定したら [OK] をクリックして [Modify Status] ダイアログ ボックスを閉じます。 4. デバッグするプログラムを実行 (ステップ実行など) します。 5. モニタに表示されるエラーや予期しないメッセージを監視してください。 7.2.2 コンソール モード Debug Monitor を使用するには このツールは、サポートしているすべてのオペレーティング システムで利用可能です。 \WinDriver\util> wddebug を適切なスイッチを指定して実行してください。 コンソール モードで Debug Monitor のスイッチの一覧を表示するには、 \> wddebug と入力してください。このコマンドのスイッチの詳細を説明するヘルプ画面が表示されます。 Debug Monitor が記録した情報を表示する場合は、 \> wddebug dump と入力してください。 87 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド Windows CE で Debug Monitor を使用するには Windows CE では Debug Monitor はコンソール モードでのみ有効です。まず Windows CE のターゲット コンピュータ上で Windows CE コマンド ウィンドウ (CMD.EXE) を実行し、このシェル内でプログラム WDDEBUG.EXE を実行します。 VxWorks で Debug Monitor を使用するには VxWorks では、Debug Monitor はコンソール モードでのみ有効です。しかし、Tornado WindShell は特有 のシンタックスを持つため、以下にデバッグ モニタを最初にロードする場所とオプション設定、情報 取得のための実行を示す Tornado II IDE でのサンプル セッションを示します。 -> ld < wddebug.out Loading wddebug.out | value = 10893848 = 0xa63a18 -> wdddebug -> wddebug_main "on", "trace", "all" Debug level (4) TRACE, Debug sections (0xffffffff) ALL , Buffer size 16384 value = 0 = 0x0 -> wddebug_main "dump" WDDEBUG v5.00 Debugging Monitor. Running DriverBuilder V5.00 Jungo (c) 2001 evaluation copy Time: THU JAN 01 01:06:56 2001 OS: VxWorks Press CTRL-BREAK to exit 以下の点に注意してください: Debug Monitor オブジェクト バイナリ モジュールは wddebug.out と呼ばれます。 メイン プログラム エントリ ポイントは wddebug_main と呼ばれます。 引数はダブル クォーティションで囲まれ、コンマにより分けられます。WindShell がこの構文 を必要とします。 88 第 8 章 特 定 P C I お よ び U S B チ ッ プ セ ッ ト サ ポ ー ト 第8章 特定 PCI および USB チップ セット サポート 8.1 概要 前述の章で説明した標準 WinDriver API および DriverWizard のコード生成機能に加えて、WinDriver は 特定のチップ セットに対する拡張サポートを提供しています。 拡張サポートには、 それらのチップセッ ト用に特別に用意されたカスタム API およびサンプル診断コードが含まれます。 現在 WinDriver の拡張サポートは次のチップセット (PLX 9030, 9050, 9052, 9054, 9056, 9080, 9656, Marvell gt64, Altera, Xilinx VirtexII, QuickLogic PBC/QuickPCI, AMCC 5933、Cypress EZ-USB ファミリ、Texas Instruments TUSB3410、TUSB3210、TUSB2136、TUSB5052、Silicon Laboratories C8051F3) で利用できま す。 注意: Cypress EZ-USB FX2LP CY7C68013A および Silicon Laboratories C8051F320 チップセット用 USB デ バイス ファームウェアの開発向けの WinDriver USB Device ツールキットの拡張サポートに関する詳細 は第 15 章を参照してください。 拡張サポートを利用可能なチップセットを使用したデバイス用ドライバを開発する場合は、次の手順 を行って WinDriver のチップセット特有のサポートを使用します。 1. /WinDriver/chip_vendor/chip_name\ ディレクトリにあるデバイス用のサンプル 診断プログラムの場所を見つけます。ほとんどのサンプル診断プログラムの名前はサン プルの目的から来ています (例えば、ファームウェアをダウンロードするサンプルは download_sample です)。ソース コードは特定のチップセットの名前 chip_name/ ディレク トリに保存されています。 プログラムの実行ファイルはターゲットになるオペレーティング システムのサブディ レクトリに保存されてます (例えば、Windows の場合 WIN32/ ディレクトリです)。 2. カスタム診断プログラムを実行してデバイスを診断し、サンプル プログラムによって提 供されるオプションを把握してください。 3. この診断プログラムのソース コードをデバイス ドライバの雛形として使用します。開発 用途に合わせてコードを修正します。コードを修正する場合、特定のチップ用のカスタ ム WinDriver API を利用することができます。このカスタム API は /WinDriver/chip_vendor/lib/ ディレクトリに保存されています。 89 W I N D R I V E R 4. ユ ー ザ ー ズ ガ イ ド 以上の手順で作成したユーザー モード ドライバのパフォーマンスを向上させる必要が ある場合は (割り込み処理等)、WinDriver Kernel PlugIn を説明している第 11 章の「Kernel PlugIn について」を参照してください。ソース コードの一部を WinDriver の Kernel PlugIn に移動して、関数の呼び出しにかかるオーバーヘッドを解消し、最大のパフォーマンス を得ることができます。 90 第 9 章 実 行 に 当 た っ て の 問 題 第9章 実行に当たっての問題 この章ではドライバ開発においての問題を説明します。また DriverWizard が自動的に処 理できない操作を WinDriver を使用して実行する手順を説明します。 WinDriver の特定チップセット [8] 向けの拡張サポートは、DMA 割り込み処理などのハードウェア特 有のタスクを実行すうるカスタム API を含んでいます。そのため、これらのチップセット用ドライバ の開発者は、これらのタスクを実行するコードを実装する必要はありません。 9.1 DMA の実行 このセクションでは、バスマスタとして実行されるデバイスのためのバスマスタ ダイレクト メモリ ア クセス (DMA) を実装する WinDriver の使用方法を説明します。 DMA とは、接続されたデバイスからホストのメモリへ直接データを転送可能な PCI、PCMCIA、およ び CardBus を含んだコンピュータのバス構造によって提供される機能です。CPU はデータ転送に関与 しないため、ホスト側のパフォーマンスの向上につながります。 DMA バッファを次の 2 つの方法で割り当てることができます。 • • Contiguous Buffer (連続バッファ): 連続メモリ ブロックを割り当てます。 Scatter/Gather: 割り当てられたバッファは物理メモリ内では断片的で、連続して割り当て る必要はありません。割り当てられた物理メモリブロックは呼び出し処理の仮想アドレス 空間で連続バッファへマップされています。そのため割り当てられた物理メモリ ブロック へ容易にアクセスすることができます。 デバイスの DMA コントローラのプログラミングはハードウェアにより異なります。通常、ローカル ア ドレス (デバイス上)、ホスト アドレス (PC の物理メモリ アドレス)、および転送カウント (転送するメモリ ブ ロック サイズ) を使用してデバイスをプログラムし、次に転送を開始するレジスタを設定します。 WinDriver は Contiguous Buffer DMA および Scatter/Gather DMA (ハードウェアがサポートしている場合) を実装する API を提供します (WDC_DMAContigBufLock() [A.3.35]、WDC_DMASGBufLock() [A.3.36]、 および WDC_DMABufUnlock() [A.3.37] の詳細を参照してください)。低水準 WD_DMAxxx API はセク ション [A.5.16] - [A.5.17] で説明されていますが、代わりにラッパー WDC_xxx API を使用することを推 奨します。 このセクションでは Scatter/Gather および Contiguous Buffer DMA を実装する WinDriver の使用方法を実 演するサンプル コードを紹介します。 91 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 注意: • このサンプル ルーチンは、割り込みまたはポーリングを使用して DMA の完了を測定する デモです。 • このサンプル ルーチンは DMA バッファを割り当て、DMA 割り込みを有効にします (ポー リングが使用されていない場合)。次にバッファを解放し、各 DMA 転送への割り込みを無 効にします (有効の場合)。しかし、実際の DMA コードを実行する場合、アプリケーション の初めに一度 DMA バッファを割り当てることができ、DMA の割り込みを有効にすること ができます (ポーリングが使用されたいない場合)。次に、同じバッファを使用して DMA 転 送を繰り返し実行し、割り込みを無効にします (有効の場合) 。アプリケーションが DMA を 実行する必要がなくなった場合のみバッファを解放します。 9.1.1 Scatter/Gather DMA DMA 実装のサンプル 次のサンプル ルーチンは WinDriver の WDC API [A.2] を使用して Scatter/Gather DMA バッファを割 り当て、バスマスタ DMA 転送を実行します。 PLX チップセット ([8]) 用の拡張サポートの詳細な例は /WinDriver/plx/lib/plx_lib.c ライブラ リ ファイルおよび /WinDriver/plx/diag_lib/plx_diag_lib.c 診断ライブラリ ファイル (plx_lib.c DMA API を使用) に保存されています。 Marvell gt64 用 Scatter/Gather DMA を実装する WD_DMAxxx API を使用したサンプルは /WinDriver/marvell/gt64/lib/gt64_lib.c ライブラリ ファイルに保存されています。 Scatter/Gather DMA 実装のサンプル BOOL DMARoutine(WDC_DEVICE_HANDLE hDev, DWORD dwDMAChannel, DWORD dwDMABufSize, UINT32 u32LocalAddr, DWORD dwOptions, BOOL fPolling) { PVOID pBuf; WD_DMA *pDma = NULL; BOOL fRet = FALSE; /* Allocate a user-mode buffer for Scatter/Gather DMA */ pBuf = malloc(dwDMABufSize); /* dwDMABufSize = number of bytes to allocate */ if (!pBuf) { printf("Failed allocating a user-mode DMA buffer\n"); return FALSE; } memset(pBuf, 0, dwDMABufSize); /* Allocate a DMA buffer and open DMA for the selected channel */ if (!DMAOpen(hDev, pBuf, u32LocalAddr, dwDMAChannel, dwDMABufSize, &pDma)) { free(pBuf); return FALSE; } 92 第 9 章 実 行 に 当 た っ て の 問 題 /* Enable DMA interrupts (if not polling) */ if (!fPolling) { if (!MyDMAInterruptEnable(hDev, MyDmaIntHandler, pDma)) { printf("Failed enabling DMA interrupts\n"); goto Error; } } /* Flush the data from the CPU caches in order to synchronize these caches with the DMA buffer (see documentation of WDC_DMASyncCpu()) */ WDC_DMASyncCpu(pDma); /* Start DMA - write to the device to initiate the DMA transfer */ if (!MyDMAStart(hDev, pDma)) { printf("Failed initiating DMA\n"); goto Error; } /* Wait for the DMA transfer to complete */ MyDMAIsDone(hDev, pDma); /* Flush the data from the I/O caches and update the CPU caches in order to synchronize the I/O caches with the DMA buffer (see documentation of WDC_DMASyncIo()) */ WDC_DMASyncIo(pDma); fRet = TRUE; Exit: DMAClose(pDma, pBuf, fPolling); return fRet; } /* DMAOpen: Allocates and locks a Scatter/Gather DMA buffer */ BOOL DMAOpen(WDC_DEVICE_HANDLE hDev, PVOID pBuf, UINT32 u32LocalAddr, DWORD dwDMAChannel, DWORD dwDMABufSize, WD_DMA *ppDma) { DWORD dwStatus, dwPageNumber; BOOL fRead = dwOptions & DMA_READ_FROM_DEVICE ? TRUE : FALSE; /* Allocate and lock a Scatter/Gather DMA buffer */ dwStatus = WDC_DMASGBufLock(hDev, pBuf, dwOptions, dwDMABufSize, ppDma); if (WD_STATUS_SUCCESS != dwStatus) { printf("Failed locking a Scatter/Gather DMA buffer. Error 0x%lx - %s\n", dwStatus, Stat2Str(dwStatus)); return FALSE; } /* Program the device's DMA registers for each physical page */ for(dwPageNumber = 0; dwPageNumber < (*ppDma)->dwPages; dwPageNumber++) 93 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド { MyDMAPageProgram(u32LocalAddr, (*ppDma)->Page[dwPageNumber].pPhysicalAddr, (*ppDma)->Page[dwPageNumber].dwBytes, fRead); } return TRUE; } /* DMAClose: Frees a previously allocated Scatter/Gather DMA buffer */ void DMAClose(WD_DMA *pDma, PVOID pBuf, BOOL fPolling) { /* Disable DMA interrupts (if not polling) */ if (!fPolling) MyDMAInterruptDisable(hDev); /* Unlock and free the DMA buffer */ WDC_DMABufUnlock(pDma); /* Free the virtual user-mode DMA buffer */ if (pBuf) free(pBuf); } 実行しなければならないものは: 上記のサンプル コードで、MyDMAxxx() ルーチン以下の実装はデバイスの使用により異なります。 MyDMAPageProgram(): デバイスの DMA レジスタをプログラムします。 デバイスにより Scatter/Gather DMA をサポートするメソッドは異なります。 MyDMAStart(): DMA 転送を開始するデバイスへ書き込みます。 MyDMAInterruptEnable() および MyDMAInterruptDisable(): WDC_IntEnable() [A.3.40] および WDC_IntDisable() [A.3.41] を使用して、ソフトウェアの割り込みを有効/無効に し、物理的にハードウェア DMA 割り込みを有効/無効にするためにデバイスの関連したレジ スタを書き込み/読み取ります。(WinDriver での割り込み処理に関する詳細はセクション [9.2] を参照してください) 。 MyDMAIsDone(): ポーリングを使用して DMA の完了を測定する場合、DMA 転送の完了を 測定するために、この関数をデバイスから連続して読み取るループとして実装します。割り 込みを使用する場合、DMA の完了を測定する割り込みハンドラ ルーチンからの信号を待っ てください。 注意 : WD_xxx API を使用して、1MB より大きい Scatter/Gather DMA バッファを割り当てる場合、FAQ (http://www.jungo.com/support/faq.html#dma1) で説明されている通り、WD_DMALock() [A.5.16] で DMA_LARGE_BUFFER フラグを設定し、追加のメモリ ページ用のメモリを割り当てる必要がありま す。しかし、WDC_DMASGBufLock() [A.3.36] を使用して DMA バッファを割り当てる場合、関数が処 理するため大きいバッファを割り当てる特別な実装は必要ありません。 94 第 9 章 9.1.2 実 行 に 当 た っ て の 問 題 Contiguous Buffer (連続バッファ) DMA 次のサンプル ルーチンは WinDriver の WDC API [A.2] を使用して Contiguous DMA バッファを割り当 て、バスマスタ DMA 転送を実行します。 PLX チップセット ([8]) 用の拡張サポートの詳細な例は /WinDriver/plx/lib/plx_lib.c ライブラ リ ファイルおよび /WinDriver/plx/diag_lib/plx_diag_lib.c 診断ライブラリ ファイル (plx_lib.c DMA API を使用) に保存されています。 AMCC 5933 用 Contiguous Buffer DMA を実装する WD_DMAxxx API を使用したサンプルは /WinDriver/amcc/lib/amcclib.c ライブラリ ファイルに保存されています。 Contiguous Buffer DMA 実装のサンプル BOOL DMARoutine(WDC_DEVICE_HANDLE hDev, DWORD dwDMAChannel, DWORD dwDMABufSize, UINT32 u32LocalAddr, DWORD dwOptions, BOOL fPolling) { PVOID pBuf = NULL; WD_DMA *pDma = NULL; BOOL fRet = FALSE; /* Allocate a DMA buffer and open DMA for the selected channel */ if (!DMAOpen(hDev, &pBuf, u32LocalAddr, dwDMAChannel, dwDMABufSize, &pDma)) { free(pBuf); return FALSE; } /* Enable DMA interrupts (if not polling) */ if (!fPolling) { if (!MyDMAInterruptEnable(hDev, MyDmaIntHandler, pDma)) { printf("Failed enabling DMA interrupts\n"); goto Error; } } /* Flush the data from the CPU caches in order to synchronize these caches with the DMA buffer (see documentation of WDC_DMASyncCpu()) */ WDC_DMASyncCpu(pDma); /* Start DMA - write to the device to initiate the DMA transfer */ if (!MyDMAStart(hDev, pDma)) { printf("Failed initiating DMA\n"); goto Error; } /* Wait for the DMA transfer to complete */ MyDMAIsDone(hDev, pDma); /* Flush the data from the I/O caches and update the CPU caches in order to synchronize the I/O caches with the DMA buffer (see documentation of 95 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド WDC_DMASyncIo()) */ WDC_DMASyncIo(pDma); fRet = TRUE; Exit: DMAClose(pDma, fPolling); return fRet; } /* DMAOpen: Allocates and locks a Contiguous DMA buffer */ BOOL DMAOpen(WDC_DEVICE_HANDLE hDev, PVOID *ppBuf, UINT32 u32LocalAddr, DWORD dwDMAChannel, DWORD dwDMABufSize, WD_DMA *ppDma) { DWORD dwStatus; BOOL fRead = dwOptions & DMA_READ_FROM_DEVICE ? TRUE : FALSE; /* Allocate and lock a Contiguous DMA buffer */ dwStatus = WDC_DMAContigBufLock(hDev, ppBuf, dwOptions, dwDMABufSize, ppDma); if (WD_STATUS_SUCCESS != dwStatus) { printf("Failed locking a Contiguous DMA buffer. Error 0x%lx - %s\n", dwStatus, Stat2Str(dwStatus)); return FALSE; } /* Program the device's DMA registers for the physical DMA page */ MyDMAPageProgram(u32LocalAddr, (*ppDma)->Page[0].pPhysicalAddr, (*ppDma)->Page[0].dwBytes, fRead); return TRUE; } /* DMAClose: Frees a previously allocated Contiguous DMA buffer */ void DMAClose(WD_DMA *pDma, BOOL fPolling) { /* Disable DMA interrupts (if not polling) */ if (!fPolling) MyDMAInterruptDisable(hDev); /* Unlock and free the DMA buffer */ WDC_DMABufUnlock(pDma); } 実行しなければならないものは: 上記のサンプル コードで、MyDMAxxx() ルーチン以下の実装はデバイスの使用により異なります。 • MyDMAPageProgram(): デバイスの DMA レジスタをプログラムします。 • MyDMAStart(): DMA 転送を開始するデバイスへ書き込みます。 • MyDMAInterruptEnable() および MyDMAInterruptDisable(): WDC_IntEnable() [A.3.40] および WDC_IntDisable() [A.3.41] を使用して、ソフトウェアの割り込みを有効/無 96 第 9 章 実 行 に 当 た っ て の 問 題 効にし、物理的にハードウェア DMA 割り込みを有効/無効にするためにデバイスの関連し たレジスタを書き込み/読み取ります。(WinDriver での割り込み処理に関する詳細はセク ション [9.2] を参照してください) 。 • MyDMAIsDone(): ポーリングを使用して DMA の完了を測定する場合、DMA 転送の完了 を測定するために、この関数をデバイスから連続して読み取るループとして実装します。 割り込みを使用する場合、DMA の完了を測定する割り込みハンドラ ルーチンからの信号 を待ってください。 9.1.3 SPARC での DMA の実行 Solaris の SPARC では、DVMA (Direct Virtual Memory Access) をサポートします。DVMA をサポートす るプラットフォームでは、物理アドレスではなく仮想アドレスを持つデバイスを提供することによっ て、転送を実行します。このメモリ アクセスの方法で、提供された仮想アドレスへのデバイス アクセ スを MMU (Memory Management Unit) を使用する適切な物理アドレスへ移します。デバイスは dis-contiguous 物理ページへマップされる連続仮想イメージへ / から転送します。これらのプラット フォームで操作するデバイスは、Scatter/Gather DAM 機能を必要としません。 9.2 割り込み処理 WinDriver はデバイスからの割り込みを処理するタスクを簡素化するために、API、DriverWizard コード 生成、およびサンプルを提供しています。 WinDriver で拡張サポートされるチップ セットを使用したデバイス用のドライバを開発している場合、 割り込み処理を実行する手段として、特定チップ用のカスタム WinDriver 割り込み API を使用すること を推奨します。これらのルーチンはターゲットのハードウェアで実装されます。 その他のチップの場合、DriverWizard を使用してデバイスの割り込みに関する情報 (割り込み要求 (IRQ) 番号、タイプ、共有状態など) を検出/定義し、割り込みが発生した時にカーネルで実行するコマンド を定義します。 次に、 ウィザードで定義した情報を基にデバイスの割り込みを処理する WinDrivir API の 使用方法を実例する割り込みルーチンを含む診断コードの雛形を生成します。 以下のセクションでは PCI、PCMCIA、および ISA 割り込みを処理する WinDriver API の使用方法を説 明します。サンプルおよび DriverWizard で生成された割り込みコードを理解し、オリジナルの割り込 み処理を作成するために、次のセクションをお読みください。 注意 : このセクションでは、ユーザー モード アプリケーションから割り込みを処理する WinDriver の 使用方法を説明します。割り込み処理はパフォーマンス上重大なタスクであるため、カーネルで割り 込みを直接処理することもできます。WinDriver の Kernel PlugIn [11] は、カーネルの割り込みルーチン の実装を許可しています。Kernel PlugIn から割り込みを処理する方法についてはセクション [11.6.5] を 参照してください。 9.2.1 一般的な割り込み処理 WinDriver を使用した割り込み処理は以下の手順で行います。 97 W I N D R I V E R 1. ユ ー ザ ー ズ ガ イ ド デバイス上で割り込みを有効した場合、発生した割り込みを処理するスレッドを作成し ます 2. スレッドは割り込みが発生するのを待つ無限ループを実行します。 3. 割り込みが発生すると、WinDriver はカーネルでユーザーにより設定された転送コマンド (セクション [9.2.2] を参照) を実行し、コントロールがユーザー モードにリターンしたと き、ドライバの割り込み処理ルーチンが呼び出されます。 4. 割り込み処理コードがリターンすると、待ちループが継続します。 デバイスからの割り込みを待つために使用される低水準の WinDriver WD_IntWait() 関数 [A.6.3] は、割 り込みが発生するまでスレッドをスリープ状態にします。割り込みを待つ間は CPU を消費しません。 割り込みが発生すると、割り込みは最初に WinDriver カーネルで処理され、次に WD_IntWait が割り込 み処理スレッドを呼び出し、リターンします。 割り込みスレッドはユーザー モードで実行するので、ファイル操作および GDI 関数を含む任意の Windows API 関数を呼び出せます。 基本的な割り込み処理コードの順序 以下のコードは、エッジ トリガー割り込み用(通常の ISA/EISA カード (セクション [9.2.2] を参照)) の簡 単な割り込み処理のサンプルです。 注意: 以下のコードは WinDriver の低水準の WD_xxx 割り込み関数を使用しています。オリジナルの割 り込み処理を作成した場合、ラッパー WDC 割り込み関数 [9.2.1]、または少なくとも、低水準の割り込 み処理をカプセル化した高水準の windrvr_int_thread.c WinDriver API [9.2.1] を使用することを 推奨します。 WD_INTERRUPT intrp; /* Interrupt information structure */ DWORD DLLCALLCONV wait_interrupt (PVOID pData) { printf("Waiting for interrupt"); for (;;) { WD_IntWait(hWD, &intrp); if (intrp.fStopped) break; /* WD_IntDisable called by parent */ /* Call your interrupt routine here */ printf("Got interrupt %d\n", intrp.dwCounter); } return 0; } void install_interrupt() { BZERO(intrp); /* Set the interrupt handle, returned by WD_CardRegister() */ intrp.hInterrupt = cardReg.Card.Item[0].I.Int.hInterrupt; 98 第 9 章 実 行 に 当 た っ て の 問 題 /* No kernel transfer commands to perform upon interrupt */ intrp.Cmd = NULL; intrp.dwCmds = 0; /* No special interrupt options */ intrp.dwOptions = 0; WD_IntEnable(hWD, &intrp); if (!intrp.fEnableOk) { printf("Failed enabling interrupts\n"); return; } printf("Starting interrupt thread\n"); hThread = CreateThread (0, 0x1000, wait_interrupt, NULL, 0, &thread_id); /* Call your driver's interrupt handler here */ WD_IntDisable (hWD, &intrp); WaitForSingleObject(hThread, INFINITE); } windrvr_int_thread.c を使用した簡単な割り込み処理 WinDriver には、InterruptEnable() 関数 [A.2.15] や InterruptDisable() 関数 [A.2.16] などの割り込み処理を簡 略化した便利な関数があります。\WinDriver\src\windrvr_int_thread.c でこれらの関数を実装します。この 操作方法を理解するには、これらの関数を参照してください。 注意: このセクションで説明した WinDriver InterruptEnable() および InterruptDisable() API は、割り込み処 理を実装するタスクを簡素化する WDC ライブラリの割り込み API [8.2.1] によって使用されます。割り 込み処理コードを作成する場合は、ラッパー割り込み API を使用することを推奨します。 下記の例は、これらの便利なラッパー関数を使用するためにセクション [9.2.1] のコードを再記述して おります。このコードは、サンプル プログラム int_io.c からの抜粋です。このプログラムは、 \WinDriver\samples\int_io ディレクトリ以下にあります。コード全体を参照する場合は、このファイルを 参照してください。 VOID DLLCALLCONV interrupt_handler (PVOID pData) { WD_INTERRUPT *pIntrp = (WD_INTERRUPT *)pData; /* Implement your interrupt handler routine here */ printf("Got interrupt %d\n", pIntrp->dwCounter); } ... int main() { HANDLE hWD; WD_CARD_REGISTER cardReg; WD_INTERRUPT *pIntrp; /* Pointer to interrupt information structure */ HANDLE hThread; ... hWD = WD_Open(); 99 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド BZERO(cardReg); cardReg.Card.dwItems = 1; cardReg.Card.Item[0].item = ITEM_INTERRUPT; cardReg.Card.Item[0].fNotSharable = TRUE; cardReg.Card.Item[0].I.Int.dwInterrupt = MY_IRQ; cardReg.Card.Item[0].I.Int.dwOptions = 0; ... WD_CardRegister(hWD, &cardReg); ... pIntrp = malloc(sizeof(WD_INTERRUPT)); BZERO(*pIntrp); pIntrp->hInterrupt = cardReg.Card.Item[0].I.Int.hInterrupt; printf ("Starting interrupt thread\n"); ... dwStatus = InterruptEnable(&hThread, hWD, pIntrp, interrupt_handler, pIntrp)) /* InterruptEnable() calls WD_IntEnable() and creates an interrupt handler thread */ if (dwStatus) { printf ("failed enabling interrupt Status 0x%x - %s\n", dwStatus, Stat2Str(dwStatus)); } else { printf("Press Enter to uninstall interrupt\n"); fgets(line, sizeof(line), stdin); InterruptDisable(hThread); /* InterruptDisable() calls calls WD_IntDisable() */ } WD_CardUnregister(hWD, &cardReg); free(pIntrp); .... } 上記のコードでは、interrupt_handler() 関数は、割り込みが発生するたびに呼び出される "割り込みハン ドラ" として動作します。割り込み処理の設定のための簡略化したコードで、InterruptEnable() 関数 [A.2.15] を呼び出します。この関数はスレッドを生成し、そのスレッドは interrupt_handler() 関数を呼び 出します。interrupt_handler() 関数へのポインタは InterruptEnable() 関数の 4 番目の引数として渡されま す。割り込みが発生する度に、データ pData は、5 番目の引数で指定され、関数に渡されます。 WDC ライブラリを使用した割り込み処理 WinDriver Card (WDC) ライブラリ [A.2] は、簡素化された割り込み処理関数 (WDC_IntEnable()、 WDC_IntDisable()、および WDC_IntIsEnabled()) を含む便利なラッパー関数を WinDriver PCI/PCMCIA/ISA API へ提供します。これらの関数に関する詳細はセクション [A.3.40] - [A.3.42] を参照してください。 以下のサンプル コードは、上記のセクション [9.2.1] で紹介した例の代わりに簡単な割り込み処理を実 装する WDC 割り込み API を使用方法を示しています。これらの関数を使用する割り込み処理のソー ス コードは WinDriver pci_diag (/WinDriver/samples/pci_diag/)、pcmcia_diag 100 第 9 章 実 行 に 当 た っ て の 問 題 (/WinDriver/samples/pcmcia_diag/)、PLX (/WinDriver/plx/) のサンプル、および DriverWizard で生成された PCI/PCMCIA/ISA コードを参照してください。 VOID DLLCALLCONV interrupt_handler (PVOID pData) { PWDC_DEVICE pDev = (PWDC_DEVICE)pData; /* Implement your interrupt handler routine here */ printf("Got interrupt %d\n", pDev->Int.dwCounter); } ... int main() { DWORD dwStatus; WDC_DEVICE_HANDLE hDev; ... WDC_DriverOpen(WDC_DRV_OPEN_DEFAULT, NULL); ... hDev = WDC_IsaDeviceOpen(...); ... /* Enable interrupts. This sample passes the WDC device handle as the data for the interrupt handler routine */ dwStatus = WDC_IntEnable(hDev, NULL, 0, 0, interrupt_handler, (PVOID)hDev, FALSE); /* WDC_IntEnable() allocates and initializes the required WD_INTERRUPT structure, stores it in the WDC_DEVICE structure, then calls InterruptEnable(), which calls WD_IntEnable() and creates an interrupt handler thread */ if (WD_STATUS_SUCCESS != dwStatus) { printf ("Failed enabling interrupt. Error: 0x%x - %s\n", dwStatus, Stat2Str(dwStatus)); } else { printf("Press Enter to uninstall interrupt\n"); fgets(line, sizeof(line), stdin); WDC_IntDisable(hDev); /* WDC_IntDisable() calls InterruptDisable(), which calls WD_IntDisable() */ } ... WDC_IsaDeviceClose(hDev); ... WDC_DriverClose(); } 101 W I N D R I V E R 9.2.2 ユ ー ザ ー ズ ガ イ ド ISA / EISA および PCI 割り込み 一般に、ISA/EISA 割り込みは、PCI 割り込みがレベル依存であるのに反し、エッジ トリガーされます。 この違いは割り込み処理ルーチンを書く上で、多くの意味があります。 エッジ トリガーされる割り込みは、物理割り込み信号が Low から High になるときに、1 回だけ生成 されます。したがって正確に 1 個の割り込みが生成されます。これによって Windows OS が WinDriver カーネル割り込みハンドラを呼び出し、WD_IntWait() 関数 [A.3.3] で待っているスレッドを解放します。 この割り込みを認識するのに特別の作業は必要ありません。 レベル センシティブ割り込みは、物理割り込み信号が High である限り生成されます。割り込み信号 がカーネルによる割り込み処理の最後に Low にならないときは、Windows OS が WinDriver カーネル割 り込みハンドラを再び呼び出します。このため PC はハングします。この状態が起きるのを防ぐには、 割り込みが WinDriver カーネル割り込みハンドラによって認識される必要があります。 カーネル レベルの転送コマンド (割り込みの認識) 通常、PCI カードの割り込み処理 (レベル センシティブ割り込みハンドラ) は、割り込みレベル (割り込 みの認識) を Low にするためにカーネルで転送コマンドを実行する必要があります。転送コマンドは、 PCI カードのランタイム レジスタへの書き込みを行うので、ハードウェアの割り込みを除去します。 しかし、割り込みを認識するために実行される転送コマンドはハードウェアにより異なります。その ため、WinDriver を使用して、レベル センシティブ割り込み処理を行う場合、割り込みが発生した場合 にカーネルで実行する転送コマンドを事前に設定する必要があります。 (WD_IntWait() [A.6.3] が返る前に) WinDriver カーネル割り込み処理で実行される転送コマンドを渡す には、(WD_Transfer 構造体を使用して定義された) コマンド配列 を用意し、WDC_IntEnable() [A.3.40]、 または低水準な InterruptEnable() 関数 [A.5.22] (どちらも低水準な WD_IntEnable() 関数 [A.6.2] を呼び出し ます) を使用して割り込みを有効にした時、コマンド配列を WinDriver へ渡します。 例えば、割り込みコマンド状態レジスタ (INTCSR) へ「0」を記述することによって割り込みを除去す る場合、このレジスタを IO ポート dwAddr へマップします。この場合、以下のコードを使用して、カー ネルで INTCSR レジスタを初めに読み取る転送コマンドの配列を定義し、値を保存します。次に割り 込みを認識する「0」をこのレジスタへ記述します。読み取り/書き込み転送コマンドは DWORD モー ドで実行されます。 WD_TRANSFER trans[2]; /* Array of WinDriver transfer command structures */ BZERO(trans); /* 1st command: Read a DWORD from the INTCSR I/O port */ trans[0].cmdTrans = RP_DWORD; /* Set address of IO port to read from: */ trans[0].dwPort = dwAddr; /* Assume dwAddr holds the address of INTCSR */ /* 2nd command: Write DWORD to the INTCSR I/O port */ trans[1].cmdTrans = WP_DWORD; /* Set the address of IO port to write to: */ trans[1].dwPort = dwAddr; /* Assume dwAddr holds the address of INTCSR */ /* Set the data to write to the INTCSR IO port: */ 102 第 9 章 実 行 に 当 た っ て の 問 題 trans[1].Data.Dword = 0; 転送コマンドを定義した後、割り込みを有効にすることができます。 以下のコードは、上記で用意した転送コマンドを使用して、割り込みを有効にする WDC ライブラリ [A.2] の使用方法を示します。 /* Enable the interrupts: hDev: WDC_DEVICE_HANDLE received from a previous call to WDC_PciDeviceOpen() INTERRUPT_CMD_COPY: Used to save the read data - see explanation below interrupt_handler: Your user-mode interrupt handler routine pData: The data to pass to the interrupt handler routine */ WDC_IntEnable(hDev, &trans, 2, INTERRUPT_CMD_COPY, interrupt_handler, pData, FALSE); WDC ライブラリを使用していない場合、以下で示すように InterruptEnable() [A.5.21] を使用して割り込 みを有効にすることができます。 WD_INTERRUPT intrp; /* WinDriver interrupt information structure */ BZERO(intrp); /* Set the interrupt handle with the handle returned from a previous call to WD_CardRegister() */ intrp.hInterrupt = cardReg.Card.Item[i].I.Int.hInterrupt; /* Set the number of interrupt transfer commands */ intrp.dwCmds = 2; /* Set the interrupt transfer commands (allocated above) */ intrp.Cmd = trans; /* Set the interrupt options. Use INTERRUPT_CMD_COPY to store read data - see explanation below */ intrp.dwOptions = INTERRUPT_CMD_COPY; /* Enable the interrupts: hThread: Thread handle, which will be updated by the function. This handle should later be passed to InterruptDisable(). hWD: Handle to WinDriver, received from a previous call to WD_Open() intrp: Interrupt information structure (see above) interrupt_handler: Your user-mode interrupt handler routine pData: The data to pass to the interrupt handler routine */ InterruptEnable(&hThread, hWD, &intrp, interrupt_handler, pData); INTERRUPT_CMD_COPY オプションは、ライト コマンドを実行する前に、最初の転送 コマンドで読 まれる値を取り扱うために使用されます。これはレジスタの値を読む必要があるときに有効で、次に それに割り込みレベルを Low にするために書き込みます。割り込み発生時にユーザー モードからこの レジスタを読み取ろうとすると、書き込み転送コマンドがカーネル レベルで実行されているため、レ ジスタはすでに「0」になっています。INTERRUPT_CMD_COPY を使用すると、初めの転送コマンド の読み取り値は trans[0].Data.Dword フィールドでカーネルに記憶されます。この値はユーザー モード割 り込み処理ルーチンから参照することができます。 103 W I N D R I V E R 9.2.3 ユ ー ザ ー ズ ガ イ ド VxWorks での割り込み処理率の向上 WinDriver for VxWorks (別名 DriverBuilder) は、コールバック ルーチンを実装します。ユーザーが設定し ている場合、コールバック ルーチンは、割り込みを受信すると直ぐに実行されます。これによって、 割り込みの検出と処理速度が上がります。Windows 98 / Me / NT / 2000 / XP / Server 2003、Linux および Solaris では、割り込み処理率を向上する Kernel PlugIn を使用できるので、これらのプラットフォーム では、このルーチンは必要ありません。Kernel PlugIn の詳細は、第 11 章の「Kernel PlugIn について」 を参照してください。 windrvr_isr を使用するには: 1. コードに以下の宣言を追加します: int (__cdecl *windrvr_isr)(void); 2. 割り込みの通知を直ぐに実行するように、割り込み処理ルーチンへのポインタを windrvr_isr に設定します。例: int __cdecl my_isr(void) { // Add code here in order to verify that the ISR is called. return TRUE; // If TRUE, continue regular handling of WinDriver; // If FALSE, exit ISR. } extern int (__cdecl *windrvr_isr)(void); // after calling drvrInit() windrvr_isr = my_isr; 9.2.4 Windows CE の割り込み Windows CE は、物理割り込み番号ではなく論理割り込みスキームを使用します。論理割り込みスキー ムは、論理 IRQ 番号に物理 IRQ 番号をマップする内部カーネル テーブルを管理します。Windows CE か らの割り込みを要求する場合、デバイス ドライバは論理割り込み番号の使用を期待します。この場合、 割り込みのマップには以下の 3 つのアプローチがあります: 1. 割り込みマッピング用の Windows CE Plug-and-Play を使用する (PCI バス ドライバ) Windows CE で割り込みマッピングを行うにはこのアプローチを推奨します。PCI バス ド ライバを使用してデバイスを登録します。この方法の後に PCI バス ドライバが IRQ マッ ピングを実行し、WinDriver にこれを使用するように指示します。 PCI バス ドライバを使用してデバイスを登録する例はセクション [6.3] を参照してくだ さい。 2. プラットフォーム割り込みマッピングを使用する (X86 または ARM) 多くの x86 または MIPS プラットフォームでは、予約済みの割り込みを除き、すべての 物理割り込みを以下の簡単なマップを使用して静的にマップします。 logical interrupt = SYSINTR_FIRMWARE + physical interrupt 104 第 9 章 実 行 に 当 た っ て の 問 題 Windows CE Plug-and-Play にデバイスを登録していない場合、WinDriver は次のマッピングを 行います。 3. マップされた割り込み値を指定する 注意: このオプションは、platform builder によってのみ実行できます。 デバイスのマップされた論理割り込み値を提供します。入手できない場合、物理 IRQ を論理 割り込みへ性的にマップします。次に 論理割り込みと INTERRUPT_CE_INT_ID フラグを設定 して WD_CardRegister を呼びます。静的割り込みマップは CFWPC.C ファイル (%_TARGETPLATROOT%\ KERNEL\HAL ディレクトリ) にあります。 静的マップはまた予約済み割り込みマップを使用する場合にも役立ちます。対象のプラット フォームの静的マップは以下のようになります: • IRQ0: タイマー 割り込み • IRQ2: 第 2 PIC 用のカスケード 割り込み • IRQ6: フロッピー コントローラ • IRQ7: LPT1 (PPSH が割り込みを使用しないため) • IRQ9 • IRQ13: 数値コプロセッサ これらの割り込みを初期化、または使用を試みても失敗します。ただし、PPSH を使用せずに、 他の目的でパラレル ポートを再要求する場合には、これらの割り込みの一つを使用できる場 合があります。 この問題を解決するには、単純に以下のようなコードを含む CFWPC.C (%_TARGETPLATROOT%\ KERNEL\HAL ディレクトリ以下にあります) を編集します。割り 込みマップ テーブルの割り込みの値を7に設定します。 SETUP_INTERRUPT_MAP(SYSINTR_FIRMWARE+7,7); IRQ9 を割り当てられた PCI カードの場合、WinCE はデフォルトでは、この割り込みをマップ しないので、カードからの割り込みを受信できません。この場合、IRQ9 に同様のエントリを 挿入する必要があります。 SETUP_INTERRUPT_MAP(SYSINTR_FIRMWARE+9,9); Windows CE で割り込み待ち時間を向上させる レジストリおよびコードを若干変更して PCI デバイス用の Windows CE での割り込み待ち時間を短縮 することができます。 1. Windows CE プラットフォームでドライバを開発する場合、セクション [6.3] で説明した とおり、初めに WinDriver でデバイスが動作するように登録する必要があります。 105 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド レジストリの最後の値を変更します。 "WdIntEnh"=dword:0 から "WdIntEnh"=dword:1 へ変更します。この行を除外したり、値を 0 のままにした場合は、割り込み待ち時間は 短縮されません。 2. プロジェクトの "Preprocessor Definitions" に WD_CE_ENHANCED_INTRを追加し、プロジェ クト全体を再コンパルします。Microsoft eMbedded Visual C++ を使用している場合、 "Preprocessor Definitions" は "Project Settings" の下にあります。 3. InterruptEnable を呼び出した直後に、2 つのパラメータを受け取る CEInterruptEnhance を呼 び出します。 InterruptEnable から割り込みスレッドを受け取る処理 マップされた割り込み値。PCI_GetInterruptItemIndex を呼び出し、返された値からの情報 を取得することでマップされた割り込み値を入手できます。 例: CEInterruptEnhance(hThread, hPci->cardReg.Card.Item [PCI_GetInterruptItemIndex(hPci)].I.Val.dw4); 9.3 USB コントロール転送 9.3.1 USB データ交換 USB 標準はホストとデバイス間で 2 種類のデータ交換をサポートします。 機能データ交換は、デバイスからまたはデバイスへのデータの転送に使用されます。バルク 転送、割り込み転送、等時性 (Isochronous) 転送の 3 種類のデータの転送があります。 コントロール交換は、デバイスを最初に接続したときにデバイスの設定に使用され、デバイ スの他のパイプの制御を含むその他のデバイス特有の目的のためにも使用されます。コント ロール交換は、常駐である主にデフォルトで Pipe 0 のコントロール パイプから生じます。 106 第 9 章 実 行 に 当 た っ て の 問 題 図 9.1: USB データ交換 9.3.2 コントロール転送の詳細 コントロール トランザクションは常にセットアップ ステージから始まります。次に、ゼロまたは要求 された操作の特別な情報を送信するコントロール データ トランザクション (データ ステージ) がそれ に続きます。 最後に、 ステータス トランザクションがホストへステータスを返すことによりコントロー ル転送が完了します。 セットアップ ステージでは、8 バイト セットアップ パケットがデバイスのコントロール エンドポイン トへ情報を伝達するために使用されます。セットアップ パケットのフォーマットは USB の仕様で指定 されています。 コントロール転送はリード トランザクションまたはライト トランザクションです。リード トランザク ションではセットアップ パケットはデバイスからリードされる特性と大量のデータを含んでいます。 ライト トランザクションでは、セットアップ パケットはライト トランザクションに関連するデバイス へ送られた (書かれた) コマンドとコントロール データを含みます。これらはデータ ステージでデバイ スに送られます。 図 9.2 (USB の仕様から引用) は、read (読み取り) および write (書き込み) トランザクションのシーケン スを示しています。'in' はデバイスからホストへデータが流れることを意味し、'out' はホストからデバ イスへデータが流れることを意味します。 107 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 図 9.2: USB のリードとライト 9.3.3 セットアップ パケット セットアップ パケット (コントロール データ ステージおよびステータス ステージを組み合わせたも の) は設定に使用され、デバイスへコマンドを送信します。USB の仕様の第 9 章では、標準デバイス 要 求を定義します。これらの USB 要求は、セットアップ パケットを使用してホストからデバイスへ送信 されます。USB デバイスはこれらの要求に正確に応答する必要があります。また、それぞれのベンダー は、デバイス特有のセットアップ パケットを定義し、デバイス特有の操作を実行することもできます。 標準セットアップ パケット(standard USB device requests) の詳細を次節で説明します。ベンダーのデバイ ス特有セットアップ パケットは、各 USB デバイスに対して、ベンダーのデータ ブックに記されてい ます。 9.3.4 USB セットアップ パケットのフォーマット 次の表は USB セットアップ パケットのフォーマットを示しています。詳細については、 http://www.usb.org の USB の仕様を参照してください。 バイト 0 フィールド 説明 bmRequest Type Bit 7: リクエスト方向 (0=ホストからデバイス - out, 1=デバイスからホ スト - in) Bits 5..6: リクエスト タイプ (0=標準, 1=クラス, 2=ベンダー, 3=reserved) Bits 0..4: 受信側 (0=デバイス, 1=インターフェイス, 2=エンド ポイント,3=その他) 1 108 bRequest 実際のリクエスト (次の表を参照してください) 第 9 章 2 wValueL 実 行 に 当 た っ て の 問 題 リクエストにより異なるワード サイズ値 (例えば、CLEAR_FEATURE リクエストでは値は機能の選択に使用され、GET_DESCRIPTOR リク エストでは、値はディスクリプタ タイプを示し、SET_ADDRESS リク エストでは値はデバイス アドレスを含みます。) 3 wValueH Value ワードの上位バイト 4 wIndexL リクエストにより異なるワード サイズ値。索引は一般的にエンドポ イントまたはインターフェイスを指定するために使用されます。 5 wIndexH Index ワードの上位バイト 6 wLengthL データ ステージがある場合は、転送されるバイト数を示した ワード サ イズ値 7 wLengthH 9.3.5 Length ワードの上位バイト 標準デバイスが要求するコード 以下の表は、標準デバイスが要求するコードを表しています。 BRequest 値 GET_STATUS 0 CLEAR_FEATURE 1 Reserved for future use 2 SET_FEATURE 3 Reserved for future use 4 SET_ADDRESS 5 GET_DESCRIPTOR 6 SET_DESCRIPTOR 7 GET_CONFIGURATION 8 SET_CONFIGURATION 9 GET_INTERFACE 10 SET_INTERFACE 11 SYNCH_FRAME 12 109 W I N D R I V E R 9.3.6 ユ ー ザ ー ズ ガ イ ド セットアップ パケットの例 セットアップ パケットの構成と、その中でのフィールドを図式化した、標準 USB デバイスの一例を挙 げます。セットアップ パケットは Hex 形式です。 次のセットアップ パケットは、USB デバイスから 'Device descriptor' を取り込む 'Control Read' トランザ クションです。'Device descriptor' は USB 標準リビジョン、ベンダー ID、およびプロダクト ID などの情 報を含みます。 GET_DESCRIPTOR (デバイス) セットアップ パケット 80 06 00 01 00 00 12 00 セットアップ パケットの意味: バイト 0 フィールド 値 説明 BmRequest Type 80 8h=1000b bit 7=1 -> データ方向 (デバイスからホスト) 0h=0000b bits 0..1=00 -> 受信側は "デバイス" 1 bRequest 06 2 wValueL 00 3 wValueH 01 リクエストは 'GET_DESCRIPTOR' ディスクリプタ タイプはデバイスです。(値は USB spec で定義されます。) 4 wIndexL (デバイス ディスクリプタが 1 つなのでこのセットアッ 00 プ パケットでは Index は関係ありません。 5 wIndexH 00 6 wLengthL 12 取り込まれるデータの長さ: 18(12h) バイト ('device descriptor' の長さ) 7 wLengthH 00 これに応えて、デバイスは 'Device Descriptor' データを送信します。例えば、これは 'Cypress EZ-USB Integrated Circuit' の 'Device Descriptor' です: バイト番号 0 1 2 3 4 5 6 7 8 9 10 データ 12 01 00 01 Ff ff ff 40 47 05 80 110 第 9 章 バイト番号 11 12 13 14 15 16 17 データ 00 01 00 00 00 00 01 実 行 に 当 た っ て の 問 題 USB の仕様で定義づけられているように、バイト 0 はデスクリプタの長さを示し、バイト 2-3 は USB の 仕様リリース ナンバーを含みます。バイト 7 はエンドポイント 00 に対して最も大きいパケット サイ ズです。バイト 8-9 は ベンダー ID で、バイト 10-11 はプロダクト ID を示します。 9.4 WinDriver でコントロール転送を行う DriverWizard を使用して、対象のデバイスを診断を行う際に、WinDriver で Pipe00 でコントロール転送 を簡単に送受信することができます。対象のハードウェアに対して DriverWizard [5] で生成された API を使用するか、もしくはアプリケーションから直接 WinDriver の WDU_Transfer 関数 [A.6.7] を呼ぶこと ができます。 9.4.1 DriverWizard でのコントロール転送 1. Pipe00 を選択し、[Read/Write to Pipe] をクリックします。 2. カスタム セットアップ パケットを入力するか、もしくは標準 USB 要求を使用します。 カスタム要求の場合: 必要なセットアップ パケット フィールドを入力します。データ ステージ を含む書き込みトランザクションの場合、[Write to pipe data (Hex)] フィールドにデータを入力し ます。必要なトランザクションに応じて、[Read From Pipe] または [Write To Pipe] を選択します (図 9.3 を参照してください)。 図 9.3: カスタム要求 111 W I N D R I V E R • ユ ー ザ ー ズ ガ イ ド 標準 USB 要求の場合: GET_DESCRIPTOR CONFIGURATION、GET_DESCRIPTOR DEVICE 、GET_STATUS DEVICE などの要求一覧から USB 要求を選択します (図 9.4 を 参照してください)。選択するとダイアログ ボックスの右側に各標準 USB 要求の説明 が表示されます。 図 9.4: 要求一覧 3. 標準 USB 要求 GET_DESCRIPTOR DEVICE を使用するデバイスから検出した Device Descriptor データを DriverWizard ログ画面から参照できます (図 9.5 を参照してください)。 112 第 9 章 実 行 に 当 た っ て の 問 題 図 9.5: ログ スクリーン 9.4.2 WinDriver API でのコントロール転送 リードまたはライト トランザクションをコントロール パイプ上で実行する場合、ハードウェアに対し て DriverWizard で生成された API を使用するか、またはアプリケーションで WinDriver WDU_Transfer 関 数 [A.6.7] を直接呼ぶことができます。 BYTE の配列 SetupPacket[8] を、セットアップ パケットで埋めます。そして、これらの関数を呼び、Pipe00 にセットアップ パケットを送信したり、デバイスからコントロール データやステータス データを受信 します。 次のサンプルで setupPacket[8] 値を GET_DESCRIPTOR セットアップ パケットで埋める方法を示しま す。 setupPacket[0] setupPacket[1] setupPacket[2] setupPacket[3] setupPacket[4] setupPacket[5] setupPacket[6] setupPacket[7] • = = = = = = = = 0x80; 0x6; 0; 0x1; 0; 0; 0x12; 0; //BmRequstType //bRequest [0x6 == GET_DESCRIPTOR] //wValue //wValue [Descriptor Type: 0x1 == DEVICE //wIndex //wIndex //wLength [Size for the returned buffer] //wLength ] 次のサンプルでセットアップ パケットをコントロール パイプに送る方法を示します (GET 説明; デバイスは、pBuffer 値で要求された情報を返します)。 WDU_TransferDefaultPipe(hDev, TRUE, 0, pBuffer, dwSize, bytes_transferred, &setupPacket[0], 10000); 113 W I N D R I V E R • ユ ー ザ ー ズ ガ イ ド 次のサンプルでセットアップ パケットをコントロール パイプに送る方法を示します (SET 説明)。 WDU_TransferDefaultPipe(hDev, FALSE, 0, NULL, 0, bytes_transferred, &setupPacket[0], 10000); WDU_TransferDefaultPipe についての詳細は、セクション [A.6.9] を、また、WDU_Transfer についての詳 細は、セクション [A.6.7] を参照してください。 9.5 64 ビット OS のサポート 注意: バージョン 6.02 以降、WinDriver は Solaris 8.0/9.0 64 ビット カーネルをサポートしています。 WinDriver がサポートする Solaris プラットフォームの一覧は、セクション 4.1.5 を参照してください。 • WinDriver for Solaris 64 ビット カーネルは、32 ビットおよび 64 ビット アプリケーションの両方を サポートします。ただし、64 ビット アプリケーションの方がより効果的です。 • 一般的に、DWORD は unsigned long です。32 ビット アプリケーションでは、DWORD は 32 ビッ ト変数で、64 ビット アプリケーションでは、DWORD は 64 ビット変数です。WD_Transfer 構造 体で転送コマンドを使用する場合は例外です。アプリケーションのコンパイルに関係なく、 WD_Transfer 構造体では、DWORD は 32 ビットを表し、QWORD は 64 ビットを表します。 • 64 ビット OS では、64 ビット データ転送を直接実行します。WinDriver の WD_Transfer [A.2.10] を 使用する必要はありません。 9.6 バイト オーダー 9.6.1 エンディアンネスとは メモリ ストレージを処理するには主に 2 つのアーキテクチャがあります。ビッグ エンディアンとリト ル エンディアンと呼ばれ、メモリに格納されるバイトの順番を表します。 • ビッグ エンディアンとは、最下位メモリ アドレスにマルチ バイト データ フィールドの最上 位バイトから順番に格納します。 これは、0x1234 のような 16 進文字列を (0x12 0x34) としてメモリに格納します。ビッグ エンド または上位エンドを初めに格納します。4 バイトの値について次のことが同じように当てはま ります。例えば、0x12345678 は、(0x12 0x34 0x56 0x78) と順番に格納されます。 • リトル エンディアンとは、最下位メモリ アドレスにマルチ バイト データ フィールドの最下 位バイトから順番に格納します。 これは、0x1234 のような 16 進文字列を (0x34 0x12) としてメモリに格納します。リトル エンド または下位エンドを初めに保存します。4 バイトの値について次のことが同じように当てはま ります。例えば、0x12345678 は、(0x78 0x56 0x34 0x12) と順番に格納されます。 すべてのプロセッサはビッグ エンディアンまたはリトル エンディアンのいずれかでデザインされて います。Intel x86 系プロセッサはリトル エンディアンを採用しています。Sun SPARC、Motorola 68K お よび PowerPC ファミリはすべてビッグ エンディアンを採用しています。 114 第 9 章 実 行 に 当 た っ て の 問 題 エンディアンネスの違いによって、コンピュータが異なるフォーマットで記述されたバイナリ データ を共有メモリまたはファイルから読み込む場合に、問題が発生する場合があります。 ビッグ エンディアンとリトル エンディアンの名前の由来は、小説「ガリバー旅行記」(Jonathan Swift 1726) の小人国の話から来ており、ゆで卵を小さい方から割るか、大きい方から割るかの対立を描いて います。 9.6.2 WinDriver のバイト オーダー マクロ x86 アーキテクチャに対応するようにリトル エンディアンとして PCI バスをデザインしています。PCI バスと SPARC、PowerPC のアーキテクチャ間のバイト オーダーの違いから問題が生じないように、 WinDriver には、リトル エンディアンとビッグ エンディアン間でデータを変換するマクロ定義が含ま れています。 WinDriver を使用してドライバを開発した場合、これらのマクロ定義によって、クロス プラットフォー ム間で互換性が有効になります。これらのマクロを使用することによって、安全に x86 アーキテクチャ にドライバを配布できます。 以下のセクションでは、そのマクロの説明と使用方法を紹介します。 9.6.3 PCI ターゲット アクセスのマクロ PCI デバイスのメモリ マップされた領域を使用する PCI カードから読み込みまたは PCI カードへ書き 込みを行う際に、エンディアンネスを変換するために PCI ターゲット アクセスの WinDriver のマクロ を使用します。 注意: これらのマクロ定義は Linux PowerPC アーキテクチャに当てはまります。 • dtoh16 - WORD (device to host) 変換用のマクロ定義 • dtoh32 - DWORD (device to host) 変換用のマクロ定義 • dtoh64 - QWORD (device to host) 変換用のマクロ定義 以下の場合に WinDriver のマクロ定義を使用します: 1. メモリ マップされた領域を使用してカードへ直接書き込みアクセスをする場合、デバイスへ書 き込むデータにマクロを適応する場合。 例えば: DWORD data = VALUE; *mapped_address = dtoh32(data); 2. メモリ マップされた領域を使用してカードから直接読み込みアクセスをする場合、デバイスか ら読み込むデータにマクロを適応する場合。 例えば: WORD data = dtoh16(*mapped_address); 115 W I N D R I V E R 3. ユ ー ザ ー ズ ガ イ ド メモリ マップされた領域へデータ転送する場合のみ、WD_Transfer [A.2.11] を使用してカード にアクセスをする際にデータにマクロを適応する場合。 書き込みの場合: WD_TRANSFER Trans; DWORD write_data = 0x12345678; BZERO(Trans); Trans.cmdTrans = WM_DWORD; //Write memory DWORD Trans.Data.Dword = dtoh32(write_data); // More transfer initialization WD_Transfer(hWD, Trans); 読み込みの場合: WD_TRANSFER Trans; WORD read_data; BZERO(Trans); Trans.cmdTrans = RM_WORD; //Read Port WORD // More transfer initialization WD_Transfer(hWD, Trans); read_data = dtoh16(Trans.Data.Word); 注意: I/O 領域へ WD_Transfer 呼び出しを発行する場合、データを変換する必要はありません。 9.6.4 PCI マスター アクセスのマクロ PCI マスタ デバイスがアクセスするホスト メモリ内のデータのエンディアンネスを変換するために PCI マスタ アクセスの WinDriver のマクロを使用します。つまり、ホストではなくデバイスからアクセ スする場合。 注意: これらのマクロの定義は Linux PowerPC と SPARC アーキテクチャの両方に当てはまります。 • htod16 - WORD (host to device) 変換用のマクロの定義 • htod32 - DWORD (host to device) 変換用のマクロ定義 • htod64 - QWORD (host to device) 変換用のマクロ定義 以下の場合に WinDriver のマクロ定義を使用します: カードで読み込み / 書き込みを行われるホスト メモリ上で準備したデータにマクロを適応する場 合。そのような場合の例は、scatter/gather DMA 用の一連のディスクリプタです。 以下の例は、WinDriver\plx\9054 以下の PLX9054 の WinDriver のサンプルです: //setting chain of dma pages in the memory for (dwPageNumber=0, dwMemoryCopied=0; dwPageNumber<hDma->dma.dwPages; dwPageNumber++) { pList[dwPageNumber].dwPADR = htod32((UINT32)hDma->dma.Page[dwPageNumber].pPhysicalAddr); pList[dwPageNumber].dwLADR = htod32((dwLocalAddr + (fAutoinc ? dwMemoryCopied : 0))); pList[dwPageNumber].dwSIZ = htod32((UINT32)hDma->dma.Page[dwPageNumber].dwBytes); pList[dwPageNumber].dwDPR = htod32((dwStartOfChain + sizeof(DMA_LIST)*(dwPageNumber+1)) 116 第 9 章 実 行 に 当 た っ て の 問 題 | BIT0 | (fIsRead ? BIT3 : 0)); dwMemoryCopied += hDma->dma.Page[dwPageNumber].dwBytes; } pList[dwPageNumber - 1].dwDPR |= htod32(BIT1); //end of chain 117 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 第 10 章 パフォーマンスの向上 10.1 概要 ユーザー モード ドライバの開発を終了した時点で、コード内のモジュールが必要なパフォーマンスを 発揮していないことに気づいたとします (例えば、割り込み処理や I/O マップされた領域へのアクセス など)。この場合、以下のいずれかの方法を使ってパフォーマンスを向上させることが可能です。 ユーザー モード ドライバのパフォーマンスを向上させる。 パフォーマンスを向上させる必要があるコードを WinDriver の Kernel PlugIn に移動させる。 注意: Windows CE および VxWorks にはカーネル モードとユーザー モードの区別がないため Kernel PlugIn を実行できませんが、Kernel PlugIn を使用しなくても最高のパフォーマンスに向上できます。 VxWorks で割り込み処理率を向上するには、セクション [8.2.3] で説明したとおり、windrvr_isr hook を 使用します。 次の チェックリストを利用して、どのようにドライバのパフォーマンスを向上させるかを検討してく ださい。 10.1.1 パフォーマンスを向上させるためのチェックリスト 次のチェックリストを使用してドライバのパフォーマンス向上に役立ててください: 118 第 1 0 章 #1 問題 解決方法 ISA カード - カード上の I/O に • パ フ ォ ー マ ン ス の 向 上 複数の WD_Transfer を WD_MultiTransfer に変更する (セ クション [10.2.2] の「I/O にマップした領域へのアクセ マップした領域へのアクセス ス」を参照してください)。 • 問題が解決しない場合、Kernel PlugIn を用意して I/O を カーネル モードでハンドルする (詳しくは、第 11、12 章 の Kernel Plugin の説明を参照してください)。 #2 PCI カード - カード上の I/O に • まず、PCI 設定レジスタのアドレス スペースのビット 0 を 0 に変更してカードを I/O マップからメモリ マップ マップした領域へのアクセス に変更し、問題 #3 の解決方法を試す。BAR0、1、2、3、 4、5 レジスタを異なる値で初期化するように EERPOM を再プログラムする必要があります。 • 上の方法で問題が解決しない場合、問題 #1 の解決方法 を試す。 • 問題が解決しない場合、Kernel PlugIn を用意して I/O を カーネル モードでハンドルする (詳しくは、第 11、12 章 の Kernel Plugin の説明を参照してください)。 #3 カード上のメモリにマップし • メモリにマップした領域に直接アクセスし、 WD_Transfer を使用せずにメモリにアクセスする(セク た領域へのアクセス ション [10.2.1] の「メモリにマップした領域への直接ア クセス」を参照してください)。 • これで問題が解決しない場合、ハードウェアのデザ インに問題があると考えられます。ソフトウェア デザ インの変更や Kernel PlugIn を利用してもパフォーマン スを向上できません。 #4 割り込み (割り込みの受け取り Kernel PlugIn を利用して割り込みをカーネル モードで処理 もれ、割り込みの受け取りが遅 する必要があります (詳しくは、第 11、12 章の Kernel Plugin すぎる場合) の説明を参照してください)。 119 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 10.2 ユーザー モード ドライバのパフォーマンスの向上 一般的にメモリにマップされた領域への転送は、I/O にマップされた領域への転送よりも高速です。こ れは、WinDriver では WD_Transfer 関数を呼び出さずにメモリにマップされた領域に直接アクセスでき るためです。 10.2.1 メモリにマップされた領域への直接アクセス WD_CardRegister [A.2.8] でメモリにマップされた領域を登録すると、dwTransAddr、dwUserDirectAddr が 返されます。 dwTransAddr は、メモリ領域への読み書きを行う際に使われる WD_Transfer [A.2.11] のベース アドレス として使われます。メモリへの転送をより効率的に行うには、dwUserDirectAddr を直接ポインタとして 使用します。この方法を利用することにより、関数呼び出しに必要なオーバーヘッドなしでメモリに マップされた領域を直接読み書き可能です。 WD_Transfer または dwUserDirectAddr を使用するかどうか、特に文字列転送コマンドを使用する際に は、データ型のサイズに応じてベース アドレスのアラインが重要です。または、転送を小さく分割し ます。データをアラインする最も簡単な方法は、バッファを定義する際に、基本の型を使用すること です。例: BYTE buf[len]; // BYTE 転送の場合 − アラインなし WORD buf[len]; // WORD 転送の場合 − 2 バイト境界でアライン UINT32 buf[len]; // DWORD 転送の場合 − 4 バイト境界でアライン UINT64 buf[len]; // QWORD 転送の場合 − 8 バイト境界でアライン 10.2.2 I/O にマップされた領域へのアクセス I/O にマップされた領域のデータにアクセスするには、WD_Transfer 関数 [A.2.11] を使用しなければな りません。大きなバッファを転送しなければならない場合は、文字列 (ブロック) 転送コマンドを使用 できます。例えば、RP_SBYTE (Read Port String Byte ) コマンドは Byte のバッファを I/O ポートに転送で きます。この場合、関数呼び出しにかかるオーバーヘッドは、ブロック転送時間に比べて無視して構 わない程度になります。 小さな転送を繰り返すような場合でも、関数呼び出しにかかるオーバーヘッドが全体のパフォーマン ス低下につながります。これは、WD_Transfer を 1 秒間に 20,000 回以上呼び出すような場合に発生し ます。 このようなケースの例として、1 MB のデータ ブロックを 1 Word ずつ転送する (LOW バイトを I/O ポー ト 0x300 に、HIGH バイトを I/O ポート 0x301 に転送する) 場合などがあげられます。 通常、この例では WD_Transfer を 100 万回呼び出すことになります (Byte 0 をポート 0x300、Byte 1 を ポート 0x301、Byte 2 をポート 0x300、Byte 4 をポート 0x301 など (WP_BYTE - Write Port Byte))。 このオーバーヘッドを半分に減らすには、WD_Transfer を WP_SBYTE (Write Port String Byte) を使って 呼び出すことにより一度に 2 バイト転送可能になります。最初の呼び出して Byte 0、Byte 1 をポート 120 第 1 0 章 パ フ ォ ー マ ン ス の 向 上 0x300、0x301 に、2 回目の呼び出しで Byte 2、Byte 3 をポート 0x300、0x301 に転送します。この方法 だと、WD_Transfer を 50 万回呼び出すだけでブロックを転送できます。 3 つ目の方法は、1000 個の WD_TRANSFER コマンドを持つ配列を用意する方法です。配列内のコマン ドはそれぞれ、一度に 2 バイト転送可能な WP_SBYTE コマンドが含まれます。次に WD_MultiTransfer [A.2.12] を WD_TRANSFER コマンドの配列へのポインタを使って呼び出します。WD_MultiTransfer を 呼び出すと、一度に 2000 バイトを転送可能です。1 MB を転送するには、WD_Transfer を 500 回呼び出 せばよい訳です。これは、最適化前の呼び出し回数の 0.05% に当たります。この場合の Trade-off は、 WD_Transfer の呼出し数と 500 個の WD_TRANSFER コマンドに使用されるメモリの間です。 10.2.3 64-ビット データ転送を行う 注意: 実際に 64 ビット転送を実行の能力は、ハードウェア、CPU、ブリッジなどによる転送のサポー トに依存し、これらの仕様の組合せになどのよっても影響を受けます。 WinDriver は、32 ビット オペレーティング システムで x86 プラットフォーム上での 64 ビット PCI デー タ転送をサポートしています。PCI ハードウェア (デバイスおよびバス) が 64 ビットの場合、対象のホ スト オペレーティング システムが 32 ビットであっても、より高い処理能力をハードウェアに与える ことができます。 この新しい技術は、プラットフォームで以前では実現できなかったデータ転送の能力を飛躍的に高め ます。DDK または他のドライバ開発ツールで記述したドライバよりも高いパフォーマンスを WinDrinver で開発したドライバが発揮します。Jungo 社によるベンチマーク テストでは、64 ビット デー タ転送で 32 ビット データ転送に比べ、データ転送速度が飛躍的に向上する結果が得られました。 WinDriver および KernelDriver で開発されたドライバは、通常の 32 ビット データ転送で得られる性能 よりも高い数字を得られることが実証されました。 64 ビット データ転送の実行に関しては、セクション [A.2.11] の WD_Transfer 関数レファレンスを参照 してください。 注意: 64 ビット オペレーティング システムでは、64 ビット データ転送を直接実行します。WD_Transfer を使用する必要はありません。 121 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 第 11 章 Kernel PlugIn について この章では、WinDriver の Kernel PlugIn の機能について説明します。 注意: Windows CE および VxWorks にはカーネル モードとユーザー モードの区別がないため Kernel PlugIn を実行できませんが、Kernel PlugIn を使用しなくても最高のパフォーマンスに向上できます。 VxWorks で割り込み処理率を向上するには、セクション [9.2.3] で説明したとおり、windrvr_isr hook を 使用します。 11.1 Kernel PlugIn の概要 ユーザー モードで作成されたドライバは、カーネル からユーザー モードへの関数呼び出しにかなりの 量のオーバーヘッドがあることも事実であり、必要なパフォーマンスが得られない場合もあります。 そのような場合、コードには手を加えず Kernel PlugIn 機能を使用し、ドライバ コードの問題となるセ クションをカーネルへ移すことが可能です。WinDriver の Kernel PlugIn 機能を使用すると、性能を低下 させることなくドライバが動作します。 Kernel PlugIn を利用した場合の利点を次に示します: すべてのドライバ コードをユーザー モードで開発、デバッグが可能です。 カーネル モードに移されたコード セグメントは本質的に変更されていないため、カーネル デ バッグの必要がありません。 Kernel PlugIn を使ってカーネルで動作するコードは、プラットフォームに依存しないため、 WinDriver および Kernel PlugIn がサポートするすべてのプラットフォームで動作します。一般 的なカーネル モードのドライバは、特定のプラットフォームでしか動作しません。 WinDriver の Kernel PlugIn 機能を使用することにより、パフォーマンスを低下させずにドライバを作成 できます。 11.2 Kernel PlugIn を作成する前に すべてのパフォーマンスに関する問題を Kernel PlugIn で解決する必要はありません。問題によっては、 WinDriver に用意されている関数をうまく組み合わせることによって、ユーザー モードでパフォーマン スの向上が可能です。詳細は、第 10 章の「パフォーマンスの向上」を参照してください。 122 第 1 1 章 K E R N E L P L U G I N に つ い て 11.3 期待される効果 WinDriver Kernel PlugIn を使用して割り込み処理を作成できるため、1 秒間に約 100,000 の割り込みを逃 すことがなく、すべて処理可能です。 11.4 開発プロセスの概要 WinDriver の Kernel PlugIn を使用する際に、まず標準の WinDriver ツールを使用してユーザー モードで ドライバを開発およびデバッグします。パフォーマンスに影響する部分のコード (割り込み処理、I/O マップされたメモリ範囲へのアクセスなど) を検出し、カーネル モードで実行する Kernel PlugIn を作成 します。パフォーマンスに影響する部分のコードを Kernel PlugIn ドライバへ移します。これにより呼 び出しのオーバーヘッドおよびユーザー モードで同じタスクを実装する時に発生するコンテキスト スイッチを削除します。 このユニークなアーキテクチャで、開発期間を短縮し、パフォーマンスの低下を防げます。 11.5 WinDriver Kernel PlugIn の構造 11.5.1 構造の概要 ユーザー モードで記述したドライバは、デバイスにアクセスする際に WinDriver の関数 (WDC_xxx お よび/または WD_xxx [A.2]) を使用します。ユーザー モードで実装され、カーネル レベルのパフォー マンスの達成が必要な関数 (割り込み処理など) の場合、WinDriver Kernel PlugIn に移します通常、ユー ザー モードと Kernel PlugIn の両方で同じ WinDriver API をサポートしているので、コードの修正をせず に、ユーザー モードからカーネルへ WDC_xxx / WD_xxx 関数呼び出しを使用するようにコードを移行 できます。 123 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド アプリケーション WinDriver コンポーネント ( YourApp.EXE ) 記述するコンポーネント ドライバ コード WinDriver ユーザーモード ライブラリ (WinDrvr.h) ユーザー モード カーネル モード Kernel PlugIn 関数 KP_Init() KP_Open() KP_IntAtIrq() KP_IntAtDpc() KP_Call() KP_Close() WinDriver 割り込み処理 WinDriver カーネル 割り込み ハードウェア Kernel PlugIn (WinDrvr.VXD、 メッセージ WinDrvr.SYS) I/O 受け渡し 図 11.1: KernelPlugIn の構造 11.5.2 WinDriver Kernel と Kernel Plugin のインターフェイス WinDriver カーネルと WinDriver Kernel PlugIn は次の 2 種類のインターフェイスがあります: 1. 割り込み処理: WinDriver が割り込みを受け取ると、ユーザー モードの割り込み処理をデ フォルトで有効にします。しかし、割り込みを Kernel PlugIn ドライバが処理するように 設定し、WinDriver が割り込みを受信すると、Kernel PlugIn ドライバのカーネル モードで 割り込み処理が始動します。Kernel PlugIn 割り込み処理は、基本的に Kernel PlugIn へ移 動する前にユーザー モードで割り込み処理を記述およびデバッグしていたコードと同 様ですが、ユーザー モードのコードの一部を編集する必要があります。KernelPlugIn で 割り込みの検知および処理を行うコードを再記述し、KernelPlugIn の柔軟性を有効にしま す (セクション 11.6.5 を参照してください)。 2. メッセージ受け渡し: カーネル モードで関数を実行する場合 (I/O 処理関数など)、ユー ザー モードのドライバは WinDriver Kernel PlugIn に「メッセージ」を渡します。このメッ セージは特定の関数にマップされ、カーネル内で実行されます。この関数はユーザー モードで開発されたものと同じコードが含まれます。 ユーザー モード アプリケーションから Kernel PlugIn ドライバへメッセージを使用して データを渡すこともできます。 124 第 1 1 章 11.5.3 K E R N E L P L U G I N に つ い て Kernel Plugin コンポーネント Kernel PlugIn の開発サイクルを終了すると、作成したドライバは以下のエレメントを持つことになりま す。 WDC_xxx / WD_xxx API 関数で記述されたユーザー モード ドライバ アプリケーション(<アプ リケーション名>/.exe)。 WinDriver カーネル モジュール (windrvr6/.sys/.o)。 カーネル レベルへ移動したドライバ機能を含む WDC_xxx / WD_xxx API 関数で記述された Kernel PlugIn ドライバ (<Kernel PlugIn ドライバ名>/.sys/.o) 11.5.4 Kernel PlugIn イベント シーケンス 次に Kernel PlugIn で実装できるすべての関数の一般的なイベント シーケンスを示します: ユーザー モードから Kernel PlugIn へのハンドルを開く イベント / コールバック 備考 イベント: このイベントはブート時にダイナミック ロード Windows は Kernel PlugIn ドライバをロードしま により行われるか、またはレジストリからの指示 す。 として行われます。 コールバック: KP_Init が WinDriver に KP_Open() ルーチン KP_Init() Kernel PlugIn ルーチン [A.13.2] を呼び [A.13.2] の名前を知らせます。アプリケーション 出します。 がドライバを開く場合 (Kernel PlugIn ドライバを 開く名前で WDC_xxxDeviceOpen() (PCI: [A.3.8]、 PCMCIA: [A.3.9]、ISA: [A3.10]) を呼び出す場合か、 または (ラッパー WDC_xxxDeviceOpen() 関数に呼 び出される) 低水準の WD_KernelPlugInOpen() 関 数 [A.12.1] を呼び出す場合)、 WinDriver はこのルー チンを呼び出します。 イベント: ユーザー モード ドライバ アプリケーションは Kernel PlugIn ドライバを開く名前で WDC_xxxDeviceOpen() (PCI: [A.3.8]、PCMCIA: [A.3.9]、 ISA: [A3.10]) を呼び出すか、 または (ラッ パー WDC_xxxDeviceOpen() 関数に呼び出され る) 低水準の WD_KernelPlugInOpen() 関数 [A.12.1] を呼び出します。 125 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド コールバック: KP_Open() 関数 [A.13.2] は WinDriver への Kernel KP_Open() Kernel PlugIn ルーチン [A.13.2] を呼 PlugIn ドライバで実装した全コールバック関数名 び出します。 の通知に使用されます。また、必要に応じて Kernel Plugin ドライバの開始に使用されます。 Kernel PlugIn からのユーザー モード要求処理 イベント / コールバック 備考 イベント: アプリケーションは WDC_CallKerPlug() / アプリケーションは WDC_callKerPlug() WD_KernelPlugInCall() を呼び出し、(Kernel PlugIn [A.3.14]、または 低水準の WD_KernelPlugInCall() ドライバの) カーネル モードでコードを実行しま 関数 [A.12.3] を呼び出します。 す。アプリケーションは Kernel PlugIn ドライバへ メッセージを渡します。 Kernel PlugIn ドライバは 送られたメッセージに従って実行するコードを 選択します。 コールバック: KP_Call() [A.13.4] はユーザー モードより渡された KP_Call() Kernel PlugIn ルーチン [A.13.4] を呼び メッセージに従ってコードを実行します。 出します。 割り込み処理の有効化/無効化および高い割り込み要求処理 イベント / コールバック 備考 イベント: アプリケーションは fUseKP 引数に TRUE を設 定して WDC_IntEnable() [A.3.40] を呼ぶか (Kernel PlugIn でデバイスを開いた後)、または、 KernelPlugIn ドライバへのハンドルでより低レ ベルな InterruptEnable() [A.5.21] または WD_IntEnable() [A.6.2] 関数を呼びます (関数へ 渡された WD_INTERRUPT 構造体の hKernelPlugIn フィールドに設定)。 コールバック: この関数には Kernel PlugIn の割り込み処理に必要 KP_IntEnable() Kernel PlugIn ルーチン [A.13.6] を な初期化設定を含めてください。 呼び出します。 イベント: ハードウェアが割り込みを発生します。 コールバック: KP_IntAtIrql() は高い優先度で実行されるため、基 KP_IntAtIrql() Kernel PlugIn ルーチン [A.13.8] を 本的な割り込み処理 (割り込みを識別するため 呼び出します。 に、レベル センシティブ割り込みの HW 割り込み シグナルの低くするなど) だけを実行します。 126 第 1 1 章 K E R N E L P L U G I N に つ い て シグナルの低くするなど) だけを実行します。 より多くの割り込み処理が必要な場合、 KP_IntAtDpc() 関数 [A.13.9] で追加処理を引き継ぐ ために KP_IntAtIrql() は TRUE を返します。 イベント: 割り込みが Kernel PlugIn で有効になっている場 合 (割り込みを有効にするイベントの詳細を参 照) 、アプリケーションは WDC_IntDisable() [A.3.41] を呼び出すか、または、低水準の InterruptDisable() [A.5.22] または WD_IntDisable() [A.6.5] 関数を呼び出します。 コールバック: この関数は KP_IntEnable() [A.13.6] コールバックに KP_IntDisable() Kernel PlugIn ルーチン [A.13.7] が より割り当てられたメモリを解放します。 呼び出されます。 割り込み処理 – 異なる処理の呼び出し イベント / コールバック 備考 イベント: カーネルで引き継いだ手順として追加の割り込 Kernel PlugIn KP_IntAtIrql( ) 関数 [A.13.8] が み処理を WinDriver へ伝えます。 TRUE を戻します。 コールバック: 残りの割り込みコードを処理しますが KP_IntAtDpc( ) [A.13.9] Kernel PlugIn ルーチンを KP_IntAtIrql よりは優先度が低いです。 呼び出します。 イベント: ユーザー モードで処理するための割り込みコー KP_IntAtDpc( ) は 0 よりも大きい値を戻します ドが必要です。 コールバック: ユーザー モード割り込みハンドラから実行が再 WD_IntWait( ) [A.6.3] を戻します。 開されます。 プラグアンドプレイおよびパワー マネージメント イベント / コールバック 備考 アプリケーションは fUseKP 引数に TRUE を設 定して WDC_EventRegister() [A.3.43] を呼んで、 Kernel PlugIn ドライバを使用して、Plug-and-Play およびパワー マネージメントの通知を受け取 るように登録します (Kernel PlugIn でデバイス を開いた後)。または、Kernel PlugIn ドライバへ 127 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド のハンドルでより低レベルな EventRegister() [A.11.2] または WD_EventRegister() 関数を呼び 出します (関数に渡された WD_EVENT 構造体 の hKernelPlugIn フィールドに設定)。 イベント: プラグアンドプレイまたはパワー マネージ メント イベントが発生します。 コールバック: KP_Event は、発生したイベントについての情報を KP_Event( ) [A.13.5] が呼び出されます。 受け取ります。 イベント: イベントは、ユーザー モード アプリケーションで KP_Event( ) は TRUE を返します。 処理される必要があります。 コールバック: ユーザー モード割り込みハンドラ アプリケー WD_Intwait( ) [A.6.3] を返します。 ション イベント ハンドラで処理を再開します。 11.6 Kernel PlugIn の仕組み このセクションでは Kernel PlugIn の開発サイクルを説明します。 まず初めにドライバ コードを作成し、ユーザー モードでドライバ コード全体をデバッグすることを推 奨します。次にパフォーマンス上の問題に直面したり、柔軟性が必要な場合、コードの一部を Kernel PlugIn ドライバへポーティングします。 11.6.1 Kernel PlugIn ドライバの作成に必要な条件 Kernel PlugIn ドライバをビルドするには以下のツールが必要です。 • Windows 98/Me/NT/2000/XP/Server 2003 の場合 o Visual C (VC) コンパイラ (cl.exe、rc.exe、link.exe および nmake.exe) o ターゲットとなるオペレーティング システム用の Windows デバイス ドライバ開 発キット (DDK) がインストールされたホスト マシン 注意 • Windows DDK は MSDN サブスクリプションの一部として利用できます。また、 http://www.microsoft.com/whdc/ddk/winddk.mspx から購入できます。 • ターゲット PC が Windows 98/Me 用の Kernel PlugIn ドライバを開発している場合、 Windows 2000 またはそれ以降をホスト プラットフォームとして使用してください。 • 128 Linux および Solaris の場合、GCC、gmake または make が必要です。 第 1 1 章 K E R N E L P L U G I N に つ い て 注意:必要条件ではありませんが、Kernel PlugIn ドライバを開発する場合は、2 台のコンピュータ (ホス ト プラットフォーム用に 1 台、ターゲット プラットフォーム用に 1 台) を使用することを推奨します。 ホスト コンピュータでドライバを開発し、ターゲット コンピュータで開発したドライバを実行しテス トします。 11.6.2 Kernel PlugIn の実装 始める前に このセクションでは、Kernel PlugIn ドライバで実装されるコールバック関数 (呼び出しイベントが発生 した際に呼び出されます) について説明します。例えば、KP_Init( ) [A.13.1] はドライバがロードされた ときに呼び出されるコールバック関数です。ロード時に実行するコードはこの関数に記述しておく必 要があります。 ドライバ名は KP_Init() で渡されます。ここで渡された名前で実装される必要があります。その他のコー ルバック関数の場合、このリファレンス ガイドでは KP_xxx() 関数 (KP_Open() など) のように関数名を 付けます。ただし、Kernel PlugIn ドライバを開発する際には、コールバック関数に他の名前を付けるこ ともできます。DriverWizard で Kernel PlugIn コードを生成する際には、コールバック関数名 (KP_Init() 関 数以外) は "KP_<ドライバ名>_<コールバック関数>" の形式で名前を付けます。例えば、プロジェクト名 が MyDevice の場合、Kernel PlugIn KP_Open() 関数の名前は KP_MyDevice_Open() となります。 あなたの KP_Init 関数の記述 KP_Init() 関数は [A.13.1] 以下のようになります。 BOOL __cdecl KP_Init(KP_INIT *kpInit); KP_INIT は次のような構造体になります: typedef struct { DWORD dwVerWD; // WinDriver Kernel PlugIn ライブラリのバージョン CHAR cDriverName[12]; // デバイス ドライバ名を返します、最大 12 文字 KP_FUNC_OPEN funcOpen; // KP_Open 関数を返します } KP_INIT; この関数はドライバがロードされるたびに呼び出されます。KP_INIT 構造体には KP_Open() 関数 [A.13.2] (WinDriver/samples/pci_diag/kp_pci/kp_pci.c のサンプルを参照してください) の アドレスとKernel PlugIn 名が埋めこまれます。 注意: 1. Kernel PlugIn ドライバの選択する名前は、作成するドライバの名前にしてください (KP_Init [A.13.1] で KP_INIT 構造体の cDriverName で設定されます)。たとえば、XXX.SYS という名前 のドライバを生成する場合、KP_INIT 構造体の cDriverName 項目に名前 “XXX” を設定します。 2. ユーザー モードで設定されたドライバ名、WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) の呼び出しで設定されたドライバ名、WD_KernelPlugInOpen() [A.12.1] へ 渡された WD_KERNEL_PLUGIN 構造体の pcDriverName フィールド (WDC ライブラリを使用 129 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド していない場合) で設定されたドライバ名、および KP_Init() へ渡された KP_INTI 構造体の cDriverName フィールドで設定されたドライバ名が同一であるかを確認してください。 ユーザー モード アプリケーションと Kernel PlugIn ドライバで共有するヘッダー ファイルで Kernel PlugIn ドライバ名を定義し、関連したすべての場所で定義した値を使用するとエラー なしで実装することができます。 KP_PCI サンプルから抜粋 (WinDriver/samples/pci_diag/kp_pci/kp_pci.c): BOOL __cdecl KP_Init(KP_INIT *kpInit) { /* Verify that the version of the WinDriver Kernel PlugIn library is identical to that of the windrvr.h and wd_kp.h files */ if (WD_VER != kpInit->dwVerWD) { /* Re-build your Kernel PlugIn driver project with the compatible version of the WinDriver Kernel PlugIn library (kp_nt.lib) and windrvr.h and wd_kp.h files */ return FALSE; } kpInit->funcOpen = KP_PCI_Open; strcpy (kpInit->cDriverName, KP_PCI_DRIVER_NAME); return TRUE; } ドライバ名はプリプロセッサ名を使用して設定されます。この定義は、pci_diag のユーザー モード ア プリケーションおよび KP_PCI Kernel PlugIn ドライバで共有される /WinDriver/samples/pci_diag/pci_lib.h ヘッダー ファイルに保存されています。 /* Kernel PlugIn driver name (should be no more than 8 characters) */ #define KP_PCI_DRIVER_NAME "KP_PCI" KP_Open() 関数の記述 KP_Open() 関数 [A.13.2] は以下のようになります。 BOOL __cdecl KP\_Open(KP\_OPEN\_CALL {*}kpOpenCall, HANDLE hWD, PVOID pOpenData, PVOID {*}ppDrvContext); ユーザー モード アプリケーションが Kernel PlugIn ドライバの名前で WDC_xxxDeviceOpen() (PCI: [A.3.8]、PCMCIA: [A.3.9]、ISA: [A.3.10]) を呼び出す際か、または 低水準の WD_KernelPlugInOpen() 関数 [A.12.1] (ラッパー WDC_xxxDeviceOpen() 関数で呼び出された場合) を呼び出す際に、このコールバック を呼び出します。 KP_Open( ) 関数には、Kernel PlugIn に組み込むコールバックを定義してください。 130 第 1 1 章 K E R N E L P L U G I N に つ い て 次に組み込み可能なコールバックを示します: コールバック名 機能 KP_Close( ) ユーザー モード アプリケーションが Kernel PlugIn ドライバで開くデバイス用の [A.13.3] WDC_xxxDeviceClose() (PCI: [A.3.11], PCMCIA: [A.3.12], ISA: [A.3.13] を呼び出す場 合か、または、(ラッパー WDC_xxxDeviceClose() 関数で呼び出される) 低水準の WD_KernelPlugInClose() 関数 [A.12.2] を呼び出す場合に呼び出されます。 KP_Call( ) [A.13.4] ユーザー モード アプリケーションが WDC_CallKerPlug() 関数 [A.3.14] または低水 準の (ラッパー WDC_CallKerPlug() 関数で呼び出される) WD_KernelPlugInCall() 関 数 [A.12.3] を呼び出した場合に呼び出されます。 この関数は Kernel PlugIn メッセージ ハンドラを実装します。 KP_Event( ) Plug-and-Play および パワーマネージメント イベントが発生した場合に呼び出さ [A.13.5] れるか、または fUseKP 引数に TRUE を設定して WDC_EventRegister() [A.3.43] を 呼ぶか (Kernel PlugIn でデバイスを開いた後)、 Kernel PlugIn ドライバへのハンド ルでより低レベルな EventRegister() [A.11.2] または WD_EventRegister() を呼んで (関数へ渡される WD_EVENT 構造体の hKernelPlugIn フィールドで設定 )、Kernel PlugIn のこのイベントの通知を受け取るように予め登録したユーザーモード ア プリケーションを指定します。 KP_IntEnable( ) ユーザー モード アプリケーションが Kernel PlugIn の割り込みを有効にした場合、 [A.13.6] (Kernel PlugIn でデバイスが開かれた後) fUseKP パラメタが TRUE の WDC_IntEnable() を呼び出した場合、または、(関数に渡された WD_INTERRUPT 構 造体の hKernelPlugIn フィールドで設定された) Kernel PlugIn ドライバで処理する 低水準の InterruptEnable() [A.5.21] または WD_IntEnable() [A.3.40] 関数を呼び出し た場合に呼び出されます。 この関数には Kernel PlugIn の割り込み処理に必要な初期化設定を含めてくださ い。 KP_IntDisable( ) ユーザー モード アプリケーションが WDC_IntDisable() [A.3.41] を呼び出した場合 [A.13.7] か、または Kernel PlugIn ドライバで割り込みを有効にしていた場合に低水準の InterruptDisable() [A.5.22] か WD_IntDisable() [A.6.5] 関数を呼び出した場合に呼び出 します。 この関数は KP_IntEnable() [A.13.6] コールバックにより割り当てられたメモリを 解放します。 KP_IntAtIrql( ) WinDriver が割り込みを受け取った場合に呼び出されます (Kernel PlugIn へのハン [A.13.8] ドルを持つことによって可能となる割り込みを提供)。この関数はカーネル モー ドで割り込みを処理する関数です。この関数は高い割り込み要求レベルで実行さ れます。追加の引継ぎ処理は KP_IntAtDpc() またはユーザー モードで実行されま す。 131 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド KP_IntAtDpc( ) KP_IntAtIrql() [A.13.8] コールバックが TRUE に返る割り込み処理を要求された場 [A.13.9] 合に呼び出されます。 この関数に優先度の低いカーネル モードの割り込み処理コードを含めます。 アプリケーションのユーザー モードの割り込み処理ルーチンが引き起こされる 回数を決定します。 上記で説明したとおり、これらのハンドラはユーザー モード アプリケーションが Kernel PlugIn ドライ バを (WDC_xxxDeviceOpen() / WD_KernelPlugInOpen(), WDC_xxxDeviceClose()/WD_KernelPlugInClose() を 使用して) 開くまたは閉じる場合、(WDC_CallKerPlug() / (WD_KernelPlugInCall() を呼び出して) Kernel PlugIn ドライバへメッセージを送信する場合、(Kernel PlugIn でデバイスを開いた後、fUseKP パラメタ を TRUE に設定して WDC_IntEnable() を呼び出す、または関数へ渡された WD_INTERRUPT 構造体の hKernelPlugIn() フィールドに設定した Kernel PlugIn ハンドルで InterruptEnable() または WD_InterruptEnable() を呼び出して) Kernel PlugIn ドライバで割り込みを有効にする場合、または Kernel PlugIn ドライバを使用して有効にした WDC_IntDisable() / InterruptDisable() / WD_IntDisable() 割り込みを 無効にする場合に呼び出されます。 Kernel PlugIn の割り込み処理は、Kernel PlugIn ドライバを使用して割り込みが有効の場合に割り込みが 発生した際に呼び出されます。 Kernel PlugIn のイベント ハンドラは、(Kernel PlugIn でデバイスを開いた後、fUseKP 引数に TRUE を設 定して WDC_EventRegister() を呼び出す、または関数へ渡された WD_EVENT 構造体の hKernelPlugIn() フィールドに設定した Kernel PlugIn へのハンドルで EventRegister() または WD_EventRegister() を呼び出 して) Kernel PlugIn ドライバを使用して発生したイベントの通知を受け取るようにアプリケーションを 登録した場合、Plug-and-Play またはパワーマネージメント イベントが発生した際に呼び出されます。 Kernel PlugIn コールバック関数の定義に加え、KP_Open() で Kenerl Plugin に必要な初期化設定を実行す るコードを実装することもできます。KP_PCI ドライバのサンプルおよび DriverWizard で生成された Kernel PlugIn ドライバでは、たとえば、KP_Open() は、共有ライブラリの初期化関数を呼び出し、ユー ザー モードから関数へ渡されるデバイス情報を保存するために使用される Kernel PlugIn ドライバ コン テキスト用のメモリを割り当てます。 KP_PCI サンプルから抜粋 (WinDriver/samples/pci_diag/kp_pci/kp_pci.c): /* KP_PCI_Open is called when WD_KernelPlugInOpen() is called from the user mode. */ /* pDrvContext will be passed to rest of the Kernel PlugIn callback functions. */ BOOL __cdecl KP_PCI_Open(KP_OPEN_CALL *kpOpenCall, HANDLE hWD, PVOID pOpenData, PVOID *ppDrvContext) { DWORD dwStatus; KP_PCI_Trace("KP_PCI_Open entered\n"); kpOpenCall->funcClose = KP_PCI_Close; kpOpenCall->funcCall = KP_PCI_Call; kpOpenCall->funcIntEnable = KP_PCI_IntEnable; kpOpenCall->funcIntDisable = KP_PCI_IntDisable; 132 第 1 1 章 K E R N E L P L U G I N に つ い て kpOpenCall->funcIntAtIrql = KP_PCI_IntAtIrql; kpOpenCall->funcIntAtDpc = KP_PCI_IntAtDpc; kpOpenCall->funcEvent = KP_PCI_Event; /* Initialize the PCI library */ dwStatus = PCI_LibInit(); if (WD_STATUS_SUCCESS != dwStatus) { KP_PCI_Err("KP_PCI_Open: Failed to initialize the PCI library: %s", PCI_GetLastErr()); return FALSE; } /* Allocate memory to hold the device information in the driver context */ *ppDrvContext = malloc(sizeof(WDC_DEVICE)); if (!*ppDrvContext) { KP_PCI_Err("KP_PCI_Open: Failed allocating memory for the driver context\n"); PCI_LibUninit(); return FALSE; } /* Copy the device information passed from the user mode to the Kernel PlugIn driver context */ COPY_FROM_USER(*ppDrvContext, *((PWDC_DEVICE*)pOpenData), sizeof(WDC_DEVICE)); KP_PCI_Trace("KP_PCI_Open: Kernel PlugIn driver opened successfully\n"); return TRUE; } 残りの Kernel PlugIn コールバックの記述 使用したい残りの Kernel PlugIn ルーチン(割り込みを処理する KP_Intxxx() 関数、Plug-and-Play およびパ ワーマネージメント イベントを処理する KP_Event() など) を実装します。 11.6.3 Kernel PlugIn ドライバの生成されたコードとサンプル コード DriverWizard を使用して、デバイスの Kernel PlugIn ドライバの雛型が生成します。その雛型を Kernel PlugIn ドライバの開発のベースとして使用できます (推奨)。または、Kernel PlugIn ドライバのベースと して WinDriver/samples/pci_diag/kp_pci/ Kernel PlugIn ディレクトリ以下のサンプル (KP_PCI) を使用でき ます。 Kernel PlugIn ドライバはスタンド アロン モジュールではありません。ドライブと通信を開始するユー ザー モード アプリケーションが必要です。関連したアプリケーションは、DriverWizard を使用して生 成した Kernel PlugIn コードを使用した場合に生成されます。 pci_diag アプリケーション (/WinDriver/samples/pci_diag ディレクトリに保存されています) は、サンプル KP_PCI ドライバと通信し ます。 133 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド KP_PCI サンプルおよび DriverWizard で生成されたコードはユーザー モード アプリケーション (USERMODE.EXE または XXX_DIAG.EXE - ‘XXX’ は生成されるドライバ名です) と Kernel PlugIn ド ライバ (kp_pci/.sys/.o / xxx/.sys/.o) 間の通信を行います。 サンプルおよび生成されたコードは Kernel PlugIn の KP_Open() 関数へのデータの渡し方法と Kernel PlugIn で他の関数により使用されるグローバル Kernel PlugIn ドライバ コンテキストを割り当て、保管 する関数を使用方法を示します。 サンプルおよび生成された Kernel PlugIn コードは、ユーザー モードから Kernel PlugIn で特定の関数を 開始する方法、およびメッセージを通じて Kernel PlugIn ドライバとユーザー モード WinDriver アプリ ケーションの間でデータを渡す方法を示すためにドライバのバージョン番号を入手するメッセージを 実装します。 サンプルおよび生成されたコードには Kernel PlugIn での割り込み処理方法も含まれています。 Kernel PlugIn は割り込みカウンタを実装しています。Kernel PlugIn 割り込みハンドラは引継ぎ処理を実 行し、割り込みの着信を 5 回おきにユーザー モード アプリケーションへ通知します。 KP_PCI サンプルは PCI の割り込み処理を実演していますが、サンプル KP_IntAtIrql() 関数のコメントで 説明したとおり、割り込みの認識はハードウェアごとに異なるため、デバイス独自に割り込みを認識 するコードを実装するには、この関数を修正する必要があります。 DriverWizard で生成されたコードは選択されたデバイス (PCI/PCMCIA/ISA) 用の割り込みコードのサン プルを含んでいます。生成された Kp_IntAtIrql() 関数は、ウィザード ([Interrput] タブで、レジスタにカー ドの割り込みへの読み取り/書き込みコマンドを指定) で定義した割り込み転送コマンドを実装する コードを含みます。割り込みを受け取った際にカーネルで認識される必要がある PCI および PCMCIA の割り込みの場合、生成されたコードが、定義したコマンドを実行するために必要なコードをすでに 含んでいるように、Kernel PlugIn コード生成の前にウィザードを使用して割り込みを認識 (消去) する コマンドを定義することを推奨します。 さらに、サンプルおよび生成されたコードには Kernel PlugIn で Plug-and-Play およびパワーマネージ メント イベントの通知の受け取り方法も含まれています。 ヒント: Kernel PlugIn ドライバを記述する前に、Kernel PlugIn の生成されたプロジェクトおよびサンプ ル プログラムをビルドして実行することを推奨します。(デバイス用の必要な割り込みの認識を実装す るために、コードを修正しないで対象の PCI デバイス独自の割り込みを処理する際に、汎用的な KP_PCI ドライバを使用することはできません)。 11.6.4 Kernel PlugIn のサンプル コードと生成されたコードのディレク トリ構造 pci_diag および kp_pci のサンプル ディレクトリ kp_pci.c ファイルで、Kernel PlugIn のサンプル コード (KP_PCI) を実装してます。このサンプル ドライ バは、WinDriver PCI 診断プログラムのサンプル (pci_diag) の一部で、KP_PCI ドライバに加え、ドライ バ (pci_diag) と通信を行うユーザーモード アプリケーション、およびそのユーザーモード アプリケー 134 第 1 1 章 K E R N E L P L U G I N に つ い て ションと Kernel PlugIn ドライバの両方で使用できる API を含む共有ライブラリが含まれます。C 言語 でこのサンプルのソースを実装してます。 以下、/WinDriver/pci_diag/ ディレクトリ以下のファイルの概要です: • kp_pci/ - 以下の KP_PCI Kernel PlugIn ドライバ ファイルを含みます: kp_xxx.c: KP_XXX ドライバのソースコード Kernel PlugIn のビルド用の Project および/または make ファイルと関連ファイル WINNT/kp_pci.sys: WinNT DDK でビルドした Windows 用の KP_PCI Kernel PlugIn ドラ イバのプリコンパイル済みバージョン • pci_lib.c: WinDriver の WDC API [A.1] を使用して PCI デバイスにアクセスするライブラリの 実装。 ライブラリの API をユーザーモード アプリケーション (pci_diag) と Kernel PlugIn ドライバ (kp_pci.c) の両方で使用します。 • pci_lib.h: pci_lib ライブラリのヘッダ ファイル • pci_diag.c: サンプルの診断ユーザーモード コンソール (CUI) アプリケーションの実装で、 pci_lib と WDC ライブラリを使用して PCI デバイスとの通信を行います。 • このサンプルでは、ユーザーモードの WinDriver アプリケーションから Kernel PlugIn ドライ バへのアクセスを行います。デフォルトでは、サンプルでは、kp_pci.c Kernel PlugIn ドライ バへのハンドルで、選択した PCI デバイスを開きます。成功した場合、セクション [10.6.3] の 説明のとおり、Kernel PlugIn ドライバと通信を行います。Kernel PlugIn へのハンドルを開く のに失敗した場合、デバイスとのすべての通信をユーザーモードから実行します。 • pci.inf: Windows 98/Me/2000/XP/Server 2003 用のサンプル WinDriver PCI INF ファイル。注意: こ のファイルを使用するには、ファイル内の Vendor および Device ID を対象のデバイスの Vendor および Device ID に変更してください。 • pci_diag ユーザーモード アプリケーションのビルド用の Project および/または make ファイ ル • 対象の OS 用のユーザーモード アプリケーション (pci_diag) のプリコンパイル済みバー ジョン • files.txt: サンプル pci_diag ファイルの一覧 • readme.txt: サンプル Kernel PlugIn ドライバ、ユーザーモード アプリケーション、ビルド手 順およびコードのテスト手順の概要 DriverWizard で生成された Kernel PlugIn ディレクトリ 対象のデバイス用に DriverWizard で生成された Kernel PlugIn のコードには、カーネルモードの Kernel PlugIn のプロジェクトと通信を行うユーザーモード アプリケーションが含まれます。汎用的な 135 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド KP_PCI と pci_diag サンプルとは対照的に、Wizard で生成されたコードは、対象のデバイス用に検 出または定義したリソース情報を使用します。同様に、コードを生成する前に Wizard で定義したデバ イス独自の情報も使用します。 セクション [10.6.3] の説明のとおり、PCI または PCMCIA の割り込みを処理するドライバを使用する際 には、Wizard で生成された割り込み処理のコードで、定義したハードウェア独自の情報を使用できる ようにするためには、コードを生成する前に、DriverWizard で割り込みを検知するのに読み書きするレ ジスタを定義し、これらのレジスタから読み込む、またはレジスタへ書き込むコマンドを設定するこ とを強く推奨します。 以下、DriverWizard で Kernel PlugIn のコードを生成した場合の、生成されたファイルの概要です (xxx は、コードを生成する際に指定したドライバの名前を表します。また、kp_xxx は、コードを保存先 として指定したディレクトリを表します): • kermode/ - 以下の KP_XXX Kernel PlugIn ドライバ ファイルを含みます: kp_xxx.c: KP_XXX ドライバのソースコード Kernel PlugIn ドライバのビルド用の Project および/または make ファイルと関連ファイ ル • usermode/ - 以下の xxx_diag ユーザーモード アプリケーション ファイルを含みます: xxx_diag.c: xxx_diag アプリケーションのソースコード アプリケーションのビルド用の Project および/または make ファイル • xxx_lib.c: WinDriver の WDC API [A.2] を使用して、対象のデバイスへアクセスするライ ブラリの実装。 このライブラリの API をユーザーモード アプリケーション (xxx_diag) と Kernel PlugIn ド ライバ (KP_XXX) の両方で使用します。 • xxx_lib.h: xxx_lib ライブラリのヘッダ ファイル • xxx_files.txt: 生成されたファイルの一覧と生成されたコードのビルド手順 • xxx.inf: 対象のデバイスの WinDriver INF ファイル (Windows 98/Me/2000/XP/Server 2003 で、 PCI または PCMCIA などの Plug and Play デバイスの場合のみ) 11.6.5 Kernel PlugIn での割り込み処理 セクション [11.6.5] の説明のとおり、Kernel PlugIn ドライバの使用を有効にした場合、Kernel PlugIn ド ライバで割り込みを処理します。 Kernel PlugIn の割り込みを有効にした場合、WinDriver がハードウェアの割り込みを受信した際には、 Kernel PlugIn ドライバの KP_IntAtIrql() 関数 [A.13.8] を呼びます。KP_IntAtIrql() が TRUE を返す場合、 136 第 1 1 章 K E R N E L P L U G I N に つ い て KP_IntAtIrql() が処理を終え、TRUE を返した後に、遅延した KP_IntAtDpc() Kernel PlugIn 関数 [A.13.9] を 呼びます。 KP_IntAtDpc() の戻り値は、ユーザーモードの割り込み処理ルーティンを実行する回数です。 たとえば、KP_PCI のサンプルでは、Kernel PlugIn で実行中の割り込みハンドラは割り込みを 5 回カウン トし、5 回毎にユーザー モードに通知します。従って、WD_IntWait( ) [A.6.3] (ユーザー モード) は、受 け取った割り込みの 5 回に 1 回しかユーザー モードに通知しません。KP_IntAtIrql( ) がアクティブな KP_IntAtDpc( ) に 5 回に 1 回 TRUE を返します。KP_IntAtIrql( ) は KP_IntAtIrql( ) からの呼出しで遅延し た DPC の累積した数を返します。つまりユーザー モードの割り込み処理は、5 回に 1 回しか実行され ません。 ユーザー モードの割り込み処理 (Kernel PlugIn なし) Kernel PlugIn 割り込み処理が無効の場合、割り込みを受信する度に WD_IntWait() を返し、WinDriver が カーネルで割り込み処理を終了すると、ユーザーモードの割り込み処理ルーティンを起動します (おも に、WDC_IntEnable() [A.3.40] またはより低レベルな InterruptEnable() [A.5.21] または WD_IntEnable() [A.6.2] への呼び出しで渡される割り込み転送コマンドの実行) – 図 [11.2] を参照。 ドライバ コード WD_IntWait() WD_IntWait() ユーザー モード カーネル モード 割り込み 信号 WinDriver カーネル ハードウェア 図 11.2: Kernel PlugIn なしでの割り込みの処理 カーネルでの割り込み処理 (Kernel PlugIn あり) Kernel PlugIn で割り込みを処理するには、Kernel PlugIn ドライバの名前をWDC_xxxDeviceOpen() 関数へ 渡すことによって、ユーザーモード アプリケーションが Kernel PlugIn ドライバでデバイスへのハンド ルを開き (PCI: [A.3.8]、PCMCIA: [A.3.9]、ISA: [A.3.10])、そして fUseKP パラメータに TRUE を設定して、 WDC_IntEnable() [A.3.40] を呼びます。 137 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド WDC_xxx API [A.1] を使用しない場合、アプリケーションは、Kernel PlugIn ドライバへのハンドルを WD_IntEnable() 関数 [A.6.2] またはラッパー InterruptEnable() 関数 [A.5.21] へ渡します (WD_IntEnable() と WD_IntWait() [A.6.3] を呼びます)。Kernel PlugIn 割り込み処理を有効にします。(関数へ渡される WD_INTERRUPT 構造体の hKernelPlugIn フィールド内に Kernel PlugIn ハンドルを渡します。) Kernel PlugIn で割り込みを有効にするために、WDC_IntEnable()/InterruptEnable()/WD_IntEnable() を呼ぶ ときに、Kernel PlugIn の KP_IntEnable() callback 関数 [A.13.6] を有効にします。この関数で、Kernel PlugIn 割り込み処理へ渡される割り込みコンテキストを設定できます。また同様に、ハードウェアで実際に 割り込みを有効にするためにデバイスへの書き込みや、デバイスの割り込みを正確に有効にするため に必要なコードを実装できます。 Kernel PlugIn 割り込みハンドラが有効な場合、KP_IntAtIrql( ) [A.13.8] が割り込みのたびに呼び出されま す。KP_IntAtIrql ( ) 関数のコードは HIGH IRQL で実行されます。このコードの実行中はシステムが停 止します (そのため、コンテキスト スイッチや、優先度の低い割り込みが処理されません)。 KP_IntAtIrql( ) 関数内のコードは、次の制約があります: ページしないメモリに対してのみアクセス可能です。 次の関数だけを呼び出し可能です (または、これらの関数を呼び出したラッパー関数): − WDC_MultiTransfer() [A.2.21]、WD_Transfer() [A.5.14]、WD_MultiTransfer() [A.5.15] ま たは WD_DebugAdd() [A.1.6] − 高い 割り込み要求レベルから呼び出される OS 固有のカーネル関数 (WinDDK 関数 など)。 (これらの関数を使用すると、その他の OS とのコード互換性が損なわれる 場合があるのでご注意ください。) malloc()、free() または上記の関数以外の WDC_xxx または WD_xxx API 関数は呼びません。 138 第 1 1 章 K E R N E L P L U G I N に つ い て ドライバ コード WD_IntEnable() . . ユーザー モード カーネル モード WinDriver Kernel PlugIn 割り込み KP_IntAtDpc() { 優先度の 低いコード } KP_IntAtIrql() { 優先度の 高いコード 信号 ハードウェア WinDriver カーネル } 図 11.3: Kernel PlugIn ありでの割り込み処理 前述の制限のため、KP_IntAtIrql() に記述するコードはできだけ小さくします (レベル センシティブ割 り込みの検知/消去など)。割り込み処理で実行するその他をコードを KP_IntAtDpc() [A.13.9] で実装し ます。KP_IntAtDpc() [A.13.9] は、遅延した割り込みレベルで実行し、KP_IntAtIrql() と同じ制限を持っ ていません。KP_IntAtIrql() が戻り値を返した後に (TRUE を返した場合)、KP_IntAtDpc() を呼びます。 ユーザーモードで割り込み処理を行うこともできます。カーネルモードでの割り込み処理が終了した 後に、ユーザーモードの割り込み処理ルーティンを呼ぶ回数が KP_IntAtDpc() [A.13.9] の戻り値となり ます。 11.6.6 メッセージの受け渡し WinDriver アーキテクチャでは、WDC_CallKerPlug() [A.2.14] またはより低レベルな WD_KernelPlugInCall() 関数 [A.12.3] を使用して、ユーザーモードから Kernel PlugIn ドライバへメッセー ジを渡すことによって、ユーザーモードからカーネルモードの関数を有効にすることができます。 ドライバのユーザーモードとカーネルモードの plugin 部分の両方に共通なヘッダファイルにそのメッ セージを定義します。pci_diag KP_PCI サンプル コードと DriverWizard で生成されたコードで、サンプ ル コードの場合には、共有ライブラリのヘッダファイル pci_lib.h で、生成されたコードの場合には、 xxx_lib.h で、メッセージを定義します。 139 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド ユーザー モードからメッセージを受け取ると、WinDriver は KP_Call [A.13.4] Kernel PlugIn コールバック 関数を実行します。その関数は、受信したメッセージを確認し、このメッセージに対応したコードを 実行します (Kernel PlugIn で実装されるように)。 生成された / サンプル Kernel PlugIn コードは、Kernel PlugIn へデータを渡すためにドライバのバー ジョンを取得するためのメッセージを実装します。KP_Call() でバージョン番号を設定するコードは、 Kernel PlugIn がユーザー モード アプリケーションからメッセージを受信するときはいつでも Kernel PlugIn の中で実行されます。ヘッダー ファイル pci_lib.h/xxx_lib.h の中でメッセージの定義を参照でき ます。ユーザー モード アプリケーション (pci_diag.exe/xxx_diag.exe) は、WD_KernelPlugInCall() 関数 [A.12.3] から Kernel PlugIn ドライバへメッセージを送信します。 140 第 1 2 章 K E R N E L P L U G I N の 作 成 第 12 章 Kernel PlugIn の作成 Kernel PlugIn ドライバを記述する最も簡単な方法は、DriverWizard を使用して、ハード ウェアの Kernel PlugIn コードを作成します。または、PCI Kernel PlugIn ドライバの開発 の雛型として、WinDriver/samples/pci_diag/kp_pci ディレクトリに、KP_PCI という WinDriver から提供された Kernel PlugIn ドライバのサンプルを使用しても簡単に作成で きます。 Kernel PlugIn ドライバの作成には、次のステップに従ってください: 12.1 Kernel PlugIn が必要かどうかを確認する Kernel PlugIn はユーザー モードでドライバの開発、デバッグが終了してから使用します。開発やデバッ グが容易なユーザー モードでドライバを作成してから移行してください。 ドライバのパフォーマンスを向上する方法を説明している第 10 章の「パフォーマンスの向上」を参照 して Kernel PlugIn が必要かどうかを確認してください。さらに、Kernel PlugIn では、ユーザーモードで ドライバを記述する際に、ユーザーモードでは利用できないような柔軟性を提供します(特に、割り込 み処理に関して) 。 12.2 ユーザー モードのソース コードを用意する 1. 必要な関数を Kernel PlugIn へ移動して隔離します。 2. その関数からプラットフォーム固有のコードをすべて削除します。Kernel が使用する関数の みを使用します。 3. ユーザー モードでドライバをリコンパイルします。 4. ユーザー モードでドライバをデバッグして、変更後、コードが動作するか確認します。 注意: カーネル スタックはサイズに制限があります。このめた、Kernel PlugIn へ移動するコードには、 静的なメモリ割り当てを持たないようにしてください。代わりに malloc() 関数を使用して、動的にメ モリを割り当てます。これは特に大きいデータ構造に重要です。 注意: カーネルへ移植しているユーザー モード コードが、直接メモリ アドレスへアクセスする場合、 物理アドレスのユーザー モード マッピングを使用する場合、WD_CardRegister() から返されます。カー ネル内で、代わりに物理アドレスのカーネル マッピングを使用する必要があります (カーネル マッ 141 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド ピングは、WD_CardRegister() [A.5.11] から返されます)。WDC ライブラリ [A.2] の API を使用して、メ モリにアクセスする場合、このことを考慮する必要はありません。関連する API をユーザーモードま たはカーネルモードでの使用に応じて、この API がメモリのマップを正しく行っているかを確認しま す。 12.3 Kernel PlugIn プロジェクトの新規作成 DriverWizard を使用して、デバイスの Kernel PlugIn のプロジェクト (ユーザー モード プロジェクトに対 応) を新規作成できます (推奨)。また、開発の雛型として KP_PCI サンプルを使用して作成することも できます。もちろん、0 からコードを開発することもできます。 開発の雛型として KP_PCI サンプルを使用するように選択した場合、以下の手順に従ってください。 1. WinDriver/samples/pci_diag/kp_pci/ ディレクトリのコピーを作成します。たとえば、KP_MyDrv という Kernel PlugIn プロジェクトを新規作成する場合、WinDriver/samples/pci_diag/kp_pci/ を /WinDriver/samples/MyDrv/ へコピーします。 2. 新規に作成したディレクトリのすべての Kernel PlugIn ファイルの ''KP_PCI'' と ''kp_pci'' のすべ てのインスタンスを ''KP_MyDrv'' と ''kp_MyDrv'' に変更します (それぞれ) [注意: コードを正し く機能するには、kp_pci.c ファイルの KP_PCI_xxx() 関数名を変更する必要はありませんが、 関数名にドライバ名を使用した方が、コードがより分かりやすくなります。] 3. ファイル名の “KP_PCI” という文字列を “kp_MyDrv” へ変更します。 4. Kernel PlugIn ドライバとユーザーモード アプリケーションから共有 pci_lib ライブラリ API を 使用するには、pci_lib.h と pci_lib.c ファイルを /WinDriver/samples/pci_diag/ ディレクトリから新 規に作成した MyDrv/ ディレクトリにコピーします。ライブラリの関数名を変更して、''PCI'' ではなく、ドライバ名 (MyDrv) を使用できますが、この場合には、作成したKernel PlugIn プ ロジェクトとユーザーモード アプリケーションからこれらの関数へのすべての呼び出しで、 名前を変更する必要があるので、注意してください。 新規のプロジェクトに共有ライブラリをコピーしない場合、サンプルの Kernel PlugIn コード を編集し、PCI_xxx ライブラリ API へのすべての参照を他のコードに置き換える必要があり ます。 5. 必要に応じて、プロジェクト ファイル と make ファイルのファイルとディレクトリ パス、お よびソース ファイルの #include パスを変更します (新規作成したプロジェクト ディレクトリ の保存場所に依存します)。 6. pci_diag ユーザーモード アプリケーションを使用するには、 /WinDriver/samples/pci_diag/pci_diag.c、関連する pci_diag プロジェクト、workspace/solution また は make ファイルを MyDrv/ ディレクトリへコピーし、ファイル名を変更し (希望に応じて)、 ファイル内のすべての ''pci_diag'' の参照を変更したユーザーモード アプリケーションの名前 に変更します。workspace/solution ファイルを使用するには、ファイル内の ''KP_PCI'' への参照 を新規のKernel PlugIn ドライバに変更します。 たとえば、''KP_MyDrv''。そして、実装したい ドライバの機能用にサンプル コードを変更します。 142 第 1 2 章 K E R N E L P L U G I N の 作 成 生成されたおよびサンプルコードの説明は、11.6.3 および 11.6.4 を参照してください。 12.4 Kernel PlugIn へのハンドルの作成 ユーザーモード アプリケーションまたはライブラリ ソース コードでは、Kernel PlugIn を使用してデバ イスへのハンドルを開くには、Kernel PlugIn ドライバの名前で、WDC_PciDeviceOpen() [A.3.8] / WDC_PcmciaDeviceOpen() [A.3.9] / WDC_IsaDeviceOpen() [A.3.10] を呼びます (対象のデバイスの種類に 依存します)。 DriverWizard で生成されたコードおよびサンプルの pci_diag 共有ライブラリで、このことを実装してま す – 生成されたコードまたはサンプルの XXX_DeviceOpen()/PCI_DeviceOpen() ライブラリ関数 (生成さ れたコードまたはサンプルの xxx_diag/pci_diag ユーザーモード アプリケーションから呼ばれます) を 参照してください。 コードで WDC ライブラリ [A.2] を使用しない場合、Kernel PlugIn ドライバへのハンドルを開くには、 コードの初めで WD_KernelPlugInOpen() [A.12.1] を呼ぶ、アプリケーションの終了前または Kernel PlugIn ドライバの使用を終了する前で、WD_KernelPlugInClose() [A.12.2] を呼ぶ必要があります。 WD_KernelPlugInOpen() は、関数へ渡された WD_KERNEL_PLUGIN 構造体の hKernelPlugIn フィールド 内の Kernel PlugIn ドライバへのハンドルを返します。 12.5 Kernel PlugIn での割り込み処理の設定 1. WDC_IntEnable() [A.3.40] を呼ぶ場合 (セクション [12.4] で説明したとおり、Kernel PlugIn ドラ イバ名で WDC_xxxDeviceOpen() を呼んで、Kernel PlugIn ドライバを使用してデバイスへの ハンドルを開いた後)、fUseKP 関数の引数を TRUE に設定して、開いたデバイスに対して、 Kernel PlugIn ドライバで割り込みを有効にすることを表します。 DriverWizard で生成されたコードおよびサンプルの pci_diag 共有ライブラリ (xxx_lib.c / pci_lib.c) でこのことを実装してます – 生成されたコードまたはサンプルの XXX_IntEnable()/PCI_IntEnable() ライブラリ関数 (生成されたコードまたはサンプルの xxx_diag/pci_diag ユーザーモード アプリケーションから呼ばれます) を参照してください。 WDC_xxx API [A.2] を使用しない場合、Kernel PlugIn で割り込みを有効にするには、 WD_IntEnable() [A.6.2] または InterruptEnable() [A.5.21] (which calls WD_IntEnable()) を呼んで、 WD_KernelPlugInOpen() [A.12.1] から受信した Kernel PlugIn へのハンドル (関数へ渡された WD_KERNEL_PLUGIN 構造体のhKernelPlugIn フィールド内) を渡します。 2. WDC_IntEnable()/InterruptEnable()/ WD_IntEnable() を呼んで、Kernel PlugIn で割り込みを有効に する場合、WinDriver は Kernel PlugIn の KP_IntEnable() コールバック関数 [A.13.6] を有効にし ます。この関数を実装して、Kernel PlugIn 割り込み処理(KP_IntAtIrql() / KP_IntAtDpc()) へ渡さ れる割り込みコンテキストを設定します。同様に、デバイスへ書き込むことによって、実際 にハードウェアで割り込みを有効にします。たとえば、対象のデバイスの割り込みを正しく 有効にするために、その他の必要なコードを実行します。 143 W I N D R I V E R 3. ユ ー ザ ー ズ ガ イ ド ユーザーモードの割り込み処理の実装または、この実装の関連部分を Kernel PlugIn の割り込 み処理関数へ移動します。レベル センシティブな割り込みの検知 (クリア) 用のコードなど、 優先度の高いコードを、高い割り込み要求のレベルで動作する KP_IntAtIrql() function [A.13.8] へ移動する必要があります。遅延した割り込み処理をKP_IntAtDpc() [A.13.9] へ移動すること ができます。KP_IntAtIrql() が割り込み処理を終了し、TRUE を返すと KP_IntAtDpc() を実行し ます。直接カーネルで高度な割り込み処理を行うために、コードを編集して、より効果的に 割り込みを処理することもでき、より高い柔軟性を提供します (たとえば、特定のレジスタか ら値を読み込んだり、読み込んだ値を書き戻したり、特定のレジスタ ビットを換えたりしま す)。Kernel PlugIn ドライバを使用したカーネルでの割り込み処理の方法に関しては、セク ション [11.6.5] を参照してください。 12.6 Kernel PlugIn での I/O 処理の設定 1. ユーザー モードから I/O 処理のコードを Kernel PlugIn メッセージ ハンドラ KP_Call( ) [A.13.4] へ移動します。 2. ユーザーモードから I/O 処理を実行するカーネルのコードを有効にするには、 WDC_CallKerPlug() [A.3.14] または、Kernel PlugIn で実行したい各異なる機能の関連するメッ セージで、より低レベルな WD_KernelPlugInCall() 関数 [A.12.3] を呼びます。 3. ユーザーモード アプリケーション(メッセージを送信する) と Kernel PlugIn ドライバ (メッ セージを実装する) で共有するヘッダ ファイルでこれらのメッセージを定義します。 サンプルまたは DriverWizard で生成された Kernel PlugIn プロジェクトでは、ユーザーモード アプリケーションと Kernel PlugIn ドライバで共有するメッセージ ID とその他の情報を pci_lib.h/xxx_lib.h 共有ライブラリ ヘッダ ファイルで定義します。 12.7 Kernel PlugIn ドライバのコンパイル 12.7.1 Windows でのコンパイル サンプルの WinDriver/samples/pci_diag/kp_pci/ Kernel PlugIn ディレクトリと Driver Wizard で生成された Kernel PlugIn の base_dir/kermode/ ディレクトリ (base_dir は、生成されたドライバ プロジェクトを保存し たディレクトリです) には、Microsoft Developer Studio (MSDEV) 6.0 および/または MSDEV 7.0 (.NET) Kernel PlugIn プロジェクト ファイル (.dsp / .vcproj) が含まれます。 サンプルの WinDriver/samples/pci_diag/ ディレクトリと生成された base_dir/usermode/ ディレクトリに は、それぞれ Kernel PlugIn ドライバを実行するユーザーモード アプリケーション用の MSDEV 6.0 およ び/または MSDEV 7.0 (.NET) プロジェクト ファイル (.dsp / .vcproj) が含まれます。 サンプルの WinDriver\samples\pci_diag\ ディレクトリと生成された base_dir\ ディレクトリには、MSDEV 6.0 および/または MSDEV 7.0 (.NET) ワークスペース / ソリューション ファイル (.dsw / .sln) が含まれ、 また、それには Kernel PlugIn とユーザーモード アプリケーション両方のプロジェクト ファイルが含ま れ、MSDEV 6.0 または 7.0 (.NET) IDE で両方のプロジェクトと SYS Kernel PlugIn ドライバのコンパイ ルおよびビルドが簡単にできます。 144 第 1 2 章 K E R N E L P L U G I N の 作 成 (すべてのプロジェクト ファイルとワークスペース ファイルは、関連する msdev\ または msdev_net\ サ ブ ディレクトリ以下にあります。) Kernel PlugIn ドライバと各ユーザーモード アプリケーションをビルドするには、以下のステップを実 行します: 1. Verify ご使用の PC に対象の OS 用の Windows DDK (Device Development Kit) がインストールさ れていることを確認します (セクション [11.6.1] を参照してください)。 対象の OS とは、作成するドライバが動作するオペレーティング システムのことです。たと えば、Windows XP 用のドライバを作成する場合には、Windows XP DDK をインストールしま す。 それぞれの OS 用に複数の DDK をインストールでき、ドライバが対応する対象の OS に応じ て、Kernel PlugIn ドライバをリビルドします。 2. 対象のプラットフォーム用の Windows DDK の場所を示すように BASEDIR 環境変数を設定し ます。たとえば、Windows XP 用の Kernel PlugIn ドライバをビルドするには、Windows XP DDK をインストールしたディレクトリを示すように BASEDIR 環境変数を設定します。 3. Microsoft Developer Studio (MSDEV) を開始し、下記のステップを実行します。 a ドライバのプロジェクト ディレクトリから、生成されたワークスペース/ソ リューション ファイル - \base_dir\msdev\ xxx_diag.dsw/.sln を開きます (base_dir は、 ドライバのプロジェクト ディレクトリです - サンプル コードの場合、pci_diag\、 または Driver Wizard で生成されたコードの保存先のディレクトリ; デフォルトで は、 \WinDriver\wizard\my_projects です)。xxx はドライバ名です (サンプルでは pci、 または Driver Wizard でコードを生成する際に指定した名前)。 DriverWizard で MSDEV IDE 用にコードを生成するように選択した場合、コード ファイルを生成した後、Wizard が自動的に MSDEV を起動し、生成されたワーク スペース ファイルまたはソリューション ファイルを開くので注意してください。 ただし、コード生成ダイアログの ''IDE to Invoke'' を''None'' に設定することによっ て、この動作を回避できます。 b Kernel PlugIn SYS ドライバ (kp_pci.sys / kp_xxx.sys) をビルドするには以下のステッ プを実行します: i. Kernel PlugIn プロジェクト (kp_pci.dsp/vcproj / kp_xxx.dsp/vcproj) をアクティブ なプロジェクトとして設定します。 ii. 対象のプラットフォーム用のアクティブな構成を選択します: [ビルド] メ ニューから [アクティブな構成の設定 …] を選択し、使用する構成を選択し ます。 注意: アクティブな設定は、ビルドするドライバのターゲットの OS と対応してい る必要があります。たとえば、Windows 2000 の場合、Win32 win2k free (リリース モード) または Win32 win2k checked (デバッグ モード) のどちらかを選択します。 145 W I N D R I V E R ユ ー ザ ー ズ iii. ガ イ ド ドライバをビルドします。F7 キーを押すか、[Build] メニューから実行して ください。 c Kernel PlugIn ドライバを実行するユーザーモード アプリケーションをビルドする には、以下のステップを実行します (pci_diag.exe / xxx_diag.exe): i. ユーザーモード プロジェクト (pci_diag.dsp/vcproj / xxx_diag.dsp/vcproj) をアク ティブなプロジェクトとして設定します。 ii. アプリケーションをビルドします: F7 キーを押すか、[ビルド] メニューから 実行します。 注意: Windows 98/Me では、生成されたコードを上記で説明した方法では、SYS ドライ バをビルドできません。ただし、Windows NT/2000/XP/Server 2003 で Windows 98/Me プ ラットフォームをターゲットとして SYS ドライバをビルドできます – つまり、 Windows NT/2K/XP/Server 2003 が起動する PC でコードをビルドします。しかし、 Windows 98/Me DDK の場所を示すように BASEDIR 環境変数を設定し、Windows 98/Me 用に Kernel PlugIn プロジェクトでビルド ターゲットを設定し、Windows 98/Me で生成 されたドライバを使用します。 12.7.2 Linux でのコンパイル 1. Shell ターミナルを開きます。 2. Kernel PlugIn モジュールのソースコードを生成したディレクトリに移動します。 (例: /home/user/WinDriver/wizard/my_projects) cd /home/user/WinDriver/wizard/my_projects/ 3. Kernel PlugIn の makefile のディレクトリに移動します。 cd kerplug 4. configure スクリプトを使用して、makefile を生成します。 注意: configure スクリプトは、起動してるカーネルをベースとしたカーネル独自の makefile を作成します。configure スクリプトに-with-kernel-source=<path> フラ グを追加することによって、インストールした他のカーネル ソースをベースとした configure スクリプトを起動できます。<path> には、カーネル ソースのディレクトリへの振 るパスを指定します。 5. 6. モジュールをビルドします。“make” コマンドを使用します。 サンプル ユーザーモード診断アプリケーションの makefile のあるディレクトリに移動し ます。 cd ../../linux 7. 146 サンプル診断プログラムをコンパイルします。 “make” コマンドを使用します。 第 12.7.3 1 2 章 K E R N E L P L U G I N の 作 成 Solaris でのコンパイル 注意: WinDriver は、GNU make ユーティリティ用にのみ makefiles を生成します。 GNU make ではなく、標準的な make ユーティリティを使用する場合、WinDriver が生成する makefile を修正する必要があります。http://www.sunfreeware.com から GNU make パッケージを入手できます。 1. Shell ターミナルを開きます。 2. Kernel PlugIn モジュールのソースコードを生成したディレクトリに移動します。 (例: /home/user/WinDriver/wizard/my_projects) cd /home/user/WinDriver/wizard/my_projects 3. Kernel PlugIn の makefile のディレクトリに移動します。 cd kerplug/solaris 4. モジュールをビルドします。“make” コマンドを使用します。 5. サンプル ユーザーモード診断アプリケーションの makefile のあるディレクトリに移動しま す。 cd ../../solaris 6. サンプル診断プログラムをコンパイルします。コマンド “make” を使用します。 注意: 64 ビット カーネルの場合、Kernel PlugIn モジュールおよびユーザーモード アプリケーションの 両方共に 64 ビット モードでコンパイルする必要があります。WinDriver で提供される makefile は、特 別な宣言をせずに CC および LD 環境変数を使用します。したがって、ご使用のコンパイラおよびリン カに対応する独自のフラグに合うように、これらの変数を設定する必要がある場合があります。 たとえば、gcc でコンパイルする場合には、CC および LD 変数を以下のように設定する必要がありま す: Kernel PlugIn モジュールのコンパイルの場合: \ $ export LD="gcc -m64 -melf64_sparc -nostdlib" \ $ export CC="gcc -m64 -isystem /usr/include/" ユーザーモード アプリケーションのコンパイルの場合: \ $ export LD="gcc -m64" \ $ export CC="gcc -m64" 12.8 Kernel PlugIn ドライバのインストール 12.8.1 1. Win32 プラットフォームの場合 ファイルをコピーします。 147 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド Winows 98 / Me / NT / 2000 / XP / Server 2003: 作成された MyDrv.SYS ドライ バを \ %windir% \ system32\drivers ディレクトリ (Win NT / 2000 の場合 c:\ %winnt% \ system32\drivers、Win XP / Server 2003 の場合 C:\Windows\system32\drivers) にコピーします。 注意: Kernel PlugIn ドライバを Windows 98/Me 用に開発する場合、Windows NT/2000/XP/Server 2003 ホスト PC でドライバを開発してください (セクション [12.7] の注意を参照してくださ い)。 2. Windows NT/2000/XP/Server 2003 の場合、wdreg.exe (または wdreg_gui.exe) ユーティリティ を使用して、以下のようにドライバを登録またはロードします。Windows 98/Me の場合、 wdreg16.exe ユーティリティを使用します: 注意: • 下記の手順では、.sys 拡張子のない、”KP_NAME” は Kernel PlugIn ドライバの名前を 表しています。 • Windows 98 / Me の場合、”wdreg” の文字列を “wdreg16” に置き換えます。WDREG ユー ティリティに関する詳細は [13.2.2] を参照してください。 SYS ドライバのインストール \WinDriver\util> wdreg -name KP_NAME install 注意: Windows 98 / Me 上の SYS ドライバの例外では、Kernel PlugIn ドライバは動的にロードできま す。そのため、ロード時にリブートする必要はありません。 12.8.2 1. Linux の場合 モジュールのディレクトリに作成されたドライバをコピーします。 kptest/kermode/LINUX# cp kptest_module.o /lib/modules/misc/ 2. カーネルにモジュールを挿入します。 kptest/LINUX# /sbin/insmod kptest_module 12.8.3 Solaris の場合 Kernel PlugIn ドライバのインストールは、root でログインするか、root 権限を持つユーザー (super user) に なってシステム管理者となって実行してください。 1. ドライバ ディレクトリに作成されたドライバをコピーします。 kptest/SOLARIS# cp kptest /kernel/drv/sparcv9 (64 ビット プラットフォームの場合) kptest/SOLARIS# cp kptest /kernel/drv (32 ビット プラットフォームの場合) 2. このファイルをドライバ ディレクトリにコピーします。 kptest# cp kptest.conf /kernel/drv 3. ドライバをインストールします。 kptest/SOLARIS# add_drv kptest 148 第 1 2 章 K E R N E L P L U G I N の 作 成 注意: その他、便利なコマンドを紹介します: • modinfo – ロードしてるカーネル モジュールの一覧を表示 • rem_drv – カーネル モジュールを削除 149 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 第 13 章 ドライバの動的ロード 13.1 なぜ動的にロード可能なドライバが必要なのか 新しいドライバを追加した際に、システムにドライバをロードするには、システムを再起動する必要 がある場合があります。WinDriver は動的にロード可能なドライバなので、ドライバをインストール後、 システムの再起動をせずに直ぐにアプリケーションを使用できます。ユーザーモード ドライバまたは カーネルモード ドライバのどちらを作成しても、動的にドライバをロードできます。 注意: ドライバのアンロードを行うには、WinDriver アプリケーション、Kernel PlugIn、INF ファイルを 使用して WinDriver へ登録されたプラグ アンド プレイ デバイスのハンドルが開いていないことを確認 してください。 13.2 Windows NT / 2000 / XP / Server 2003 および 98 / Me 13.2.1 Windows ドライバの種類 Windows ドライバを以下のいずれの種類としても実装することができます。両方とも wdreg ユーティ リティに対応してます: • WDM (Windows Driver Model) ドライバ: Win 98 / Me / 2000 / XP / Server 2003 上で .sys 拡張子のファ イル。たとえば、windrvr6.sys。WDM ドライバは、INF ファイルをインストールすることによっ てインストールされます。 • 非 WDM / レガシー ドライバ: 非 プラグ アンド プレイ Windows OS (Windows NT4.0) 用のドライ バ、Windows 98/Me の .vxd 拡張子のファイルおよびすべての Kernel PlugIn ドライバ ファイル (つ まり、 windrvr6.vxd ; MyKPDriver.sys) が含まれます。 WinDriver USB Windows カーネル モジュール - windrvr6.sys – は、フル WDM ドライバです。下記のセク ションで説明しますが、wdreg ユーティリティを使用してインストールできます。 注意: WinDriver のバージョン 6.21 以降 より .vxd ドライバはサポートされていません。 13.2.2 WDREG ユーティリティ WinDriver には、動的にドライバをロードおよびアンロードするユーティリティがあるので、Windows のデバイス マネージャーによる手動の作業を行いません (デバイスの INF には使用します)。Windows 150 第 1 3 章 ド ラ イ バ の 動 的 ロ ー ド 2000 / XP / Server 2003 の場合、このユーティリティを wdreg と wdreg_gui という 2 つの形態で提供して います。これらのユーティリティは \WinDriver\util\ ディレクトリにあり、コマンドラインから実行で き、同じ機能を持っています。これらファイルの違いとしては、wdreg_gui は、インストールメッセー ジをグラフィカルに表示し、wdreg はコンソール モードのメッセージを表示します。 Windows 98 / Me の場合、wdreg16 ユーティリティを提供します。 ここでは、Windows オペレーティング システムの wdreg / wdreg_gui / wdreg16 の使用方法を説明します。 注意: wdreg に関しては、以下のサンプルと説明を参照してください。Windows 2000 / XP / Server 2003 の 場合、wdreg の文字列を wdreg_gui に置き換えられます。Windows 98 / Me の場合、wdreg を wdreg16 に 置き換えてください。 注意: Windows 98 / Me では、wdreg16 のみを使用して、windrvr6.inf をインストールして、WDM サービ ス windrv6.sys および Kernel PlugIn ドライバをインストールします。しかし、他のいかなる INF ファイ ルをインストールするのに wdreg16 を使用することはできません。 非 WDM ドライバ (Windows NT 4.0 の windrvr6.sys および Kernel PlugIn ドライバ) このセクションでは、wdreg ユーティリティを使用して 非 WDM ドライバ (Windows NT4.0 上での windrvr6.sys および Windows 98/Me/NT/2000/XP/Server 2003 上での Kernel PlugIng ドライバ) をインストー ルする方法を説明します。 使用法: WDREG [-file <ファイル名>] [-name <ドライバ名>] [-startup <level>] [-silent] [-log <ログファイル>] Action [Action ...] • オプション wdreg は次の基本 OPTION をサポートします: [-startup]: ドライバを開始するときに指定します。以下の引数の 1 つが必要となります。 • boot: オペレーティング システムのローダーで開始されるドライバを表示します。そ して、OS (たとえば、Atdisk) をロードする必要のあるドライバにのみ使用されます。 • system: OS の初期化中に開始されたドライバを表示します。 • automatic: システムが起動中に Service Control Manager によって開始されたドライバ を表示します。 • demand: 要求に応じて Service Control Manager によって開始されたドライバを表示しま す。(ドライバをプラグインした場合など) • disabled: 開始されないドライバを表示します。 注意: デフォルトでは、−statup オプションは自動的に設定されています。 [-name] - Kernel PlugIn を使用している場合のみ関連があります (デフォルトでは、wdreg コ マンドは windrvr6 サービスに関連しています)。ドライバのシンボリック名を設定します。こ の名前はユーザーモード アプリケーションがドライバを処理するのに使用します。このオプ ションの引数として、ドライバのシンボリック名 (*.sys 拡張子なし) を引数に設定します。引 151 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 数は KernelPlugIn プロジェクトにある KP_Init() [A.13.1] 関数内で設定するドライバ名と同じ 必要があります。strcpy (kpInit->cDriverName , XX_DRIVER_NAME) [-file] - Kernel PlugIn を使用している場合のみ関連があります。wdreg を使用して物理 ファイル名と異なる名前でレジストリにドライバをインストールできます。このオプション にはドライバのファイル名が引数として必要です (*.sys 拡張子なし)。 wwdreg は Windows のインストール ディレクトリ (<WINDIR>\system32\drivers) を検索 します。従ってドライバをインストールする前に関連ディレクトリにドライバ ファイルが検 出できることを確認する必要があります。 使用法: \> WDREG -name <新しいドライバ名> -file <オリジナルのドライバ名> install [-silent] - いかなるメッセージも表示しません。 [-log <ログファイル>] - 指定したファイルに全てのメッセージを記録します。 • アクション wdreg は、次の基本アクションをサポートします: [create] – ドライバをレジストリに追加することにより、次に Windows を起動する際 にロードするようにします。 [delete] – 次に起動する際にロードしないように レジストリからドライバを削除しま す。 [start] – ドライバを動的にロードします。ドライバを start する前に create する必要が あります。 [stop] – メモリからドライバを動的にアンロードします。 注意: windrvr6.sys サービスを正常に終了させるには、初めに、このサービスへのハンド ルを開いているものをすべて閉じてください (開いている WinDriver アプリケーション を閉じます)。ハンドルが開いている状態でサービスを停止しようとした場合、wdreg が 関連エラーメッセージを表示します。 • ショートカット wdreg には次の便利なショートカットが用意されています: [install] – ドライバを作成し、開始します。 これは、初めに wdreg stop アクションを使用して、wdreg start アクションを使用するのと 同様です (古いバージョンのドライバが存在する場合)。 または、wdreg create アクションを使用して、wdreg start アクションを使用するのと同様 です (その他の場合)。 [uninstall] – 次の起動時にロードしないように、メモリからドライバをアンロード し、レジストリからドライバを削除します。 152 第 1 3 章 ド ラ イ バ の 動 的 ロ ー ド これは、初めに wdreg stop アクションを使用し、wdreg delete アクションを使用するのと 同様です。 注意: WinDriver のサービスを正常に終了するには、windrvr6.sys ドライバ (WinDriver アプ リケーションなど) へのハンドルが開いていないことを確認してください。このこ とは、install および uninstall のショートカットにも当てはまります。WinDriver のサー ビスを停止するコマンドが含まれています。Windrvr6.sys へのハンドルが開いている 状態でサービスを停止しようとした場合、wdreg が関連エラーメッセージを表示し ます。 WDM ドライバ (Windows 98 / Me / 2000 / XP / Server 2003 の windrvr6.sys) このセクションでは、wdreg ユーティリティを使用して、Windows 98/Me/2000/XP/Server 2003 で WDM windrvr6.sys ドライバをインストールする方法、または Windows 2000/XP/Server 2003 でプラグ アンド プ レイのデバイス (PCI または PCMCIA など) および USB デバイスをwindrvr6.sys ドライバと動作するよ うに登録する INF ファイルのインストール方法を解説します。 注意: (1) 上記の指定のように、Windows 98 / Me では、wdreg16 を使用して、windrvr6.inf をインストール して、windrvr6.sys WDM サービスをインストールします。しかし、wdreg16 を使用して、他の いかなる INF ファイルもインストールできません。 (2) Kernel PlugIn ドライバは、WDM ドライバではなく、かつ INF からインストールされてい ないので、この節の説明には当てはまりません。- Windows 98/Me/NT/2000/XP/Server 2003 で、wdreg を使用して Kernel PlugIn ドライバのインストール方法に関しては、上記のセク ション [13.2.2] を参照してください。 使用法:以下で紹介するように、wdreg ユーティリティを二通りの方法で使用できます: 1. WDREG -inf <ファイル名> [-silent] [-log <ログファイル>] [install | uninstall | enable | disable] 2. • wdreg -rescan <enumerator> [-silent] [-log <ログファイル>] オプション wdreg は次の基本オプションをサポートします: [-inf] – 動的にインストールされる INF ファイルへのパス。 [-rescan <enumerator>] - ハードウェアが変更した場合に、enumerator (ROOT、ACPI、 PCI、USB など) を再スキャンします。一つの enumerator のみ指定できます。 [-silent] – いかなるメッセージも表示しません。(オプション) [-log <ログファイル>] - 指定したファイルに全てのメッセージを記録します。(オプ ション) 153 W I N D R I V E R • ユ ー ザ ー ズ ガ イ ド アクション wdreg は、次の基本アクションをサポートします: [install] - inf ファイルをインルトールし、対象の場所へファイルをコピーし、古い バージョンと置き換えることによって inf ファイル名で指定したドライバを動的にロー ドします (必要な場合)。 [uninstall] - 次に起動する際にロードしないように レジストリからドライバを削 除します。 [enable] - ドライバを有効にします。 [disable] - ドライバを無効にします。動的にドライバをアンロードするが、システ ムが起動後、ドライバはリロードします。 注意: WinDriver を正常に無効 / アンインストールするには、初めに、windrvr6.sys サー ビスへのハンドルを開いているものをすべて閉じてください (開いている WinDriver ア プリケーションを閉じます windrvr6.sys サービスと一緒に動作するように登録されてい る PCI / USB デバイスを全てアンインストールします (または、デバイスを削除します))。 windrvr6.sys サービスへのハンドルが開いている状態でサービスを停止しようとした場 合、wdreg が関連エラーメッセージを表示します。そして、開いているハンドルを閉じ て再試行するか、キャンセルして PC を再起動してコマンドを終了するか、選択できま す。 13.2.3 windrvr6.sys INF ファイルの動的ロード / アンロード WinDriver を使用する場合、汎用ドライバである windrvr6.sys (WinDriver のカーネル モード) を使用 してハードウェアにアクセスしてコントロールするユーザーモード アプリケーションを開発しま す。従ってドライバ windrvr6.sys を動的にロード / アンロードするのに、wdreg を使用できます。ま た、WDM 互換の OS 上ではプラグ アンド プレイ デバイス用の INFファイルを動的にロードする必 要があります。Windows 2000 / XP / Server 2003 上では、wdreg で自動的に動的ロードします。ここ では、wdreg の実装例と詳細について説明します。 実装例: • Windows NT 上で windrvr6.sys を開始するには: \> wdreg install 下記のコマンドと同じです。 \> wdreg create start • Windows 98 / Me / 2000 / XP / Server 2003 上で windrvr6.sys を開始するには: \> wdreg –inf [windrvr6.inf へのパス] install windrvr6.inf ファイルをロードし、windrvr6.sys サービスを開始します。 • Windows 2000 / XP / Server 2003 上で C:\temp ディレクトリにある device.inf と言う名の INF ファイルをロードするには: \> wdreg –inf c:\tmp\device.inf install 154 第 1 3 章 ド ラ イ バ の 動 的 ロ ー ド ドライバ/INF ファイルをアンロードするには、同じコマンドを使用しますが、上記の例で、”install” パ ラメータを “uninstall” に置き換えます。 13.2.4 Kernel PlugIn ドライバを動的にロード / アンロード WinDriver を使用して Kernel PlugIn ドライバを作成した場合は、WinDriver の汎用ドライバ windrvr6.sys をロードした後に、Kernel PlugIn をロードする必要があります。 ドライバをアンインストールする際には、windrvr6.sys をアンロードする前に Kernel PlugIn ドライバを アンロードする必要があります。 注意: Windows 98/ME では、Kernel PlugIn を動的にロードしないので、初期ロード後に再起動する必要 があります。その他の Windows プラットフォームでは、Kernel PlugIn を動的にロードするので、再起 動する必要はありません。 Kernel PlugIn ドライバ ([ドライバ名].sys) をロード / アンロードするには、上記の windrvr6.sys の説明の ように、”name” フラグ (Kernel PlugIn ドライバの名前を追加した後) をつけて、wdreg コマンドを使用し ます。 注意:ドライバ名に拡張子 *.sys を追加しないで下さい。 実装例: • KPTest.sys と呼ばれる KrenelPlugin ドライバをロードするには \> wdreg -name KPTest install • MPEG_Encoder と呼ばれる Kernel PlugIn ドライバを MPEGENC.sys とロードするには \> wdreg -name MPEG_Encoder -file MPEGENC install • KPTest.sys と呼ばれる KernelPlugIn ドライバをアインストール \> wdreg -name KPTest uninstall • MPEG_Encoder と呼ばれる KernelPlugIn ドライバと MPEGENC.sys ファイルをアインス トール \> wdreg -name MPEG_Encoder -file MPEGENC uninstall 13.3 Linux Linux で WinDriver を動的にロードするには /sbin$ insmod –f /lib/modules/misc/windrvr6.o WinDriver を動的にアンロードするには /sbin$ rmmod windrvr6 また、Linux に windriver6.o をインストール (ロード) するには、wdreg スクリプトを使用する ことができます。 サンプル使用例: ドライバのロード \> wdreg <ドライバ名.拡張子> 155 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 13.4 Solaris 初期インストール後、Solaris で WinDriver を動的にロードするには /usr/sbin$ add_drv windrvr6 WinDriver を動的にアンロードするには /usr/sbin$ rem_drv windrvr6 156 第 1 4 章 ド ラ イ バ の 配 布 第 14 章 ドライバの配布 この章は、ドライバ開発の最終段階です。ドライバの配布方法を紹介します。 注意: Windows 2000 / XP / Server 2003 の場合、この章の説明の “wdreg” と記述している個所を “wdreg_gui” に置き換えることができます。同じ機能ですが、コンソール モード メッセージの代わりに GUI メッ セージが表示されます。 Windows 98 / Me の場合、この章の説明の “wdreg” と記述している個所を “wdreg16” に置き換えてくださ い。詳細は、wdreg ユーティリティの説明、第 13 章を参照してください。 14.1 WinDriver の有効なライセンスを取得するには WinDriver ライセンスを取得するには、添付の申込用紙または \WinDriver\docs ディレクトリ にある申込 用紙 (order.txt) を使用します。必要事項をご記入の上、FAX および電子メールでエクセルソフト株式会 社までご返送ください。Registered 版 (登録版) の WinDriver を開発に使用するマシンにインストールす るには、および評価版で開発したドライバコードを有効にするには、セクション 4.2 で記述されている インストール手順に従ってください。 14.2 Windows 98 / Me および 2000 / XP / Server 2003 の 場合 作成したドライバを配布するには、いくつかのステップを行う必要があります。まずドライバをター ゲット システムにインストールする配布パッケージを作成します。次に、ターゲット マシンにドライ バをインストールします。このプロセスは windrvr6.sys と windrvr6.inf 、デバイス用 (プラグ アンド プレイ ハードウェア – PCI / USB 用) の INF ファイル、Kernel PlugIn ドライバ (作成した場合) を インストールします。最後に WinDriver で開発したハードウェア コントロールアプリケーション を インストールして実行します。これら全ての手順は、wdreg ユーティリティで行えます。 注意: このセクションでは SYS ファイルの配布について説明しています。WinDriver のバージョン 6.21 以降より .vxd ドライバはサポートされていません。 157 W I N D R I V E R 14.2.1 ユ ー ザ ー ズ ガ イ ド 配布パッケージの用意 配布するパッケージには、次のファイルを含めます。 ハードウェア コントロール アプリケーション / DLL。 windrvr6.sys (\WinDriver\redist ディレクトリにあります)。 windrvr6.inf (\WinDriver\redist ディレクトリにあります)。 wd_utils.dll (\WinDriver\redist ディレクトリにあります。ターゲット マシン の %windir%\system32 ディレクトリにコピーします)。 デバイス用の INF ファイル (PCI / USB デバイスには必要です)。DriverWizard でこのファイル を生成します。詳細は、セクション 5.2 を参照してください。 Kernel PlugIn ドライバ - <KD ドライバ名>.sys − (作成した場合) 14.2.2 ターゲット コンピュータにドライバをインストール 注意: ドライバをターゲット コンピュータにインストールするにはターゲット コンピュータの管理者 権限が必要です。 以下の手順に従い、ターゲットコンピュータにドライバをインストールします。 インストールの前に − システムの再起動を防ぐには、windrvr6.sys サービスへのハンドルを開いていないこ とをドライバのインストール前に確認します。この手順で、このサービスを使用し ているアプリケーションがない、および windrvr6.sys と動作するように登録されてい る PCI / USB デバイスへの接続がないことを確認します。つまり、この時点で、PC に 接続してる PCI / USB デバイスで、このドライバと動作するようにインストールさ れた INF ファイル はなく、またはファイルはインストールされているが、デバイス は無効です。たとえば、古い WinDriver のバージョンで開発したドライバをアップ グレードする際に、この処理が必要になります (バージョン 6.0 以降では、以前の バージョンで使用していたモジュール名が異なります)。 このため、デバイス マネージャから WinDriver と動作するように登録されたすべて の PCI / USB ドライバを無効またはアンインストールするか (Win 98 / Me では、[プ ロパティ] – [アンインストール] または [削除])、もしくは PC からデバイスを切断し ます。この処理をしない場合、wdreg を使用している新しいドライバのインストー ルを試みると、WinDriver で動作するように登録されているすべてのデバイスをアン インストールするか、あるいはインストール コマンドを正常に実行するために PC を再起動するようにと言うメッセージが表示されます。 − Windows 2000 の場合、Windows 2000 の INF 選択アルゴリズムのため、ターゲット コンピュータに古いバージョンの WinDriver で開発された PCI / USB ドライバが存 在する場合、Windows / WinDriver が WinDriver で処理する PCI / USB デバイス用に作 成した古い INF ファイルをすべて削除するのを推奨します。もしくは、インストー 158 第 1 4 章 ド ラ イ バ の 配 布 ルする古い INF ファイルを、古いバージョンの WinDriver で有効にしてください (詳 細は、セクション 14.4 を参照してください)。これらのファイルは “oem*.inf” (例、 oem1.inf) と言う名前で、\%windir%\inf ディレクトリに保存されます。INF ディレク トリで、デバイスのベンダー ID とデバイス / プロダクト ID でデバイスの関連ファ イルを検索することもできます。 WinDriver のカーネルモ ジュールのインストール: 1. windrvr6.sys と windrvr6.inf ファイルを同じディレクトリにコピーします。 2. wdreg / wdreg16 ユーティリティを使用して、ターゲット コンピュータに WinDriver のカーネル モジュールをインストールします。 Windows 2000 / XP / Server 2003 では、コマンド ラインから以下のように入力し ます: \> wdreg -inf <windrvr6.inf のパス> install Windows 98 / Me では、コマンド ラインから以下のように入力します: \> wdreg16 -inf <windrvr6.inf のパス> install たとえば、windrvr6.inf および windrvr6.inf をターゲット コンピュータの d:\MyDevice\ ディレクトリにある場合、以下のようになります: \> wdreg -inf d:\MyDevice\windrvr6.inf install WinDriver ツールキットの \WinDriver\util ディレクトリ以下に wdreg ユーティリ ティがあります。このユーティリティの一般的な説明および使用方法に関して は、第 13 章を参照してください。 注意: wdreg は対話型のユーティリティです。問題があるとメッセージを表示し て問題を解決する方法を示します。場合によってはコンピュータの再起動を指 示します。wdreg は対話型のユーティリティです。 注意: ドライバの配布時に、新しいバージョンの windrvr6.sys を Windows ドライ バ ディレクトリ (%windir%\system32\driver) の古いバージョンのファイルで上書 きしないようにご注意ください。インストール プログラムまたは INF ファイル でインストーラが自動的にタイム スタンプを比較して新しいバージョンを古 いバージョンで上書きしないように設定することを推奨いたします。 対象のデバイスの INF ファイルをインストールする (windrvr6.sys と動作するように登録した Plug and Play デバイス) • Windows 2000 / XP / Server 2003: wdreg ユーティリティを使用して、自動的に INF ファイ ルをロードします。 Windows 2000 / XP / Server 2003 で対象の INF ファイルを自動的にインストールし Windows デバイス マネージャーを更新するには、以下のように wdreg を起動して、 install コマンドを実行します: \> wdreg -inf <対象の INF ファイルのパス> install 159 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 注意: Windows 2000 では、対象のデバイスの INF ファイルを以前にインストールした 場合 (WinDriver の以前のバージョンで使用した Plug and Play で動作するようにデバイ スを登録)、作成した新しい INF ファイルをインストールする前に %windir%\inf ディレ クトリからデバイスの INF ファイルをすべて削除します。このプロセスで、Windows が 自動的に使用していないファイルを検出したりインストールしたりするのを防ぎま す。INF ディレクトリで、デバイスのベンダー ID とデバイス / プロダクト ID でデバイ スの関連ファイルを検索することもできます。 • Windows 98 / Me: 下記のセクション 14.4 を参考に、Windows の [新しいハードウェアの 追加ウィザード] または [デバイス ドライバの更新ウィザード] を使用して、手動で INF ファイルをインストールします。 14.2.3 ターゲット コンピュータに Kernel PlugIn をインストール 注意: ドライバをターゲット コンピュータにインストールするにはターゲット コンピュータの管理者 権限が必要です。 Kernel PlugIn ドライバを作成した場合、以下の手順に従ってください。 1. Kernel PlugIn ドライバ ([KP ドライバ名].sys) をターゲット コンピュータの Windows drivers ディレクトリにコピーします (%windir%\system32\drivers)。 2. wdreg ユーティリティを使用して、Windows の起動時にデバイス ドライバのリストに Kernel PlugIn ドライバを追加します。次のコマンドを使用します。 − SYS Kernel PlugIn ドライバをインストールする場合: \> wdreg -name [ドライバ名 (sys 拡張子は付けません)] install wdreg の実行ファイルは、\WinDriver\util ディレクトリにあります。このユーティリティ の説明と使用方法は、第 13 章を参照してください (特に、セクション 13.2.4 の「Kernel PlugIn のインストール」を参照してください) 。 14.3 Windows NT 4.0 の場合 注意: Windows 98 / Me の場合、このセクションでは、windrvr6.vxd ファイルのみの配布の説明をします。 windrvr6.sys をインストールする場合には、上記のセクション 14.2 の Windows 98 / Me および 2000 / XP / Server 2003 のインストール手順に従ってください。 作成したドライバを配布するには、いくつかのステップを行う必要があります。まずドライバをター ゲット コンピュータにインストールする配布パッケージを作成します。次に、WinDriver の汎用ドライ バ (windrvr6.sys) をインストールします。Kernel PlugIn ドライバを作成した場合、同様にターゲット コン ピュータにインストールします。最後に、WinDriver で開発したハードウェア コントロール アプリケー ションをターゲット コンピュータにインストールして実行します。詳細は以下の手順に従ってくださ い。 160 第 1 4 章 14.3.1 ド ラ イ バ の 配 布 配布パッケージの用意 配布パッケージには、以下のファイルが含まれます。 − ハードウェア コントロール アプリケーション / DLL − Windows NT 用の windrvr6.sys (\WinDriver\redist ディレクトリにあります)。 − wd_utils.dll (\WinDriver\redist ディレクトリにあります。ターゲット コンピュータ の %windir%\system32 ディレクトリにコピーします)。 − 14.3.2 Kernel PlugIn ドライバ - <ドライバ名>.sys - (作成した場合)。 ターゲットコンピュータにドライバをインストール 注意:ドライバをターゲット コンピュータにインストールするにはターゲット コンピュータの管理者 権限が必要です。 以下の手順に従い、ターゲット コンピュータにドライバをインストールします。 1. windrvr6.sys のハンドルを開いていないことを確認します。 2. windrvr6.sys ファイルをターゲット コンピュータの Windows インストール ディレク トリにコピーします (%windir%\system32\drivers)。 3. wdreg ユーティリティを使用して、Windows が起動時にロードするデバイスドライ バのリストに windrvr6.sys を追加します。 − 次のインストール コマンドを入力します: \> wdreg install wdreg の実行ファイルは、\WinDriver\util ディレクトリ以下にあります。ユーティリティ の説明および使い方は、第 13 章を参照してください。 14.3.3 ターゲットコンピュータに Kernel PlugIn をインストール 注意: ドライバをターゲット コンピュータにインストールするにはターゲット コンピュータの管理者 権限が必要です。 Kernel PlugIn ドライバを作成した場合、以下の手順に従ってください。 1. Kernel PlugIn ドライバ ([ドライバ名].sys) をターゲット コンピュータの Windows drivers インストール ディレクトリ (%windir%\system32\drivers) にコピーしてくださ い。 注意: ドライバの配布時に、新しいバージョンの windrvr6.sys を Windows ドライバ ディレクトリ (windrvr6.vxd の %windir%\system32\drivers) の古いバージョンのファイ ルで上書きしないようにご注意ください。インストール プログラムでインストーラ 161 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド が自動的にタイム スタンプを比較して新しいバージョンを古いバージョンで上書 きしないように設定することを推奨いたします。 2. wdreg ユーティリティを使用して、Windows が起動時にロードするデバイス ドライ バ リストに Kernel PlugIn ドライバを追加します。 − 次のインストール コマンドを入力します: \> wdreg -name [ドライバ名] install wdreg の実行ファイルは、\WinDriver\util ディレクトリ以下にあります。ユーティリティ の説明をおよび使い方は、第 13 章を参照してください。 14.4 INF ファイルを作成する デバイス情報ファイル (INF) は、Windows 98 / Me / 2000 / XP / Server 2003 で「プラグアンドプレイ」機 能で使用される情報を提供するテキスト ファイルです。このファイルを使用して、ハードウェア デバ イスをサポートするためのソフトウェアをインストールします。INF ファイルは、USB や PCI などの ハードウェアを識別するために必要です。INF ファイルには、デバイスとインストールするファイル に関する情報がすべて含まれています。ハードウェア メーカーは新製品を提供するとき、各クラスの デバイス用に要求されるリソースとファイルを明確に定義するため、INF ファイルを作成する必要が あります。 場合によっては、指定したデバイスの INF ファイルは、オペレーティング システムが提供する INF ファ イルに含まれることがあります。それ以外の場合は、あなたのデバイス用に INF ファイルを作成する 必要があります。DriverWizard は、あなたのカード / デバイス用の INF ファイルを生成できます。選択 されたデバイスが WinDriver によって処理されることを OS に通知するために、INF ファイルは使用さ れます。 USB デバイスの場合、windrvr6.sys と動作するようにデバイスを初めに登録しないと、WinDriver (DriverWizard から、またはコードからのいずれか) でデバイスにアクセスできません。デバイスの INF ファイルをインストールを行うことでデバイスを登録します。DriverWizard はデバイスの INF ファイル を自動的に生成する機能を持っています。 DriverWizard を使用して、開発マシン上で INF ファイルを生成できます (詳細はセクション 5.2 を参照 してください)。そして、ドライバを配布するどのマシンにも INF ファイルをインストールします (下 記で説明)。 14.4.1 なぜ INF ファイルを作成する必要があるのか DriverWizard で USB デバイスへアクセスするため。 起動時に Windows オペレーティング システムの [新規ハードウェアの検出ウィザード] が表 示されるのを停止するため。 Windows 98 / Me / 2000 / XP / Server 2003 上で OS が PCI 設定レジスタを初期化するのを確認す るため。 162 第 1 4 章 ド ラ イ バ の 配 布 OS が USB デバイスに物理アドレスを割り当てるのを確認するため。 デバイスの新しいドライバをロードするため。プラグ アンド プレイ システムでインストー ルするハードウェアのドライバを新規作成するときはいつでも INF ファイルの作成が必要で す。 既存のドライバを新規のものに置き換えるため。 14.4.2 ドライバがないときに INF ファイルをインストールするには 注意: Windows 98 / Me /2000 / XP / Server 2003 で INF ファイルをインストールするには管理者権限が必 要です。 Windows 2000 / XP / Server 2003 の場合 Windows 2000 / XP / Server 2003 上では、install コマンドで wdreg ユーティリティを使用して、 INF ファイルを自動的にインストールします。 \> wdreg -inf <INF ファイルのパス> install 詳細は、セクション 13.2.2 を参照してください。 開発環境 PC で、DriverWIzard で INF ファイルを作成する際に、DriverWizard の [INF generation] ウィンドウで、[Automatically Install the INF file] オプションのチェックをオンにすることによっ て、自動的に INF ファイルをインストールできます (セクション 5.2 を参照してください)。 次の方法の何れかを使用して、Windows 2000 / XP / Server 2003 上に手動で INF ファイルをイン ストールすることもできます。 • Windows の [新しいハードウェアの検出] ウィザード: デバイスを接続時、またはデバイスを接続した状態で、デバイス マネージャがハード ウェアの変更をスキャンしたときにこのウィザードは有効になります。 • Windows [ハードウェアの追加 / 削除 ウィザード]: マイ コンピュータを右クリックして [プロパティ] を選択します。そして [ハードウェ ア] タブを選択して [ハードウェア ウィザード] をクリックします。 • Windows [デバイス ドライバの更新 ウィザード]: デバイス マネージャからデバイスを選択して [プロパティ] を選択し、[ドライバ] タブ を選択します。[ドライバの更新] をクリックします。Windows XP および Windows Server 2003 の場合、[プロパティ] から直接 [ドライバの更新] を選択できます。 手動でのインストール方法では、インストール中に正しい INF ファイルの場所を設定する必 要があります。 手動でインストールするのではなく、wdreg ユーティリティを使用して、自動的に INF ファ イルをインストールすることを推奨いたします。 163 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド Windows 98 / Me の場合 Windows 98 / Me では、手動で PCI / USB デバイスの INF ファイルをインストールする必要が あります。[ハードウェアの追加 ウィザード] または [デバイス ドライバの更新 ウィザード] を 使用します。 • Windows [新しいハードウェアの追加ウィザード]: 注意: インストール済みのデバイスのドライバが他にない場合、または初めにデバイ スのドライバをアンインストール (削除) する場合、この方法を使用します。それ以外 の場合、Windows [新しいハードウェアの検出ウィザード] ([新しいハードウェアの追加 ウィザード] を有効) は、このデバイスには表示されません。 1. Windows [新しいハードウェアの追加ウィザード] を有効にするには、コン ピュータにハードウェア デバイスを装着するか、デバイスが既に装着済み の場合、ハードウェアの変更をスキャンします。 2. Windows [新しいハードウェアの追加ウィザード]を表示するには、次の指示 に従ってください。必要に応じて、配布するパッケージの INF ファイルの 場所を指定します。 • Windows [デバイス ドライバの更新ウィザード]: 1. Windows の [デバイス マネージャ] を開く: [システム] の [プロパティ] ウィンドウ ([マイ コンピュータ] を右クリックして、[プロパティ] を選択) から [デバイス マ ネージャ] タブを選択します。 2. [デバース マネージャ] のデバイス リストからデバイスを選択して、開いて、[ド ライバ] タブを選択して、[ドライバの更新] ボタンをクリックします。デバイス マ ネージャでデバイスの場所を特定するには、[表示] メニューで [デバイス (接続 別)] を選択します。PCI デバイスの場合、標準 PC | PCI バス | デバイスを表示しま す。USB デバイスの場合、標準 PC | PCI バス | USB ユニバーサル ホスト コント ローラ (または OHCI / EHCI など使用している他のコントローラ) への PCI | USB ルート ハブ | デバイス を表示します。 3. [デバイス ドライバの更新ウィザード] の指示に従って開きます。必要な場合、配 布パッケージの INF ファイルの場所を指定します。 14.4.3 INF ファイルを使用して既存のドライバを置き換えるには 注意: Windows 98 / Me /2000 / XP / Server 2003 でドライバを置き換えるには管理者権限が必要です。 1. Windows 2000 で、WinDriver の以前のバージョンで動作するように登録された PCI / USB のデバイ スを更新する場合、まず、作成した新しい INF ファイルではなく、古い INF ファイルを Windows がインストールするのを防ぐために、Windows INF ディレクトリ (%windir%inf) からデバイスの古 い INF ファイルをすべて削除することを推奨します。INF ディレクトリで、デバイスのベンダー ID とデバイス / プロダクト ID でデバイスの関連ファイルを検索して削除してください。 164 第 1 4 章 2. ド ラ イ バ の 配 布 INF ファイルをインストールする Windows 2000 / XP / Server 2003 では、自動的に INF ファイルをインストールします。 wdreg ユーティリティで install コマンドを使用して、自動的に Windows 2000 / XP / Server 2003 に INF ファイルをインストールします。 \> wdreg -inf <INF ファイルのパス> install 詳細は、セクション 13.2.2 を参照してください。 開発を行う PC では、DriverWizard で INF ファイルを生成するように選択した場合 (DriverWizard [INF generation] ウィンドウで [Automatically Install the INF file] にチェックを入れ る)、INF ファイルは自動的にインストールされます。セクション 5.2 を参照してください。 Windows 2000 / XP / Server 2003では、INF ファイルを手動でのインストールも可能です。以下 のいずれかの方法で行います。 • Windows [新しいハードウェアの検出ウィザード]: デバイスを接続したとき、またはデ バイスが既に接続済みで、デバイス マネージャがハードウェアの変更をスキャンした ときにこのウィザードは有効になります。 • Windows [ハードウェアの追加と削除ウィザード]: [マイ コンピュータ] を右クリック して、[プロパティ] を選択して、[ハードウェア] を選択して、[ハードウェア ウィザー ド] をクリックします。 • Windows [デバイス ドライバの更新ウィザード]: [デバイス マネージャ] のデバイス リ ストからデバイスを選択して、[ドライバ] タブを選択して、[ドライバの更新] をクリッ クします。Windows XP および Windows Server 2003 の場合、プロパティ リストから直 接ドライバを選択できます。 上記の手動での方法では、インストール中に INF ファイルの場所を指定する必要があります。 インストール ウィザードが生成した INF ファイルとは違う INF ファイルをインストールす る場合、[他のドライバをインストールする] を選択して一覧から INF ファイルを選択します。 手動で INF ファイルをインストールするのではなく、wdreg ユーティリティを使用して自動 的に INF ファイルをインストールすることを推奨します。 Windows 98 / Me では、下記で説明するように、Windows の [新しいハードウェアの追加ウィ ザード] または [デバイス ドライバの更新ウィザード] を使用して INF ファイルを手動でイン ストールする必要があります。 • Windows [新しいハードウェアの追加ウィザード]: 注意: この方法を使用するのは、デバイスにインストールされているドライバが他にない場 合、または初めにデバイスのドライバをアンインストール (削除) する場合です。その他の 場合、Windows の [新しいハードウェアの検出ウィザード] ([新しいハードウェアの追加ウィ ザード] を有効にします) は、表示されません。 165 W I N D R I V E R ユ ー ザ ー ズ a. ガ イ ド Windows の [新しいハードウェアの追加ウィザード] を有効にするには、コン ピュータにハードウェア デバイスを装着するか、またはデバイスが接続済み の場合はハードウェアの変更をスキャンします (更新)。 b. Windows の [新しいハードウェアの追加ウィザード] が表示される際には、以下 のインストール手順に従ってください。必要な場合は、配布するパッケージの INF ファイルの場所を指定してください。 • Windows の [デバイス ドライバの更新ウィザード]: a. Windows の [デバイス マネージャ] を開きます。[システム] の [プロパティ] ウィンドウ ([マイ コンピュータ] を右クリックして、[プロパティ] を選択しま す) から [デバイス マネージャ] タブを選択します。 b. [デバイス マネージャ] のデバイス一覧からデバイスを選択し、開いて、[ドラ イバ] タブを選択して、[ドライバの更新] ボタンをクリックします。デバイス マ ネージャでデバイスの場所を特定するには、[表示] メニューで [デバイス (接続 別)] を選択します。PCI デバイスの場合、標準 PC | PCI バス | デバイスを表示し ます。USB デバイスの場合、標準 PC | PCI バス | USB ユニバーサル ホスト コン トローラ (または OHCI / EHCI など使用している他のコントローラ) への PCI | USB ルート ハブ | デバイス を表示します。 c. [デバイス ドライバの更新ウィザード] の指示に従って開きます。必要な場合、 配布パッケージの INF ファイルの場所を指定します。 14.5 Windows CE の場合 配布手順には、WinDriver カーネル DLL ファイル windrvr6.dll のインストールおよびターゲット CE プ ラットフォーム / コンピュータで WinDriver で開発したハードウェア コントロール アプリケーション のインストールが含まれます。インストールの説明は、ターゲット プラットフォーム / コンピュータ に windrvr6.dll のインストールを行う場合のみ当てはまります。 1. ターゲット コンピュータに WinDriver のカーネル DLL ファイルをインストールします。 • ターゲット CE コンピュータ用に開発した WinDriver アプリケーションの場合: \WinDriver\redist\ TARGET_CPU ディレクトリから windrvr6.dll をターゲット Windows CE コンピュータの Windows ディレクトリにコピーします。 • 新しい CE プラットフォームをビルドする場合: windrvr6.dll を \WinDriver\redist\TARGET_CPU ディレクトリか ら %_FLATRELEASEDIR% ディレクリにコピーして、提供された PROJECT_WD.BIB ファイルの内容を PROJECT.BIB ファイルに追加します。これにより、WinDriver カーネル ファイルを永続的に Windows CE カーネル NK.BIN の一部にします。そし 166 第 1 4 章 ド ラ イ バ の 配 布 て、MAKEIMG.EXE を使用して、新しい Windows CE カーネル NK.BIN をビルドし ます。この作業は、セクション 4.2.2 で説明したWinDriver CE を CE Platform Builder と インストールする作業に似ています。 2. Windows CE の起動時にデバイス ドライバのリストに WinDriver を追加します。 • ターゲット CE コンピュータ用に開発した WinDriver アプリケーションの場合: PROJECT_WD.REG ファイル内でドキュメント化されたエントリにそってレジストリを 修正します。ハンドヘルド CE コンピュータ上で Windows CE Pocket Registry を使用する か、または Windows CE Platform SDK に付属している Remote CE Registry Editor Tool を使 用して行うことが可能です。Remote CE Registry Editor Tool を使用するには、Windows Host System に Windows CE サービスをインストールする必要があります。 • 新しい CE プラットフォームをビルドする場合: 必要なレジストリ エントリは、MAKEIMG.EXE を使用して Windows CE イメージをビル ドする前に、Windows CE ETK 設定ファイル PROJECT.REG に PROJECT_WD.REG ファ イルの内容を追加して行います。 注意: 非 x86 プラットフォームの PCI に限り、コメント文字を削除し、カード特有の情報を挿 入した後、PCI の指定した行を PROJECT_WD.REG から PROJECT.REG へコピーしてくださ い。 14.6 Linux の場合 Linux のカーネルは開発途中で、カーネル データ構造体はたびたび変更されます。このような流動的 な開発環境をサポートし、安定したカーネルを作成するために、Linux のカーネル開発者は、カーネル 自身をコンパイルしたヘッダー ファイルと同一になるようにカーネル モジュールをコンパイルする ことを決定しました。#include'ing により、バージョン番号がカーネル ヘッダー ファイルに挿入され エンコードされるカーネル バージョンと区別します。Linux のドライバ開発者は、ターゲット システ ムのカーネル バージョンでドライバを再コンパイルする必要があります。 14.6.1 WinDriver Kernel モジュール windrvr6.o はカーネル モジュールであるため、windrvr6.o をロードするすべてのカーネル バージョン で、再コンパイルする必要があります。この作業を簡単に行えるように、Linux カーネルから WinDriver カーネル モジュールを分離するために次のコンポーネントを提供しています。 windrvr_gcc_v2.a、windrvr_gcc_v3.a および windrvr_gcc_v3_regparm.a: WinDriver のカーネル モ ジュール用にコンパイルしたオブジェクト コード。windrvr_gcc_v2.a を gcc v2.x.x でコンパイ ルしたカーネル用に使用し、windrvr_gcc_v3.a を gcc v3.x.x でコンパイルしたカーネル用に使 用します。windrvr_gcc_v3_regparm を regparm フラグで gcc v3.x.x でコンパイルしたカーネル 用に使用します。 linux_wrappers.c/h: WinDriver カーネル モジュールを Linux カーネルに結合するラッ パー ライブラリのソース コード。 167 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド linux_common.h および windrvr.h: ターゲット マシンで、WinDriver カーネル モジュー ルをビルドするのに必要なヘッダ ファイル。 wdusb_linux.c: USB スタックを利用するために使用します。このファイルは、USB ファ イルですが、PCI/PCMCIA/ISA ドライバにも必要となるファイルです。 configure: windrvr6.o モジュールをコンパイルしカーネルへ挿入する makefile を作成する 構成スクリプト。 makefile.in, wdreg and setup_inst_dir: この構成スクリプトは makefile を作成す る makefile.in を使用します。この makefile は wdreg ユーティリティ シェル スクリプトおよび WinDriver/util 以下にある setup_inst_dir を呼び出します。この 3 つともターゲットへコピーす る必要があります。 これらのコンポーネントをドライバ のソース コードまたはオブジェクト コードと一緒に配布する必 要があります。 14.6.2 ユーザーモード ハードウェア コントロール アプリケーション / 共有オブジェクト ユーザー モード ハードウェア コントロール アプリケーション / 共有オブジェクト はカーネル バー ジョン番号と一致する必要はないので、バイナリ コード (ソース コードの無許可のコピーを防ぎたい 場合) または、ソース コードとして配布してもかまいません。 注意: ソース コードとして配布する場合、コード中に使用してる WinDriver のライセンス コードを配 布しないように注意してください。 14.6.3 Kernel Plugin モジュール Kernel Plugin モジュール (作成した場合) はカーネル モジュールのため、有効なカーネルのバージョン 番号と一致する必要があります。したがって、ターゲット システム用に再コンパイルが必要になりま す。ユーザーが再コンパイルできるように Kernel Plugin モジュールのソース コードを配布することを お勧めします。Kernel PlugIn のコード生成で Driver Wizard が生成した configure スクリプトを使用して、 Kernel PlugIn モジュールをビルドでき、そして配布する Kernel PlugIn モジュールに挿入できます。 14.6.4 インストール スクリプト 作成したドライバの実行ファイル / DLL を適切な場所 ( /usr/local/bin など) にコピーするインストール シェル スクリプトを提供し、make または gmake を起動して、WinDriver のカーネル モジュールおよび Kernel PlugIn モジュールをビルドしインストールすることをお勧めします。 14.7 Solaris の場合 Solaris の場合、作成したドライバをユーザーがターゲットにインストールをできるように、次のもの を提供する必要があります。 168 第 1 4 章 ド ラ イ バ の 配 布 WinDriver カーネル モジュール: WinDriver カーネル モジュールを実装する windrvr6 と windrvr6.cnf ファイル。 ユーザーモード ハードウェア コントロール アプリケーション / DLL: 作成したユーザーモー ド ハードウェア コントロール アプリケーション / DLL バイナリ。 Kernel Plugin モジュール: Kernel Plugin モジュールを使用した場合、mykp や mykp.cnf などの 関連ファイルを提供する必要があります。 インストール スクリプト: ドライバの実行ファイルを適切な場所 ( /usr/local/bin など) にコ ピーするインストール シェル スクリプトを提供し、WinDriver カーネルをインストールする ことをお勧めします。必要に応じて、(開発環境マシンの WinDriver ディレクトリにある) install_windrvr6 ユーティリティ スクリプトを採用してください。 14.8 VxWorks の場合 VxWorks の場合、作成したドライバをユーザーがターゲットにインストールできるように、次のもの を提供する必要があります。 WinDriver カーネル モジュール: WinDriver カーネル モジュールを実装する windrvr6.o ファイ ル。 ハードウェア コントロール アプリケーション / DLL: your_drv.out などの作成したハード ウェア コントロール アプリケーション / DLL のソース コードやバイナリ。 これらすべてのファイルを VxWorks embedde イメージに統合する必要があります。以下の二つのス テップを行います。 1. windrvr6.o と your_drv.out を、VxWorks イメージにビルドする必要があります。 VxWorks イメージの Tornado II Project のビルド仕様の場合、MACROS タブの EXTRA_MODULES として windrvr6.o と your_drv.out を指定し、これらのファイルを適切 なターゲット ディレクトリ ツリーにコピーします。プロジェクトをリビルドします。こ れらのファイルがイメージに含まれます。 2. スタート アップ中に、windrvr6.o を初期化するために drvrInit ルーチンが呼び出されます。 ドライバのスタート アップルーチンも同様に呼び出されます。 drvrInt-WinDriver の初期化ルーチンとドライバ アプリケーションのスタートアップ ルー チンを呼び出すように、usrAppInit.c (Tornado II プロジェクト ディレクトリにある) にコー ドを追加します。もちろん、usrAppInit.c を修正後は、VxWorks イメージをリビルドする 必要があります。 169 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 第 15 章 WinDriver USB Device この章では、Cypress EZ-USB FX2LP CY7C68013A、および Silicon Laboratories C8051F320 開発ボードをベースとしたデバイスを開発する WinDriver USB Device ツー ルキットについて説明します。 15.1 WinDriver USB Device の概要 WinDriver USB Device ツールキットは、Cypress EZ-USB FX2LP CY7C68013A、および Silicon Laboratories C8051F320 開発ボードをベースとした USB デバイスのファームウェアの開発を簡素化、促進します。 これらの開発ボードは、この章では "サポートする開発ボード" と呼ばれます。 このツールキットは、USB ホスト ドライバの開発に使用する WinDriver USB ツールキットを補足する ものです。これらのツールキットで、デバイスのファームウェアおよびホスト ドライバ開発の両方の 段階において、USB デバイス開発ソフトウェアとして完全なソリューションを提供します。 USB デバイス ベンダーは、USB (Universal Serial Bus) の仕様 (第 3 章を参照) をサポートする必要があり ます。USB インターフェースを 2 つのレベルで実装します: USB プロトコルの低レイヤを SIE (Serial Interface Engine) で実装し、プロトコルの高レイヤをデバイスのファームウェアで実装します。 ファームウェアはソフトウェアとデータからなります。データは、デバイスの設定を定義し、PROM、 EPROM、EEPROM およびフラッシュ チップなどのさまざまなプログラム可能な ROM チップを使用し てメモリに半永久的にインストールされます。 WinDriver USB Device で、サポートする開発ボードの開発者は、直感的な GUI を使用して、対象のデ バイス用に必要な USB インターフェースを定義するファームウェアを簡単に作成できます。 WinDriver USB Device には、サポートする開発ボード用にファームウェアのライブラリが含まれます。 これらのライブラリには、一般的な USB ファームウェアの機能を実行する関数が含まれます。そのた め、デバイス メーカーは、ファームウェアのコードを記述するのに多くの時間を費やすことなくデバ イスをリリースできます。 WinDriver USB Device は、WinDriver USB ツールキットのグラフィカルな DriverWizard ユーティリティ の機能を持っていますが、異なる機能を持っており、対象のデバイスの USB のインターフェースを定 義できます。たとえば、デバイス ID とデバイス クラス、インターフェースの数、代替設定 (alternate settings) の数、エンドポイント (endpoints) の数および属性など。使いやすい GUI ダイアログを使用して、 ウィザードのダイアログで定義した情報を基にデバイスのファームウェアのコードを生成します。 DriverWizard で生成されたファームウェアのコードには、便利な API が含まれます。API は、WinDriver 170 第 1 5 章 W I N D R I V E R U S B D E V I C E USB Device ファームウェア ライブラリ API を利用して、デバイスのファームウェアのフル機能を実装 します。 付録 B および C で、WinDriver USB Device ファームウェア ライブラリおよび生成される DriverWizard API の詳細を説明します。 ファームウェアのコードを生成した後は、開発プロセスを簡素化する WinDriver USB Device の API を 使用して、ファームウェアを実装するために必要な修正を行うことができます。ファームウェアの実 装が終了したら、ファームウェアをビルドしてデバイスにダウンロードします。 第 5 章で説明した WinDriver USB の DriverWizard のハードウェア診断機能は、WinDriver USB Device の DriverWizard でも利用できます。つまり、一旦ファームウェアを開発してデバイスにダウンロードした ら、DriverWizard を使用して、ウィザードのグラフィカル インターフェースから、デバイスの設定の 確認とデバイスとの接続テストを行い、ハードウェアをデバッグできます。 WinDriver USB ツールキット (USB ホスト ドライバの開発用) の登録版ユーザーの場合、デバイスの ファームウェア開発とハードウェアのデバッグが終了したら、WinDriver USB ツールキットを使用し て、対象のデバイスのドライバを開発できます。 15.2 必要なシステムおよびハードウェア • オペレーティング システム: ファームウェアのコードは Windows 2000 / XP / Server 2003 で コンパイルしますが、デバイスの USB インターフェースの定義とファームウェアを実装し た後のハードウェアのデバッグを行う際には、Windows 98 / Me でも DriverWizard を使用 できます。 • CPU アーキテクチャ: x86 プロセッサ • 生成したファームウェアのコードをビルドするには、開発環境 PC に以下の開発ツールが インストールされている必要があります: o Keil Cx51 development tools for 8x51 o Cypress EZ-USB FX2LP CY7C68013A 開発ボードの場合: The Cypress EZ-USB FX2LP Development Kit 15.3 WinDriver デバイス ファームウェア (WDF) ディレ クトリの概要 このセクションでは、WinDriver\wdf ディレクトリのディレクトリ構造とファイルについて説明 します。 wdf\ ディレクトリには、次のディレクトリが含まれます: • cypress\ ディレクトリ: Cypress EZ-USB FX2LP CY7C68013A 開発ボードをベースとした デバイス用のファイルが含まれます 171 W I N D R I V E R • ユ ー ザ ー ズ ガ イ ド silabs\ ディレクトリ: Silicon Laboratories C8051F320 開発ボードをベースとしたデバイ ス用のファイルが含まれます 15.3.1 cypress ディレクトリ WinDriver\wdf\cypress\ ディレクトリには、次のディレクトリが含まれます: • FX2LP\ ディレクトリ: FX2LP CY7C68013A 開発ボードをベースとしたデバイス用のファ イルが含まれます FX2LP\ ディレクトリには、次のサブディレクトリおよびファイルが含まれます: • include\ ディレクトリ: o wdf_cypress_lib.h: EZ-USB 開発ボードをベースとしたデバイス用の、ファー ムウェア ライブラリの種類、一般的な定義および関数プロトタイプを含むヘッ ダー ファイル。このファイルは、ボードのファームウェア ライブラリ (評価版ユー ザーの場合、wdf_cypress_fx2lp_eval.lib。登録版ユーザーの場合、ライ ブラリのソース コードは DriverWizard デバイスのファームウェア コード生成の 一部として作成されます。セクション [15.3.3] の WinDriver USB Device ファーム ウェア ライブラリに関する説明を参照) のインターフェースを提供します。 o periph.h: EZ-USB 開発ボードをベースとしたデバイス用の、USB 周辺機器機能 をサポートする関数プロトタイプを含むヘッダー ファイル。 関数の実装は、デバイス用に定義した特定の設定に従います。デバイス用の実装 を含む periph.c ソース ファイルは、ウィザードで定義した USB デバイスの設 定を基にデバイスのファームウェア コードを生成するときに、DriverWizard に よって作成されます。詳細は、生成される DriverWizard ファイル [15.4.3] の説明 を参照してください。 • lib\ ディレクトリ: o wdf_cypress_fx2lp_eval.lib: EZ-USB 開発ボード用の評価用ファームウェ ア ライブラリ ([15.3.3] の説明を参照) • samples\ ディレクトリ: EZ-USB 開発ボード用のデバイス ファームウェアのサンプル o loopback\ ディレクトリ: ループバック サンプル: サンプルは、OUT エンドポ イントの FIFO バッファを IN エンドポイントの FIFO バッファから読み込んだ データで埋める、ループバックを実装します periph.c: periph.h ヘッダー ファイル (上記を参照) で宣言した関数 のサンプル実装を含むソース ファイル wdf_dscr.a51: EZ-USB 開発ボード用のサンプル ディスクリプタ デー タ テーブル定義を含むアセンブリ ファイル 172 第 1 5 章 W I N D R I V E R U S B D E V I C E build.bat: サンプル ファームウェア コードのビルド用のユーティリ ティ。注意: ビルド ユーティリティは、評価版のファームウェア ライブ ラリ (wdf_cypress_fx2lp_eval.lib) を使用します。 loopback_eval.hex: サンプル コードと build.bat ユーティリティ で作成した EZ-USB 開発ボード用のサンプル ループバック ファーム ウェア。注意: ファームウェアは、評価版のファームウェア ライブラリ (wdf_cypress_fx2lp_eval.lib) を使用します。 15.3.2 silabs ディレクトリ WinDriver\wdf\silabs\ ディレクトリには、次のディレクトリが含まれます: • F320\ ディレクトリ: C8051F320 開発ボードをベースとしたデバイス用のファイルが含ま れます F320\ ディレクトリには、次のサブディレクトリおよびファイルが含まれます: • include\ ディレクトリ: o wdf_silabs_lib.h: C8051F320 開発ボードをベースとしたデバイス用の、 ファームウェア ライブラリの種類、一般的な定義および関数プロトタイプを含む ヘッダー ファイル。このファイルは、ボードのファームウェア ライブラリ (評価 版ユーザーの場合、wdf_silabs_f320_eval.lib。登録版ユーザーの場合、ラ イブラリのソース コードは DriverWizard のデバイス ファームウェア コード生成 の一部として作成されます。セクション [15.3.3] の WinDriver USB Device ファー ムウェア ライブラリに関する説明を参照) のインターフェースを提供します。 o c8051f320.h: C8051F320 開発ボードの一般的なファームウェア ライブラリ定 義を含むヘッダー ファイル o c8051f320regs.h: C8051F320 開発ボードのレジスタ/ビット定義を含むヘッ ダー ファイル o periph.h: C8051F320 開発ボードをベースとしたデバイス用の、USB 周辺機器機 能をサポートする関数プロトタイプを含むヘッダー ファイル。 関数の実装は、デバイス用に定義した特定の設定に従います。デバイス用の実装 を含む periph.c ソース ファイルは、ウィザードで定義した USB デバイスの設 定を基にデバイスのファームウェア コードを生成するときに、DriverWizard に よって作成されます。詳細は、DriverWizard で生成されるファイル [15.4.3] の説明 を参照してください。 • lib\ ディレクトリ: o wdf_silabs_f320_eval.lib: C8051F320 開発ボード用の評価用ファームウェ ア ライブラリ ([15.3.3] の説明を参照)。 • samples\ ディレクトリ: C8051F320 開発ボード用のデバイス ファームウェアのサンプル 173 W I N D R I V E R o ユ ー ザ ー ズ ガ イ ド loopback\ ディレクトリ: ループバック サンプル: サンプルは、OUT エンドポ イントの FIFO バッファを IN エンドポイントの FIFO バッファから読み込んだ データで埋める、ループバックを実装します。 periph.c: periph.h ヘッダー ファイル (上記を参照) で宣言した関数 のサンプル実装を含むソース ファイル wdf_dscr.h: C8051F320 開発ボード用のサンプル デバイス ディスクリ プタ情報を含むヘッダー ファイル wdf_dscr.c: C8051F320 開発ボード用のデバイス ディスクリプタ デー タ構造体の定義を含むソース ファイル build.bat: サンプル ファームウェア コードのビルド用のユーティリ ティ。注意: ビルド ユーティリティは、評価版のファームウェア ライブ ラリ (wdf_silabs_f320_eval.lib) を使用します。 loopback_eval.hex: サンプル コードと build.bat ユーティリティ で作成した C8051F320 開発ボード用のサンプル ループバック ファーム ウェア。注意: ファームウェアは、評価版のファームウェア ライブラリ (wdf_silabs_f320_eval.lib) を使用します。 15.3.3 WinDriver USB Device ファームウェア ライブラリ WinDriver USB Device ツールキットの登録版を使用して DriverWizard でファームウェアのコードを 生成すると、生成したコードに、一般的な USB ファームウェアの機能を実行する API を含む、 WinDriver USB Device ファームウェア ライブラリのソース ファイルが含まれます (セクション [15.4.3] の説明を参照)。これらのソース ファイルは、ツールキットの 評価版には含まれません。ツー ルキットの評価版には、WinDriver USB Device の評価ができるように、コンパイル済みの評価版ラ イブラリが含まれています。ライブラリは、デバイス ファームウェアのサンプルおよび生成した DriverWizard の評価用ファームウェア コードで利用されます。 評価版ライブラリは、次の制限を除いて、登録版ライブラリと機能は同じです: あらかじめ設定さ れている数 (25,000) の転送を実行できます。この数を超えると、ライブラリは動作しなくなります。 15.3.4 サンプル コードのビルド WinDriver\wdf\cypress\FX2LP\samples\ または WinDriver\wdf\silabs\F320\samples\ ディレクトリからサンプルをビルドするには、選択 したサンプルの build.bat ユーティリティ (WinDriver\wdf\cypress\FX2LP\samples\loopback\build.bat または WinDriver\wdf\silabs\F320\samples\loopback\build.bat) を使用します: 174 第 • 1 5 章 W I N D R I V E R U S B D E V I C E build.bat ファイルを開いて、KEIL 変数が Keil 開発ツールの場所を指していることを確 認します。デフォルトの Keil ディレクトリは C:\Keil です。Keil 開発ツールを他のディ レクトリにインストールした場合、build.bat ファイルの次の行を正しい場所を指すよ うに変更してください: set KEIL=C:\Keil • たとえば、Keil 開発ツールを D:\MyTools\Keil にインストールした場合、次のように変 更します: set KEIL=D:\MyTools\Keil • Cypress EZ-USB FX2LP CY7C68013A サンプルの場合、build.bat ファイルの CYPRESS 変数が EZ-USB Cypress 開発キットの場所を指していることを確認します。デフォ ルトの Cypress ディレクトリは C:\Cypress です。EZ-USB Cypress 開発キットを他のディ レクトリにインストールした場合、build.bat ファイルの次の行を正しい場所を指すよ うに変更してください: set CYPRESS=C:\Cypress • たとえば、EZ-USB Cypress 開発キットを D:\Cypress にインストールした場合、次のよ うに変更します: set CYPRESS=D:\Cypress • build.bat ユーティリティを実行して、サンプル ファームウェアをビルドします。 15.4 WinDriver USB Device の開発プロセス 以下の手順で、WinDriver USB Device を使用して (サポートする開発ボードをベースとした) USB デバ イス用のファームウェアを開発します: 15.4.1 Device USB インターフェースの定義 WinDriver USB Device の DriverWizard ユーティリティを使用して、デバイスの USB インターフェー スを定義します: 1. 次のいずれかの方法を使用して、DriverWizard を実行します: o [スタート] - [プログラム] - [WinDriver] - [DriverWizard] の順に選択する o デスクトップの DriverWizard アイコンをダブルクリックする o WinDriver\wizard\wdwizard.exe をダブルクリックするか、もしくはコ マンドライン プロンプトで入力して実行する 2. ウィザードの [Choose Your Project] ダイアログで [New device firmware project] オプションを 選択して、[Next >>] をクリックします。 175 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド DriverWizard の [File] メニューから、もしくはウィザードのツールバーでファームウェア プロジェクト アイコンをクリックして、新しいデバイス ファームウェア プロジェクトを 作成することもできます。 図 15.1: デバイス ファームウェア プロジェクトの作成 3. [Choose Your Development Board] ダイアログで対象の開発ボードを選択して、[OK] をク リックします。 図 15.2: 開発ボードの選択 4. [Edit Device Descriptor] ダイアログで、ベンダーとデバイス ID、メーカーとデバイスの説明、 デバイス クラスとサブクラスなどの、対象デバイスの基本的なデバイス ディスクリプタ情 報を定義します。 176 第 1 5 章 W I N D R I V E R U S B D E V I C E 図 15.3: デバイス ディスクリプタの編集 5. [Configure Your Device] ダイアログで、デバイスの USB 設定を定義します。 図 15.4: デバイスの設定 177 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド このダイアログでは、デバイス インターフェースの追加、各インターフェースの代替設定 の追加、および各代替設定で必要なエンドポイントの追加を行うことができます。コンポー ネントを追加する際に、インターフェースのクラスとサブクラスやエンドポイントのアド レス、転送タイプ、最大パケット サイズなどの、各コンポーネントに関連する属性を定義 できます。ウィザードは、設定が簡単に行えるように、デバイス用の適切な設定オプション のみを表示します。また、設定に潜在的な問題がある場合は警告を表示します。 Cypress EZ-USB FX2LP CY7C68013A 開発ボードでエンドポイントを設定する方法の詳 細は、この後にあります。 このダイアログから、追加したコンポーネントの削除、または設定情報の編集をいつでも 行うことができます。 図 15.5: インターフェースの定義 図 15.6: エンドポイントの定義 178 第 1 5 章 W I N D R I V E R U S B D E V I C E 注意: o 現在は、Silicon Laboratories C8051F320 開発ボード用に複数のインターフェース を定義することはできません。 o Cypress EZ-USB FX2LP CY7C68013A 開発ボード用に複数のインターフェースを 定義すると、DriverWizard はコンポジット デバイス用のファームウェア コードを生 成します。ウィザードは、2 番目のインターフェースを追加するとき警告を表示しま す。 6. [File] メニューから、もしくはウィザードのツールバー アイコンを使用して、DriverWizard デバイス ファームウェア プロジェクトをいつでも保存できます。一旦プロジェクトを xxx.wdp 形式で保存したら、後から DriverWizard で開いて、終了した時点から作業を再 開できます。 デバイスの USB インターフェースの定義が終了したら、DriverWizard の定義 (次のセクション [15.4.2] を参照) に基づいて、デバイスのファームウェア コードを生成します。 EZ-USB エンドポイント バッファの設定 このセクションには、EZ-USB エンドポイント バッファの設定に関する EZ-USB テクニカル リファ レンス マニュアル (EZ-USB_TRM.pdf) のセクション 1.18 の情報が含まれています。この情報は、 DriverWizard を使用して Cypress EZ-USB FX2LP CY7C68013A 開発ボードをベースとしたデバイ スのエンドポイント設定を定義するときに役立ちます。 詳細は、Cypress\USB\Doc\FX2LP\ ディレクトリにある EZ-USB テクニカル リファレンス マニュア ルを参照してください。次の URL からオンラインでも入手できます: http://www.keil.com/dd/docs/datashts/cypress/fx2_trm.pdf USB 仕様では、エンドポイントをデータのソースまたはシンクとして定義しています。USB はシリ アル バスなので、デバイスのエンドポイントは実際には連続して空の、または USB データ バイト が埋められた FIFO です。ホストは 4 ビットのアドレスおよび方向ビットを送信してデバイスのエン ドポイントを選択します。したがって、USB は、IN0 から IN15 および OUT0 から OUT15 の 32 の エンドポイントをユニークにアドレスできます。 EZ-USB から見ると、エンドポイントは受信したバイト、またはバス上を送信するバイトが含まれ ているバッファです。OUT エンドポイント バッファからデータを読み込み、IN エンドポイント バッ ファにホストに送信するデータを書き込みます。 EZ-USB には、図 1.16 のように 3 つの 64 バイト エンドポイント バッファと 4KB のバッファ空間が 含まれており、12 通りに設定できます。3 つの 64 バイト バッファは、すべての設定で共通です。 179 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 図 15.7: EZ-USB エンドポイント バッファ 15.4.2 デバイス ファームウェア コードの生成 DriverWizard を使用してデバイスの USB インターフェースを定義したら、次のいずれかの方法を使 用して、[Configure Your Device] ダイアログからデバイスのファームウェア コードの生成を選択で きます: • [Next >>] ボタンをクリックするか、Alt+N ショートカット キーを使用する • [Generate Code] ツールバー アイコンを選択する • [Build] メニューから [Generate Code] オプションを選択する ウィザードの [Select Code Generation Options] ダイアログが表示されます: • 180 Cypress EZ-USB FX2LP CY7C68013A の場合: 第 1 5 章 W I N D R I V E R U S B D E V I C E 図 15.8: Cypress EZ-USB FX2LP CY7C68013A ファームウェア コード生成 • Silicon Laboratories C8051F320 の場合: 図 15.9: Silicon Laboratories C8051F320 ファームウェア コード生成 ダイアログのすべてのディレクトリ パスが PC 上の正しい場所を指していることを確認します: • [WinDriver base directory] は、WinDriver USB Device のインストール ディレクトリを指して いる必要があります • [Keil base directory] は、Keil Cx51 development tools for 8x51 のインストール ディレクトリ を指している必要があります 181 W I N D R I V E R • ユ ー ザ ー ズ ガ イ ド FX2LP CY7C68013A ボードの場合、[Cypress USB directory] は、Cypress EZ-USB FX2LP Development Kit Cypress\USB ディレクトリを指している必要があります [Keil uVision2 IDE] チェック ボックスをオンにすると、DriverWizard は、Keil uVision2 IDE からファー ムウェアをビルドするプロジェクト ファイルを生成します。デフォルトでこのオプションがオンに なっていると、ウィザードは、コード生成ダイアログを表示するように IDE を明示的に変更しない 限り、コードを生成した後この IDE を表示します。 Silicon Laboratories デバイスの場合、[Silicon Laboratories IDE] チェック ボックスをオンにすると、 DriverWizard は、Silicon Laboratories IDE からファームウェア コードをビルドする互換プロジェクト ファイルを生成します。 コード生成情報を定義したら、[Next >>] ボタンをクリックしてコードを生成します。次のセク ション [15.4.3] では、生成されるファームウェア ファイルについて説明します。 上のダイアログで表示されている USB ホスト ドライバ コードの生成オプションは、WinDriver USB ツールキットの製品版を利用している場合、または WinDriver の評価期間内にのみサポートされま す。このオプションが選択されていると、ウィザードは、デバイスのファームウェア コード以外に (ウィザードで定義した) USB デバイス用の WinDriver USB ホスト ドライバ アプリケーションのス ケルトンも生成します。DriverWizard のホスト ドライバ コード生成に関する詳細は、第 5 章および セクション [15.4.5] を参照してください。 15.4.3 デバイス ファームウェアの開発 ウィザードでファームウェア コードを生成した後、必要に応じて、コードを修正できます。開発が 効率的に行えるように、ライブラリおよび生成した WinDriver USB Device ファームウェア API を使 用して、必要なファームウェアの機能を実装します。 USB ファームウェアの API および生成されるコードは、付録 B および C で説明します。 注意: WinDriver ライブラリおよび生成したデバイスのファームウェア コードを修正する場合、 コードが開発ボードのハードウェア仕様を満たしていることを確認してください: • Cypress FX2LP CY7C68013A 開発ボードの場合: EZ-USB_TRM.pdf - 特に、セクション 15.6「Endpoint Configuration」を参照してください。このドキュメントは、 Cypress\USB\Doc\FX2LP\ ディレクトリにあります。次の URL からオンラインでも入 手できます: http://www.keil.com/dd/docs/datashts/cypress/fx2_trm.pdf • Silicon Laboratories C8051F320 開発ボードの場合: C8051F32xRev1_1.pdf - 特に、セ クション 15.5「FIFO Management」および15.11「Configuring Endpoints 1-3」を参照してく ださい。このドキュメントは、Silabs\MCU\Documentation\Datasheets\ ディレク トリにあります (Silicon Laboratories IDE をインストールした場合)。次の URL からオンラ インでも入手できます: http://www.keil.com/dd/docs/datashts/silabs/c8051f32x.pdf 182 第 1 5 章 W I N D R I V E R U S B D E V I C E 生成される DriverWizard USB デバイス ファームウェア ファイル デバイスのファームウェア コードを生成するとき、DriverWizard は xxx_FW ディレクトリに次の ファイルを作成します: • periph.c: デバイス用の USB 周辺機器機能をサポートする関数の実装を含む C のソース ファイル。関数の実装は、DriverWizard で定義した特定のデバイス設定により行われます。 periph.h は periph.c ソース ファイルで実装される関数のプロトタイプを含むヘッ ダー ファイルで、WinDriver\<device_dir>\include\ ディレクトリ (WinDriver\wdf\cypress\FX2LP\include\ または WinDriver\wdf\silabs\F320\include\、セクション [15.3] を参照) にあります。 • DriverWizard で定義した情報を利用する、デバイス ディスクリプタ情報: o Cypress EZ-USB FX2LP CY7C68013A 開発ボードの場合: wdf_dscr.a51: アセンブリ ファイル o Silicon Laboratories C8051F320 開発ボードの場合: wdf_desc.h および wdf_desc.c: C ファイル • • build.bat: ファームウェア コードのビルド用のユーティリティ xxx.Uv2: Keil uVision2 IDE からコードをビルドするプロジェクト ファイル (xxx は選択 したファームウェア プロジェクトの名前)。このファイルは、DriverWizard の [Select Code Generation Options] ダイアログで作成を選択した場合にのみ作成されます (セクション [15.4.2] を参照)。 • xxx.wsp: Silicon LaboratoriesIDE からコードをビルドするプロジェクト ファイル (xxx は 選択したファームウェア プロジェクトの名前)。このファイルは、Silicon Laboratories C8051F320 用にのみ作成され、DriverWizard の [Select Code Generation Options] ダイアログ で作成を選択した場合にのみ作成されます (セクション [15.4.2] を参照)。 次のファイルは、WinDriver USB Device ファームウェア ライブラリのソース コードを含みます。こ れらのファイルは、WinDriver USB Device ツールキットの登録版を使用している場合にのみ生成さ れます: • main.c: ファームウェアのメインのエントリ ポイントの実装を含む C ソース ファイル。 Silicon Laboratories C8051F320 開発ボードをベースとしたデバイスの場合、必要な USB 割 り込みサービス ルーチン (USB_ISR()) の実装も含まれます。 • wdf_cypress_lib.c (Cypress EZ-USB FX2LP CY7C68013A の場合) / wdf_silabs_lib.c (Silicon Laboratories C8051F320 の場合): 対象の開発ボード用の WinDriver USB Device ファームウェア ライブラリ関数の実装を含 む C ソース ファイル。 183 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド DriverWizard で生成されたファームウェアのビルド 生成されたファームウェア コードをビルドするには、次のいずれかの方法を使用します: • コマンドラインから生成された build.bat ユーティリティを実行する • Keil uVision2 IDE 用のプロジェクト ファイルの生成を選択した場合、この IDE からファイ ルを開いてビルドする • Silicon Laboratories C8051F320 で、この IDE 用のプロジェクト ファイルの生成を選択した 場合、この IDE からファイルを開いてビルドする ビルド出力は xxx.hex ファームウェア ファイル (xxx はファームウェア プロジェクト用に選択し た名前) です。 注意: 生成される build.bat および xxx.uV2 / xxx.wsp プロジェクト ファイルは、 WinDriver USB Device の登録版と評価版で異なります。また、出力も異なります。 評価版の場合、評価用ファームウェア ライブラリが使用され、転送に制限 (最大 25,000) が あります ([15.3.3] を参照) 登録版の場合、生成されたライブラリ ソース ファイルが使用され、転送に制限はありま せん。 Windriver USB Device ツールキットの評価期間中に作成したファームウェア プロジェクト ファイル (xxx.wdp) がある場合は、登録後にこれらのファイルを開いてウィザードで ファームウェア コードを再生成し、新しい登録版の build.bat とプロジェクト ファイル を作成してください。それから、これらのファイルを使用して登録版のフル機能のファー ムウェア (xxx.hex) をビルドし、ファームウェアをデバイスにダウンロードしてくださ い。 ファームウェアをビルドした後、開発ボードのベンダーのファームウェア ダウンロード ツールを使 用してファームウェアをハードウェアにダウンロードします。 WinDriver の評価版を使用している場合、または (ホスト ドライバの作成用の) WinDriver USB ツー ルキット用のライセンスで登録版を使用している場合は、 WinDriver\cypress\firmware_sample\WIN32\ ディレクトリにあるサンプルの Cypress download_sample.exe ユーティリティを使用して作成したファームウェアをデバイスにダウン ロードできます。 15.4.4 ハードウェアのデバッグ ファームウェアをデバイスにダウンロードしたら、セクション [5.2] のように、DriverWizard ユーティ リティを使用してファームウェアをデバッグできます (この章の USB の説明を参照) 注意: セクション [5.2] で説明されているホスト ドライバ コード生成オプションは、WinDriver USB Device ライセンスの 一部ではありません。 15.4.5 USB ホスト デバイス ドライバの開発 デバイスの開発が完了した後、WinDriver USB ツールキットの登録版ユーザーの場合、または WinDriver の評価版を使用している場合、第 6 章で説明したように、WinDriver を使用して対象のデバイス用のド 184 第 1 5 章 W I N D R I V E R U S B D E V I C E ライバを開発できます。 セクション [15.4.2] で説明したように、両方のライセンスがある場合、DriverWizard のファームウェア 生成ダイアログから WinDriver USB ホスト ドライバ アプリケーションのスケルトンを生成するオプ ションが追加されます。 185 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 付録 A 関数リファレンス A.1 一般用法 A.1.1 WinDriver のコール順序 − 一般用法 次に WinDriver API の一般的なコール順序を示します。 WD_Open() WD_Version()1 WD_DebugAdd() PCI / ISAPnP / USB Hardware Access API WD_Sleep() WD_Close() 注意: WD_Version [A.1.3] は、WD_Open [A.1.2] をコールした後で他の WinDriver 関数をコールする前に コールすることを推奨します。その目的は、WinDriver カーネル モジュール (windrvr) バージョン番 号を返すことでアプリケーションおよび WinDriver カーネル モジュールのバージョンが互換である ことを認識させます。 WD_Open( ) のあと、WD_DebugAdd( ) [A.1.6] および WD_Sleep( ) [A.1.8] をどこからでもコールする ことができます。 この関数リファレンスは、C 言語指向です。WinDriver Visual Basic および Delphi コードを C コード に似た形で表現することで、すべてのユーザーに対しての理解度を向上します。 多くの API は、C、VB または Delphi アプリケーションから使用できる単一実装を含んでいますが、 いくつかの WinDriver 関数には、VB および Delphi 用に特定の実装が必要となります。Delphi / Visual Basic サンプルおよびインクルード ファイルを参照してください: \WinDriver\delphi \WinDriver\vb 186 付 録 A A.1.2 WD_Open() 目的 WinDriver カーネル モジュールにアクセスするためにハンドルをオープンします。ハンドルはすべ ての WinDriver API によって使用されるため、他の WinDriver API がコールされる前にハンドルを コールしなければなりません。 プロトタイプ HANDLE WD_Open(); パラメータ なし 戻り値 WinDriver カーネル モジュールへのハンドル。デバイスをオープンできない場合は INVALID_HANDLE_VALUE を返します。 注釈 登録版を使用する場合、WD_License() [A.1.9] 関数のリファレンスからライセンスの登録方法を参照 してください。 例 HANDLE hWD; hWD = WD_Open(); if (hWD==INVALID_HANDLE_VALUE) { printf("Cannot open WinDriver device\n"); } A.1.3 WD_Version() 目的 起動中の WinDriver カーネル モジュールのバージョン番号を返します。 プロトタイプ DWORD WD_Version(HANDLE hWD, WD_VERSION *pVer); パラメータ 名前 hWD 型 入出力 HANDLE 入力 187 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド pVer WD_VERSION * dwVer DWORD 出力 cVer[100] CHAR 出力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pVer WD_VERSION エレメント。 dwVer バージョン番号。 CVer[100] バージョン情報文字列。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_VERSION ver; BZERO(ver); WD_Version(hWD, &ver); printf("%s\n", ver.cVer) if (ver.dwVer<WD_VER) { printf("Error - incorrect WinDriver version\n"); } A.1.4 WD_Close() 目的 WinDriver カーネル モジュールへのアクセスを終了します。 プロトタイプ void WD_Close(HANDLE hWD); パラメータ 名前 hWD 188 型 入出力 HANDLE 入力 A 付 録 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 注釈 WinDriver カーネル モジュールの使用を終了したときは、この関数を必ずコールします。 例 WD_Close(hWD); A.1.5 WD_Debug() 目的 デバッグメッセージを収集するレベルにデバッグレベルを設定 します。 プロトタイプ DWORD WD_Debug(HANDLE hWD, WD_DEBUG *pDebug); パラメータ 名前 型 入出力 hWD HANDLE 入力 pDebug WD_DEBUG * 入力 dwCmd DWORD 入力 dwLevel DWORD 入力 dwSection DWORD 入力 dwLevelMessageBox DWORD 入力 dwBufferSize DWORD 入力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モー ド ドライバへのハンドル。 pDebug WD_DEBUG エレメント。 189 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwCmd デバッグ コマンド: フィルタの設定、バッファのクリア等 詳細は windrvr.h の DEBUG_COMMANDL を参照してくだ さい。 dwLevel dwCmd=DEBUG_SET_FILTER に使用されます。デバッグ レ ベルをError、Warning、Info、Trace に設定します。 詳細は windrvr.h の DEBUG_LEVEL を参照してください。 dwSection dwCmd=DEBUG_SET_FILTER に使用されます。セクション を IO、Mem、Int 等に設定します。 詳細は windrvr.h の DEBUG_SECTION を参照してください。 dwLevelMessageBox dwCmd=DEBUG_SET_FILTER に使用されます。デバッグレ ベルをメッセージボックスに出力するように設定します。 詳細は windrvr.h の DEBUG_LEVEL を参照してください。 pcBuffer dwCmd=DEBUG_SET_BUFFER に使用されます。カーネル にあるバッファのサイズです。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_DEBUG dbg; BZERO(dbg); dbg.dwCmd = DEBUG_SET_FILTER; dbg.dwLevel = D_ERROR; dbg.dwSection = S_ALL; dbg.dwLevelMessageBox = D_ERROR; WD_Debug(hWD, &dbg); A.1.6 WD_DebugAdd() 目的 デバッグ ログへデバッグ メッセージを送ります。ドライバ コードで使用します。 プロトタイプ DWORD WD_DebugAdd(HANDLE hWD, WD_DEBUG_ADD *pData); パラメータ 名前 hWD 190 型 入出力 HANDLE 入力 A 付 録 pData WD_DEBUG_ADD * dwLevel DWORD 入力 dwSection DWORD 入力 pcBuffer CHAR [256] 入力 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pData WD_DEBUG_ADD エレメント。 dwLevel 宣言されるデータに、Debug Monitor でレベルを割り当てます。 dwLevel が 0 の場合、D_ERROR が宣言されます。詳細は、windrvr.h の DEBUG_LEVEL を参照してください。 dwSection 宣言されるデータに、Debug Monitor でセクションを割り当てま す。dwLevel が 0 の場合、S_MISC が宣言されます。詳細は、windrvr.h の DEBUG_LEVEL を参照してください。 pcBuffer メッセージ ログにコピーする文字列。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_DEBUG_ADD add; BZERO(add); add.dwLevel = D_WARN; add.dwSection = S_MISC; sprintf(add.pcBuffer, "This message will be displayed in " "the debug monitor\n"); WD_DebugAdd(hWD, &add); A.1.7 WD_DebugDump() 目的 デバッグ メッセージ バッファを取り出します。 プロトタイプ DWORD WD_DebugDump(HANDLE hWD, WD_DEBUG_DUMP *pDebugDump); 191 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 型 入出力 hWD HANDLE 入力 pDebug WD_DEBUG_DUMP * 入力 pcBuffer PCHAR 入力 / 出力 dwSize DWORD 入力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モー ド ドライバへのハンドル。 PdebugDump WD_DEBUG_DUMP エレメント。 pcBuffer デバッグ メッセージを受け取るバッファ。 dwSize バッファ サイズ (Byte)。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 char buffer[1024]; WD_DEBUG_DUMP dump; dump.pcBuffer=buffer; dump.dwSize = sizeof(buffer); WD_DebugDump(hWD, &dump); A.1.8 WD_Sleep() 目的 指定した時間分、実行を遅らせます。 プロトタイプ DWORD WD_Sleep(HANDLE hWD, WD_SLEEP *pSleep); パラメータ 名前 hWD 192 型 入出力 HANDLE 入力 A 付 録 pSleep WD_SLEEP * dwMicroSeconds DWORD 入力 dwOptions DWORD 入力 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pSleep WD_SLEEP エレメント。 dwMicroSeconds 実行を遅らせる時間 (マイクロ秒単位)。- 1/1,000,000 秒 dwOptions ビット マスク フラッグ: SLEEP_NON_BUSY - 設定された場合、CPU リソースを消費せず に実行を遅らせます。(17,000 マイクロ秒以下では無関係です。busy sleep より不正確です。) デフォルト - busy sleep. 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 使用例: 応答の遅いハードウェアへのアクセス。 例 WD_Sleep slp; BZERO(slp); slp.dwMicroSeconds = 200; WD_Sleep(hWD, &slp); A.1.9 WD_License() 目的 ライセンス文字列を WinDriver カーネル モジュールに転送して指定したライセンス文字列のライ センスの種類に関する情報を返します。 プロトタイプ DWORD WD_License(HANDLE hWD, WD_LICENSE *pLicense); 193 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 型 入出力 hWD HANDLE 入力 pLicense WD_LICENSE * cLicense[] CHAR 入力 dwLicense DWORD 出力 dwLicense2 DWORD 出力 説名 名前 説明 hWD WD_Open [A.1.2] から渡された WinDriver のカーネル モード ド ライバへのハンドル。 pLicense cLicense WD_LICENSE エレメント。 WinDriver カーネル モジュールへ転送されるライセンス文字列 を含むためのバッファ。空の文字列が転送された場合、 WinDriver カーネル モジュールはパラメータ dwLicence にライ センスの種類を返します。 dwLicense ライセンス文字列 (cLicense) が許可したライセンスの種類を返 します。戻り値は、windrvr.h で enum として定義したライセン スの種類のフラグのマスクです。0 = 無効なライセンス。必要な 場合、ライセンスの種類を決定する追加のフラグは、dwLicense2 に返されます。 dwLicense2 dwLicense が対応するすべての情報を持てない場合 (その他の場 合は 0)、ライセンスの種類の決定に追加のフラグを返します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 登録版を使用する際に、コードからライセンスを登録するには、WD_Open() 以外の WinDriver API 関数を呼ぶ前に、この関数を呼ぶ必要があります。 使用例: アプリケーションに登録用のルーチンを追加する。 例 DWORD RegisterWinDriver() { 194 A 付 録 HANDLE hWD; WD_LICENSE lic; DWORD dwStatus = WD_INVALID_HANDLE; hWD = WD_Open(); if (hWD!=INVALID_HANDLE_VALUE) { BZERO(lic); // replace the following string with your license string strcpy(lic.cLicense, "12345abcde12345.CompanyName"); dwStatus = WD_License(hWD, &lic); WD_Close(hWD); } return dwStatus; } A.1.10 WD_LogStart() 目的 ログ ファイルを開きます。 プロトタイプ DWORD WD_LogStart(const char *sFileName, const char *sMode) パラメータ 名前 型 入出力 sFileName const char * 入力 sMode const char * 入力 説明 名前 説明 sFileName 開くログ ファイル名。 sMode アクセスの種類。 たとえば、NULL または w の場合、書き込み用の空のファイルを 開きます。指定したファイルが存在する場合、その内容を壊しま す。a の場合、ファイルの終わりに書き込むように開きます (ア ペンディング)。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 195 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 注釈 ログ ファイルを開くと、すべての API 呼び出しをこのファイルに記録します。WD_LogAdd [A.1.12] を 呼んで、ログ ファイルへ出力内容を追加します。 A.1.11 WD_LogStop() 目的 ログ ファイルを閉じます。 プロトタイプ VOID WD_LogStop() パラメータ なし 戻り値 なし。 A.1.12 WD_LogAdd() 目的 ログ ファイルに出力内容を追加します。 プロトタイプ VOID DLLCALLCONV WD_LogAdd(const char *sFormat[, argument ]...) パラメータ 名前 sFormat 型 入出力 const char * 入力 argument 入力 説明 名前 説明 sFormat Format-control 文字列。 196 A 付 録 argument オプション引数。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 A.2 PCI/ISA/PCMCIA/CardBus - WDC ライブラリの概要 WinDriver カード “WDC” API は、便利なユーザー モード ラッパー関数を標準の WinDriver PCI/ISA/PCMCIA/CardBus WD_xxx API [A.5] へ提供します。 WDC ラッパーは PCI/ISA/PCMCIA/CardBus デバイスとの通信するために WinDriver の使用法を簡素 化するようにデザインされています。コードで基本的な WD_xxx PCI/PCMCIA/ISA WinDriver API を 使用することができますが、代わりに高水準の WDC API を使用することを推奨します。 注意: ほとんどの WDC API は、ユーザー モードおよびカーネル モード (Kernel PlugIn ドライバ [11]) の両方から使用することができます。 DriverWizard で生成された PCI/PCMCIA/ISA 診断ドライバコード、PLX サンプルコードと同様に、 pci_diag、Kernel PlugIn pci_diag、pcmcia_diag、および pci_dump サンプルは WDC API を 利用できます。 WDC API は wd_utils.dll (WinDriver/redistディレクトリに保存されています) の一部で、 wdc_xxx ソース ファイルは WinDriver/srcディレクトリに保存されています。 WDC インターフェースは、wdc_lib.h および wdc_defs.h ヘッダ ファイル (両ファイルとも WinDriver/includes ディレクトリに保存されています) から提供されます。 wdc_lib.h は高水準の WDC API (型の定義、関数の宣言など) を宣言します。 wdc_defs.h は低水準の WDC API を宣言します。このファイルは高水準の wdc_lib.h ファイルによりカプセル化された定義と型の情報を含んでいます。 WDC API を利用できる WinDriver PCI/PCMCIA/ISA サンプルおよび DriverWizard で生成されたコー ドは、たとえば、特定のデバイス用のライブラリで構成されたり、診断アプリケーションで構成さ れます。ライブラリ コードも wdc_defs.h ファイルから低水準の API を使用しますが、高水準の 診断コードは wdc_lib.h APIのみを利用します。そのため希望するカプセル化のレベルを維持し ます。 以下のセクションでは WDC の 高水準の API [A.3] および 低水準の API [A.4] を説明します。 注意: • WinDriver の PCI API で CardBus デバイスを処理します。そのため、この章での PCI へ の参照を CardBus と置き換えてください。 • PCMCIA API は Windows 2000/XP/Server 2003 でのみサポートされています。 − WDC ライ ブラリおよび低水準の WD_xxx WinDriver API の両方とも 197 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.3 PCI/PCMCIA/ISA - WDC の高水準 API このセクションではWinDriver/include/wdc_lib.h ヘッダ ファイルで定義されている WDC API を説明します。 A.3.1 構造体、型、および一般的な定義 WDC_DEVICE_HANDLE WDC デバイス情報構造体 [A.4.3] へのハンドル。 typedef void * WDC_DEVICE_HANDLE; WDC_DRV_OPEN_OPTIONS の定義 typedef DWORD WDC_DRV_OPEN_OPTIONS; WDC ライブラリ (WDC_DriverOpen () [A.3.2] を参照) へのハンドルが開かれる時に実行されるタス クを説明するフラグのプリプロセッサの定義。 # 定義値 説明 WDC_DRV_OPEN_CHECK_VER コードで使用される WinDriver のソース ファイルのバー ジョンとロードされた WinDriver カーネルのバージョンを比 べます。 WDC_DRV_OPEN_REG_LIC WinDriver のライセンス登録文字列を登録します。 以下のプリプロセッサの定義は WDC_DriverOpen() [A.3.2] へ渡すことができる便利な WDC ドライバを 開くオプションを提供します。 # 定義値 説明 WDC_DRV_OPEN_BASIC 主に WinDriver のカーネル モジュールへのハンドルを開く基 本の WDC オープンのタスクのみを実行するように WDC_DriverOpen() [A.3.2] へ指示します。 注意: このオプションの値はゼロ (0) (<=> ドライバ オープン のフラグなし) であるため、このオプションはその他の WDC ドライバ オープン オプションと組み合わせることはできま せん。 WDC_DRV_OPEN_KP Kernel PlugIn から WDC_DriverOpen() [A.3.2] を呼び出す時の 便利なオプション。このオプションは Kernel PlugIn から WDC ライブラリへのハンドルを開くときに設定するオプションと して推奨される WDC_DRV_OPEN_BASIC フラグを設定する オプションに相当します。 WDC_DRV_OPEN_ALL すべての基本的な WDC ドライバ オープン フラグ (WDC_DRV_OPEN_CHECK_VER および WDC_DRV_OPEN_REG_REG_LIC) の便利なマスク。 WinDriver のカーネル モジュールへのハンドルを開く基本的 198 A 付 録 な機能は、常に WDC_DriverOpen() [A.3.2] により実行されま す。そのため、 WDC_DRV_OPEN_BASIC フラグを設定する 必要はありません。 WDC_DRV_OPEN_DEFAULT デフォルトの WDC オープン オプションを使用します。 ユーザー モード アプリケーションの場合: WDC_DRV_OPEN_ALL の設定に相当します。 Kernel PlugIn の場合: WDC_DRV_OPEN_KP の設定に相当 します。 WDC_DIRECTION 列挙型 ドライバのアドレス/レジスタ アクセス方向の列挙型。 列挙値 説明 WDC_READ アドレスからの読み取り WDC_WRITE アドレスへの書き込み WDC_ADDR_MODE 列挙型 メモリまたは I/O アドレス/レジスタの読み取り/書き込みモードの列挙型。 この列挙値はメモリまたは I/O アドレス/レジスタが 8、16、32、または 64 ビット (1、2、4、または 8 バイト) の倍数で読み取り/書き込みされているか確認するために使用されます。 列挙値 説明 WDC_MODE_8 8 ビット (1 バイト) モード WDC_MODE_16 16 ビット(2 バイト) モード WDC_MODE_32 32 ビット(4 バイト) モード WDC_MODE_64 64 ビット(8 バイト) モード WDC_ADDR_RW_OPTIONS 列挙型 メモリまたは I/O アドレスがどのように読み取り/書き込みされているか確認するために使用され るフラグの列挙型。 列挙値 説明 WDC_RW_BLOCK 読み取り/書き込みアドレスのブロック。 このフラグは WDC_ReadAddrBlock() [A.3.19] および WDC_WriteAddrBlock() [A.3.20] 関数により自動的に設定され ます。 WDC_RW_MEM_INDIRECT WinDriver を使用して、カーネルで (WD_Transfer() [A.5.14] を 使用して) メモリ アドレスを読み取ります。またはメモリ ア 199 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド ドレスへ書き込みます。 このオプションはメモリ アドレスにのみ関連します。 (メモリ アドレスはデフォルトでは、ユーザー モードからメモリへア クセスする時のアドレスのユーザー モードのマップ、または Kernel PlugIn ドライバからメモリへアクセスする時のカーネ ル モードのマップを使用して、WDC API ディレクトリによっ て読み取り/書き込まれます)。I/O アドレスは常に WD_Transfer() を使用してカーネルで読み取り/書き込まれま す。 WDC_BLOCK_AUTOINC 読み取り/書き込みされたメモリまたは I/O アドレスの各ブ ロックの後に自動的に読み取り/書き込みアドレスをインク リメントします。(フラグが設定されていない場合、各ブロッ クは同じアドレスから読み取り/書き込まれます)。 このオプションはブロック転送にのみ関連しています (例え ば、WDC_RW_BLOCK フラグも設定されている時)。 以下の列挙値は、デフォルトの WDC 読み取り/書き込みアドレス オプションを使用するための便利な オプションを提供します。 列挙値 説明 WDC_RW_OPT_DEFAULT WDC へデフォルトの読み取り/書き込みオプションを使用す るように指示します。シングル (ブロックなし) 転送 (例えば WDC_RW_BLOCK を設定しない) を使用してユーザー モー ド(WDC_RW_MEM_INDIRECT は設定しない) からメモリ ア ドレス ディレクトリを読み取り/書き込みます 注意: このオプションの値はゼロ (0) (<=> 読み取り/書き込み フラグなし) のため、このオプションはその他の WDC_ADDR_RW_OPTIONS オプションと組み合わせること はできません。このオプションは WDC_ReadAddr8/16/32/64() [A.3.17] および WDC_WriteAddr8/16/32/64() [A.3.18] 関数に よって使用されます。 WDC_ADDR_SIZE の定義 typedef DWORD WDC_ADDR_SIZE; メモリおよび I/O アドレス/レジスタ サイズを表すプリプロセッサの定義。 #define の値 説明 WDC_SIZE_8 8 ビット (1 バイト) WDC_SIZE_16 16 ビット (2 バイト) WDC_SIZE_32 32 ビット (4 バイト) 200 A 付 録 WDC_SIZE_64 64 ビット (8 バイト) WDC_SLEEP_OPTIONS の定義 typedef DWORD WDC_SLEEP_OPTIONS; WDC_Sleep() [A.3.52] へ渡されるスリープ オプションを表すプリプロセッサの定義。 定義値 説明 WDC_SLEEP_BUSY ビジー スリープの実行 (CPU を消費します) WDC_SLEEP_NON_BUSY ノンビジー スリープの実行 (CPU を消費しません) WDC_DBG_OPTIONS の定義 typedef DWORD WDC_DBG_OPTIONS; WDC_SetDebugOptions() [A.3.46] へ渡される WDC ライブラリの可能なデバッグ オプションを表す プリプロセッサの定義。 以下のフラグは WDC ライブラリのデバッグ メッセージ用の出力ファイルを決定します。 # 定義値 説明 WDC_DBG_OUT_DBM WDC ライブラリからデバッグ メッセージをデバッグ モニタ [6.2] へ送ります。 WDC_DBG_OUT_FILE デフォルトでは、異なったファイルが WDC_SetDebugOptions() 関数 [A.3.46] の sDbgFile のパラメタ で設定されない限り、デバッグ ファイルは stderr です。 このオプションは、Kernel PlugIn とは反対にユーザー モード からのみサポートされます。 以下のフラグはデバッグ レベルを決定します。例えば、表示する WDC デバッグ メッセージの種類な ど。 # 定義値 説明 WDC_DBG_LEVEL_ERR WDC エラー デバッグ メッセージのみ表示します。 WDC_DBG_LEVEL_TRACE WDC エラー デバッグ メッセージおよび WDC トレースデ バッグメッセージの両方を表示します。 WDC_DBG_NONE WDC デバッグ メッセージを表示しません。 以下のプリプロセッサの定義は WDC_SetDebugOptions() [A.3.46] へ渡される便利なデバッグ フラッ グの組み合わせを提供します。 201 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド ユーザー モードおよび Kernel PlugIn の便利なデバッグ オプション。 # 定義値 説明 WDC_DBG_DEFAULT WDC_DBG_OUT_DBM | WDC_DBG_LEVEL_TRACE : デフォルトのデバッグ オプションを使用します。WDC エ ラーおよびトレース メッセージをデバッグ モニタ [6.2] へ送 ります。 WDC_DBG_DBM_ERR WDC_DBG_OUT_DBM | WDC_DBG_LEVEL_ERR : WDC エラー デバッグ メッセージをデバッグ モニタへ送りま す。 WDC_DBG_DBM_TRACE WDC_DBG_OUT_DBM | WDC_DBG_LEVEL_TRACE : WDC エラーおよびトレース デバッグ メッセージをデバッグ モニタへ送ります。 WDC_DBG_FULL フル WDC デバッグ: ユーザー モード から WDC_DBG_OUT_DBM | WDC_DBG_OUT_FILE | WDC_DBG_LEVEL_TRACE : デバッグ モニタ [6.2] およびデバッグ出力ファイル (デフォル トのファイル: stderr) の両方へ WDC エラー デバッグ メッ セージおよび WDC トレースデバッグ メッセージを送りま す。 Kernel PlugIn から WDC_DBG_OUT_DBM | WDC_DBG_LEVEL_TRACE : WDC エラーおよびトレース メッセージをデバッグ モニター [6.2] へ送ります。 ユーザー モードのみの便利なデバッグ オプション。 #定義値 説明 WDC_DBG_FILE_ERR WDC_DBG_OUT_FILE | WDC_DBG_LEVEL_ERR : WDC エラー デバッグ メッセージをデバッグ ファイル (デ フォルトのファイル: stderr ) へ送ります。 WDC_DBG_FILE_TRACE WDC_DBG_OUT_FILE | WDC_DBG_LEVEL_TRACE : WDC エラーおよびトレース デバッグ メッセージをデバッグ ファイル (デフォルトのファイル: stderr) へ送ります。 WDC_DBG_DBM_FILE_ERR 202 WDC_DBG_OUT_DBM | WDC_DBG_OUT_FILE | A 付 録 WDC_DBG_LEVEL_ERR : WDC エラー デバッグ メッセージをデバッグ モニタ [6.2] お よびデバッグ ファイル (デフォルトのファイル: stderr) の 両方へ送ります。 WDC_DBG_DBM_FILE_TRACE WDC_DBG_OUT_DBM | WDC_DBG_OUT_FILE | WDC_DBG_LEVEL_TRACE : WDC エラーおよびデバッグ メッセージをデバッグ モニタ [6.2] およびデバッグ ファイル (デフォルトのファイル: stderr) の両方へ送ります。 WDC_SLOT_U の共用体 WDC PCI/PCMCIA デバイスのロケーション情報の共用体型。 フィールド pciSlot 型 説明 WD_PCI_SLOT PCI デバイスのロケーション情報 の構造体 dwBus DWORD バス番号 dwSlot DWORD スロット番号 dwFunction DWORD 関数番号 WD_PCMCIA_SLOT PCMCIA デバイスのロケー pcmciaSlot ション情報の構造体 uBus BYTE バス番号 uSocket BYTE ソケット番号 uFunction BYTE 関数番号 WDC_PCI_SCAN_RESULT PCI バス スキャン (WDC_PciScanDevices() [A.3.4] を参照) の結果を保持する構造体型。 フィールド dwNumDevices 型 説明 DWORD 検索基準 (ベンダーおよびデバ イス ID) に一致する PCI バス にあるデバイス数。 deviceId WD_PCI_ID[WD_PCI_CARDS] PCI バスにあるベンダーおよ びデバイス ID と一致する配 列。 dwVendorId DWORD ベンダー ID 203 W I N D R I V E R ユ ー ザ ー ズ dwDeviceId deviceSlot ガ イ ド DWORD デバイス ID WD_PCI_SLOT[WD_PCI_CARDS] 見つかった一致するデバイス の場所についての情報を保持 する構造体の配列。 dwBus DWORD バス番号 dwSlot DWORD スロット番号 dwFunction DWORD 関数番号 WDC_PCMCIA_SCAN_RESULT PCIMCIA バス スキャンの結果を保持するための構造体型。 フィールド dwNumDevices 型 DWORD 説明 検索基準 (製造元およびデバイ ス ID) と一致した PCMCIA で あるデバイス数。 deviceId WD_PCMCIA_ID PCIMCIA バスにある一致する [WD_PCMCIA_CARDS] ベンダーおよびデバイス ID の 配列。 wManufacturerId WORD 製造元 ID wCardId WORD デバイス ID WD_PCMCIA_SLOT 一致するデバイスの場所に関 [WD_PCMCIA_CARDS] する情報を保持する構造体の deviceSlot 配列。 uBus BYTE バス番号 uSocket BYTE ソケット番号 uFunction BYTE 関数番号 A.3.2 WDC_DriverOpen() 目的 WinDriver のカーネル モジュールへのハンドルを開き、保管します。オープン オプションに従っ て WDC ライブラリを開始します。 この関数は、その他の WDC API を呼び出す前に一度だけ呼び出します。 プロトタイプ DWORD DLLCALLCONV WDC_DriverOpen(WDC_DRV_OPEN_OPTIONS openOptions, const CHAR *sLicense); 204 A 付 録 パラメータ 名前 型 入出力 openOptions WDC_DRV_OPEN_OPTIONS 入力 sLicense const CHAR* 入力 説明 名前 説明 openOptions 関数によって実行される開始動作を決定するサポートされる オープン フラグのマスク。 sLicense WinDriver ライセンス登録文字列。この引数は、openOptions 引 数で WDC_DRV_OPEN_REG_LIC フラグが設定されていない 場合、無視されます。 このパラメータが NULL ポインタまたは文字列の場合、この 関数はデモの WinDriver 評価版ライセンスを登録しようとし ます。WinDriver を評価しているときは、このパラメタに NULL ポインタを渡します。WinDriver ツールキットを登録し た後、WinDriver ラインセンス登録文字列を渡すコードを変更 します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します [A.15]。 A.3.3 WDC_DriverClose() (以前に WDC_DriverOpen() [A.3.2] への呼び出しにより取得され、保管された) WDC WinDriver ハンドルを閉じ、WDC ライブラリを初期化しません。 各 WDC_DriverOpen() の呼び出しは、WDC ライブラリを使用する必要がなくなった場合に実行する 一致した WDC_DriverClose の呼び出しを持っています。 プロトタイプ DWORD DLLCALLCONV WDC_DriverClose(void); パラメータ なし 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 205 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.3.4 WDC_PciScanDevices() 目的 特定のベンダーおよびデバイス ID の組み合わせで全デバイス用の PCI バスをスキャンし、検出さ れたデバイスおよびそれらの場所に関する情報を返します。 プロトタイプ DWORD DLLCALLCONV WDC_PciScanDevices(DWORD dwVendorId, DWORD dwDeviceId, WDC_PCI_SCAN_RESULT *pPciScanResult); パラメータ 名前 型 入出力 dwVendorId DWORD 入力 dwDeviceId DWORD 入力 pPciScanResult WDC_PCI_SCAN_RESULT* 出力 説明 名前 説明 dwVendorId 検索するベンダー ID (16 進数)。 ゼロ (0) はすべてのベンダー ID。 dwDeviceId 検索するデバイス ID (16 進数)。 ゼロ (0) はすべてのデバイス ID。 pPciScanResult PCI バス スキャン [A.3.1] の結果を含む関数によりアップデー トされる構造体へのポインタ。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • ベンダーおよびデバイス ID の両方がゼロ (0) に返るように設定した場合、この関数はすべ ての接続された PCI デバイスに関する情報を返します。 A.3.5 WDC_PcmciaScanDevices() 目的 特定の製造元およびデバイス ID の組み合わせで全デバイス用の PCMCIA をスキャンし、検出さ れたデバイスおよびそれらの場所に関する情報を返します。 206 付 録 A プロトタイプ DWORD DLLCALLCONV WDC_PcmciaScanDevices(WORD wManufacturerId, WORD wDeviceId, WDC_PCMCIA_SCAN_RESULT *pPcmciaScanResult); パラメータ 名前 型 入出力 wManufacturerId WORD 入力 wDeviceId WORD 入力 pPcmciaScanResult WDC_PCMCIA_SCAN_RESULT* 出力 説明 名前 説明 wManufacturerId 検索する製造元 ID (16 進数)。 ゼロ (0) はすべての製造元 ID。 検索するデバイス ID (16 進数)。 wDeviceId ゼロ (0) はすべてのデバイス ID。 PCMCIA バス スキャン [A.3.1] の結果を含む関数によりアッ pPcmciaScanResult プデートされる構造体へのポインタ。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • ベンダーおよびデバイス ID の両方がゼロ (0) に返るように設定した場合、この関数はすべ ての接続された PCI デバイスに関する情報を返します。 A.3.6 WDC_PciGetDeviceInfo() 目的 PCI デバイスのリソース情報 (メモリおよび I/O 範囲と割り込み情報) を取得します。 プロトタイプ DWORD DLLCALLCONV WDC_PciGetDeviceInfo(WD_PCI_CARD_INFO *pDeviceInfo); パラメータ 名前 pDeviceInfo pciSlot 型 入出力 WD_PCI_CARD_INFO* 入力/出力 WD_PCI_SLOT 入力 207 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwBus DWORD 入力 dwSlot DWORD 入力 dwFunction DWORD 入力 WD_CARD 出力 dwItems DWORD 出力 Item WD_ITEMS[WD_CARD_ITEMS] 出力 item DWORD 出力 fNotSharable DWORD 出力 I union 出力 struct 出力 dwPhysicalAddr DWORD 出力 dwBytes DWORD 出力 dwTransAddr DWORD N/A dwUserDirectAddr DWORD N/A DWORD N/A DWORD 出力 struct 出力 dwAddr DWORD 出力 dwBytes DWORD 出力 dwBar DWORD 出力 struct 出力 dwInterrupt DWORD 出力 dwOptions DWORD N/A hInterrupt DWORD N/A struct 出力 dwBusType WD_BUS_TYPE 出力 dwBusNum DWORD 出力 dwSlotFunc DWORD 出力 Card Mem dwCpuPhysicalAddr dwBar IO Int Bus 208 A 付 録 説明 名前 説明 pDeviceInfo PCI デバイス情報構造体へのポインタ pciSlot WDC_PciScanDevices() [A.3.4] を呼び出すことにより取得する ことができるデバイスのロケーション情報構造体へのポイン タ dwBus バス番号 dwSlot スロット番号 dwFunction 関数番号 Card PCI デバイスのリソース情報構造体へのポインタ dwItems デバイス上のアイテム (リソース) 数 Item デバイスのリソース (アイテム) 情報構造体の配列 Item アイテムの種類: ITEM_NONE / ITEM_INTERRUPT / ITEM_MEMORY / ITEM_IO / ITEM_BUS fNotSharable True の場合、一度に 1 つのアプリケーションだけがメモリま たは I/O 範囲へアクセスするか、デバイスの割り込みをモニ タします。 I アイテムの種類 (Item) を基にしたリソース データの共用体 I.Mem メモリ アイテム (ITEM_MEMORY) の情報 I.Mem.dwPhysicalAddr 物理メモリ範囲の最初のアドレス I.Mem.dwBytes メモリ範囲のバイト単位での長さ I.Mem.dwBar ベース アドレス レジスタ番号 I.IO I/O アイテム (ITEM_IO) の情報 I.IO.dwAddr Firs address of the I/O range I/O 範囲の最初のアドレス I.IO.dwBytes I/O 範囲のバイト単位での長さ I.IO.dwBar ベース アドレス レジスタ番号 I.Int 割り込みアイテム (ITEM_INTERRUPT) の情報 I.Int.dwInterrupt 割り込み要求 (IRQ) の物理的な番号 I.Bus バス アイテム (ITEM_BUS) の情報 I.Bus.dwBusType デバイスのバスの種類。PCI デバイスの場合、バスの種類は WD_BUS_PCI です。 209 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド I.Bus.dwBusNum デバイスのバス番号 I.Bus.dwSlotFunc このデバイスのスロットおよび関数の情報。下の 3 バイトが 関数番号を示し、残りのバイトがスロット番号を示します。 例えば、0x80 (<=> 10000000 バイナリ) は、関数番号が 0 (下の 3 バイトが 000) でスロット番号が 0x10 (残りの番号が 10000) であることを示します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • リソース 情報は情報が無い限り、オペレーティング システムの Plug-and-Play マネージャ から入手されます。情報が無い場合、PCI 設定登録から直接読み取られます。 注意: Windows では、この関数を呼び出す前に WinDriver にデバイスを登録する INF ファ イルをインストールする必要があります。(WinDriver での INF ファイルの作成に関する詳 細はセクション[14.4] を参照) 。 • 割り込み要求 (IRQ) 番号が Plug-and-Play マネージャから取得される場合、IRQ はマップさ れています。そのため IRQ の物理的な番号と異なる場合があります。 A.3.7 WDC_PcmciaGetDeviceInfo() 目的 PCMCIA デバイスのリソース情報 (メモリと I/O 範囲および割り込み情報) を取得します。 プロトタイプ DWORD DLLCALLCONV WDC_PcmciaGetDeviceInfo(WD_PCMCIA_CARD_INFO *pDeviceInfo); パラメータ 名前 型 入出力 WD_PCMCIA_CARD_INFO* 入力/出力 WD_PCMCIA_SLOT 入力 uBus BYTE 入力 uSocket BYTE 入力 uFunction BYTE 入力 WD_CARD 出力 dwItems DWORD 出力 Item WD_ITEMS[WD_CARD_ITEMS] 出力 pDeviceInfo pcmciaSlot Card 210 付 録 item DWORD 出力 fNotSharable DWORD 出力 I union 出力 struct 出力 dwPhysicalAddr DWORD 出力 dwBytes DWORD 出力 dwTransAddr DWORD N/A dwUserDirectAddr DWORD N/A DWORD N/A DWORD 出力 struct 出力 dwAddr DWORD 出力 dwBytes DWORD 出力 dwBar DWORD 出力 struct 出力 dwInterrupt DWORD 出力 dwOptions DWORD N/A hInterrupt DWORD N/A struct 出力 dwBusType WD_BUS_TYPE 出力 dwBusNum DWORD 出力 dwSlotFunc DWORD 出力 CHAR 出力 Mem A dwCpuPhysicalAddr dwBar IO Int Bus cVersion [WD_PCMCIA_VERSION_LEN] cManufacturer CHAR [WD_PCMCIA_ 出力 MANUFACTURER_LEN] cProductName CHAR [WD_PCMCIA_ 出力 PRODUCTNAME_LEN] wManufacturerId WORD 出力 211 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド wCardId WORD 出力 wFuncId WORD 出力 説明 名前 説明 pDeviceInfo PCMCIA デバイスの情報構造体へのポインタ pcmciaSlot WDC_PcmciaScanDevices() [A.3.5] の呼び出しにより取得する ことができる PCMCIA デバイスのロケーション情報構造体 uBus バス番号 uSocket ソケット番号 uFunction 関数番号 Card PCMCIAデバイスのリソース情報構造体 dwItems デバイス上のアイテム (リソース) 数 Item デバイスのリソース (アイテム) 情報構造体の配列 Item アイテムの種類: ITEM_NONE / ITEM_INTERRUPT / ITEM_MEMORY / ITEM_IO / ITEM_BUS fNotSharable True の場合、一度に 1 つのアプリケーションだけがメモリま たは I/O 範囲へアクセスするか、デバイスの割り込みをモニ タします。 I アイテムの種類 (Item) を基にしたリソース データの共用体 I.Mem メモリ アイテム (ITEM_MEMORY) 情報 I.Mem.dwPhysicalAddr 物理メモリ範囲の最初のアドレス。 I.Mem.dwBytes メモリ範囲のバイト単位での長さ。 I.Mem.dwBar ベース アドレス レジスタ番号 I.IO I/O アイテム (ITEM_IO) 情報 I.IO.dwAddr I/O 範囲の最初のアドレス I.IO.dwBytes I/O 範囲のバイト単位での長さ I.IO.dwBar ベース アドレス レジスタ番号 I.Int 割り込みアイテム (ITEM_INTERRUPT) 情報 I.Int.dwInterrupt 割り込み要求 (IRQ) の物理的な番号 I.Bus バス アイテム (ITEM_BUS) 情報 212 付 録 I.Bus.dwBusType A デバイスのバスの種類。PCMCIA デバイスの場合、バスの種 類は WD_BUS_PCMCIA です。 I.Bus.dwBusNum I.Bus.dwSlotFunc デバイスのバス番号。 このデバイスのスロットおよび関数の情報。下の 3 バイトが 関数番号を示し、残りのバイトがスロット番号を示します。 例えば、0x80 (<=> 10000000 バイナリ) は、関数番号が 0 (下の 3 バイトが 000) でスロット番号が 0x10 (残りの番号が 10000) であることを示します。 cVersion デバイスのバージョンの文字列 cManufacturer デバイスの製造元の文字列 cProductName デバイスの製品の文字列 wManufacturerId デバイスの製造元 wCardId デバイスのデバイス ID wFuncId デバイスの関数 ID 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • リソース 情報は情報が無い限り、オペレーティング システムの Plug-and-Play マネージャ から入手されます。情報が無い場合、PCMCIA 設定登録から直接読み取られます。 注意: Windows では、この関数を呼び出す前に WinDriver にデバイスを登録する INF ファ イルをインストールする必要があります。(WinDriver での INF ファイルの作成に関する詳 細はセクション[14.4] を参照) 。 • 割り込み要求 (IRQ) 番号が Plug-and-Play マネージャから取得される場合、IRQ はマップさ れています。そのため IRQ の物理的な番号と異なる場合があります。 A.3.8 WDC_PciDeviceOpen() 目的 WDC PCI デバイス構造体を割り当て、開始します。そして、デバイスを WinDriver へ登録し、デ バイスへのハンドルを返します。 この関数で実行される動作 デバイス上の共有できないメモリまたは I/O リソースが単独で登録されていないか検証します。 デバイス上にある物理的メモリ範囲をカーネル モードおよびユーザー モードのアドレス空間の 両方へマップし、将来使用するデバイス構造体にマップされたアドレスを保存します。 213 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド デバイスとの通信をサポートするために必要なデバイスのリソース情報を保存します。 例えば、ユーザーがデバイスの割り込みを処理する関数を呼び出した際に使用する割り込み処理を 取得して保存するのと同様に、この関数は割り込み要求 (IRQ) 番号と割り込みの種類 (PCI 用のレベ ル センシティブ) を保存します。 呼び出し元がデバイスと通信する Kernel PlugIn ドライバを使用する場合、この関数はこのドライ バへのハンドルを開き、これを将来使用するために保存します。 プロトタイプ DWORD DLLCALLCONV WDC_PciDeviceOpen(WDC_DEVICE_HANDLE *phDev, const WD_PCI_CARD_INFO *pDeviceInfo, const PVOID pDevCtx, WD_CARD_CLEANUP *pDeviceCleanup, const CHAR *pcKPDriverName, PVOID pKPOpenData); パラメータ 名前 型 入出力 phDev WDC_DEVICE_HANDLE* 出力 pDeviceInfo const WD_PCI_CARD_INFO* 入力 pDevCtx const PVOID 入力 pDeviceCleanup WD_CARD_CLEANP 入力 pcKPDriverName const CHAR * 入力 pKPOpenData PVOID 入力 説明 名前 説明 phDev この関数により割り当てられた WDC デバイスをハンドルす るポインタ pDeviceInfo PCI デバイスのリソース情報構造体へのポインタ WDC_PciGetDeviceInfo() [A.3.6] を参照 pDevCtx デバイス構造体に保存されるデバイスのコンテキスト情報へ のポインタ pDeviceCleanup アプリケーションの終了によりデバイスへ実行されるク リーンアップ情報での構造体へのポインタ - WD_CardCleanupSetup() [A.5.12] (パラメタ オプション) を参照 pcKPDriverName Kernel PlugIn ドライバ名。 アプリケーションが Kernel PlugIn を使用していない場合、こ の引数に NULL ポインタを渡してください。 pKPOpenData 214 WD_KernelPlugInOpen() [A.12.1] へ渡される Kernel PlugIn ドラ A 付 録 イバのオープン データ。 アプリケーションが Kernel PlugIn ドライバを使用していない 場合、この引数に NULL ポインタを渡してください。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この関数はユーザー モードからのみ呼び出すことができます。 • カードがカーネルの仮想アドレス空間へ完全にマップできない広いメモリ範囲を持つ場 合、WDC_PciGetDeviceInfo() [A.3.6] から入手したカードのリソース情報構造体で、このリ ソースに関連するアイテムを変更し、情報構造体 (pDeviceInfo) が WDC_PciDeviceOpen() へ 渡される前にアイテムの dwOptions オプション フィールド (pDeviceInfo->Card.Item[i].dwOptions) で WD_ITEM_DO_NOT_MAP_KERNEL フラグを設定 します。 WD_ITEM_DO_NOT_MAP_KERNEL フラグは、カーネルのアドレス空間ではなくユーザー モードの仮想アドレス空間だけに関連したメモリをマップする関数を指示します。 注意: このフラグを設定した場合、この関数により作成されるデバイスの情報構造体は、 このリソー ス用のカーネルのマップ アドレスを保持しません。(関連したメモリ用の WDC_DEVICE 構造体 [A.4.3] で pAddrDesc[i]kptAddr はアップデートされません)。このた め WinDriver API への呼び出しでこのマップに依存することはできません。Kernel PlugIn ド ライバからメモリへアクセスする時も依存できません。 A.3.9 WDC_PcmciaDeviceOpen() 目的 WDC PCMCIA デバイス構造体を割り当て、開始します。デバイスを WinDriver へ登録し、デバイ スへのハンドルを返します。 この関数で実行される動作 デバイス上の共有できないメモリまたは I/O リソースが単独で登録されていないか検証します。 デバイス上にある物理的メモリ範囲をカーネル モードおよびユーザー モードのアドレス空間の 両方へマップし、将来使用するデバイス構造体にマップされたアドレスを保存します。 デバイスとの通信をサポートするために必要なデバイスのリソース情報を保存します。 例えば、ユーザーがデバイスの割り込みを処理する関数を呼び出した際に使用する割り込み処理を 取得して保存するのと同様に、この関数は割り込み要求 (IRQ) 番号と割り込みの種類 (エッジ トリ ガー/レベル センシティブ) を保存します。 呼び出し元がデバイスと通信する Kernel PlugIn ドライバを使用する場合、この関数はこのドライ バへのハンドルを開き、これを将来使用するために保存します。 215 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド プロトタイプ DWORD DLLCALLCONV WDC_PcmciaDeviceOpen(WDC_DEVICE_HANDLE *phDev, const WD_PCMCIA_CARD_INFO *pDeviceInfo, const PVOID pDevCtx, WD_CARD_CLEANUP *pDeviceCleanup, const CHAR *pcKPDriverName, PVOID pKPOpenData); パラメータ 名前 型 入出力 phDev WDC_DEVICE_HANDLE* 出力 pDeviceInfo const WD_PCMCIA_CARD_INFO* 入力 pDevCtx const PVOID 入力 pDeviceCleanup WD_CARD_CLEANP 入力 pcKPDriverName const CHAR * 入力 pKPOpenData PVOID 入力 説明 名前 説明 phDev この関数により割り当てられた WDC デバイスをハンドルす るポインタ pDeviceInfo PCMCIA デバイスのリソース情報構造体へのポインタ WDC_PcmciaGetDeviceInfo() [A.3.7] を参照 pDevCtx デバイス構造体に保存されるデバイスのコンテキスト情報へ のポインタ pDeviceCleanup アプリケーションの終了によりデバイスへ実行されるク リーンアップ情報での構造体へのポインタ - WD_CardCleanupSetup() [A.5.12] (パラメタ オプション) を参照 pcKPDriverName Kernel PlugIn ドライバ名。 アプリケーションが Kernel PlugIn を使用していない場合、こ の引数に NULL ポインタを渡してください。 pKPOpenData WD_KernelPlugInOpen() [A.12.1] へ渡される Kernel PlugIn ドラ イバのオープン データ。 アプリケーションが Kernel PlugIn ドライバを使用していない 場合、この引数に NULL ポインタを渡してください。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 216 A 付 録 注釈 • この関数はユーザー モードからのみ呼び出すことができます。 • カードがカーネルの仮想アドレス空間へ完全にマップできない広いメモリ範囲を持つ場 合、WDC_PcmciaGetDeviceInfo() [A.3.7] から入手したカードのリソース情報構造体で、こ のリソースに関連するアイテムを変更し、情報構造体 (pDeviceInfo) が WDC_PcmciaDeviceOpen() へ渡される前にアイテムの dwOptions オプション フィールド (pDeviceInfo->Card.Item[i].dwOptions) で WD_ITEM_DO_NOT_MAP_KERNEL フラグを設定 します。 WD_ITEM_DO_NOT_MAP_KERNEL フラグは、カーネルのアドレス空間ではなくユーザー モードの仮想アドレス空間だけに関連したメモリをマップする関数を指示します。 注意: このフラグを設定した場合、この関数により作成されるデバイスの情報構造体は、 このリソー ス用のカーネルのマップ アドレスを保持しません。(関連したメモリ用の WDC_DEVICE 構造体 [A.4.3] で pAddrDesc[i]kptAddr はアップデートされません)。このた め WinDriver API への呼び出しでこのマップに依存することはできません。Kernel PlugIn ド ライバからメモリへアクセスする時も依存できません。 A.3.10 WDC_IsaDeviceOpen() 目的 WDC ISA デバイス構造体を割り当て、開始します。デバイスを WinDriver へ登録し、デバイスへ のハンドルを返します。 この関数で実行される動作 デバイス上の共有できないメモリまたは I/O リソースが単独で登録されていないか検証します。 デバイス上にある物理的メモリ範囲をカーネル モードおよびユーザー モードのアドレス空間の 両方へマップし、将来使用するデバイス構造体にマップされたアドレスを保存します。 デバイスとの通信をサポートするために必要なデバイスのリソース情報を保存します。 例えば、ユーザーがデバイスの割り込みを処理する関数を呼び出した際に使用する割り込み処理を 取得して保存するのと同様に、この関数は割り込み要求 (IRQ) 番号と割り込みの種類 (エッジ トリ ガー/レベル センシティブ) を保存します。 呼び出し元がデバイスと通信する Kernel PlugIn ドライバを使用する場合、この関数はこのドライ バへのハンドルを開き、これを将来使用するために保存します。 プロトタイプ DWORD DLLCALLCONV WDC_IsaDeviceOpen(WDC_DEVICE_HANDLE *phDev, const WD_CARD *pDeviceInfo, const PVOID pDevCtx, WD_CARD_CLEANUP *pDeviceCleanup, const CHAR *pcKPDriverName, PVOID pKPOpenData); 217 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 型 入出力 phDev WDC_DEVICE_HANDLE* 出力 pDeviceInfo const WD_CARD* 入力 dwItems DWORD 入力 Item WD_ITEMS[WD_CARD_ITEMS] 入力 item DWORD 入力 fNotSharable DWORD 入力 dwOptions DWORD 入力 I union 入力 Mem dwPhysicalAddr DWORD 入力 dwBytes DWORD 入力 dwTransAddr DWORD N/A dwUserDirectAddr DWORD N/A dwCpuPhysicalAddr DWORD N/A dwBar DWORD 入力 IO struct dwAddr DWORD 入力 dwBytes DWORD 入力 dwBar DWORD 入力 Int struct dwInterrupt DWORD 入力 dwOptions DWORD 入力 hInterrupt DWORD N/A Bus 218 struct struct dwBusType WD_BUS_TYPE 入力 dwBusNum DWORD 入力 dwSlotFunc DWORD 入力 A 付 録 pDevCtx const PVOID 入力 pDeviceCleanup WD_CARD_CLEANP 入力 pcKPDriverName const CHAR * 入力 pKPOpenData PVOID 入力 説明 名前 説明 phDev この関数により割り当てられた WDC デバイスをハンドルす るポインタ pDeviceInfo デバイスのリソース情報を保持する構造体へのポインタ dwItems デバイス上のアイテム (リソース) 数 Item デバイスのリソース (アイテム) 情報構造体の配列 Item アイテムの種類: ITEM_NONE / ITEM_INTERRUPT / ITEM_MEMORY / ITEM_IO / ITEM_BUS fNotSharable True の場合、一度に 1 つのアプリケーションだけがメモリま たは I/O 範囲へアクセスするか、デバイスの割り込みをモニ タします。 dwOptions 以下の WD_ITEM_OPTIONS フラグのいずれか。 WD_ITEM_DO_NOT_MAP_KERNEL: このフラグは、メモリ アドレスの範囲をカーネル仮想アドレス空間へマップするの を避け、ユーザー モードの仮想アドレス空間へのみメモリを マップする関数を指示します。 この関数に関する詳細は注釈を参照してください。 注意: このフラグはメモリ アイテムだけに適用できます。 I アイテムの種類 (Item) を基にしたリソース データの共用体 I.Mem メモリ アイテム (ITEM_MEMORY) 情報 I.Mem.dwPhysicalAddr 物理メモリ範囲の最初のアドレス I.Mem.dwBytes メモリ範囲のバイト単位での長さ I.Mem.dwBar ベース アドレス レジスタ番号 I.IO I/O アイテム (ITEM_IO) 情報 I.IO.dwAddr I/O 範囲の最初のアドレス I.IO.dwBytes I/O 範囲のバイト単位での長さ 219 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド I.IO.dwBar ベース アドレス レジスタ番号 I.Int 割り込みアイテム (ITEM_INTERRUPT) 情報 I.Int.dwInterrupt 割り込み要求 (IRQ) の物理的な番号 I.Int.dwOptions 以下のフラグの組み合わせで構成される割り込み情報のビッ ト マスク (ゼロ (0) はオプションなし)。 INTERRUPT_LEVEL_SENSITIVE - レベル センシティブの 割り込み。デフォルト - 割り込みはエッジ トリガー式です。 ISA の割り込みは一般的にエッジ トリガー式です。 INTERRUPT_CE_INT_ID -その他のオペレーティング シス テムとは異なり、Windows CE では、物理的な割り込み番号を 論理的な割り込み番号へ抽出します。このビットを設定する と、WinDriver へ論理的な割り込み番号である IRQ 番号 (dwInterruput) を参照し、物理的な割り込み番号へ変換するよ う指示します。 I.Bus バス アイテム (ITEM_BUS) 情報 I.Bus.dwBusType デバイスのバスの種類。PCMCIA デバイスの場合、バスの種 類は WD_BUS_ISA です。 I.Bus.dwBusNum I.Bus.dwSlotFunc デバイスのバス番号。 このデバイスのスロットおよび関数の情報。下の 3 バイトが 関数番号を示し、残りのバイトがスロット番号を示します。 例えば、0x80 (<=> 10000000 バイナリ) は、関数番号が 0 (下の 3 バイトが 000) でスロット番号が 0x10 (残りの番号が 10000) であることを示します。 pDevCtx デバイス構造体に保存されるデバイスのコンテキスト情報へ のポインタ pDeviceCleanup アプリケーションの終了によりデバイスへ実行されるク リーンアップ情報での構造体へのポインタ - WD_CardCleanupSetup() [A.5.12] (パラメタ オプション) を参 照。 pcKPDriverName Kernel PlugIn のドライバ名。 アプリケーションが Kernel PlugIn ドライバを使用していない 場合、この引数に NULL ポインタを渡してください。 pKPOpenData WD_KernelPlugInOpen() [A.12.1] へ渡される Kernel PlugIn ドラ イバのオープン データ アプリケーションが Kernel PlugIn ドライバを使用していない 場合、この引数に NULL ポインタを渡してください。 220 A 付 録 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この関数はユーザー モードからのみ呼び出すことができます。 • カードがカーネルの仮想アドレス空間へ完全にマップできない広いメモリ範囲を持つ場 合、カーネルのアドレス空間ではなくユーザー モードの仮想アドレス空間だけに関連した メモリをマップする関数を指示するために、関連したメモリの WD_ITEMS 構造体用の WD_ITEM_OPTIONS フラグを設定することができます ( pDeviceInfo->Card.item[i].dwOptions)。 注意: このフラグを設定した場合、この関数により作成されるデバイスの情報構造体は、 このリソー ス用のカーネルのマップ アドレスを保持しません。(関連したメモリ用の WDC_DEVICE 構造体 [A.4.3] で pAddrDesc[i]kptAddr はアップデートされません)。このた め WinDriver API への呼び出しでこのマップに依存することはできません。Kernel PlugIn ド ライバからメモリへアクセスする時も依存できません。 A.3.11 WDC_PciDeviceClose() 目的 WDC PCI デバイスの構造体を初期化せず、割り当てられたメモリを解放します。 プロトタイプ DWORD DLLCALLCONV WDC_PciDeviceClose(WDC_DEVICE_HANDLE hDev); パラメータ 名前 hDev 型 入出力 WDC_DEVICE_HANDLE 入力 説明 名前 説明 hDev WDC_PciDeviceOpen() [A.3.8] により返される WDC PCI デバ イスの構造体へのハンドル 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この関数はユーザー モードからのみ呼び出すことができます。 221 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.3.12 WDC_PcmciaDeviceClose() 目的 WDC PCMCIA デバイスの構造体を初期化せず、割り当てられたメモリを解放します。 プロトタイプ DWORD DLLCALLCONV WDC_PcmciaDeviceClose(WDC_DEVICE_HANDLE hDev); パラメータ 名前 hDev 型 入出力 WDC_DEVICE_HANDLE 入力 説明 名前 説明 hDev WDC_PcmciaDeviceOpen() [A.3.9] により返される WDC PCMCIA デバイスの構造体へのハンドル 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この関数はユーザー モードからのみ呼び出すことができます。 A.3.13 WDC_IsaDeviceClose() 目的 WDC ISA デバイスの構造体を初期化せず、割り当てられたメモリを解放します。 プロトタイプ DWORD DLLCALLCONV WDC_IsaDeviceClose(WDC_DEVICE_HANDLE hDev); パラメータ 名前 hDev 型 入出力 WDC_DEVICE_HANDLE 入力 説明 名前 説明 hDev WDC_IsaDeviceOpen() [A.3.10] により返される WDC ISA デバ イスの構造体へのハンドル 222 A 付 録 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この関数はユーザー モードからのみ呼び出すことができます。 A.3.14 WDC_CallKerPlug() 目的 ユーザー モード アプリケーションから Kernel PlugIn ドライバへメッセージを送ります。この関数 はアプリケーションから指定のメッセージ ID の処理を実装する Kernel PlugIn の KP_Call() [A.13.4] 関数へメッセージ ID を渡し、Kernel PlugIn からユーザー モード アプリケーションへ結果を返しま す。 プロトタイプ DWORD DLLCALLCONV WDC_CallKerPlug(WDC_DEVICE_HANDLE hDev, DWORD dwMsg, PVOID pData, PDWORD pdwResult); パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwMsg DWORD 入力 pData PVOID 入力 pdwResult pdwResult 出力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) により返される WDC デバイスへのハンドル dwMsg Kernel PlugIn ドライバ (特に KP_Call() [A.13.4]) へ渡すメッ セージ ID pData Kernel PlugIn ドライバへ渡すデータへのポインタ pdwResult 送られたメッセージの結果として、カーネルで実行される操 作のための Kernel PlugIn ドライバ (KP_Call()) により返された 結果 223 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.15 WDC_ReadMemXXX() 目的 WDC_ReadMem8/16/32/64() は、それぞれ 1 バイト (8 ビット) / 2 バイト (16 ビット) / 4 バイト (32 ビット) / 8 バイト (64 ビット) を指定のメモリ アドレスから読み取ります。このアドレスは、呼び 出しコンテキスト (ユーザー モード/カーネル モード) で直接読み取られます。 プロトタイプ BYTE *WDC_ReadMem8(addr, off) WORD *WDC_ReadMem16(addr, off) UINT32 *WDC_ReadMem32(addr, off) UINT64 *WDC_ReadMem64(addr, off) パラメータ 名前 型 入出力 addr DWORD 入力 off DWORD 入力 説明 名前 説明 addr 読み取るメモリ アドレス領域 off 読み取る指定アドレス領域 (addr) の初めからのオフセット 戻り値 特定のアドレスから読み取られたデータを返します。 A.3.16 WDC_WriteMemXXX() 目的 WDC_WriteMem8/16/32/64() は、それぞれ 1 バイト (8 ビット) / 2 バイト (16 ビット) / 4 バイト (32 ビット) / 8 バイト (64 ビット) を指定のメモリ アドレスへ書き込み。このアドレスは、呼び出しコン テキスト (ユーザー モード/カーネル モード) で直接書き込まれます。 プロトタイプ void void void void 224 WDC_WriteMem8(addr, off, val) WDC_WriteMem16(addr, off, val) WDC_WriteMem32(addr, off, val) WDC_WriteMem64(addr, off, val) A 付 録 パラメータ 名前 型 入出力 addr DWORD 入力 off DWORD 入力 val BYTE / WORD / 入力 UINT32 / UINT64 説明 名前 説明 addr 読み取るメモリ アドレス領域 off 読み取る指定アドレス領域 (addr) の初めからのオフセット val 指定のアドレスへ書き込むデータ 戻り値 なし A.3.17 WDC_ReadAddrXXX() 目的 WDC_ReadAddr8/16/32/64() は、それぞれ 1 バイト (8 ビット) / 2 バイト (16 ビット) / 4 バイト (32 ビット) / 8 バイト (64 ビット) を指定のメモリ アドレス、または IO アドレスから読み取ります。 プロトタイプ DWORD DLLCALLCONV WDC_ReadAddr8(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, BYTE *val); DWORD DLLCALLCONV WDC_ReadAddr16(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, WORD *val); DWORD DLLCALLCONV WDC_ReadAddr32(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, UINT32 *val); DWORD DLLCALLCONV WDC_ReadAddr64(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, UINT64 *val); パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwAddrSpace DWORD 入力 dwOffset DWORD 入力 225 W I N D R I V E R val ユ ー ザ ー ズ ガ イ ド BYTE* / WORD* / 出力 UINT32* / UINT64* 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) により返される WDC デバイスへのハンドル dwAddrSpace 読み取るメモリまたは I/O アドレス領域 dwOffset 読み取る指定アドレス領域 (dwAddrSpace) の初めからのオフ セット val 指定のアドレスから読み取られるデータで埋められるバッ ファへのポインタ 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.18 WDC_WriteAddrXXX() 目的 WDC_WriteAddr8/16/32/64() は、それぞれ 1 バイト (8 ビット) / 2 バイト (16 ビット) / 4 バイト (32 ビット) / 8 バイト (64 ビット) を指定のメモリ アドレス、または IO アドレスへ書き込みます。 プロトタイプ DWORD DLLCALLCONV WDC_WriteAddr8(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, BYTE val) DWORD DLLCALLCONV WDC_WriteAddr16(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, WORD val); DWORD DLLCALLCONV WDC_WriteAddr32(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, UINT32 val); DWORD DLLCALLCONV WDC_WriteAddr64(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, UINT64 val); パラメータ 名前 226 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwAddrSpace DWORD 入力 dwOffset DWORD 入力 A 付 録 val BYTE / WORD / 入力 UINT32 / UINT64 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) により返される WDC デバイスへのハンドル dwAddrSpace 書き込むメモリまたは I/O アドレス領域 dwOffset 書き込む指定アドレス領域 (dwAddrSpace) の初めからのオフ セット val 指定のアドレスへ書き込むデータ 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.19 WDC_ReadAddrBlock() 目的 デバイスからデータ ブロックを読み取ります。 プロトタイプ DWORD DLLCALLCONV WDC_ReadAddrBlock(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, DWORD dwBytes, PVOID pData, WDC_ADDR_MODE mode, WDC_ADDR_RW_OPTIONS options) パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwAddrSpace DWORD 入力 dwOffset DWORD 入力 dwBytes DWORD 入力 pData PVOID 出力 mode WDC_ADDR_MODE 入力 options WDC_ADDR_RW_OPTIONS 入力 227 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) により返される WDC デバイスへのハンドル dwAddrSpace 読み取るメモリまたは I/O アドレス領域 dwOffset 読み取る指定アドレス領域 (dwAddrSpace) の初めからのオフ セット dwBytes 読み取るバイト数 pData デバイスから読み取られるデータで埋められるバッファへの ポインタ mode リード アクセス モード - WDC_ADDR_MODE [A.3.1] を参照 options データがどのように読み取られるかを決定するビット マスク - WDC_ADDR_RW_OPTIONS [A.3.1] を参照。 この関数は自動的に WDC_RW_BLOCK フラグを設定します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.20 WDC_WriteAddrBlock() 目的 データ ブロックをデバイスへ書き込みます。 プロトタイプ DWORD DLLCALLCONV WDC_WriteAddrBlock(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace, DWORD dwOffset, DWORD dwBytes, PVOID pData, WDC_ADDR_MODE mode, WDC_ADDR_RW_OPTIONS options) パラメータ 名前 228 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwAddrSpace DWORD 入力 dwOffset DWORD 入力 dwBytes DWORD 入力 pData PVOID 入力 mode WDC_ADDR_MODE 入力 A 付 録 options WDC_ADDR_RW_OPTIONS 入力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) により返される WDC デバイスへのハンドル dwAddrSpace 書き込むメモリまたは I/O アドレス領域 dwOffset 書き込む指定アドレス領域 (dwAddrSpace) の初めからのオフ セット dwBytes 書き込むバイト数 pData デバイスへ書き込むデータを保持するバッファへのポインタ mode 書き込みアクセス モード - WDC_ADDR_MODE [A.3.1] を参 照 options データがどのように書き込まれるかを決定するビット マスク - WDC_ADDR_RW_OPTIONS [A.3.1] を参照。 この関数は自動的に WDC_RW_BLOCK フラグを設定します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.21 WDC_MultiTransfer() 目的 メモリ グループおよび/または I/O グループの読み取り/書き込み転送を実行します。 プロトタイプ DWORD DLLCALLCONV WDC_MultiTransfer(WD_TRANSFER *pTrans, DWORD dwNumTrans); パラメータ 名前 pTrans 型 入出力 WD_TRANSFER* cmdTrans DWORD 入力 dwPort DWORD 入力 dwBytes DWORD 入力 fAutoinc DWORD 入力 229 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwOptions DWORD Data union Data.Byte BYTE 入力/出力 Data.Word WORD 入力/出力 Data.Dword DWORD 入力/出力 Data.Qword QWORD 入力/出力 Data.pBuffer PVOID 入力/出力 DWORD 入力 dwNumTrans 入力 説明 名前 説明 pTrans 転送コマンドの情報構造体の配列へのポインタ cmdTrans 実行する転送コマンドの種類を表す値 - windrvr.h での WD_TRANSFER_CMD 列挙型の定義を参照。転送コマンドは 以下の形式に一致します。 <dir><p>_<string><size> dir: R は読み取り、 W は書き込み p: P は I/O ポート (アドレス)、M はメモリ ポート(アドレス) string: S は文字列 (ブロック) 転送、その他の場合はシン グル転送 size: BYTE、WORD、DWORD、または QWORD dwPort 関連したデバイス (WDC_DEVICE [A.4.3]) に保存されている I/O ポート アドレス/カーネル マップ仮想メモリ アドレス: dev.pAddrDesc[i].kptAddr (i はアドレス空間のインデックス)。 fAutoinc 文字列 (ブロック) 転送用のみに関連しています。 TRUE の場合、I/O またはメモリの読み取り/書き込みポート/ アドレスは各ブロックの転送後、(インクリメント) 増分しま す。 FALSE の場合、すべてのデータは同じポート/アドレスへ (か ら) 転送されます。 dwOptions 必ず 0 (ゼロ)。 Data 転送用のデータ バッファ Data.Byte 8 ビット転送に使用されます 230 A 付 録 Data.Word 16 ビット転送に使用されます Data.Dword 32 ビット転送に使用されます Data.Qword 64 ビット転送に使用されます 文字列 (ブロック) 転送に使用されます - 転送用のデータ バッ Data.pBuffer ファへのポインタ pTrans 配列での転送コマンド数 dwNumTrans 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この転送は、カーネルで指定したアドレスを読み取る/書き込む低水準の WD_MultiTransfer() [A.5.15] WinDriver 関数を使用して実行されます。 • メモリ アドレスは (I/O アドレスのように)、 カーネルで読み込み/書き込みされます。ユー ザー モードでは直接読み込み/書き込みされません。そのため、ポート アドレスはこの関 数に渡されます。メモリおよび I/O アドレスは、デバイスの構造体に保存されている物理 的なアドレスのカーネル モードのマップである必要があります。 A.3.22 WDC_AddrSpaceIsActive() 目的 指定したメモリまたは I/O アドレス空間がアクティブかどうかを確認します (例えば、サイズがゼ ロ (0) でないか)。 プロトタイプ BOOL DLLCALLCONV WDC_AddrSpaceIsActive(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace); パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwAddrSpace DWORD 入力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) により返される WDC デバイスへのハンドル 231 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 検索するメモリまたは I/O アドレス空間 dwAddrSpace 戻り値 指定したアドレス空間がアクティブの場合、TRUE を返します。そうでない場合 FALSE を返します。 A.3.23 WDC_PciReadCfgBySlot() 目的 PCI デバイスの設定空間または PCI Express デバイスの拡張設定空間で指定したオフセットから データを読み取ります。 このデバイスは PCI バス上の場所によって識別されます。 以下の説明での “PCI” へのすべての言及には PCI Express も含まれています。 プロトタイプ DWORD DLLCALLCONV WDC_PciReadCfgBySlot(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, PVOID pData, DWORD dwBytes); パラメータ 名前 型 入出力 WD_PCI_SLOT 入力 dwBus DWORD 入力 dwSlot DWORD 入力 dwFunction DWORD 入力 dwOffset DWORD 入力 pData PVOID 出力 dwBytes DWORD 入力 pPciSlot 説明 名前 説明 pPciSlot WDC_PciScanDevices() [A.3.4] の呼び出しにより取得すること ができるデバイスの場所情報構造体へのポインタ dwBus バス番号 dwSlot スロット番号 dwFunction 関数番号 dwOffset 読み取る PCI 設定空間の初めからのオフセット 232 付 録 A PCI 設定空間から読み取られるデータで埋められるバッファ pData へのポインタ dwBytes 読み取るバイト数 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.24 WDC_PciWriteCfgBySlot() 目的 PCI デバイスの設定空間または PCI Express デバイスの拡張設定空間で指定したオフセットへ データオを書き込みます。 このデバイスは PCI バス上の場所によって識別されます。 以下の説明での “PCI” へのすべての言及には PCI Express も含まれています。 プロトタイプ DWORD DLLCALLCONV WDC_PciWriteCfgBySlot(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, UINT64 val, DWORD dwBytes); パラメータ 名前 型 入出力 WD_PCI_SLOT 入力 dwBus DWORD 入力 dwSlot DWORD 入力 dwFunction DWORD 入力 dwOffset DWORD 入力 pData PVOID 入力 dwBytes DWORD 入力 pPciSlot 説明 名前 説明 pPciSlot WDC_PciScanDevices() [A.3.4] の呼び出しにより取得すること ができるデバイスの場所情報構造体へのポインタ dwBus バス番号 dwSlot スロット番号 dwFunction 関数番号 233 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwOffset 書き込む PCI 設定空間の初めからのオフセット pData 書き込むデータを保持するデータ バッファへのポインタ dwBytes 書き込むバイト数 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.25 WDC_PciReadCfgBySlotXXX() 目的 WDC_PciReadCfgBySlot8/16/32/64() は、それぞれ 1 バイト (8 ビット) / 2 バイト (16 ビット) / 4 バイ ト (32 ビット) / 8 バイト (64 ビット) を指定の PCI デバイスの設定空間または PCI Express デバイス の拡張設定空間でのオフセットから読み取ります。 このデバイスは PCI バス上の場所によって識別されます。 以下の説明での “PCI” へのすべての言及には PCI Express も含まれています。 プロトタイプ DWORD DLLCALLCONV WDC_PciReadCfgRegBySlot8(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, BYTE *val) DWORD DLLCALLCONV WDC_PciReadCfgReg1BySlot6(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, WORD *val) DWORD DLLCALLCONV WDC_PciReadCfgReg32BySlot(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, UINT32 *val) DWORD DLLCALLCONV WDC_PciReadCfgReg64BySlot(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, UINT64 *val) パラメータ 名前 型 入出力 WD_PCI_SLOT 入力 dwBus DWORD 入力 dwSlot DWORD 入力 dwFunction DWORD 入力 dwOffset DWORD 入力 val BYTE* / WORD* / 出力 pPciSlot UINT32* / UINT64* 234 付 録 A 説明 名前 説明 pPciSlot WDC_PciScanDevices() [A.3.4] の呼び出しにより取得すること ができるデバイスの場所情報構造体へのポインタ dwBus バス番号 dwSlot スロット番号 dwFunction 関数番号 dwOffset 読み取る PCI 設定空間の初めからのオフセット PCI 設定空間から読み取られるデータで埋められるバッファ val へのポインタ 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.26 WDC_PciWriteCfgBySlotXXX() 目的 WDC_PciWriteCfgBySlot8/16/32/64() は、それぞれ 1 バイト (8 ビット) / 2 バイト (16 ビット) / 4 バ イト (32 ビット) / 8 バイト (64 ビット) を指定の PCI デバイスの設定空間または PCI Express デバイ スの拡張設定空間でのオフセットへ書き込み。 このデバイスは PCI バス上の場所によって識別されます。 以下の説明での “PCI” へのすべての言及には PCI Express も含まれています。。 プロトタイプ DWORD DLLCALLCONV WDC_PciWriteCfgRegBySlot8(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, BYTE val) DWORD DLLCALLCONV WDC_PciWriteCfgRegBySlot16(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, WORD val) DWORD DLLCALLCONV WDC_PciWriteCfgRegBySlot32(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, UINT32 val) DWORD DLLCALLCONV WDC_PciWriteCfgRegBySlot64(WD_PCI_SLOT *pPciSlot, DWORD dwOffset, UINT64 val) パラメータ 名前 pPciSlot 型 入出力 WD_PCI_SLOT 入力 235 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwBus DWORD 入力 dwSlot DWORD 入力 dwFunction DWORD 入力 dwOffset DWORD 入力 val BYTE / WORD / 入力 UINT32 / UINT64 説明 名前 説明 pPciSlot WDC_PciScanDevices() [A.3.4] の呼び出しにより取得すること ができるデバイスの場所情報構造体へのポインタ dwBus バス番号 dwSlot スロット番号 dwFunction 関数番号 dwOffset 読み取る PCI 設定空間の初めからのオフセット val PCI 設定空間へ書き込むデータ 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.27 WDC_PciReadCfg() 目的 PCI デバイスの設定空間または PCI Express デバイスの拡張設定空間で指定したオフセットから データを読み取ります。 以下の説明での "PCI" へのすべての言及には PCI Express も含まれています。 プロトタイプ DWORD DLLCALLCONV WDC_PciReadCfg(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, PVOID pData, DWORD dwBytes); パラメータ 名前 236 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwOffset DWORD 入力 付 録 pData PVOID 出力 dwBytes DWORD 入力 A 説明 名前 説明 hDev WDC_PciDeviceOpen() [A.3.8] により返される WDC PCI デバ イスの構造体へのハンドル 読み取る PCI 設定空間の初めからのオフセット dwOffset PCI 設定空間から読み取られるデータで埋められるバッファ pData へのポインタ dwBytes 読み取るバイト数 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.28 WDC_PciWriteCfg() 目的 PCI デバイスの設定空間または PCI Express デバイスの拡張設定空間で指定したオフセットへデー タオを書き込みます。 以下の説明での "PCI" へのすべての言及には PCI Express も含まれています。 プロトタイプ DWORD DLLCALLCONV WDC_PciWriteCfg(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, PVOID pData, DWORD dwBytes); パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwOffset DWORD 入力 pData PVOID Input dwBytes DWORD 入力 237 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 説明 名前 説明 hDev WDC_PciDeviceOpen() [A.3.8] により返される WDC PCI デバ イスの構造体へのハンドル dwOffset 書き込む PCI 設定空間の初めからのオフセット pData 書き込むデータを保持するデータ バッファへのポインタ dwBytes 書き込むバイト数 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.29 WDC_PciReadCfgXXX() 目的 WDC_PciReadCfg8/16/32/64() は、それぞれ 1 バイト (8 ビット) / 2 バイト (16 ビット) / 4 バイト (32 ビット) / 8 バイト (64 ビット) を指定の PCI デバイスの設定空間または PCI Express デバイスの拡張 設定空間でのオフセットから読み取ります。 以下の説明での "PCI" へのすべての言及には PCI Express も含まれています。 プロトタイプ DWORD DLLCALLCONV WDC_PciReadCfgReg8(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, BYTE *val) DWORD DLLCALLCONV WDC_PciReadCfgReg16(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, WORD *val) DWORD DLLCALLCONV WDC_PciReadCfgReg32(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, UINT32 *val) DWORD DLLCALLCONV WDC_PciReadCfgReg64(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, UINT64 *val) パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwOffset DWORD 入力 val BYTE* / WORD* / 出力 UINT32* / UINT64* 238 付 録 A 説明 名前 説明 hDev WDC_PciDeviceOpen() [A.3.8] により返される WDC PCI デバ イスの構造体へのハンドル dwOffset 読み取る PCI 設定空間の初めからのオフセット val PCI 設定空間から読み取られるデータで埋められるバッファ へのポインタ 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.30 WDC_PciWriteCfgXXX() 目的 WDC_PciWriteCfg8/16/32/64() は、それぞれ 1 バイト (8 ビット) / 2 バイト (16 ビット) / 4 バイト (32 ビット) / 8 バイト (64 ビット) を指定の PCI デバイスの設定空間または PCI Express デバイスの拡張 設定空間でのオフセットから読み取ります。 以下の説明での "PCI" へのすべての言及には PCI Express も含まれています。 プロトタイプ DWORD DLLCALLCONV WDC_PciWriteCfgReg8(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, BYTE val) DWORD DLLCALLCONV WDC_PciWriteCfgReg16(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, WORD val) DWORD DLLCALLCONV WDC_PciWriteCfgReg32(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, UINT32 val) DWORD DLLCALLCONV WDC_PciWriteCfgReg64(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, UINT64 val) パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwOffset DWORD 入力 val BYTE / WORD / 入力 UINT32 / UINT64 239 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 説明 名前 説明 hDev WDC_PciDeviceOpen() [A.3.8] により返される WDC PCI デバ イスの構造体へのハンドル dwOffset 読み取る PCI 設定空間の初めからのオフセット val PCI 設定空間へ書き込むデータ 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.31 WDC_PcmciaReadAttribSpace() 目的 PCMCIA デバイスの属性空間で指定したオフセットからデータを読み取ります。 プロトタイプ DWORD DLLCALLCONV WDC_PcmciaReadAttribSpace(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, PVOID pData, DWORD dwBytes); パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwOffset DWORD 入力 pData PVOID 出力 dwBytes DWORD 入力 説明 名前 説明 hDev WDC_PcmciaDeviceOpen() [A.3.9] により返される WDC PCMCIA デバイスの構造体へのハンドル dwOffset 読み取る PCMCIA の属性空間の初めからのオフセット pData PCMCIA 属性空間から読み取られるデータで埋められるバッ ファへのポインタ dwBytes 240 読み取るバイト数 付 録 A 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.32 WDC_PcmciaWriteAttribSpace() 目的 PCMCIA デバイスの属性空間で指定したオフセットへデータを書き込み。 プロトタイプ DWORD DLLCALLCONV WDC_PcmciaWriteAttribSpace(WDC_DEVICE_HANDLE hDev, DWORD dwOffset, PVOID pData, DWORD dwBytes); パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwOffset DWORD 入力 pData PVOID 入力 dwBytes DWORD 入力 説明 名前 説明 hDev WDC_PcmciaDeviceOpen() [A.3.9] により返される WDC PCMCIA デバイスの構造体へのハンドル dwOffset 書き込む PCMCIA の属性空間の初めからのオフセット pData 書き込むデータを保持するデータ バッファへのポインタ dwBytes 書き込むバイト数 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.33 WDC_PcmciaSetWindow() 目的 PCMCIA バス コントローラのメモリ ウィンドウの設定を変更します。 プロトタイプ DWORD DLLCALLCONV WDC_PcmciaSetWindow(WDC_DEVICE_HANDLE hDev, WD_PCMCIA_ACC_SPEED speed, WD_PCMCIA_ACC_WIDTH width, DWORD dwCardBase); 241 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 speed WD_PCMCIA_ACC_SPEED 入力 width WD_PCMCIA_ACC_WIDTH 入力 dwCardBase DWORD 入力 説明 名前 説明 hDev WDC_PcmciaDeviceOpen() [A.3.9] により返される WDC PCMCIA デバイスの構造体へのハンドル speed PCMCIA バスへのアクセス スピード。 以下の WD_PCMCIA_ACC_SPEED 列挙値のいずれか。 WD_PCMCIA_ACC_SPEED_DEFAULT: デフォルトのアク セス スピードを使用します。 WD_PCMCIA_ACC_SPEED_250NS: 250 ns WD_PCMCIA_ACC_SPEED_200NS: 200 ns WD_PCMCIA_ACC_SPEED_150NS: 150 ns WD_PCMCIA_ACC_SPEED_1000NS: 100 ns width PCMCIA バスの幅。以下の WD_PCMCIA_ACC_WIDTH 列挙 値のいずれか。 WD_PCMCIA_ACC_WIDTH_DEFAULT: デフォルトのバス の幅を使用します。 WD_PCMCIA_ACC_WIDTH_8BIT: 8 ビット WD_PCMCIA_ACC_WIDTH_16BIT: 16 ビット dwCardBase メモリ マップが始まる PCMCIA デバイスのメモリでのオフ セット 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.34 WDC_PcmciaSetVpp() 目的 PCIMCIA バス コントローラのボルテージ パワー ピン (Vpp) のパワー レベルを変更します。 242 A 付 録 プロトタイプ DWORD DLLCALLCONV WDC_PcmciaSetVpp(WDC_DEVICE_HANDLE hDev, WD_PCMCIA_VPP vpp); パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 vpp WD_PCMCIA_VPP 入力 説明 名前 説明 hDev WDC_PcmciaDeviceOpen() [A.3.9] により返される WDC PCMCIA デバイスの構造体へのハンドル vpp PCIMCIA バス コントローラのボルテージ パワー ピン (Vpp) のパワー レベル。以下の WD_PCMCIA_VPP 列挙値のいずれ か。 ピンのデフォルトのパワー レベルを使用します。 WD_PCMCIA_VPP_OFF: Vpp ピン上の電圧をゼロ (無効) に 設定します。 WD_PCMCIA_VPP_ON: Vpp ピン上の電圧を 12V (有効) に 設定します。 WD_PCMCIA_VPP_AS_VCC: Vpp ピン上の電圧と Vcc ピン 上の電圧を同じに設定します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.35 WDC_DMAContigBufLock() 目的 ダイレクト メモリ アクセス (DMA) を安全に使用できる連続する物理メモリ バッファをロック し、カーネル モードおよびユーザー モードの仮想アドレス空間の両方に物理メモリをマップしま す。 プロトタイプ DWORD DLLCALLCONV WDC_DMAContigBufLock(WDC_DEVICE_HANDLE hDev, PVOID *ppBuf, DWORD dwOptions, DWORD dwDMABufSize, WD_DMA **ppDma); 243 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 ppBuf PVOID* 出力 dwOptions DWORD 入力 dwDMABufSize DWORD 入力 ppDma WD_DMA** 出力 hDma DWORD 出力 pUserAddr PVOID 出力 pKernelAddr KPTR 出力 dwBytes DWORD 出力 dwOptions DWORD 出力 dwPages DWORD 出力 hCard DWORD 出力 Page WD_DMA_PAGE 出力 [WD_DMA_PAGES] pPhysicalAddr KPTR 出力 dwBytes DWORD 出力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) により返される WDC デバイスへのハンドル 注意: 指定したデバイスに関連しない連続する物理メモリ バッファをロックするために、このフィールドを NULL に設 定することもできます。 ppBuf 割り当てられた DMA バッファのユーザ モードのマップ アド レスの関数で埋められるポインタへのポインタ 244 A 付 録 dwOptions 以下の (windrvr.h で列挙型に定義された) いずれかのフラ グのビット マスク。 DMA_READ_FROM_DEVICE: メモリはデバイスから読み取 られ、ホストへ書き込まれるためにロックされます。 または DMA_WRITE_TO_DEVICE: メモリはホストから読み取られ、 デバイスへ書き込まれるためにロックされます。 注意: DMA_READ_FROM_DEVICE または DMA_WRITE_TO_DEVICE フラグのどちらかを設定する必要 があります。両方のフラグを同時に設定することはできま せん。 DMA_ALLOW_CACHE: メモリのキャッシュを許可します。 DMA_CTG_KBUF_BELOW_16M: メイン メモリの 16 MB 内 で物理的な DMA バッファを許可します。 dwDMABufSize DMA バッファのバイト単位でのサイズ ppDma この関数により割り当てられた DMA バッファの情報構造体 へのポインタへのポインタ。 DMA バッファが不要になった時、この構造体 (*ppDma) への ポインタは WDC_DMABufUnlock() [A.3.37] へ渡します。 hDma 割り当てられた DMA バッファへのハンドル。割り当てが失 敗した場合は 0 (ゼロ) です。 pUserAddr DMA バッファのユーザー モードのマップ アドレス pKernelAddr DMA バッファのカーネル モードのマップ アドレス dwBytes DMA バッファのバイト単位でのサイズ (<=> dwDMABufSize のパラメータ) dwOptions DMA バッファ割り当てに使用されるオプションのビット マ スク (<=> options のパラメータ) dwPages 割り当てられたバッファに使用される物理メモリ ページ数 <=> Page 配列でのエレメント数 (下記を参照)。 連続したバッファ DMA のページ数は常に 1 です。 hCard WDC_xxxDeviceOpen() (WD_CardRegister() [A.5.11] の呼び出 しによる) によって取得できる低水準の WinDriver カードの ハンドル。また WDC デバイス構造体に保存されています。 Page 物理メモリ ページの情報構造体の配列。連続したバッファ DMA の場合、この配列は常に 1 つのエレメントのみ保持しま す (dwPages を参照)。 pPhysicalAddr このページの物理アドレス 245 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwBytes このページの バイト単位でのサイズ 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この関数を呼び出すとき、DMA_KERNEL_BUFFER_ALLOC フラグを設定する必要はあり ません。この関数はこのフラグを自動的に設定します。 • 現在この関数はユーザー モードからのみサポートされています。 A.3.36 WDC_DMASGBufLock() 目的 割り当て前のユーザー モード メモリをロックし、割り当てられた対応する物理ページのリストを 返します。 割り当てられたバッファをカーネル モードのアドレス空間へマップし、カーネルのマップされた アドレスを返します。 プロトタイプ DWORD DLLCALLCONV WDC_DMASGBufLock(WDC_DEVICE_HANDLE hDev, PVOID pBuf, DWORD dwOptions, DWORD dwDMABufSize, WD_DMA **ppDma); パラメータ 名前 246 型 入出力 hDev WDC_DEVICE_HANDLE 入力 pBuf PVOID 入力 dwOptions DWORD 入力 dwDMABufSize DWORD 入力 ppDma WD_DMA** 出力 hDma DWORD 出力 pUserAddr PVOID 出力 pKernelAddr KPTR 出力 dwBytes DWORD 出力 dwOptions DWORD 出力 dwPages DWORD 出力 A 付 録 hCard DWORD 出力 Page WD_DMA_PAGE 出力 [WD_DMA_PAGES] pPhysicalAddr KPTR 出力 dwBytes DWORD 出力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) により返される WDC デバイスへのハンドル pBuf 割り当てられた物理 DMA バッファへマップされるユーザー モード バッファへのポインタ。 dwOptions 以下の (windrvr.h で列挙型に定義された) いずれかのフラ グのビット マスク。 DMA_READ_FROM_DEVICE: メモリはデバイスから読み取 られ、ホストへ書き込まれるためにロックされます。 または DMA_WRITE_TO_DEVICE: メモリはホストから読み取られ、 デバイスへ書き込まれるためにロックされます。 注意: DMA_READ_FROM_DEVICE または DMA_WRITE_TO_DEVICE フラグのどちらかを設定する必要 があります。両方のフラグを同時に設定することはできま せん。 DMA_ALLOW_CACHE: メモリのキャッシュを許可します。 dwDMABufSize DMA バッファのバイト単位でのサイズ ppDma この関数により割り当てられた DMA バッファの情報構造体 へのポインタへのポインタ DMA バッファが不要になった時、この構造体 (*ppDma) への ポインタは WDC_DMABufUnlock() [A.3.37] へ渡します。 hDma 割り当てられた DMA バッファへのハンドル。割り当てが失 敗した場合は 0 (ゼロ) です。 pUserAddr DMA バッファのユーザー モードのマップ アドレス (<=> pBuf のパラメータ) pKernelAddr DMA バッファのカーネル モードのマップ アドレス dwBytes DMA バッファのバイト単位でのサイズ (<=> dwDMABufSize のパラメータ) 247 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド DMA バッファ割り当てに使用されるオプションのビット マ dwOptions スク (<=> options のパラメータ) dwPages 割り当てられたバッファに使用される物理メモリ ページ数 <=> Page 配列でのエレメント数 (下記を参照)。 WDC_xxxDeviceOpen() (WD_CardRegister() [A.5.11] の呼び出 hCard しによる) によって取得できる低水準の WinDriver カードの ハンドル。また WDC デバイス構造体に保存されています。 Page 物理メモリ ページの情報構造体の配列。 pPhysicalAddr このページの物理アドレス dwBytes このページの バイト単位でのサイズ 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • 大きいバッファ (> 1MB) を割り当てるためにこの関数を呼び出すとき、WD_DMALock() 関 数 [A.5.16] を使用して、大きい Scatter/Gather DMA バッファの割り当てのために使用する DMA_LARGE_BUFFER フラグを設定する必要はありません。WDC_DMASGBufLock() がこ の処理を行います。 • 現在この関数はユーザー モードからのみサポートされています。 A.3.37 WDC_DMABufUnlock() 目的 WDC_DMAContigBufLock() [A.3.35] または WDC_DMASGBufLock() [A.3.36] への以前の呼び出し による DMA バッファへ割り当てられたメモリを解除し、解放します。 プロトタイプ DWORD DLLCALLCONV WDC_DMABufUnlock(WD_DMA *pDma) パラメータ 名前 pDma 248 型 入出力 WD_DMA* 入力 A 付 録 説明 名前 説明 pDma 以前の WDC_DMAContigBufLock() [A.3.35] (Contiguous DMA バッファの場合) または WDC_DMASGBufLock() [A.3.36] (Scatter/Gather DMA バッファの場合) への呼び出しから受け 取った DMA 情報構造体へのポインタ - *ppDma はこれらの関 数より返されます。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • 現在この関数はユーザー モードからのみサポートされています。 A.3.38 WDC_DMASyncCpu() 目的 CPU キャッシュからデータをフラッシュすることにより、DMA バッファで全 CPU のキャッシュ を同期化します。 注意: この関数は DMA 転送が実行される前に呼び出します (注釈を参照)。 プロトタイプ DWORD DLLCALLCONV WDC_DMASyncCpu(WD_DMA *pDma); パラメータ 名前 pDma 型 入出力 WD_DMA* 入力 DESCRIPTION 名前 説明 pDma 以前の WDC_DMAContigBufLock() [A.3.35] (Contiguous DMA バッファの場合) または WDC_DMASGBufLock() [A.3.36] (Scatter/Gather DMA バッファの場合) への呼び出しから受け 取った DMA 情報構造体へのポインタ - *ppDma はこれらの関 数より返されます。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 249 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 注釈 • 非同期的な DMA の読み取りまたは書き込み動作はメモリ内のデータへアクセスします。 CPU とホストの物理メモリ間に存在するプロセッサ (CPU) キャッシュ内のデータへはア クセスしません。読み取り転送の直前に WDC_DMASyncCpu() を呼び出して CPU キャッ シュをフラッシュしないかぎり、DMA 動作でシステム メモリへ転送されるデータは、後 で CPU キャッシュをフラッシュする場合、陳腐化したデータで上書きされる場合がありま す。書き込み転送の直前に WDC_DMASyncCpu を呼び出して CPU キャッシュをフラッ シュしないかぎり、CPU キャッシュ内のデータはメモリにコピーされたものより新しいも の (アップデートされたもの) になる場合があります。 • 現在この関数はユーザー モードからのみサポートされています。 A.3.39 WDC_DMASyncIo() 目的 I/O キャッシュからデータをフラッシュすることにより、DMA バッファで I/O のキャッシュを同 期化し、CPU キャッシュをアップデートします。 注意: この関数は DMA 転送が実行された後に呼び出します (注釈を参照)。 プロトタイプ DWORD DLLCALLCONV WDC_DMASyncIo(WD_DMA *pDma); パラメータ 名前 pDma 型 入出力 WD_DMA* 入力 説明 名前 説明 pDma 以前の WDC_DMAContigBufLock() [A.3.35] (Contiguous DMA バッファの場合) または WDC_DMASGBufLock() [A.3.36] (Scatter/Gather DMA バッファの場合) への呼び出しから受け 取った DMA 情報構造体へのポインタ - *ppDma はこれらの関 数より返されます。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • DMA 転送の完了後、データはホストの物理メモリとバスマスタ DMA デバイス間に存在す る I/O キャッシュにまだありますが、ホストのメイン メモリにはまだありません。CPU が 250 A 付 録 メモリにアクセスした場合、CPU キャッシュから誤ったデータを読み取る可能性がありま す。CPU 用のメモリを常に同期されたデータにするには、I/O キャッシュからデータをフ ラッシュし、新しいデータで CPU キャッシュをアップデートするために DMA 転送後に WDC_DMASyncIo() を呼び出します。この関数は追加のキャッシュをフラッシュし、デバ イスとメモリ間 (バス エクステンダやバス ブリッジに関連したキャッシュなど) をバッ ファします。 • 現在この関数はユーザー モードからのみサポートされています。 A.3.40 WDC_IntEnable() 目的 デバイス用の割り込み処理を有効にします。 呼び出し元が Kernel PlugIn ドライバを使用してカーネルで割り込み処理を実行する場合、高い IRQ (割り込み要求) レベルで実行する Kernel PlugIn KP_IntAtIrql() 関数 [A.13.8] は割り込みを受け 取った直後に呼び出されます 割り込みが受け取られたとき、この関数はカーネルの WinDriver により高い IRQ レベル実行され る転送コマンド情報を受け取ることができます。割り込みの処理に Kernel PlugIn ドライバが使用 されている場合、呼び出し元で設定された転送コマンドは Kernel PlugIn KP_IntAtIrql() 関数 [A.13.8] の実行が完了した後で、WinDriver により実行されます。 Kernel PlugIn ドライバを使用しないで、ユーザー モードからのレベル センシティブな割り込み (PCI 割り込みなど) を処理する場合、割り込みを認識させるための関数転送コマンドを渡す必要があり ます。Kernel PlugIn ドライバを使用している場合、割り込みを認識させる情報は Kernel PlugIn KP_IntAtIrql() 関数 [A.13.8] で実装します。そのため転送コマンドは不要です。 この関数は、カーネル モードの割り込み処理が完了した後で WinDriver に呼び出されるユーザー モード割り込みハンドラ ルーチンを受け取ります。 この割り込みが Kernel PlugIn ドライバを使用して処理される場合、Kernel PlugIn の据え置きの割 り込み処理関数 (KP_IntAtDpc() [A.13.9]) の戻り値は、ユーザー モードの割り込み処理が何回呼ばれ るかを割り出します。(Kernel PlugIn KP_IntAtIrql() [A.13.8] 関数の戻り値により割り出される提供さ れた KP_IntAtDpc() 自身も実行されます)。 プロトタイプ DWORD DLLCALLCONV WDC_IntEnable(WDC_DEVICE_HANDLE hDev, WD_TRANSFER *pTransCmds, DWORD dwNumCmds, DWORD dwOptions, INT_HANDLER funcIntHandler, PVOID pData, BOOL fUseKP); パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 pTransCmds WD_TRANSFER* 入力 251 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド cmdTrans DWORD 入力 dwPort DWORD 入力 dwBytes DWORD 入力 fAutoinc DWORD 入力 dwOptions DWORD 入力 Data union Data.Byte BYTE 入力/出力 Data.Word WORD 入力/出力 Data.Dword DWORD 入力/出力 Data.Qword QWORD 入力/出力 Data.pBuffer PVOID 入力/出力 dwNumCmds DWORD 入力 dwOptions DWORD 入力 funcIntHandler INT_HANDLER 入力 pData PVOID 入力 fUseKP BOOL 入力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.8] / PCMCIA: [A.3.9] / ISA: [A.3.10]) により返される WDC デバイスへのハンドル pTransCmds 転送コマンドの情報構造体の配列 (コマンドが不要の場合は NULL です)。 割り込みが発生した場合、カーネルで WinDriver は配列での 転送設定を実行します。 Kernel PlugIn ドライバを使用しないで、ユーザー モードから のレベル センシティブな割り込み (PCI 割り込みなど) を処理 する場合、この配列を使用して、割り込みを受け取った直後 にカーネルで割り込みを認識するための転送コマンドを設定 する必要があります。セクション [9.2.2] を参照。 252 A 付 録 cmdTrans 実行する転送コマンドの種類を表す値 - windrvr.h で WD_TRANSFER_CMD 列挙型の定義を参照。 転送コマンドは以下の形式に一致します。 <dir><p>_<string><size> dir: R = 読み取り、 W = 書き込み p: P = I/O ポート (アドレス)、M =メモリ ポート(アドレス) string: S = 文字列 (ブロック) 転送、その他の場合はシン グル転送 size: BYTE、WORD、DWORD、または QWORD dwPort 読み取る/書き込む I/O ポート アドレス/カーネル マップ仮想 メモリアドレス fAutoinc 文字列 (ブロック) 転送用のみに関連しています。 TRUE の場合、I/O またはメモリの読み取り/書き込みポート/ アドレスは各ブロックの転送後、(インクリメント) 増分しま す。 FALSE の場合、すべてのデータは同じポート/アドレスへ (か ら) 転送されます。 dwOptions 必ず 0 (ゼロ)。 Data 転送用のデータ バッファ Data.Byte 8 ビット転送に使用されます Data.Word 16 ビット転送に使用されます Data.Dword 32 ビット転送に使用されます Data.Qword 64 ビット転送に使用されます Data.pBuffer 文字列 (ブロック) 転送に使用されます - 転送用のデータ バッ ファへのポインタ dwNumCmds pTransCmds 配列での転送コマンド数 dwOptions 割り込み処理フラグのビット マスク。 オプションが無い場合は、ゼロ (0)、または、 INTERRUPT_CMD_COPY: 設定されている場合、WinDriver は読み取り転送コマンドの結果としてカーネルで読み取った データをコピーし、関連した転送コマンド構造体内でユー ザーへ返します。 253 W I N D R I V E R funcIntHandler ユ ー ザ ー ズ ガ イ ド 割り込みを受け取り、カーネルで処理された後に実行される ユーザー モード割り込み処理コールバック関数。(割り込み処 理 - INT_HANDLER - のプロトタイプは windrvr_int_thread.h で定義されています)。 pData ユーザー モード割り込み処理コールバック ルーチン (funcIntHandler) 用のデータ fUseKP TRUE の場合、高い IRQ (割り込み要求) レベルで実行するデ バイスの Kernel PlugIn ドライバの KP_IntAtIrql() 関数 [A.13.8] は、割り込みを受け取った直後に実行されます。(デバイスで 使用される Kernel PlugIn ドライバは WDC_xxxDeviceOpen() へ渡され、WDC デバイス構造体へ保存されます)。呼び出し 元が転送コマンドを関数 (pTransCmds) へ渡した場合、これら のコマンドは、KP_IntAtIrql() の実行完了後、カーネルで高い IRQ レベルで WinDriver により実行されます。 KP_IntAtIrql() が TRUE を返した場合、Kernel PlugIn の保留さ れた割り込み処理ルーチン KP_IntAtDpc() [A.13.9] を呼び出し ます。この関数の戻り値は、コントロールがユーザー モード へ返った時点でユーザー モードの割り込み処理 (funcIntHandler) が何回実行されるかを割り出します。 FALSE の場合、割り込みを受け取ったとき、pTransCmds で ユーザーが設定した転送コマンドは、カーネルで高い IRQ レ ベルで WinDriver により実行されます。ユーザー モードの割 り込み処理ルーチン (funcIntHandler) はコントロールがユー ザー モードへ返ったときに実行されます。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この関数はユーザー モードからのみ呼び出すことができます。 • この関数はソフトウェア内の割り込み処理を有効にします。この関数の呼び出しが成功し た後、ハードウェア内で割り込みの生成を物理的に有効する必要があります。(コードから デバイスへ書き込むことができるようになります)。 • この関数の呼び出しを成功させるには、割り込みを無効にするために、コードの後で WDC_IntDisable() を呼び出す必要があります。 デバイスの割り込みが有効の場合、WDC_xxxDriverClose() 関数 (PCI: [A.3.11]、PCMCIA: [A.3.12]、ISA: [A.3.13]) は WDC_IntDisable() を呼び出します。 254 付 録 A A.3.41 WDC_IntDisable() 目的 以前に呼び出した WDC_IntEnable() [A.3.40] の後に続くデバイスの割り込み処理を無効にします。 プロトタイプ DWORD DLLCALLCONV WDC_IntDisable(WDC_DEVICE_HANDLE hDev); パラメータ 名前 hDev 型 入出力 WDC_DEVICE_HANDLE 入力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.11]、PCMCIA: [A.3.12]、ISA: [A.3.13]) により返される WDC デバイスへのハンドル 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この関数はユーザー モードからのみ呼び出すことができます。 A.3.42 WDC_IntIsEnabled() 目的 デバイスの割り込みが現在有効であるかを確認します。 プロトタイプ BOOL DLLCALLCONV WDC_IntIsEnabled(WDC_DEVICE_HANDLE hDev); パラメータ 名前 hDev 型 入出力 WDC_DEVICE_HANDLE 入力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.11]、PCMCIA: [A.3.12]、ISA: [A.3.13]) により返される WDC デバイスへのハンドル 255 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 デバイスの割り込みが有効の場合 TRUE を返します。無効な場合 FALSE を返します。 A.3.43 WDC_EventRegister() 目的 デバイス用の Plug-and-Play およびパワー マネージメント イベントの通知を受け取るアプリケー ションを登録します。 プロトタイプ DWORD DLLCALLCONV WDC_EventRegister(WDC_DEVICE_HANDLE hDev, DWORD dwActions, EVENT_HANDLER funcEventHandler, PVOID pData, BOOL fUseKP); パラメータ 名前 型 入出力 hDev WDC_DEVICE_HANDLE 入力 dwActions DWORD 入力 funcEventHandler WDC_EVENT_HANDLER 入力 pData PVOID 入力 fUseKP BOOL 入力 説明 名前 説明 hDev WDC_PciDeviceOpen() [A.3.8] または WDC_PcmciaDeviceOpen() [A.3.9] によって返される Plug-and-Play WDC デバイスへのハンドル dwActions 登録するイベントを示すフラグのビット マスク Plug-and-Play イベント: WD_INSERT – 挿入されたデバイス WD_REMOVE – 取り除かれたデバイス デバイスのパワー状況を変更するイベント: WD_POWER_CHANGED_D0 – フル パワー WD_POWER_CHANGED_D1 – ロー スリープ WD_POWER_CHANGED_D2 – ミディアム スリープ WD_POWER_CHANGED_D3 – フル スリープ WD_POWER_SYSTEM_WORKING – オン システムのパワー状況: WD_POWER_SYSTEM_SLEEPING1 – オンでスリープ状態 WD_POWER_SYSTEM_SLEEPING2 - CPU オフ、メモリ オン、PCI/PCMCIA オン 256 A 付 録 WD_POWER_SYSTEM_SLEEPING3 - CPU オフ、メモリをリ フレッシュ、PCI/PCMCIA は補助パワー WD_POWER_SYSTEM_HIBERNATE - OS はコンテクストを シャットダウンする前に保存します WD_POWER_SYSTEM_SHUTDOWN - コンテクストを保存 しません funcEventHandler 呼び出し元が通知を受け取る登録をするイベントが発生した ときに呼ばれるユーザー モードのイベント処理コールバック 関数。(このイベント処理 - EVENT_HANDLER - のプロトタイ プは windrvr_events.h で定義されています)。 pData ユーザー モードのイベント処理コールバック ルーチン (funcEventHandler) 用のデータ TRUE の場合、呼び出し元が通知を受け取る登録をするイ fUseKP ベントが発生したときに、デバイスの Kernel PlugIn ドライバ の KP_Event() 関数 [A.13.5] が呼び出されます。(デバイスで使 用される Kernel PlugIn ドライバは WDC_xxxDeviceOpen() へ 渡され、WDC デバイス構造体へ保存されます)。この関数が TRUE を返した場合、ユーザー モードのイベント処理コール バック関数 (funcEventHandler) は、カーネル モードのイベント 処理が完了したとき呼び出されます 。 FALSE の場合、TRUE の場合、呼び出し元が通知を受け取る 登録をするイベントが発生したときに、ユーザー モードのイ ベント処理コールバック関数が呼び出されます。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • • この関数はユーザー モードからのみ呼び出すことができます。 この関数の呼び出しを成功させるには、デバイスからの Plug-and-Play およびパワー マネー ジメントの通知を受け取る登録を取り消すためにコードの後で WDC_EventUnregister() [A.3.44] を呼び出す必要があります。 A.3.44 WDC_EventUnregister() 目的 以前に呼び出した WDC_EventRegister() [A.3.43] へ続くデバイスからの Plug-and-Play およびパワー マネージメントの通知を受け取る登録を取り消します。 プロトタイプ DWORD DLLCALLCONV WDC_EventUnregister(WDC_DEVICE_HANDLE hDev); 257 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 hDev 型 入出力 WDC_DEVICE_HANDLE 入力 説明 名前 説明 hDev WDC_PciDeviceOpen() [A.3.8] または WDC_PcmciaDeviceOpen() [A.3.9] によって返される Plug-and-Play WDC デバイスへのハンドル 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • この関数はユーザー モードからのみ呼び出すことができます。 A.3.45 WDC_EventIsRegistered() 目的 アプリケーションがデバイス用の Plug-and-Play およびパワー マネージメントの通知を受け取る 登録をされているかどうかを確認します。 プロトタイプ BOOL DLLCALLCONV WDC_EventIsRegistered(WDC_DEVICE_HANDLE hDev); パラメータ 名前 hDev 型 入出力 WDC_DEVICE_HANDLE 入力 説明 名前 説明 hDev WDC_PciDeviceOpen() [A.3.8] または WDC_PcmciaDeviceOpen() [A.3.9] によって返される Plug-and-Play WDC デバイスへのハンドル 戻り値 アプリケーションがデバイス用の Plug-and-Play およびパワー マネージメントの通知を受け取る登 録をされている場合は TRUE を返します。登録されていない場合は FALSE を返します。 258 A 付 録 A.3.46 WDC_SetDebugOptions() 目的 WDC ライブラリ用のデバッグ オプションを設定します。設定可能なデバッグ オプションに関す る詳細は WDC_DBG_OPTIONS [A.3.1] の記述を参照してください。 この関数は通常アプリケーションの最初 (WDC_DriverOpen() [A.3.2] を呼び出した後) に呼び出さ れます。またデバッグ設定を変更するために、この関数は WDC ライブラリを使用している間 (WDC_DriverClose() [A.3.3] が呼び出されるまで) はいつでも呼び出すことができます。 この関数が呼び出されるまで WDC ライブラリはデフォルトのデバッグ オプションを使用します (WDC_DEBG_DEFAULT [A.3.1] を参照)。 この関数が再度呼び出された場合、以前のデバッグ設定をクリーンナップし、呼び出し元により指 定される新しいオプションを設定する前にデフォルトのデバッグ オプションを設定します。 プロトタイプ DWORD DLLCALLCONV WDC_SetDebugOptions(WDC_DBG_OPTIONS dbgOptions, const CHAR *sDbgFile); パラメータ 名前 型 入出力 dbgOptions WDC_DBG_OPTIONS 入力 sDbgFile const CHAR* 入力 説明 名前 説明 dbgOptions 希望するデバッグ設定を示すフラグのビット マスク (WDC_DBG_OPTIONS [A.3.1] を参照)。 このパラメータをゼロ (0) に設定した場合、デフォルトのデ バッグ オプションが使用されます (WDC_DBG_DEFAULT [A.3.1] を参照)。 sDbgFile WDC デバッグ出力ファイル。 このパラメータは WDC_DBG_OUT_FILE フラグがデバッグ オプション (dbgOption) (ディレクトリまたは便利なデバッグ オプションの組み合わせの 1 つ) で設定されている場合のみ 関連します (WDC_DBG_OPTIONS [A.3.1] を参照)。 WDC_DBG_OUT_FILE のデバッグ フラグが設定され、 sDbgFile が NULL の場合、WDC のデバッグ メッセージはデ フォルトのデバッグ ファイル (stderr) へログされます。 259 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 A.3.47 WDC_Err() 目的 WDC のデバッグ オプションに従ってデバッグのエラー メッセージを表示します (WDC_DBG_OPTIONS [A.3.1] および WDC_SetDebugOptions() [A.3.46] を参照)。 プロトタイプ void DLLCALLCONV WDC_Err(const CHAR *format[, argument] ...); パラメータ 名前 format 型 入出力 const CHAR* 入力 argument 入力 説明 名前 説明 format 表示するエラー メッセージを含む書式を管理する文字列。文 字列は 256 文字 (CHAR) までです。 argument 書式文字列用のオプションの引数 戻り値 なし A.3.48 WDC_Trace() 目的 WDC のデバッグ オプションに従ってデバッグ トレース メッセージを表示します (WDC_DBG_OPTIONS [A.3.1] および WDC_SetDebugOptions() [A.3.46] を参照)。 void DLLCALLCONV WDC_Trace(const CHAR *format[, argument] ...); パラメータ 名前 format argument 260 型 入出力 const CHAR* 入力 入力 A 付 録 説明 名前 説明 format 表示するトレース メッセージを含む書式を管理する文字列。 文字列は 256 文字 (CHAR) までです。 argument 書式文字列用のオプションの引数 戻り値 なし A.3.49 WDC_GetWDHandle() 目的 標準の WD_xxx WinDriver PCI/PCMCIA/ISA API [A.5] で必要とされる WinDriver のカーネル モ ジュールへのハンドルを返します (注釈を参照)。 プロトタイプ HANDLE DLLCALLCONV WDC_GetWDHandle(void); パラメータ なし 戻り値 WinDriver のカーネル モジュールへのハンドルを返します。失敗した場合 INVALID_HANDLE_VALUE を返します。 注釈 • WDC API のみ使用する場合、WDC ライブラリは WinDriver へのハンドルをカプセル化す るため、WinDriver へのハンドルを取得する必要はありません。この関数により、WDC ラ イブラリで使用される WinDriver のハンドルを入手することができます。これにより、コー ドから使用される API などの低水準の WD_xxx API を渡すことができます。このような場 合、(WD_Close() [A.1.4] を使用して) 受け取ったハンドルを閉めないように気をつけます。 このハンドルは、 WDC_DriverClose() [A.3.3] を使用して WDC ライブラリが閉じらた際に 閉じられます。 A.3.50 WDC_GetDevContext() 目的 デバイスのユーザー コンテキスト情報を返します。 PVOID DLLCALLCONV WDC_GetDevContext(WDC_DEVICE_HANDLE hDev); 261 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 hDev 型 入出力 WDC_DEVICE_HANDLE 入力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.11]、PCMCIA: [A.3.12]、ISA: [A.3.13]) により返される WDC デバイスへのハンドル 戻り値 デバイスのユーザー コンテキストへのポインタを返します。コンテキストが設定されていない場 合、NULL を返します。 A.3.51 WDC_GetBusType() 目的 デバイスのバスの種類 (WD_BUS_PCI、WD_BUS_PCMCIA、WD_BYS_ISA または WD_BUS_UNKNOWN) を返します: プロトタイプ WD_BUS_TYPE DLLCALLCONV WDC_GetBusType(WDC_DEVICE_HANDLE hDev); パラメータ 名前 hDev 型 入出力 WDC_DEVICE_HANDLE 入力 説明 名前 説明 hDev WDC_xxxDeviceOpen() (PCI: [A.3.11]、PCMCIA: [A.3.12]、ISA: [A.3.13]) により返される WDC デバイスへのハンドル 戻り値 デバイスのバスの種類を返します。 A.3.52 WDC_Sleep() 目的 指定した実行時間をミリセカンド単位で遅らせます。 デフォルトでは、この関数は CPU を消費するビジー スリープを実行します。 262 A 付 録 プロトタイプ DWORD DLLCALLCONV WDC_Sleep(DWORD dwMicroSecs, WDC_SLEEP_OPTIONS options); パラメータ 名前 型 入出力 dwMicroSecs DWORD 入力 options WDC_SLEEP_OPTIONS 入力 説明 名前 説明 dwMicroSecs スリープするミリセカンド数 options スリープのオプション [A.3.1] 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します [A.15]。 A.4 PCI/PCMCIA/ISA - WDC の低水準 API このセクションでは、WinDriver/include/wdc_defs.h ヘッダー ファイルで定義された WDC の種類およびプリプロセッサの定義を説明します。 A.4.1 WDC_ID_U Union WDC のデバイス ID 情報共用体の型 (PCI と PCMCIA デバイスで使用)。 フィールド 型 説明 WD_PCI_ID PCI デバイス ID 情報構造体 dwVendorId DWORD デバイスのベンダー ID dwProductId DWORD デバイスの製品 ID WD_PCMCIA_ID PCMCIA デバイス ID 情報構造 pciId pcmciaId 体 wManufacturerId WORD デバイスの製造元 ID wCardId WORD デバイスのデバイス ID 263 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.4.2 WDC_ADDR_DESC PCI/PCMCIA/ISA デバイスのメモリまたは I/O アドレス空間の情報構造体の型。 フィールド fIsMemory 型 説明 BOOL TRUE - メモリ アドレス空間 FALSE - I/O アドレス空間 dwAddrSpace DWORD アドレス空間番号 dwItemIndex DWORD 関連した WDC デバイス情報 構造体 [A.4.3] 内の CardReg.Card.Item array で WDC_xxxDeviceOpen() により 取得され、保存されるアドレス 空間用の WD_ITEMS 構造体の インデックス dwBytes DWORD アドレス空間のバイト単位で のサイズ kptAddr KPTR アドレス空間の物理的なベー ス アドレスのカーネル モード マップ。 このアドレスは、 WD_Transfer() [A.5.14] または WD_MultiTransfer() [A.5.15] API を使用してメモリまたは I/O 領域へアクセスするため WDC API により使用されま す。またはカーネルでメモリ アドレスへ直接アクセスする とき WDC API により使用され ます。 dwUserDirectMemAddr DWORD アドレス空間の物理的なベー ス アドレスのユーザー モード マップ。 このアドレスはユーザー モー ドから直接メモリ アドレスへ アクセスするために使用され ます。 264 A 付 録 A.4.3 WDC_DEVICE PCI/PCMCIA/ISA デバイスの情報構造体の型。 WDC_xxxDeviceOpen() 関数 (PCI: [A.3.11]、PCMCIA: [A.3.12]、ISA: [A.3.13]) はデバイスのこの型の 構造体を割り当て、返します。 フィールド id 型 説明 WDC_ID_U デバイス ID 情報共用体 (PCI および PCMCIA デバイス に関 連)。[A.4.1] を参照。 slot WDC_SLOT_U デバイスのロケーション情報 構造体。セクション [A.3.1] の WDC_SLOT_U の記述を参照。 dwNumAddrSpaces DWORD デバイス上で検出されたアド レス空間数 pAddrDesc WDC_ADDR_DESC* メモリおよび I/O アドレス空 間の情報構造体の配列。[A.4.2] を参照。 cardReg WD_CARD_REGISTER WDC_xxxDeviceOpen() 関数に より呼び出される WD_CardRegister() [A.5.11] に より返される WinDriver のデ バイス リソース情報構造体 kerPlug WD_KERNEL_PLUGIN Kernel PlugIn ドライバ情報構 造体 [A.14.1]。 呼び出し元が Kernel PlugIn ド ライバを使用する場合 (使用し ない場合は、この構造体は使用 されません) で、呼び出し元が WDC ライブラリにより保持さ れている場合、この構造体は WDC_xxxDeviceOpen() 関数を 含みます。 Int WD_INTERRUPT 割り込み情報構造体。 この構造体は、割り込みを持つ デバイス用の WDC_xxxDeviceOpen() 関数を 含み、WDC ライブラリにより 保持されます。 265 W I N D R I V E R hInterrupt ユ ー ザ ー ズ ガ イ ド DWORD 低水準の WD_xxx() WinDriver 割り込み API で必要な内部の WinDriver 割り込み構造体への ハンドル dwOptions DWORD WDC_xxxDeviceOpen() 関数か ら低水準の WD_CardRegister() [A.5.11] WinDriver 関数へ渡さ れる割り込み情報フラグの ビット マスク hIntThread DWORD 割り込みが有効なときに生じ る割り込みスレッド このハンドルは WDC より低 水準の WinDriver 割り込み API へ渡されます。WDC API を使 用する場合、直接このハンドル へアクセスする必要はありま せん。 Event WD_EVENT WinDriver の Plug-and-Play お よびパワー マネージメント イ ベントの情報構造体 ([A.11.2] を参照)。 hEvent HANDLE WinDriver EventRegister() [A.11.2] / EventUnregister() [A.11.3] 関数で使用されるハン ドル。 WDC API を使用数r場合、直 接このハンドルへアクセスす る必要はありません。 pCtx PVOID デバイスのコンテキスト情報。 この情報は WDC_xxxDeviceOpen() 関数に よるパラメータとして受け取 られれ、アプリケーションの呼 び出し (オプション) により将 来使用されるデバイスの構造 体へ保存されます。 266 A 付 録 A.4.4 PWDC_DEVICE WDC_DEVICE 構造体 [A.4.3] の型へのポインタ。 typedef WDC_DEVICE* PWDC_DEVICE A.4.5 WDC_MEM_DIRECT_ADDR() 目的 呼び出し処理のコンテキストから指定したメモリ アドレス空間へ直接アクセスするために使用す ることができるポインタを返すユーティリティ マクロ。 プロトタイプ WDC_MEM_DIRECT_ADDR(pAddrDesc) パラメータ 名前 pAddrDesc 型 入出力 WDC_ADDR_DESC* 入力 説明 名前 説明 pAddrDesc WDC メモリ アドレス空間の情報構造体へのポインタ ([A.4.2] を参照)。 戻り値 ユーザー モードから呼び出された場合、物理メモリ アドレスのユーザー モード マップを返します (pAddrDesc->dwUserDirectMemAddr)。 カーネル モードから呼び出された場合、物理メモリ アドレスのカーネル モード マップを返します (pAddrDesc->kptAddr)。 返されたポインタはユーザー モードまたはカーネル モードから直接メモリへアクセスするために 使用することができます。 A.4.6 WDC_ADDR_IS_MEM() 目的 与えられたアドレス空間がメモリまたは I/O アドレス空間かどうかを確認するユーティリティ マ クロ。 プロトタイプ WDC_ADDR_IS_MEM(pAddrDesc) 267 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 pAddrDesc 型 入出力 WDC_ADDR_DESC* 入力 説明 名前 説明 pAddrDesc WDC メモリ アドレス空間の情報構造体へのポインタ ([A.4.2] を参照)。 戻り値 pAddrDesc->fIsMemory を返します。メモリ アドレス空間の場合、TRUE を返します。そうでない場 合、FALSE を返します。 A.4.7 WDC_ADDR_SPACE_IS_ACTIVE() 目的 与えられたアドレス空間がメモリまたは I/O アドレス空間かどうかを確認するユーティリティ マ クロ。 プロトタイプ WDC_ADDR_SPACE_IS_ACTIVE(pAddrDesc) パラメータ 名前 pAddrDesc 型 入出力 WDC_ADDR_DESC* 入力 説明 名前 説明 pAddrDesc WDC メモリ アドレス空間の情報構造体へのポインタ ([A.4.2] を参照)。 戻り値 指定したアドレス空間がアクティブの場合、TRUE を返します。例えば、サイズ (pAddrDesc->dwBytes) がゼロ (0) でない場合。アクティブでない場合、FALSE を返します。 A.4.8 WDC_GET_ADDR_DESC() 目的 指定したアドレス空間番号へ従う WDC アドレス空間の情報構造体 (WDC_ADDR_DESC [A.4.2]) を取得するユーティリティ マクロ。 268 A 付 録 プロトタイプ WDC_GET_ADDR_DESC(pDev, dwAddrSpace) パラメータ 名前 型 入出力 pDev PWDC_DEVICE 入力 dwAddrSpace DWORD 入力 説明 名前 説明 pDev WDC デバイス情報構造体へのポインタ ([A.4.4] を参照)。 dwAddrSpace アドレス空間番号 戻り値 指定したアドレス空間番号 (pDev->pAddrDesc[dwAddrSpace]) のためのデバイスのアドレス情報構 造体 (WDC_ADDR_DESC [A.4.2]) へのポインタを返します。 A.4.9 WDC_IS_KP() 目的 WDC デバイスが Kernel PlugIn ドライバを使用しているかどうかを確認するユーティリティ マク ロ。 プロトタイプ WDC_IS_KP(pDev) パラメータ 名前 pDev 型 入出力 PWDC_DEVICE 入力 説明 名前 説明 pDev WDC デバイス情報構造体へのポインタ ([A.4.4] を参照)。 戻り値 デバイスが Kernel PlugIn ドライバを使用している場合は TRUE を返します。使用していない場合は FALSE を返します。 269 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.5 PCI/PCMCIA/ISA - WD_xxx 関数 このセクションでは基本の WD_xxx PCI/PCMCIA/ISA WinDriver API について説明します。 注意: このセクションのディレクトリで説明している WD_xxx 関数の変わりに、便利なラッパー関 数を基本の WD_xxx PCI/PCMCIA/ISA API [A.2] へ提供する WinDriver の WDC ライブラリから API を使用することを推奨します。 A.5.1 WinDriver のコール順序 − PCI / PCMCIA / ISA 次に PCI / PCMCIA / ISA ドライバの一般的なコール順序を示します。 WD_Open() WD_Version() PCMCIA PCI ISA PnP WD_PcmciaScanCards WD_PciScanCards WD_IsapnpScanCards() WD_PcmciaGetCardInfo() WD_PciGetCardInfo() WD_IsapnpGetCardInfo() WD_PcmciaConfigDump( WD_PciConfigDump() WD_IsapnpConfigDump() WD_CardRegister() Read/Write to IO/Memory1 Direct Memory Access Interrupt Handling2 WD_Transfer() WD_DMALock() InterruptThreadEnable() WD_MultiTransfer() WD_DMAUnlock() InterruptThreadDisable() WD_CardUnregister () WD_Close() 注意: (1) メモリ転送の場合、WD_Transfer および WD_MultiTransfer の代わりに WD_CardRegister [A.5.11] から 返されたダイレクト ユーザー モード ポインタを使用することを推奨します。 (2) WD_IntEnable、WD_IntWait、WD_IntCount および WD_IntDisable が上の InterruptEnable および InterruptDisable を構成し、代わりに個別に呼びだれます。詳細は、セクション [A.6] を参照してくださ い。 (3) WD_Open のあと、WD_DebugAdd および WD_Sleep をどこからでも呼び出すことができます。詳細 はセクション [A.1] を参照してください。 270 A 付 録 A.5.2 WD_PciScanCards() 目的 PCI バスにインストールされている PCI デバイスを検出して入力の基準を確認 (VendorID および/また は DeviceID) し、検出されたデバイスの番号および場所 (バス スロットおよび関数) を返します。 プロトタイプ DWORD WD_PciScanCards(HANDLE hWD, WD_PCI_SCAN_CARDS *pPciScan); パラメータ 名前 型 入出力 hWD HANDLE 入力 pPciScan WD_PCI_SCAN_CARDS * searchId WD_PCI_ID dwVendorId DWORD 入力 dwDeviceId DWORD 入力 dwCards DWORD 出力 cardId WD_PCI_ID の配列 dwVendorId DWORD 出力 dwDeviceId DWORD 出力 cardSlot WD_PCI_SLOT の配列 dwBus DWORD 出力 dwSlot DWORD 出力 dwFunction DWORD 出力 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pPciScan WD_PCI_SCAN_CARDS エレメント。 271 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド searchId WD_PCI_ID エレメント。 searchId.dwVendorId 検出に必要な PCI Vender ID。0 の場合、すべてのベンダーのカー ドを検出します。 searchId.dwDeviceId 検出に必要な PCI Vender ID。0 の場合、すべてのデバイスを検出 します。 dwCards 検出されたデバイスの数。 cardId WD_PCI_ID エレメント。 cardId.dwVendorId 検出された (searchId.dwVendorId で定義された必要な Vender ID に 対応する) デバイスの Vendor ID。 cardId.dwDeviceId 検出された (searchId.dwDeviceId で定義された必要な Vender ID に 対応する) デバイスの Device ID。 cardSlot WD_PCI_SLOT エレメント。 cardSlot.dwBus 検出されたデバイスのバス番号。 cardSlot.dwSlot 検出されたデバイスのスロット番号。 cardSlot.dwFunction 検出されたデバイスの関数番号。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_PCI_SCAN_CARDS pciScan; DWORD cards_found; WD_PCI_SLOT pciSlot; BZERO(pciScan); pciScan.searchId.dwVendorId = 0x12bc; pciScan.searchId.dwDeviceId = 0x1; WD_PciScanCards(hWD, &pciScan); if (pciScan.dwCards>0) // Found at least one device pciSlot = pciScan.cardSlot[0]; // use the first card found else printf("No matching PCI devices found\n"); A.5.3 WD_PciGetCardInfo() 目的 PCI デバイスのリソース情報 (割り込み文字列、I/O 範囲、およびメモリ範囲) を取得します。 272 付 録 A プロトタイプ DWORD WD_PciGetCardInfo(HANDLE hWD, WD_PCI_CARD_INFO *pPciCard); パラメータ 名前 型 入出力 hWD HANDLE 入力 pPciCard WD_PCI_CARD_INFO * pciSlot WD_PCI_SLOT dwBus DWORD 入力 dwSlot DWORD 入力 dwFunction DWORD 入力 Card WD_CARD dwItems DWORD Item WD_ITEMS の配列 出力 item DWORD 出力 fNotSharable DWORD 出力 I union Mem struct dwPhysicalAddr DWORD 出力 dwBytes DWORD 出力 dwTransAddr DWORD N/A dwUserDirectAddr DWORD N/A dwCpuPhysicalAddr DWORD N/A dwBar DWORD 出力 IO dwAddr struct DWORD 出力 273 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwBytes DWORD 出力 dwBar DWORD 出力 Int struct dwInterrupt DWORD 出力 hInterrupt DWORD N/A dwOptions DWORD N/A Bus struct dwBusType WD_BUS_TYPE 出力 dwBusNum DWORD 出力 dwSlotFunc DWORD 出力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pPciCard WD_PCI_CARD_INFO エレメント。 pciSlot WD_PCI_SLOT エレメント。 pciSlot.dwBus デバイスの PCI バス番号。 pciSlot.dwSlot デバイスの PCI スロット番号。 pciSlot.dwFunction デバイスの PCI 関数番号。 Card WD_CARD エレメント。 dwItems デバイスで検出されたアイテムの数。 Item WD_ITEMS エレメント: item item アイテムの種類。ITEM_MEMORY、ITEM_IO、ITEM_INTERRUPT、 または ITEM_BUS。 fNotSharable 真の場合、1 度に 1 つのアプリケーションがマップされたメモリ 範囲にアクセスまたはこのカードの割り込みをモニターすること ができます。 274 A 付 録 I "Item" に関する詳細なデータ。 I.Mem ITEM_MEMORY を説明します。 I.Mem.dwPhysicalAddr 物理的なメモリ範囲の最初のアドレス。 I.Mem.dwBytes バイト単位での範囲の長さ。 I.IO ITEM_IO を説明します。 I.IO.dwAddr I/O 範囲の最初のアドレス。 I.IO.dwBytes バイト単位での範囲の長さ。 I.IO.dwBar PCI カードの基本アドレス レジスタ番号。 I.Int ITEM_INTERRUPT を説明します。 I.Int.dwInterrupt 割り込み要求の (IRQ) 物理的な番号。 I.Bus ITEM_BUS を説明します。 I.Bus.dwBusType WD_BUS_TYPE オプションのデバイスの種類 (例、ISA / ISAPnP / PCI / PCMCIA) を保存するのに使用します。この場合 – WD_BUD_PCI I.Bus.dwBusNum 特定の PCI デバイスのバス番号。 I.Bus.dwSlotFunc スロットおよび関数。この値は、スロット番号および関数番号を 合わせたものです。下の 3 バイトが関数番号を示し、残りのバイ トがスロット番号を示します。例えば、0x80 (<=> 10000000 バイナ リ) は、関数番号が 0 (下の 3 バイトが 000) でスロット番号が 0x10 (残りの番号が 10000)であることを示します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 • PCI デバイスでは、Plug-and-Play マネージャから I/O、メモリ、および IRQ 情報を入手し ます (情報を入手できる場合)。これらから入手できない場合、これらの情報は PCI の設定 登録から直接読み取られます。Windows の場合、inf ファイルがインストールされている 必要があります。 • Plug-and-Play マネージャから IRQ を取得する場合、IRQ はマップされるので、物理 IRQ と 異なる場合があります。 275 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 例 WD_PCI_CARD_INFO pciCardInfo; WD_CARD Card; BZERO(pciCardInfo); pciCardInfo.pciSlot = pciSlot; WD_PciGetCardInfo(hWD, &pciCardInfo); if (pciCardInfo.Card.dwItems!=0) // At least one item was found { Card = pciCardInfo.Card; } else { printf("Failed fetching PCI card information\n"); } A.5.4 WD_PciConfigDump() 目的 選択された PCI デバイスの PCI 設定スペースか選択された PCI Express デバイスの拡張された設定ス ペースからの読み取り、またはこれらへの書き込みを行います。 以下の説明での “PCI” へのすべての言及には PCI Express も含まれています。 プロトタイプ DWORD WD_PciConfigDump(HANDLE hWD, WD_PCI_CONFIG_DUMP *pConfig); パラメータ 名前 型 入出力 hWD HANDLE 入力 pConfig WD_PCI_CONFIG_DUMP * pciSlot 276 WD_PCI_SLOT dwBus DWORD 入力 dwSlot DWORD 入力 dwFunction DWORD 入力 pBuffer PVOID 入力 / 出力 dwOffset DWORD 入力 dwBytes DWORD 入力 A 付 録 fIsRead DWORD 入力 dwResult DWORD 出力 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pConfig WD_PCI_CONFIG_DUMP エレメント。 pciSlot WD_PCI_SLOT エレメント。 pciSlot.dwBus カードの PCI バス番号。 pciSlot.dwSlot カードの PCI スロット番号。 pciSlot.dwFunction カードの PCI 関数番号。 pBuffer 次のデータへのポインタ: 1. PCI 設定登録からリードされるデータ。 2. PCI 設定登録へライトされるデータ。 dwOffset リード、ライトする PCI 設定空間のオフセット。 dwBytes バッファからリードされるまたはバッファへライトするバイト 数。 fIsRead TRUE の場合 - PCI 設定登録からリードします。 FALSE の場合 - PCI 設定登録にライトします。 dwResult 1. PCI_ACCESS_OK - リード/ライト OK。 2. PCI_ACCESS_ERROR - リード/ライトの失敗。 3. PCI_BAD_BUS - バスが存在しません。 4. PCI_BAD_SLOT - スロットまたは関数が存在しません。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_PCI_CONFIG_DUMP pciConfig; DWORD dwStatus; WORD aBuffer[2]; BZERO(pciConfig); pciConfig.pciSlot.dwBus = 0; 277 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド pciConfig.pciSlot.dwSlot = 3; pciConfig.pciSlot.dwFunction = 0; pciConfig.pBuffer = aBuffer; pciConfig.dwOffset = 0; pciConfig.dwBytes = sizeof(aBuffer); pciConfig.fIsRead = TRUE; dwStatus = WD_PciConfigDump(hWD, &pciConfig); if (dwStatus) { printf("WD_PciConfigDump failed: %s\n", Stat2Str(dwStatus)); } else { printf("Card in Bus 0, Slot 3, Funcion 0 has Vendor ID %x " "Device ID %x\n", aBuffer[0], aBuffer[1]); } A.5.5 WD_PcmciaScanCards() 目的 入力基準 (ManufacturerId および/または CardId) を確認する PCMCIA ソケットへ接続されている PCMCIA デバイスを検出し、番号および検出したデバイスの場所 (バス、ソケット、および関数) を 返します。 プロトタイプ DWORD WD_PcmciaScanCards(HANDLE hWD, WD_PCMCIA_SCAN_CARDS *pPcmciaScan); パラメータ 名前 型 入出力 hWD HANDLE 入力 pPcmciaScan WD_PCMCIA_SCAN_CARDS * searchId 278 WD_PCMCIA_ID wManufacturerId WORD 入力 wCardId WORD 入力 dwCards DWORD 出力 cardId WD_PCMCIA_ID の配列 wManufacturerId DWORD 出力 wCardId DWORD 出力 A 付 録 WD_PCMCIA_SLOT の配列 出力 uBus BYTE 出力 uSocket BYTE 出力 uFunction BYTE 出力 uPadding BYTE N/A dwOptions 入力 cardSlot dwOptions 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pPcmciaScan WD_PCMCIA_SCAN_CARDS エレメント。 Searched WD_PCMCIA_ID エレメント。 Searched.wManufacturerId 検出する PCMCIA カードの製造元 ID が必要です。0 の場合、全製 造元からのデバイスを検出します。 Searched.wCardId 検出する PCMCIA カード ID が必要です。0 の場合、全カードを検 出します。 DwCards 検出したカード数。 CardId WD_PCMCIA_ID エレメント。 cardId.wManufacturerId 検出したデバイスの製造元 ID 。(searchId.dwManufacturerId で定義 した 製造元 ID と対応しています)。 cardId.wCardId 検出したデバイスのカード ID 。(searchId.wCardId で定義したカー ド ID と対応しています)。 CardSlot WD_PCMCIA_SLOT エレメント CardSlot.uBus 検出したデバイスのバス番号 (最初のバスは 0)。 CardSlot.uSocket 検出したデバイスのソケット番号 (最初のソケットは 0)。 CardSlot.uFunction 検出したデバイスの関数番号 (最初の関数は 0)。 CardSlot.uPadding 1 バイトのパディング (リザーブ)。 279 W I N D R I V E R dwOptions ユ ー ザ ー ズ ガ イ ド リザーブ (0 に設定)。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す[A.15]。 例 WD_PCMCIA_SCAN_CARDS pcmciaScan; DWORD cards_found; WD_PCMCIA_SLOT pcmciaSlot; BZERO(pcmciaScan); pcmciaScan.searchId.wManufacturerId = 0x1234; pcmciaScan.searchId.wCardId = 0x5678; WD_PcmciaScanCards(hWD, &pcmciaScan); if (pcmciaScan.dwCards>0) // Found at least one device { // use the first card found pcmciaSlot = pcmciaScan.cardSlot[0]; } else { printf("No matching PCMCIA devices found\n"); } A.5.6 WD_PcmciaGetCardInfo() 目的 PCIMCIA デバイスのリソース情報 (メモリ範囲、バージョン、製造元およびモデル名、デバイスの タイプ、割り込み情報など) を取得します。 プロトタイプ DWORD WD_PcmciaGetCardInfo(HANDLE hWD, WD_PCMCIA_CARD_INFO *pPcmciaCard); パラメータ 名前 型 入出力 hWD HANDLE 入力 pPcmciaCard WD_PCMCIA_CARD_INFO * pcmciaSlot uBus 280 WD_PCMCIA_SLOT BYTE 入力 付 録 uSocket BYTE 入力 uFunction BYTE 入力 uPadding BYTE N/A Card A WD_CARD dwItems DWORD Item WD_ITEMS の配列 出力 item DWORD 出力 fNotSharable DWORD 出力 I union Mem struct dwPhysicalAddr DWORD 出力 dwBytes DWORD 出力 dwTransAddr DWORD N/A dwUserDirectAddr DWORD N/A dwCpuPhysicalAddr DWORD N/A dwBar DWORD 出力 IO struct dwAddr DWORD 出力 dwBytes DWORD 出力 dwBar DWORD 出力 Int struct dwInterrupt DWORD 出力 dwOptions DWORD N/A hInterrupt DWORD N/A Bus struct 281 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwBusType WD_BUS_TYPE 出力 dwBusNum DWORD 出力 dwSlotFunc DWORD 出力 cVersion[4] CHAR 出力 cManufacturer[48] CHAR 出力 cProductName CHAR 出力 wManufacturerId WORD 入力 wCardId WORD 入力 wFuncId WORD 入力 dwOptions DWORD N/A 説明 名前 HWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pPcmciaCard WD_PCMCIA_CARD_INFO エレメント。 PcmciaSlot WD_PCMCIA_SLOT エレメント。 cardSlot.uBus デバイスのバス番号 (最初のバスは0)。 cardSlot.uSocket デバイスのソケット番号 (最初のソケットは0)。 cardSlot.uFunction デバイスの関数番号 (最初の関数は 0)。 cardSlot.uPadding 1 バイトのパディング (リザーブ)。 Card WD_CARD エレメント。 dwItems デバイスで検出されたアイテム数。 Item WD_ITEMS エレメント。 item アイテムのタイプ。ITEM_MEMORY、ITEM_IO、 ITEM_INTERRUPT、または ITEM_BUS。 fNotSharable True の場合、一度に 1 つのアプリケーションがマップされたメモ リ範囲にアクセスするか、またはこのカードの割り込みをモニタ することができます。 282 付 録 A I “Item” に従う固有のデータ。 I.Mem ITEM_MEMORY を説明します。 I.Mem.dwPhysicalAddr 物理的なメモリ範囲の最初のアドレス。 I.Mem.dwBytes バイト単位での範囲の長さ。 I.Mem.dwBar PCMCIA カードのベース アドレス レジスタ番号。 I.IO ITEM_IO を説明します。 I.IO.dwAddr I/O 範囲の最初のアドレス。 I.IO.dwBytes バイト単位での範囲の長さ。 I.IO.dwBar PCMCIA カードのベース アドレス レジスタ番号。 I.Int ITEM_INTERRUPT を説明します。 I.Int.dwInterrupt 割り込み要求 (IRQ) の物理番号。 I.Bus ITEM_BUS を説明します。 I.Bus.dwBusType WD_BUS_TYPE オプション (ISA/ISAPnP/PCI/PCMCIA など) から デバイスのタイプを保存するために使用します。 この場合、 WD_BUS_PCMCIA. になります。 I.Bus.dwBusNum PCMCIA デバイス特有のバス番号。 I.Bus.dwSlotFunc ソケットおよび関数。この値は、ソケット番号および関数番号を 合わせたものです。下の 3 バイトが関数番号を示し、残りのバイ トがソケット番号を示します。例えば、0x80 (<=> 10000000 バイナ リ) は、関数番号が 0 (下の 3 バイトが 000) でソケット番号が 0x10 (残りの番号が 10000)であることを示します。 cVersion[4] バージョン番号。 cManufacturer[48] 製造元の文字列。 cProductName[48] 製品名の文字列。 wManufacturerId カード製造元 ID。 wCardId カード タイプおよびモデル ID。 wFuncId カード関数 ID。 dwOptions リザーブ (0 に設定) 283 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 注釈 • PCMCIA カードのリソース情報は、Windows Plug-and-Play マネージャ (Windows 2000 以降) から WinDriver によって取得されます。 例 WD_PCMCIA_CARD_INFO pcmciaCardInfo; WD_CARD Card; BZERO(pcmciaCardInfo); pcmciaCardInfo.pcmciaSlot = pcmciaSlot; WD_PcmciaGetCardInfo(hWD, &pcmciaCardInfo); if (pcmciaCardInfo.Card.dwItems!=0) // At least one item was found { Card = pcmciaCardInfo.Card; } else { printf("Failed fetching PCMCIA card information\n"); } A.5.7 WD_PcmciaConfigDump() 目的 カード情報構造体 (CIS) が保存されている選択された PCMCIA デバイスの PC カードの属性スペー スからの読み取り、およびそれへの書き込みを行います。 プロトタイプ DWORD WD_PcmciaConfigDump(HANDLE hWD, WD_PCMCIA_CONFIG_DUMP *pPcmciaConfig); パラメータ 名前 型 入出力 hWD HANDLE 入力 pPcmciaConfig WD_PCMCIA_CONFIG_DUMP * pcmciaSlot 284 WD_PCMCIA_SLOT uBus BYTE 入力 uSocket BYTE 入力 uFunction BYTE 入力 A 付 録 uPadding BYTE N/A pBuffer PVOID 入力/出力 dwOffset DWORD 入力 dwBytes DWORD 入力 fIsRead DWORD 入力 dwResult DWORD 出力 dwOptions DWORD 入力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pPcmciaConfig WD_PCMCIA_CONFIG_DUMP エレメント。 pcmciaSlot WD_PCMCIA_SLOT エレメント。 cardSlot.uBus デバイスのバス番号 (最初のバスは 0)。 cardSlot.uSocket デバイスのソケット番号 (最初のソケットは 0)。 cardSlot.uFunction デバイスの関数番号 (最初の関数は 0)。 cardSlot.uPadding 1 バイトのパディング (リザーブ)。 pBuffer 以下のどちらかのデータへのポインタ 1. PCMCIA 設定登録へライトされるデータ 2. PCMCIA 設定登録からリードされるデータ dwOffset 読み取り/書き込みを行う PCMCIA 設定スペースでの特定登録の オフセット。 dwBytes バッファからリード/バッファへライトしたバイト数 fIsRead TRUE の場合 - PCMCIA 設定登録からリードします。 FALSE の場合 - PCMCIA 設定登録へライトします。 dwResult 1. PCMCIA_ACCESS_OK – リード/ライト OK。 2. PCMCIA_BAD_SOCKET – ソケットは存在しません。 3. PCMCIA_BAD_OFFSET – 不正なオフセットです。 4. PCMCIA_ACCESS_ERROR – リード/ライトは失敗しました。 dwOptions リザーブ (0 に設定)。 285 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返しま す [A.15]。 例 WD_PCMCIA_CONFIG_DUMP pcmciaConfig; DWORD dwStatus; WORD aBuffer[2]; BZERO(pcmciaConfig); pcmciaConfig.pcmciaSlot.uBus = 0; pcmciaConfig.pcmciaSlot.uSocket = 0; pcmciaConfig.pcmciaSlot.uFunction = 0; pcmciaConfig.pcmciaSlot.uPadding = 0; pcmciaConfig.pBuffer = aBuffer; pcmciaConfig.dwOffset = 0; pcmciaConfig.dwBytes = sizeof(aBuffer); pcmciaConfig.fIsRead = TRUE; dwStatus = WD_PcmciaConfigDump(hWD, &pcmciaConfig); if (dwStatus) { printf("WD_PcmciaConfigDump failed: %s\n", Stat2Str(dwStatus)); } else { printf("Card in Bus 0, Socket 0: the code of the first tuple in" " the CIS is %x\n", (UINT32)aBuffer[0]); } A.5.8 WD_IsapnpScanCards() 目的 入力基準 (VendorID および/または Serial Device Number) と一致する ISA PnP バスにインストールされて いる ISA PnP デバイスを検出し、検出されたデバイスの番号および場所 (バス、スロットおよび関数) を 返します。 プロトタイプ DWORD WD_IsapnpScanCards(HANDLE hWD, WD_ISAPNP_SCAN_CARDS *pIsapnpScan); パラメータ 名前 型 入出力 hWD HANDLE 入力 pIsapnpScan WD_ISAPNP_SCAN_CARDS * 286 付 録 searchId WD_ISAPNP_CARD_ID cVendor[8] CHAR 入力 dwSerial DWORD 入力 dwCards DWORD 出力 Card WD_ISAPNP_CARD の配列 cardId A WD_ISAPNP_CARD_ID cVendor[8] CHAR 出力 dwSerial DWORD 出力 dwLogicalDevices DWORD 出力 bPnPVersionMajor BYTE 出力 bPnPVersionMinor BYTE 出力 bVendorVersionMajor BYTE 出力 bVendorVersionMinor BYTE 出力 cIdent CHAR [36] 出力 説明 名前 説明 HWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドライ バへのハンドル。 pIsapnpScan WD_ISAPNP_SCAN_CARDS エレメント。 searchId WD_ISAPNP_CARD_ID エレメント。 searchId.cVendor[8] 検出するために要求された ISA PnP Vendor ID。0 の場合すべてのベン ダーからデバイスを検出します。 searchId.dwSerial 検出するための要求された ISA PnP シリアル デバイス番号。0 の場 合、すべてのデバイスを検出します。 dwCards 検出されたデバイスの数。 Card WD_ISAPNP_CARD エレメント。 287 W I N D R I V E R ユ ー ザ ー ズ cardId ガ イ ド WD_ISAPNP_CARD_ID エレメント - 検出されたデバイスの Vendor ID およびシリアル番号。 cardId.cVendor[8] Vendor ID。 cardId.dwSerial デバイスのシリアル番号。 dwLogicalDevices デバイス上の論理デバイスの数。 bPnPVersionMajor ISA PnP バージョンのメジャー部分。 bPnPVersionMinor ISA PnP バージョンのマイナー部分。 bVendorVersionMajor ベンダー バージョンのメジャー部分。 bVendorVersionMinor ベンダー バージョンのマイナー部分。 cIdent WD_ISAPNP_ANSI - ASCII デバイス識別文字列。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_ISAPNP_SCAN_CARDS isapnpScan; DWORD Cards_found WD_ISAPNP_CARD isapnpCard; BZERO(isapnpScan); // CTL009e - Sound Blaster ISA PnP Card strcpy(isapnpScan.searchId.cVendorId, "CTL009e"); isapnpScan.searchId.dwSerial = 0; WD_IsapnpScanCards(hWD, &isapnpScan); if (isapnpScan.dwCards>0) // Found at least one device { // Take the first card found isapnpCard = isapnpScan.Card[0]; } else { printf("No matching ISA PnP devices found\n"); } A.5.9 WD_IsapnpGetCardInfo() 目的 ISA Plug and Play デバイス リソース情報 (例、メモリ範囲、I/O 範囲、割り込み文字列) を取得します。 288 付 録 A プロトタイプ DWORD WD_IsapnpGetCardInfo(HANDLE hWD, WD_ISAPNP_CARD_INFO *pIsapnpCard); パラメータ 名前 型 入出力 hWD HANDLE 入力 pIsapnpCard WD_ISAPNP_CARD_INFO * cardId WD_ISAPNP_CARD_ID cVendor CHAR[8] 入力 dwSerial DWORD 入力 dwLogicalDevice DWORD 入力 clogicalDevice CHAR [8] 出力 dwCompatibleDevices DWORD 出力 CompatibleDevices CHAR [10][8] 出力 cIdent CHAR [36] 出力 Card WD_CARD dwItems DWORD Item WD_ITEMS の配列 出力 item DWORD 出力 fNotSharable DWORD 出力 I union Mem struct dwPhysicalAddr DWORD 出力 dwBytes DWORD 出力 dwTransAddr DWORD N/A dwUserDirectAddr DWORD N/A 289 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwCpuPhysicalAddr DWORD N/A dwBar DWORD 出力 IO struct dwAddr DWORD 出力 dwBytes DWORD 出力 dwBar DWORD 出力 Int struct dwInterrupt DWORD 出力 hInterrupt DWORD 出力 dwOptions DWORD N/A Bus struct dwBusType WD_BUS_TYPE 出力 dwBusNum DWORD 出力 dwSlotFunc DWORD 出力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pIsapnpCard WD_ISAPNP_CARD_INFO エレメント。 cardId WD_ISAPNP_CARD_ID エレメント。 cardId.cVendor 要求された情報のために要求された ISA プラグ アンド プレイ Vendor ID。 cardId.dwSerial 要求された情報のために要求された ISA プラグ アンド プレイ シ リアル デバイス番号。 dwLogicalDevice clogicalDevice 要求された情報のための論理デバイスの数。 WD_ISAPNP_COMP_ID - 検出された論理デバイス ID の ASCII コード 8 文字の文字列。 290 A 付 録 dwCompatibleDevices 互換性がある検出されたデバイスの数。 CompatibleDevices WD_ISAPNP_COMP_ID - 互換性があるデバイス ID の配列。 cIdent WD_ISAPNP_ANSI - ASCII デバイス識別文字列。 Card WD_CARD エレメント。 dwItems デバイス上で検出されたアイテムの数。 Item WD_ITEMS エレメント。 item アイテムの種類。ITEM_MEMORY, ITEM_IO, ITEM_INTERRUPT または ITEM_BUS。 fNotSharable 真の場合、一度に 1 つのアプリケーションがマップされたメモリ 範囲にアクセスまたはこのカードの割り込みをモニターすること ができます。 I "Item" による詳細なデータ。 I.Mem ITEM_MEMORY を説明します。 I.Mem.dwPhysicalAddr 物理的なメモリ範囲の最初のアドレス。 I.Mem.dwBytes バイト単位での範囲の長さ。 I.IO ITEM_IO を説明します I.IO.dwAddr I/O 範囲の最初のアドレス。 I.IO.dwBytes バイト単位での範囲の長さ。 I.IO.dwBar PCI カードの基本アドレス レジスタ番号。 I.Int ITEM_INTERRUPT を説明します。 I.Int.dwInterrupt 割り込み要求の (IRQ) 物理的な番号。 I.Bus ITEM_BUS を説明します。 I.Bus.dwBusType WD_BUS_TYPE オプションのデバイスの種類 (例、ISA / ISAPnP / PCI / PCMCIA) を保存するのに使用します。この場合 – WD_BUS_EISA。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 291 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 例 WD_ISAPNP_CARD_INFO isapnpCardInfo; WD_CARD Card; BZERO(isapnpCardInfo); // from WD_IsapnpScanCard(): isapnpCardInfo.CardId = isapnpCard; isapnpCardInfo.dwLogicalDevice = 0; WD_IsapnpGetCardInfo(hWD, &isapnpCardInfo); // At least one item was found. if (isapnpCardInfo.Card.dwItems!=0) Card = isapnpCardInfo.Card; else printf("Failed fetching ISA PnP card information\n"); A.5.10 WD_IsapnpConfigDump() 目的 選択された ISA PnP デバイスの ISA PnP 設定登録からリードまたは ISA PnP 設定登録へライトします。 プロトタイプ DWORD WD_IsapnpConfigDump(HANDLE hWD, WD_ISAPNP_CONFIG_DUMP *pConfig); パラメータ 名前 型 入出力 hWD HANDLE 入力 pConfig WD_ISAPNP_CONFIG_DUMP * cardId 292 WD_ISAPNP_CARD_ID cVendor CHAR[8] 入力 dwSerial DWORD 入力 dwOffset DWORD 入力 fIsRead DWORD 入力 bData BYTE 入力 / 出力 dwResult DWORD 出力 A 付 録 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pConfig WD_ISAPNP_CONFIG_DUMP エレメント。 cardId WD_ISAPNP_CARD_ID エレメント。 cardId.cVendor 要求されたデバイスのために要求された ISA プラグ アンド プレ イ Vendor ID。 cardId.dwSerial 必要な情報のために要求された ISA プラグ アンド プレイ シリア ル デバイス番号。 dwOffset リード、ライトする ISA PnP 設定空間のオフセット。 fIsRead TRUE の場合 - ISA PnP 設定登録からリードします。 FALSE の場合 - ISA PnP 設定登録にライトします。 bData データとは: 1. ISA PnP 設定登録にライトされたもの。 2. ISA PnP 設定登録からリードされたもの。 dwResult 0 - ISAPNP_ACCESS_OK - リード/ライト OK。 1 - ISAPNP_ACCESS_ERROR - リード/ライトの失敗 2 - ISAPNP_BAD_ID - デバイスが存在しません 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_ISAPNP_CONFIG_DUMP isapnpConfig; BZERO(isapnpConfig); // from WD_IsapnpScanCard(): isapnpConfig.CardId = isapnpCard; isapnpConfig.dwOffset = 0; isapnpConfig.fIsRead = TRUE; WD_IsapnpConfigDump(hWD, &isapnpConfig); if (isapnpConfig.dwResult!=ISAPNP_ACCESS_OK) { printf("No ISA PnP device specified slot\n"); } else { printf("ISA PnP config in offest 0 =\%x\n", 293 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド isapnpConfig.bData); } A.5.11 WD_CardRegister() 目的 • デバイスの物理メモリ領域をカーネル モード処理およびユーザー モード アプリケーションで アクセスするようにマップします。 • I/O またはメモリ リソースが前回排他的に登録されたかチェックします。 • InterruptEnable [A.5.21] または WD_IntEnable [A.6.2] に使用されている内部データ構造体の割り 込み要求 (IRQ) 番号および割り込みの種類 (edge triggered および level sensitive) に関するデータ を保存します。 プロトタイプ DWORD WD_CardRegister(HANDLE hWD, WD_CARD_REGISTER *pCardReg); パラメータ 名前 型 入出力 hWD HANDLE 入力 pCardReg WD_CARD_REGISTER * Card WD_CARD dwItems DWORD Item WD_ITEMS の配列 item DWORD 入力 fNotSharable DWORD 入力 dwOptions DWORD 入力 I union Mem 294 入力 struct dwPhysicalAddr DWORD 入力 dwBytes DWORD 入力 dwTransAddr DWORD 出力 dwUserDirectAddr DWORD 出力 付 録 dwCpuPhysicalAddr DWORD 出力 dwBar DWORD 出力 IO struct dwAddr DWORD 入力 dwBytes DWORD 入力 dwBar DWORD 出力 Int struct dwInterrupt DWORD 入力 dwOptions DWORD 入力 hInterrupt DWORD 出力 Bus A WD_BUS dwBusType WD_BUS_TYPE 入力 dwBusNum DWORD 入力 dwSlotFunc DWORD 入力 fCheckLockOnly DWORD 入力 hCard DWORD 出力 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ド ライバへのハンドル。 pCardReg WD_CARD_REGISTER エレメント。 Card WD_CARD エレメント。 dwItems デバイスで検出されたアイテムの数。 Item WD_ITEMS エレメント。 item ITEM_MEMORY、ITEM_IO、ITEM_INTERRUPT または ITEM_BUS。 295 W I N D R I V E R ユ ー ザ ー ズ fNotSharable ガ イ ド 真の場合、1 度に 1 つのアプリケーションがマップされたメモ リ範囲にアクセスまたはこのカードの割り込みをモニターする ことができます。 dwOptions 以下の WD_ITEM_OPTIONS フラグのいずれか WD_ITEM_DO_NOT_MAP_KERNEL: このフラグはカーネル 仮想アドレス空間へメモリ アドレス範囲へのマップおよび ユーザー モードの仮想アドレス空間のみへのメモリのマップ を避ける関数を指示します。 この関数の詳細は注釈を参照してください。 注意: このフラグはメモリ アイテムにのみ適用します。 I "Item" に関する詳細なデータ。 I.Mem ITEM_MEMORY を説明します。 I.Mem.dwPhysicalAddr 物理的なメモリ範囲の最初のアドレス。 I.Mem.dwBytes バイト単位での範囲の長さ。 I.Mem.dwTransAddr カーネル モード処理のための dwPhysicalAddr および dwBytes (WD_XxxGetCardInfo 内) に返された物理的なメモリ アドレスを マップします。WD_Transfer [A.5.14] に使用されます。 I.Mem.dwUserDirectAddr (ユーザー モードから直接アクセスを有効にする) ユーザー モード アプリケーションのための dwPhysicalAddr および dwBytes (WD_XxxGetCardInfo 内) に返された物理的なメモリ ア ドレスをマップします。 I.Mem.dwCpuPhysicalAddr デバイスのメモリ アドレスをバス特定の値から CPU 値に変換 します。 I.Mem.dwBar PCI カードの基本アドレス レジスタ番号。 I.IO ITEM_IO を説明します。 I.IO.dwAddr I/O 範囲の最初のアドレス。 I.IO.dwBytes バイト単位での範囲の長さ。 I.IO.dwBar PCI カードの基本アドレス レジスタ番号。 I.Int ITEM_INTERRUPT を説明します。 I.Int.dwInterrupt 割り込み要求 (IRQ) の物理的な番号。 296 付 録 I.Int.dwOptions A ビット マスク フラッグ: INTERRUPT_LEVEL_SENSITIVE - 割り込みが Level Sensitive の場合。 デフォルト - 割り込みは Edge-Triggered (WD_XxxGetCardInfo か ら返されます) です。 INTERRUPT_CE_INT_ID - (他のオペレーティング システムと 違い) Windows CE には物理的な割り込み番号を論理的なものす る抽象概念があります。このビットの設定が論理的な割り込み 番号として dwInterrupt での割り込みへの参照を WinDriver に命 令し、それを物理的な割り込み番号に変換します。 I.Int.hInterrupt InterruptEnable [A.5.21] または WD_IntEnable [A.6.2] と使用するた めの割り込みハンドルを返します。 I.Bus ITEM_BUS を説明します。 I.Bus.dwBusType デバイス (例 ISA / ISAPnP / PCI / PCMCIA) の種類を保存するの に使用します。 1 = ISA; 2 = EISA; 5 = PCI; 8 = PCMCIA I.Bus.dwBusNum 特定のデバイスのバス番号。 I.Bus.dwSlotFunc スロットおよび関数。 fCheckLockOnly TRUE に設定したとき - 特定のリソースが排他的なリソースを 予防としたときにロックされていないか確認します。 hCard WD_CardUnregister [A.5.13] によって使用されたカードのための ハンドル。カード登録に失敗した場合は 0 です。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 • PCI/PCMCIA の場合、cardRegCard の入力リソース情報は、WD_PciGetCardInfo() [A.5.3] お よび WD_PcmciaGetCardInfo() [A.5.6] を通じて Plug-and-Play マネージャから取得されます。 • カードが、カーネル仮想アドレス空間すべてにマップできない広いメモリ範囲を持つ場合、 このメモリ範囲を、カーネル アドレス空間ではなくユーザー モード仮想アドレス空間だけ にマップする関数を指示するために、関連したメモリ WD_ITEMS 構造体 (pCardReg->Card.item[i].dwOptions) 用に WD_ITEM_DO_NOT_MAP_KERNEL フラグを設定 することができます。(PCI/PCMCIA デバイスの場合、WD_CardRegister() へ構造体を渡す 297 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 前に WD_PciGetCardInfo() [A.5.3] / WD_PcmciaGetCardInfo() [A.5.6] から返されるカード情 報構造体 (pCard) で関連したアイテムを修正することができます)。 注意: このフラグの設定した場合、WD_CardRegiser() はメモリのカーネル マッピングでア イテムの dwTransAddr フィールドをアップデートしません。そのため、カーネルからメモ リへアクセスするために WD_Transfer() [A.5.14] または WD_MultiTransfer() [A.5.15] を呼び 出すことはできません。またメモリ アイテムの dwTransAddr フィールドを使用して Kernel PlugIn ドライバから直接メモリへアクセスすることもできません。 • WD_CardRegister() でカード メモリ リソースを仮想メモリへマップすることができます。 また通常のポインタとしてアクセスすることもできます。Windows CE には、明白なリク エスト (要求) なしでお互いのメモリ スペースへアクセスするプロセスを制限するセキュ リティ機能があります。現在のスレッド用の許可を設定する SetProcPermissions() を使用し てリクエスト (要求) することができます。カードのリソースは WinDriver 内でマップされ、 これらのマッピングはデバイス マネージャの処理に属するため、その他のスレッドはこれ らのマッピングがアクセスする前にこの関数を呼び出します。WD_Open() を呼び出すたび に SetProcPermissions() (windrvr.h を参照) を呼び出します。マップされた地域にアクセ スし、WD_Open() を呼び出さないスレッド (ユーザー スレッド、Windows メッセージ ス レッドなど) は明白に SetProcPermissions() を呼び出します。 例 WD_CARD_REGISTER cardReg; BZERO(cardReg); cardReg.Card.dwItems = 1; cardReg.Card.Item[0].item = ITEM_IO; cardReg.Card.Item[0].fNotSharable = TRUE; cardReg.Card.Item[0].I.IO.dwAddr = 0x378; cardReg.Card.Item[0].I.IO.dwBytes = 8; WD_CardRegister(hWD, &cardReg); if (cardReg.hCard==0) { printf("Failed locking device\n"); return FALSE; } A.5.12 WD_CardCleanupSetup() 目的 アプリケーションの終了時に、指定したカードで実行中の転送のクリーンナップを行うリストを設定 します。 プロトタイプ DWORD WD_CardCleanupSetup(HANDLE hWD, WD_CARD_CLEANUP *pCardCleanup) 298 A 付 録 パラメータ 名前 型 入出力 hWD HANDLE 入力 pCardCleanup WD_CARD_CLEANUP * hCard DWORD 入力 Cmds WD_TRANSFER * 入力 dwCmds DWORD 入力 dwOptions DWORD 入力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pCardCleanup WD_CARD_CLEANUP 構造体へのポインタ。 HCard WD_CardRegister [A.5.11] から取得した関連するカードへのハンド ル。 Cmds 停止時に実行される WD_TRANSFER コマンドのバッファ。 dwCmds コマンドの数。 dwOptions 0 を設定すると、以下の 2 つの場合で転送コマンドを実行します: アプリケーションが自動的に停止する場合 WD_CardUnregister [A.5.13] を呼び出さずにアプリケーションを 終了する場合 WD_FORCE_CLEANUP を設定すると、上記の 2 つの場合に加え て、WD_CardUnregister [A.5.13] を呼び出した場合に転送コマンド を実行します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 WD_CardRegister [A.5.11] を呼んだ後、すぐにこの関数を呼んでください。 299 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 例 dwStatus = WD_CardCleanupSetup(hPlx->hWD, pCleanup); if (dwStatus) { printf("WD_CardCleanupSetup failed: %s\n", Stat2Str(dwStatus)); } A.5.13 WD_CardUnregister() 目的 デバイスの登録を解除しそれに割り当てられたリソースを解放します。 プロトタイプ DWORD WD_CardUnregister(HANDLE hWD, WD_CARD_REGISTER *pCardReg); パラメータ 名前 型 入出力 hWD HANDLE 入力 pCardReg WD_CARD_REGISTER * Card WD_CARD N/A fCheckLockOnly DWORD N/A hCard DWORD 入力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 hCard WD_CardRegister [A.5.11] から返された登録を解除するためのデバ イスのハンドル。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_CardUnregister(hWD, &cardReg); 300 A 付 録 A.5.14 WD_Transfer() 目的 I/O ポートまたはメモリ アドレスへの単一の read (読み込み) / write (書き込み) 命令を実行します。 プロトタイプ DWORD WD_Transfer(HANDLE hWD, WD_TRANSFER *pTrans); パラメータ 名前 型 入出力 hWD HANDLE 入力 pTrans WD_TRANSFER * cmdTrans DWORD 入力 dwPort DWORD 入力 dwBytes DWORD 入力 fAutoinc DWORD 入力 dwOptions DWORD 入力 Data Union Data.Byte BYTE 入力 / 出力 Data.Word WORD 入力 / 出力 Data.Dword DWORD 入力 / 出力 Data.Qword QWORD 入力 / 出力 Data.pBuffer PVOID 入力 / 出力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pTrans WD_TRANSFER エレメント。 301 W I N D R I V E R cmdTrans ユ ー ザ ー ズ ガ イ ド 操作のコマンド (WD_TRANSFER_CMD; インプルメントについて の詳細は、windrvr.h を参照してください)。入力は次のようにしま す: <dir><p>_<string><size> dir - R = リード、W = ライト p - P = I/O ポート、M = メモリ String - S = 文字列、シングル転送の場合は不要。 Size - BYTE、WORD、DWORD または QWORD。 dwPort I/O 転送 - WD_CardRegister [A.5.11] 内の I.IO.dwAddr から返された ポートアドレス。 メモリ転送 - WD_CardRegister の I.Mem.dwTransAddr からカーネル モード仮想メモリが返されます。 dwBytes fAutoinc 文字列転送に使用されます - 転送するバイト数。 fAutoinc 文字列 転送に使用されます TRUE の場合、I/O またはメモリ アドレスが転送のために含まれま す。 FALSE の場合、すべてのデータが同じポート/アドレスに転送され ます。 dwOptions 0 でなければなりません。 Data 転送されるデータ。 Data.Byte 8 ビット転送に使用されます。 Data.Word 16 ビット転送に使用されます。 Data.Dword 32 ビット転送に使用されます。 Data.Qword 64 ビット転送に使用されます。 Data.pBuffer 文字列転送で使用されます - バッファへのポインタとリード/ライ トするデータ。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 64-ビット データ転送 (QWORD) は、メモリ リード/ライト文字列オペレーションにのみ利用できま す。 64-ビット データ転送 (QWORD) には、64-ビット用のPCI デバイスおよび WinDriver がサポートする OS 上で実行する x86 CPU が必要です (注意: WD_Transfer による 64-ビット データ転送は、64-ビッ トでないオペレーティング システム/CPU でも行うことができます)。 302 付 録 A BYTE buf[len]; // BYTE 転送用 − アラインなし WORD buf[len]; // WORD 転送用 − 2 バイト境界でアライン UINT32 buf[len]; // DWORD 転送用 − 4 バイト境界でアライン UINT64 buf[len]; // QWORD 転送用 − 8 バイト境界でアライン 例 WD_TRANSFER Trans; BYTE read_data; BZERO(Trans); Trans.cmdTrans = RP_BYTE; //Read Port BYTE Trans.dwPort = 0x210; WD_Transfer(hWD, &Trans); read_data = Trans.Data.Byte; A.5.15 WD_MultiTransfer() 目的 I/O ポートまたはメモリ アドレスへ複数の read (読み込み) / write (書き込み) 命令を実行します。 プロトタイプ DWORD WD_MultiTransfer(HANDLE hWD, WD_TRANSFER *pTransArray, DWORD dwNumTransfers); パラメータ 名前 型 入出力 hWD HANDLE 入力 pTransArray WD_TRANSFER * の配列 cmdTrans DWORD 入力 dwPort DWORD 入力 dwBytes DWORD 入力 fAutoinc DWORD 入力 dwOptions DWORD 入力 Data union Data.Byte BYTE 入力 / 出力 Data.Word WORD 入力 / 出力 303 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド Data.Dword DWORD 入力 / 出力 Data.Qword QWORD 入力 / 出力 Data.pBuffer PVOID 入力 / 出力 DWORD 入力 dwNumTransfers 説明 名前 HWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pTransArray WD_TRANSFER エレメント。 cmdTrans 操作のコマンド (WD_TRANSFER_CMD; インプルメントについて は windrvr.h を参照してください)。入力は次のようにします: <dir><p>_<string><size> dir - R = リード、W = ライト p - P = I/O ポート、M = メモリ String - S = 文字列、シングル転送の場合は不要。 Size - BYTE、 WORD、DWORD または QWORD。 dwPort I/O 転送 - WD_CardRegister [A.5.11] 内の I.IO.dwAddr から返された ポートアドレス。 メモリ転送 - WD_CardRegister の I.Mem.dwTransAddr からカーネル モード仮想メモリが返されます。 dwBytes fAutoinc 文字列転送に使用されます - 転送するバイト数。 fAutoinc 文字列転送に使用されます TRUE の場合、I/O またはメモリ アドレスが転送のために含まれま す。 FALSE の場合、すべてのデータが同じポート/アドレスに転送され ます。 dwOptions 0 でなければなりません。 Data 転送されるデータ バッファ。 Data.Byte 8 ビット転送に使用されます。 Data.Word 16 ビット転送に使用されます。 304 付 録 Data.Dword 32 ビット転送に使用されます。 Data.Qword 64 ビット転送に使用されます。 Data.pBuffer A Dword 転送で使用されます - バッファへのポインタとリード/ライ トするデータ。 dwNumTransfers 配列内のコマンドの数。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 WD_Transfer [A.5.14] を参照してください。 注意: この関数は、Visual Basic ではサポートされていません。 例 WD_TRANSFER Trans[4]; DWORD dwResult; char *cData = "Message to send\n"; BZERO(Trans); Trans[0].cmdTrans = WP_WORD; Trans[0].dwPort = 0x1e0; Trans[0].Data.Word = 0x1023; //Write Port WORD Trans[1].cmdTrans = WP_WORD; Trans[1].dwPort = 0x1e0; Trans[1].Data.Word = 0x1022; Trans[2].cmdTrans = WP_SBYTE; //Write Port String BYTE Trans[2].dwPort = 0x1f0; Trans[2].dwBytes = strlen(cdata); Trans[2].fAutoinc = FALSE; Trans[2].dwOptions = 0; Trans[2].Data.pBuffer = cData; Trans[3].cmdTrans = RP_DWORD; //Read Port Dword Trans[3].dwPort = 0x1e4; WD_MultiTransfer(hWD, &Trans, 4); dwResult = Trans[3].Data.Dword; 305 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.5.16 WD_DMALock() 目的 • Contiguous または Scatter Gather DMA を有効にします。 • 物理的なメモリ領域をロックして対応する物理的なアドレスのリストを返します。 • カーネル仮想アドレス空間へ割り当てられたバッファの物理アドレスのマップを返します。 • Contiguous Buffer DMA の場合、ユーザー モード仮想アドレス空間へ割り当てられたバッファの物 理アドレスのマップを返します。(Scatter/Gather DMA の場合、仮想ユーザー モード アドレスは関 数への入力として呼び出し元により提供されます)。 プロトタイプ DWORD WD_DMALock(HANDLE hWD, WD_DMA *pDMA); パラメータ 名前 型 入出力 hWD HANDLE 入力 pDma WD_DMA * 306 hDma DWORD 出力 pUserAddr PVOID 入力 / 出力 pKernelAddr KPTR 出力 dwBytes DWORD 入力 dwOptions DWORD 入力 dwPages DWORD 入力 /出力 hCard DWORD 入力 /出力 Page WD_DMA_PAGE 配列 pPhysicalAddr KPTR 出力 dwBytes DWORD 出力 A 付 録 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドライ バへのハンドル。 pDma WD_DMA エレメント。 hDma WD_DMAUnlock [A.5.17] によって使用される DMF バッファのハン ドル。失敗した場合は 0 を返します。 pUserAddr ユーザ モード仮想メモリへのポインタ。Scatter Gather する場合は入 力、連続した DMA バッファの場合は出力。 pKernelAddr カーネルの割り当てられたバッファのカーネルのマップ。Contiguous Buffer DMA の場合のみ適応 (dwOptions = DMA_KERNEL_BUFFER_ALLOC)。 dwBytes バッファのサイズ。 dwOptions ビット マスク フラッグ: DMA_KERNEL_BUFFER_ALLOC: セットした場合 物理的メモリ内に連続したバッファを割り当てます。 デフォルト- Scatter Gather. DMA_KBUF_BELOW_16M: DMA が (上で) "contiguous" に設定され た場合にのみ関連します。 設定した場合、メイン メモリの最初の 16MB に物理的なアドレスが 割り当てられます。 DMA_LARGE_BUFFER - DMA が (上で) "Scatter Gather" に設定され た場合にのみ関連します。 設定した場合、1 MB 以上をロックできます。 DMA_ALLOW_CACHE – メモリのキャッシュを許可します。 DMA_KERNEL_ONLY_MAP: DMA を DMA_KERNEL_BUFFER_ALLOC フラグをつけてcontiguous オプ ションに設定した場合のみ関連します。設定した場合 − 割り当てら れたバッファのマップは、ユーザーモードではなく、カーネルモー ドへのみです。 DMA_READ_FROM_DEVICE: 設定した場合、メモリ ページをデバ イスからの読み込みをロックし、デバイスへの書き込みを示します。 DMA_WRITE_TO_DEVICE: 設定した場合、メモリ ページをデバイ スへの書き込みをロックし、デバイスからの読み込みを示します。 注意: DMA_READ_FROM_DEVICE または DMA_WRITE_TO_DEVICE のいずれか一つを設定します。両方を設 定できません。 307 W I N D R I V E R ユ ー ザ ー ズ dwPages ガ イ ド ページ数。 DMA が "contiguous" に設定されている場合は 1 を返します。 DMA_LARGE_BUFFER は、ページ配列のサイズを説明する入力とし ても使用されます。詳細は、『WinDriver インプルメントについて』 セクションを参照してください。 hCard WD_CardRegister() [A.5.11] から受信した関連カードのハンドル。 このフィールドに 0 を設定するオプションで、デバイス無しでカー ネル バッファのロックを可能にします。 Page WD_DMA_PAGE − ページの配列。 pPhysicalAddr 物理的なアドレスへのポインタ。 dwBytes ページのサイズ。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 • WinDriver は、 Windows 98 / Me / NT / 2k / XP / CE / Server 2003、 Linux、Solaris および VxWorks で Scatter / Gather および Contiguous DMA をサポートします。 Linux では、Scatter / Gather DMA を 2.4 カーネルおよびそれ以降からサポートします (2.2 Linux カー ネルでは、DMA のこの種類をサポートするにはパッチが必要です)。 • アプリケーションから、割り当てられた DMA バッファへアクセスするには、直接、物理メモリ アドレス (dma.Page[i].pPhysicalAddr) を使用しないで下さい。 ユーザー モード アプリケーションからメモリにアクセスするには、アドレス (dma.pUserAddr) のユーザー モード仮想マップを使用します。Contiguous Buffer DMA の場合、カーネル アプリケー ション (Kernel PlugIn を使用した場合) または WinDriver の API (WD_Transfer() など) を使用してメ モリにアクセスするには、物理アドレス (dma.pKernelAddr の WD_DMALock() が返す) のカーネル マップを使用します。 • Solaris では、ユーザー バッファ アドレスとサイズをシステム メモリ ページ境界でアラインする 必要があります。アラインしたメモリを割り当てる関数、valloc (割り当てたメモリ ブロックをア ラインする以外は、malloc に似てます) を使用します。SPARC プラットフォームでは、通常、仮 想ページ サイズを 8 KB にし、x86 プラットフォームでは、4 KB にします。 • DMA_LARGE_BUFFER フラグを使用する場合、dwPages は入力 / 出力パラメータになります。 WD_DMALock() 呼び出しへの入力の場合、dwPages はページの配列の最大要素数になります。 WD_DMALock() からの戻りの場合、dwPages は実物理ブロック数になります。隣接したページを 一つのブロックとして戻すので、戻りの dwPages はより小さくなる可能性があります。 • Solaris x86 プラットフォームでは、物理ページ サイズ (4K) より大きい連続バッファの割り当ての 場合、DMA_KERNEL_ONLY_MAP で WD_DMALock を使用します。物理アドレスのカーネル マッ 308 付 録 A プを使用します。バッファへアクセスする WD_Transfer の dma.pKernelAddr の WD_DMALock() が、 その物理アドレスを返します。 例 以下のコードが、Scatter/Gather DMA 割り当ての実行です: WD_DMA dma; DWORD dwStatus; PVOID pBuffer = malloc(20000); BZERO(dma); dma.dwBytes = 20000; dma.pUserAddr = pBuffer; dma.dwOptions = fIsRead ? DMA_READ_FROM_DEVICE : DMA_WRITE_TO_DEVICE; // Initialization of dma.hCard, value obtained from WD_CardRegister call: dma.hCard = cardReg.hCard; dwStatus = WD_DMALock(hWD, &dma); if (dwStatus) { printf("Could not lock down buffer\n"); } else { // On successful return dma.Page has the list of // physical addresses. // To access the memory from your user mode // application, use dma.pUserAddr. } 例 以下のコードが、contiguous カーネル バッファ DMA 割り当ての実行です: WD_DMA dma; DWORD dwStatus; BZERO(dma); dma.dwBytes = 20 * 4096; // 20 pages dma.dwOptions = DMA_KERNEL_BUFFER_ALLOC | ( fIsRead ? DMA_READ_FROM_DEVICE : DMA_WRITE_TO_DEVICE); // Initialization of dma.hCard, value obtained from WD_CardRegister call: dma.hCard = cardReg.hCard; dwStatus = WD_DMALock(hWD, &dma); if (dwStatus) { printf("Failed allocating kernel buffer for DMA\n"); } else { // On return dma.pUserAddr holds the user mode virtual // mapping of the allocated memory and dma.pKernelAddr // holds the kernel mapping of the physical memory. // dma.Page[0].pPhysicalAddr points to the allocated // physical address. } 309 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.5.17 WD_DMAUnlock() 目的 DMA バッファのロックを解除します。 プロトタイプ DWORD WD_DMAUnlock(HANDLE hWD, WD_DMA *pDMA); パラメータ 名前 型 入出力 hWD HANDLE 入力 pDMA WD_DMA * hDma DWORD 入力 pUserAddr PVOID N/A pKernelAddr KPTR N/A dwBytes DWORD N/A dwOptions DWORD N/A dwPages DWORD N/A Page WD_DMA_PAGEの配列 N/A 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pDMA WD_DMA エレメント。 hDma WD_DMALock [A.5.16] に返される DMA バッファのハンドル。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_DMAUnlock(hWD, &Dma); 310 A 付 録 A.5.18 WD_DMASyncCpu() 目的 CPU キャッシュからデータをフラッシュして、すべての CPU のキャッシュと DMA バッファを同期化 します。 注意: この関数は DMA 転送を実行する前に呼び出します (注釈を参照)。 プロトタイプ DWORD WD_DMASyncCpu(HANDLE hWD, WD_DMA *pDMA); パラメータ 名前 型 入出力 hWD HANDLE 入力 pDMA WD_DMA * 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モードド ライバへのハンドル。 DMA 情報構造体 – WD_DMALock( ) [A.5.16] を参照。 pDMA 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します [A.15] 。 注釈 • 非同期的な DMA の読み取りまたは書き込み動作はメモリ内のデータへアクセスします。 CPU とホストの物理メモリ間に存在するプロセッサ (CPU) キャッシュ内のデータへはア クセスしません。読み取り転送の直前に WD_DMASyncCpu() を呼び出して CPU キャッ シュをフラッシュしないかぎり、DMA 動作でシステム メモリへ転送されるデータは、後 で CPU キャッシュをフラッシュする場合、陳腐化したデータで上書きされる場合がありま す。書き込み転送の直前に WD_DMASyncCpu を呼び出して CPU キャッシュをフラッシュ しないかぎり、CPU キャッシュ内のデータはメモリにコピーされたものより新しいもの (アップデートされたもの) になる場合があります。 例 WD_DMASyncIo(&dma); 311 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.5.19 WD_DMASyncIo() 目的 I/O キャッシュからデータをフラッシュして、I/O キャッシュと DMA バッファを同期化し、CPU キャッ シュをアップデートします。 注意: この関数は DMA 転送を実行した後に呼び出します (注釈を参照)。 プロトタイプ RD WD_DMASyncIo(HANDLE hWD, WD_DMA *pDMA); パラメータ 名前 型 入出力 hWD HANDLE 入力 pDMA WD_DMA * 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モードド ライバへのハンドル。 pDMA DMA 情報構造体 – WD_DMALock( ) [A.5.16] を参照。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します [A.15] 。 注釈 DMA 転送が完了した後、データは I/O キャッシュに存在します。ホストの物理メモリとバスマスタ DMA デバイスの間に存在しますが、ホストのメイン メモリにはありません。CPU がメモリへアクセ スした場合、CPU キャッシュから誤ったデータを読み取る場合があります。CPU 用のメモリを常に同 期されたデータにするには、I/O キャッシュからのデータをフラッシュし CPU のキャッシュを新しい データにアップデートするために DMA 転送の後に WD_DMASynclo() を呼び出します。この関数はデ バイスとメモリの間にある追加のキャッシュおよびバッファ (バス エクステンダやブリッジに関連し たキャッシュなど) をフラッシュします。 A.5.20 WD_PcmciaControl() 目的 バス コントローラの設定を変更します。 312 A 付 録 プロトタイプ DWORD WD_PcmciaControl(HANDLE hWD, WD_PCMCIA_CONTROL *pPcmciaControl); パラメータ 名前 型 入出力 hWD HANDLE 入力 pPcmciaControl WD_PCMCIA_CONTROL* 入力 WD_PCMCIA_SLOT 入力 uBus BYTE 入力 uSocket BYTE 入力 uFunction BYTE 入力 uAccessSpeed BYTE 入力 uBusWidth BYTE 入力 uVppLevel BYTE 入力 dwCardBase DWORD 入力 pcmciaSlot 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ド ライバへのハンドル。 pPcmciaControl PCMCIA バス コントローラ情報構造体。 pcmciaSlot WDC_PcmciaScanDevices() [A.3.5] を呼び出して取得可能な PCMCIA デバイスのロケーション情報構造体。 uBus バス番号 uSocket ソケット番号 uFunction 関数番号 uAccessSpeed PCMCIA バスへのアクセス スピード。 以下の WD_PCMCIA_ACC_SPEED 列挙値のいずれか。 WD_PCMCIA_ACC_SPEED_DEFAULT: デフォルトのアクセ ス スピードを使用します。 WD_PCMCIA_ACC_SPEED_250NS: 250 ns WD_PCMCIA_ACC_SPEED_200NS: 200 ns WD_PCMCIA_ACC_SPEED_150NS: 150 ns WD_PCMCIA_ACC_SPEED_1000NS: 100 ns 313 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド uBusWidth PCMCIA バスの幅。以下の WD_PCMCIA_ACC_WIDTH 列挙値 のいずれか。 WD_PCMCIA_ACC_WIDTH_DEFAULT: デフォルトのバスの 幅を使用します。 WD_PCMCIA_ACC_WIDTH_8BIT: 8 ビット WD_PCMCIA_ACC_WIDTH_16BIT: 16 ビット uVppLevel PCMCIA コントローラのボルテージ パワー ピン (Vpp) のパワー レベル。以下の WD_PCMCIA_VPP 列挙値のいずれか。 WD_PCMCIA_VPP_DEFAULT: デフォルトの PCMCIA Vpp ピンのパワー レベルを使用します。 WD_PCMCIA_VPP_OFF: Vpp ピンの電圧を 0 (無効) に設定し ます。 WD_PCMCIA_VPP_ON: Vpp pin の電圧を 12 V に設定します。 WD_PCMCIA_VPP_AS_VCC: Vpp ピンの電圧をVcc ピンと同 じ電圧に設定します。 dwCardBase メモリのマップが始まる PCMCIA デバイスのメモリでのオフ セット。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します [A.15]。 例 WD_DMAUnlock(hWD, &DMA); A.5.21 InterruptEnable() 目的 割り込みの受信を受けてコールバック関数をコールします。割り込みハンドルを設定するのに便利な 関数です。 プロトタイプ DWORD InterruptEnable(HANDLE *phThread, HANDLE hWD, WD_INTERRUPT *pInt, INT_HANDLER func, PVOID pData); パラメータ 名前 型 入出力 phThread HANDLE * 出力 hWD HANDLE 入力 314 A 付 録 pInt WD_INTERRUPT * hInterrupt HANDLE 入力 dwOptions DWORD 入力 Cmd WD_TRANSFER * 入力 dwCmds DWORD 入力 kpCall WD_KERNEL_PLUGIN_CALL hKernelPlugIn DWORD 入力 dwResult DWORD N/A fEnableOk DWORD N/A dwCounter DWORD N/A dwLost DWORD N/A fStopped DWORD N/A func HANDLER 入力 pData PVOID 入力 説明 名前 phThread 説明 InterruptDisable [A.5.22] によって使用される割り込みスレッドの ハンドルを返します。 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 Int WD_INTERRUPT エレメント。 hInterrupt WD_CardRegister [A.5.11] 内の I.Int.hInterrupt に返された割り込み内 部データ構造体のハンドル。 dwOptions ビット マスク フラッグ。通常 "0" でオプションなしまたは: INTERRUPT_CMD_COPY: 設定した場合、WinDriver カーネルは、 割り込みを承認するために使用されるリード コマンドから返さ れたデータをコピーしてユーザー モードに戻ります。データは、 関数がコールされたときに利用できます。 315 W I N D R I V E R ユ ー ザ ー ズ Cmd ガ イ ド ハードウェア割り込みに返されることによってカーネル モード で実行する転送コマンド (WD_TRANSFER *) の配列。これらのコ マンドは、レベル依存割り込みを承認するのに必要です (詳細はセ クション 9.2.2 の「ISA / EISA および PCI 割り込み」を参照してく ださい)。 データ転送コマンドが必要ない場合、NULL に設定します (詳細は WD_Transfer() [A.5.14] を参照してください)。 dwCmds Cmd 配列にある転送コマンドの数。 kpCall WD_KERNEL_PLUGIN_CALL エレメント: hKernelPlugIn WD_KernelPlugInOpen [A.12.1] から返された Kernel PlugIn へのハン ドル。 func 割り込みが発生するごとに一回コールされる割り込みハンドル関 数。HANDLER は、windrvr_int_thread.h で定義されます。 pData 引数として割り込みハンドル関数へ渡されるポインタ。 Return Value 有効な割り込みが成功した場合、TRUE を返します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 • \WinDriver\src\windrvr_int_thread.c. 内で実装されます。 • WD_IntEnable、WD_IntWait、WD_IntCount および WD_IntDisable 関数が上記の InterruptEnable およ び InterruptDisable 関数を作成し、別々に呼び出すことが可能です。詳細は、セクション A.6 を参 照してください。 • Windows 98 / Me / NT / 2000 / XP / Server 2003、Linux および Solaris 上で PCI 割り込み処理率を向上 させるには、WinDriver の Kernel PlugIn 機能を使用してください。VxWorks では、windrvr_isr コー ルバック関数を使用できます。 例 VOID DLLCALLCONV interrupt_handler(PVOID pData) { WD_INTERRUPT *pIntrp = (WD_INTERRUPT *)pData; // do your interrupt routine here printf("Got interrupt %d\n", pIntrp->dwCounter); } .... 316 付 録 A main() { WD_CARD_REGISTER cardReg; WD_INTERRUPT Intrp; HANDLE hWD, thread_handle; .... hWD = WD_Open(); BZERO(cardReg); cardReg.Card.dwItems = 1; cardReg.Card.Item[0].item = ITEM_INTERRUPT; cardReg.Card.Item[0].fNotSharable = TRUE; cardReg.Card.Item[0].I.Int.dwInterrupt = MY_IRQ; cardReg.Card.Item[0].I.Int.dwOptions = 0; .... WD_CardRegister(hWd, &cardReg); .... PVOID pdata = NULL; BZERO (Intrp); Intrp.hInterrupt = cardReg.Card.Item[0].I.Int.hInterrupt; Intrp.Cmd = NULL; Intrp.dwCmds = 0; Intrp.dwOptions = 0; printf("starting interrupt thread\n"); pData = &Intrp; if (!InterruptEnable(&thread_handle, hWD, &Intrp, interrupt_handler, pdata)) { printf ("failed enabling interrupt\n") } else { printf("Press Enter to uninstall interrupt\n"); fgets(line, sizeof(line), stdin); // this calls WD_IntDisable() InterruptDisable(thread_handle); } WD_CardUnregister(hWD, &cardReg); .... } A.5.22 InterruptDisable() 目的 割り込みハンドルを終了するのに便利な関数です。 プロトタイプ DWORD InterruptDisable(HANDLE hThread); 317 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 hThread 型 入出力 HANDLE 入力 説明 名前 説明 hThread InterruptEnable [A.5.21] によって作成され発生した割り込みスレッ ドのハンドル。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 • • \WinDriver\src\windrvr_int_thread.c. 内で実装されます。 WD_IntEnable、WD_IntWait、WD_IntCount および WD_IntDisable 関数が上記の InterruptEnable およ び InterruptDisable 関数を作成し、別々に呼び出すことが可能です。詳細は、セクション A.6 を参 照してください。 例 main() { .... if (!InterruptEnable(&thread_handle, hWD, &Intrp, interrupt_handler, pData)) { printf("failed enabling interrupt\n"); } else { printf("Press Enter to uninstall interrupt\n"); fgets(line, sizeof(line), stdin); // this calls WD_IntDisable() InterruptDisable(thread_handle); } .... } 318 A 付 録 A.6 PCI/PCMCIA/ISA - 低水準 WD_xxx 関数 このセクションでは 低水準の WD_xxx PCI/PCMCIA/ISA WinDriver 関数を説明します。 注意: 便利なラッパー関数を基本の WD_xxx PCI/PCMCIA/ISA API [A.2] へ提供する WinDriver の WDC ライブラリから API を使用することを推奨します。 WDC API を使用しない場合、低水準の関数の代わりにセクション [A.5] で説明されている高水準の WD_xxx API の使用を考慮してください。 A.6.1 WinDriver のコール順序 - 低水準 次に割り込みを行うのに使用される WinDriver API の一般的なコール順序を示します。InterruptEnable お よび InterruptDisable は、割り込みハンドルをより便利な方法で有効にします。 W D _ IntE na b le() W D _ IntW a it() W D _ IntC o u n t() W D _ IntD isa b le A.6.2 WD_IntEnable() 目的 割り込みによってコールされるように割り込みサービス ルーチン (ISR) を登録します。 プロトタイプ DWORD WD_IntEnable(HANDLE hWD, WD_INTERRUPT *pInterrupt); パラメータ 名前 型 入出力 hWD HANDLE 入力 pInterrupt WD_INTERRUPT * hInterrupt HANDLE 入力 dwOptions DWORD 入力 319 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド Cmd WD_TRANSFER * 入力 dwCmds DWORD 入力 kpCall WD_KERNEL_PLUGIN_CALL hKernelPlugIn HANDLE 入力 dwMessage DWORD N/A pData PVOID N/A dwResult DWORD N/A fEnableOk DWORD 出力 dwCounter DWORD N/A dwLost DWORD N/A fStopped DWORD N/A 説明 名前 HWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pInterrupt WD_INTERRUPT エレメント。 hInterrupt 有効にするための割り込みのハンドル。ハンドルは I.Int.hInterrupt 内の WD_CardRegister [A.5.11] によって返されます。 dwOptions ビット マスク フラッグ。May be "0" for no option, or: INTERRUPT_CMD_COPY: 設定した場合、WinDriver カーネルは、 割り込みを承認するために使用されるリード コマンドから返さ れたデータをコピーしてユーザー モードに戻ります。データは、 WD_IntWait [A.6.3] が返ったときに利用できます。 320 A 付 録 Cmd ハードウェア割り込みに返されることによってカーネル モード で実行する転送コマンド (WD_TRANSFER *) の配列。これらのコ マンドは、レベル依存割り込みを承認するのに必要です (詳細はセ クション 9.2.2 の「ISA / EISA および PCI 割り込み」を参照してく ださい)。 データ転送コマンドが必要ない場合、NULL に設定します (詳細は WD_Transfer() [A.5.11] を参照してください)。 dwCmds Cmd 配列にある転送コマンドの数。 kpCall WD_KERNEL_PLUGIN_CALL エレメント。 hKernelPlugIn WD_KernelPlugInOpen [A.12.1] から返された Kernel PlugIn へのハン ドル。 fEnableOk WD_IntEnable [A.6.2] が成功した場合、TRUE を返します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 (1) 割り込みハンドルについての詳細はセクション 9.2.2 の「ISA / EISA および PCI 割り込み」を参照し てください。 (2) kpCall は、Kernel PlugIn インプルメントに関連します。 例 WD_INTERRUPT Intrp; WD_CARD_REGISTER cardReg; BZERO(cardReg); cardReg.Card.dwItems = 1; cardReg.Card.Item[0].item = ITEM_INTERRUPT; cardReg.Card.Item[0].fNotSharable = TRUE; cardReg.Card.Item[0].I.Int.dwInterrupt = 10; // IRQ 10 // INTERRUPT_LEVEL_SENSITIVE - set to level sensitive // interrupts, otherwise should be 0. // ISA cards are usually edge triggered while PCI cards // are usually level sensitive. cardReg.Card.Item[0].I.Int.dwOptions = INTERRUPT_LEVEL_SENSITIVE; cardReg.fCheckLockOnly = FALSE; WD_CardRegister(hWD, &cardReg); if (cardReg.hCard == 0) printf("Could not lock device\n"); else { BZERO(Intrp); 321 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド Intrp.hInterrupt = cardReg.Card.Item[0].I.Int.hInterrupt; Intrp.Cmd = NULL; Intrp.dwCmds = 0; Intrp.dwOptions = 0; WD_IntEnable(hWD, &Intrp); } if (!Intrp.fEnableOk) { printf("failed enabling interrupt\n"); } 例 他の例については、windriver\Samples\pci_diag\pci_lib.c を参照してください。 A.6.3 WD_IntWait() 目的 割り込みが返されるか無効になるまで待ちそして終了します。 プロトタイプ DWORD WD_IntWait(HANDLE hWD, WD_INTERRUPT *pInterrupt); パラメータ 名前 型 入出力 hWD HANDLE 入力 pInterrupt WD_INTERRUPT * 322 hInterrupt HANDLE 入力 dwOptions DWORD N/A Cmd WD_TRANSFER * N/A dwCmds DWORD N/A kpCall WD_KERNEL_PLUGIN_CALL N/A fEnableOk DWORD N/A dwCounter DWORD 出力 dwLost DWORD 出力 fStopped DWORD 出力 A 付 録 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pInterrupt WD_INTERRUPT エレメント。 hInterrupt I.Int.hInterrupt 内の WD_CardRegister [A.5.11] によって返された割り 込みのハンドル。 dwCounter 返されてきた割り込みの数。 dwLost カーネル モードで承認されたがユーザー モードでハンドルされ ていない割り込みの数。 fStopped 割り込みが発生した場合には、0 を返します。待機中に割り込み が無効になった場合は、INTERRUPT_STOPPED を返します。待機 中に、 実際のハードウェアの割り込みではなく、 WD_IntWait [A.6.3] を割り込んだ場合は、INTERRUPT_INTERRUPTED を返します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 割り込みを待機してるアプリケーションを停止した場合 (CTRL+Z を押下など)、Linux および Solaris 上 では、INTERRUPT_INTERRUPTED ステータスが発生します。 例 for (;;) { WD_IntWait(hWD, &Intrp); if (Intrp.fStopped) break; ProcessInterrupt(Intrp.dwCounter); } A.6.4 WD_IntCount() 目的 WD_IntEnabled [A.6.2] が呼び出されたときからの割り込みの数を数えます。 323 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド プロトタイプ DWORD WD_IntCount(HANDLE hWD, WD_INTERRUPT *pInterrupt); パラメータ 名前 型 入出力 hWD HANDLE 入力 pInterrupt WD_INTERRUPT * hInterrupt HANDLE 入力 dwOptions DWORD N/A Cmd WD_TRANSFER * N/A dwCmds DWORD N/A kpCall WD_KERNEL_PLUGIN_CALL N/A fEnableOk DWORD N/A dwCounter DWORD 出力 dwLost DWORD 出力 fStopped DWORD 出力 説明 名前 hWD 説明 WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 PInterrupt WD_INTERRUPT エレメント。 HInterrupt I.Int.hInterrupt 内の WD_CardRegister [A.5.11] によって返された割り 込みのハンドル。 dwCounter 返されてきた割り込みの数。 dwLost ハンドルがされていない割り込みの数。 fStopped 待つ間に割り込みが無効になった場合は、TRUE を返します。 324 付 録 A 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 DWORD dwNumInterrupts; WD_IntCount(hWD, &Intrp); dwNumInterrupts = Intrp.dwCounter; A.6.5 WD_IntDisable() 目的 割り込み処理を無効にします。 プロトタイプ DWORD WD_IntDisable(HANDLE hWD, WD_INTERRUPT *pInterrupt); パラメータ 名前 型 入出力 hWD HANDLE 入力 pInterrupt WD_INTERRUPT hInterrupt HANDLE 入力 dwOptions DWORD N/A Cmd WD_TRANSFER * N/A dwCmds DWORD N/A kpCall WD_KERNEL_PLUGIN_CALL N/A fEnableOk DWORD N/A dwCounter DWORD N/A dwLost DWORD N/A fStopped DWORD N/A 325 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 説明 名前 説明 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ドラ イバへのハンドル。 pInterrupt WD_INTERRUPT エレメント。 hInterrupt I.Int.hInterrupt 内の WD_CardRegister [A.5.11] によって返された割り 込みのハンドル。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_IntDisable(hWD, &Intrp); A.7 WinDriver USB (WDU) ライブラリの概要 このセクションでは、以下の内容を含んだ WinDriver の USB ライブラリ (WDU) について説明しま す。 • WDU_xxx API のコール順序の概要 – セクション [A.7.1]。 • 以前の WinDriver USB API (バージョン 5.22 以降) で開発されたコードのアップグレード方 法 (向上した WDU_xxx API の使用) – セクション [A7.2]。 WinDriver の以前のバージョンで開発した USB ドライバ コードをアップグレードしない 場合、このセクションをスキップしてください。 WDU ライブラリのインターフェースは、WDU API を呼ぶソースファイルが含まれた /WinDriver/include/wdu_lib.h および /WinDriver/include/windrvr.h ヘッダー ファ イルに保存されています。 A.7.1 WinDriver USB のコール順序 WinDriver の WDU_xxx USB API は、ユーザー モード USB アプリケーションと USB デバイス間のイ ベント ドリブン転送をサポートするよう設計されています。これは以前のバージョンにはありません でした。以前のバージョンでは、USB デバイスは関数呼出しの特定の順序を使用して初期化およびコン トロールされていました。 次のセクションでは、3 つのユーザー コールバック関数 (WDU_ATTACH_CALLBACK [A.8.1]、 WDU_DETACH_CALLBACK [A.8.2] および WDU_POWER_CHANGE_CALLBACK [A.8.3]) を実装できま す。これらの関数は、USB デバイスの装着または検出などの、システム イベントの発生時に、アプリ 326 付 録 A ケーションに通知するのに使用されます。最善のパフォーマンスは、最小の実行が 3 つの関数で行わ れます。 アプリケーションが WDU_Init [A.9.1] を呼び出し、デバイスが関連しているかしていないかをシステム が識別するための基準を設けます。WDU_Init がユーザー コールバック関数へポインタを渡す必要があ ります。 アプリケーションはただイベントの通知を待機するだけです。通知を受信するまで、処理が続きます。 アプリケーションは、下記の高水準または低水準 API で定義したどの関数でも使用します。高水準関 数は低水準関数 (WinDriver カーネル モジュールとユーザー モード アプリケーション間の通信を可能 にする IOCTL を使用する) を使用します。 既存の場合、アプリケーションは指定の基準に一致するデバイスへのリスンを停止し、それらのデバ イスへのコールバックの通知を解除するのに WDU_Uninit [A.9.6] 関数を呼び出します。 次の図は、上記で説明したコール順序を示しています。縦線が、関数またはプロセスを表しています。 横線の矢印が、信号または要求を表し、開始位置から受信までを描いています。上から下が時間軸で す。 327 W I N D R I V E R ユ ー ザ ー ズ main() ガ イ ド attach() detach() WinDriver WDU_Init() (時間) WinDriver は既に接続されているデバイスをレポートします 信号を接続します 値を戻します* USBデバイスを接続します 信号を接続します 値を戻します* WDU_SetInterface() ** WDU_Transfer() ** [main は WinDriver へ他の要求を開始する場合があります] ** USBデバイスの接続を解除します 信号の接続を解除します WDU_Uninit() • WDU_Init() の呼び出しで、WD_ACKNOWLEDGE フラグがセットさ れている場合、関数がデバイスの制御を許可する場合は attach() の コールバックが TRUE を戻します。許可しない場合は、FALSE を戻 します。 ** attach() が TRUE を戻した場合のみ可能です アクティブな関数または処理を示します 途切れた時間を示します 328 A 付 録 次のコードをユーザー モード アプリケーションのコードのフレームワークとして使用できます: attach() { ... if this is my device set the desired alternate setting signal main() about the attachment of this device return TRUE; else return FALSE; } detach() { ... signal main() about the detachment of this device ... } main() { WDU_Init(...); ... while (...) { wait for new devices ... issue transfers ... } ... WDU_Uninit(); } A.7.2 WD_xxx USB API から WDU_xxx API へのアップグレード バージョン 6.00 から提供されている WinDriver の WDU_xxx USB API は、ユーザー モード USB アプリ ケーションと USB デバイス間のイベント ドリブン転送をサポートするよう設計されています。これは 以前のバージョンにはありませんでした。以前のバージョンでは、USB デバイスは関数呼出しの特定 の順序を使用して初期化およびコントロールされていました。 この変更の結果、Microsoft Windows だけではなく対応するすべてのプラット フォーム上で WinDriver 6.X で動作するように、WinDriver の以前のバージョンのインターフェース用の設計された USB アプリ ケーションを修正する必要があります。セクション A.7.1 で説明した meta-code の一部のフレームワー クと一致するようにアプリケーションのコードを作り直す必要があります。 更に、USB API を定義している関数が変更されています。次のセクションで説明しますが、新しい関 数は、改良したユーザー モード USB アプリケーションと WinDriver カーネル モード間のインター フェースを提供します。新しい関数は引数を直接、受信します。古い関数は、構造体を使用して引数 を受信していました。 329 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 次の表に、左側の項目に古い関数を、右側の項目に各古い関数を置き換えた関数を表示しています。 この表を使用して、新しいコードではどの新しい関数を使用するかを素早く判断します。 高水準 API この関数が… 次のように置き換えられました... WD_Open() WDU_Init() [A.9.1] WD_Version() WD_UsbScanDevice() WD_UsbDeviceRegister() WDU_SetInterface() [A.9.2] WD_UsbGetConfiguration() WDU_GetDeviceInfo() [A.9.4] WD_UsbDeviceUnregister() WDU_Uninit() [A.9.6] 低水準 API この関数が… 次のように置き換えられました... WD_UsbTransfer() WDU_Transfer() [A.9.7] WDU_TransferDefaultPipe() [A.9.9] WDU_TransferBulk() [A.9.10] WDU_TransferIsoch() [A.9.11] WDU_TransferInterrupt() [A.9.12] (USB_TRANSFER_HALT option) WDU_HaltTransfer() [A.9.13] WD_UsbResetPipe() WDU_ResetPipe() [A.9.14] WD_UsbResetDevice() WDU_ResetDevice() [A.9.15] WD_UsbResetDeviceEx() 330 A 付 録 A.8 USB – ユーザー コールバック関数 注意: 下記に説明する関数で、要素を構成する引数の構造体を扱う関数があります。これらの構造体は、 (f) で現し、セクション A.10 で説明します。 A.8.1 WDU_ATTACH_CALLBACK() 目的 WinDriver は、まだ他のドライバに制御されていない、指定した基準に一致した新しいデバイスが装着 されたときに、この関数を呼び出します。 この callback を各一致するインターフェースに対して一度呼びます。 プロトタイプ typedef BOOL (DLLCALLCONV *WDU_ATTACH_CALLBACK)(WDU_DEVICE_HANDLE hDevice, WDU_DEVICE *pDeviceInfo, PVOID pUserData); パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 pDeviceInfo WDU_DEVICE * [A.10.3] 入力 (f) pUserData PVOID 入力 説明 名前 説明 hDevice デバイス / インターフェースのユニークな識別子。 pDeviceInfo デバイス詳細設定へのポインタ。関数の終了まで有効。 pUserData WD_Init [A.9.1] (イベント テーブル) へ渡されるポインタ。attach 関 数のユーザー モード データへポイントします。 戻り値 WD_Init [A.9.1] (dwOptions 引数内で) を呼び出すように WD_ACKNOWLEDGE フラグを設定した場合、 コールバック関数がデバイスを制御するかチェックし、制御する場合は、TRUE を返し、そうでない 場合、FALSE を返します。 WDU_Init への呼び出しで、WD_ACKNOWLEDGE フラグを設定しない場合、callback 関数の戻り値は、 意味がありません。 331 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.8.2 WDU_DETACH_CALLBACK() 目的 WinDriver は、デバイスがシステムから取り外されたときに、この関数を呼び出します。 プロトタイプ typedef void (DLLCALLCONV *WDU_DETACH_CALLBACK)(WDU_DEVICE_HANDLE hDevice, PVOID pUserData); パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 pUserData PVOID 入力 説明 名前 説明 hDevice デバイス / インターフェースのユニークな識別子。 pUserData WD_Init [A.9.1] (イベント テーブル) へ渡されるポインタ。attach 関 数のユーザー モード データへポイントします。 戻り値 なし。 A.8.3 WDU_POWER_CHANGE_CALLBACK() 目的 WinDriver は、デバイスの電源の設定を変更したときに、この関数を呼び出します。 プロトタイプ typedef BOOL (DLLCALLCONV WDU_POWER_CHANGE_CALLBACK)(WDU_DEVICE_HANDLE hDevice, DWORD dwPowerState, PVOID pUserData); パラメータ 名前 hDevice 332 型 入出力 WDU_DEVICE_HANDLE 入力 A 付 録 dwPowerState DWORD 入力 pUserData PVOID 入力 説明 名前 説明 hDevice デバイス / インターフェースのユニークな識別子。 DwPowerState 選択した電源状態の番号。 pUserData WD_Init [A.9.1] (イベント テーブル) へ渡されるポインタ。attach 関 数のユーザー モード データへポイントします。 戻り値 TRUE / FALSE。現在、戻り値に重要な意味はありません。 注釈 Windows 2000 以降の Windows オペレーティング システムでのみ、この callback をサポートします。 A.9 USB − 関数 注意: 下記に説明する関数で、要素を構成する引数の構造体を扱う関数があります。これらの構造体は、 (f) で現し、セクション A.10 で説明します。 A.9.1 WDU_Init() 目的 入力基準に一致するデバイスへリスンを開始し、デバイスの通知コールバックを登録します。 プロトタイプ DWORD WDU_Init(WDU_DRIVER_HANDLE *phDriver, WDU_MATCH_TABLE *pMatchTables, DWORD dwNumMatchTables, WDU_EVENT_TABLE *pEventTable, const char *sLicense, DWORD dwOptions); パラメータ 名前 型 入出力 phDriver WDU_DRIVER_HANDLE * 出力 pMatchTables WDU_MATCH_TABLE * [A.10.1] 入力 (f) 333 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwNumMatchTables DWORD 入力 pEventTable WDU_EVENT_TABLE * [A.10.2] 入力 (f) sLicense const char * 入力 dwOptions DWORD 入力 説明 名前 説明 phDriver イベントおよび基準の登録へのハンドル。 pMatchTables デバイスの基準を定義しているマッチ テーブルの配列。 dwNumMatchTables pMatchTables のエレメントの番号。 pEventTable デバイスの状態の変化の通知コールバック関数のアドレスと コールバックの対応するデータ。 sLicense WinDriver のライセンス文字列。 dwOptions 0 または、WD_ACKNOWLEDGE (WDU_ATTACH_CALLBACK [A.8.1] に値が戻ってくるときに、ユーザーはデバイスを制御で きます)。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 A.9.2 WDU_SetInterface() 目的 指定したインターフェースの代替の設定を設定します。 プロトタイプ DWORD WDU_SetInterface(WDU_DEVICE_HANDLE hDevice, DWORD dwInterfaceNum, DWORD dwAlternateSetting); パラメータ 名前 334 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 dwInterfaceNum DWORD 入力 dwAlternateSetting DWORD 入力 付 録 A 説明 名前 説明 hDevice デバイス / インターフェースのユニークな識別子。 dwInterfaceNum インターフェースの番号。 dwAlternateSetting 要求した代替の設定値。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 A.9.3 WDU_GetDeviceAddr() 目的 デバイスが使用する USB アドレスを取得します。pAddress を指定した呼出し元へのアドレス番号を記 述します。 プロトタイプ DWORD WDU_GetDeviceAddr(WDU_DEVICE_HANDLE hDevice, ULONG *pAddress); パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 pAddress ULONG 出力 説明 名前 説明 hDevice デバイス / インターフェースのユニークな識別子。 pAddress ULONG へのポインタ − 結果を返します。 注釈 Windows でのみ、この関数をサポートします。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 335 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.9.4 WDU_GetDeviceInfo() 目的 WDU_DEVICE [A.10.3] 構造体のすべての記述子を含む、デバイスからの設定情報を取得します。呼出 し元は、WDU_PutDeviceInfo [A.9.5] の呼び出しで使用後、*ppDeviceInfo を解放します。 プロトタイプ DWORD WDU_GetDeviceInfo(WDU_DEVICE_HANDLE hDevice, WDU_DEVICE **ppDeviceInfo); パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 ppDeviceInfo WDU_DEVICE ** [A.10.3] 出力 (f) 説明 名前 説明 HDevice デバイス / インターフェースのユニークな識別子。 ppDeviceInfo デバイス情報を含むバッファへのポインタをポイントします。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 A.9.5 WDU_PutDeviceInfo() 目的 以前の WDU_GetDeviceInfo() [A.9.4] の呼び出しで割り当てられた、デバイス情報のポインタを受信しま す。 プロトタイプ DWORD WDU_PutDeviceInfo(WDU_DEVICE *pDeviceInfo); パラメータ 名前 pDeviceInfo 336 型 入出力 WDU_DEVICE * [A.10.3] 出力 付 録 A 説明 名前 説明 pDeviceInfo デバイス情報を含むバッファへのポインタ − WDU_GetDeviceInfo() への以前の呼び出しで返される場合。 戻り値 なし。 A.9.6 WDU_Uninit() 目的 入力基準に一致するデバイスへリスンを開始し、デバイスの通知コールバックを解除します。 プロトタイプ void WDU_Uninit(WDU_DRIVER_HANDLE hDriver); パラメータ 名前 hDriver 型 入出力 WDU_DRIVER_HANDLE 入力 説明 名前 説明 hDriver WDU_Init [A.9.1] から受信した登録をハンドルします。 A.9.7 WDU_Transfer() 目的 デバイスへ / からデータを転送します。 プロトタイプ DWORD WDU_Transfer(WDU_DEVICE_HANDLE hDevice, DWORD dwPipeNum, DWORD fRead, DWORD dwOptions, PVOID pBuffer, DWORD dwBufferSize, PDWORD pdwBytesTransferred, PBYTE pSetupPacket, DWORD dwTimeout); 337 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 dwPipeNum DWORD 入力 fRead DWORD 入力 dwOptions DWORD 入力 pBuffer PVOID 入力 dwBufferSize DWORD 入力 pdwBytesTransferred PDWORD 出力 pSetupPacket PBYTE 入力 dwTimeout DWORD 入力 説明 名前 hDevice 説明 WDU_Init() [A.9.1] から取得したデバイス / インターフェースの ユニークな識別子。 dwPipeNum データ転送されるパイプの数。 fRead read (読み取り) の場合は TRUE、write (書き込み) の場合 FALSE。 dwOptions ビット マスク フラグ: USB_ISOCH_NOASAP – 等時性 (アイソクロナス) 転送用。この オプションを設定することで、データ転送の実行中に下位ドラ イバ (usbd.sys) は (次に利用可能なフレームの代わりに) 現在の フレーム番号を使用するよう命令します。低スピードまたは高 スピードのデバイス (USB 1.1 のみ) で転送中に未使用のフレー ムがある場合、このフラグを使用します。このオプションは、 Windows (Windows CE を除く) でのみ適用されます。 USB_ISOCH_RESET – データ転送を行なう前に等時性パイプを リセットします。また、マイナーなエラーが発生した際にパイ プをリセットします (データ転送は続行されます)。 USB_ISOCH_PACKETS_ONLY – パケット サイズ以下のデータ を等時性パイプに転送しません。 338 A 付 録 pBuffer データ バッファのアドレス。 dwBufferSize 転送するバイトの数。バッファ サイズはデバイスの最大パケッ ト サイズに制限はありません。このため、複数の最大パケット サイズにバッファ サイズを設定することによって、より大きな バッファを使用できます。コンテキスト スイッチの数を減らす ための大きなバッファを使用することによって、パフォーマン スを向上します。 pdwBytesTransferred 実際に転送されたバイトの数。 pSetupPacket パイプを制御するために転送する 8 バイト パケット。 dwTimeout 転送に掛かる時間 (単位は、ミリ秒)。 dwTimeout が 0 の場合、 関数のタイムアウト インターバルはなく、無限に待ちます。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 タイムアウト (dwTimeout パラメータ) の解像度は、オペレーティング システムのスケジューラのタイ ムスロットに依存します。たとえば、Windows の場合、タイムアウトの解像度は 10 ミリ秒です。 A.9.8 WDU_Wakeup() 目的 ウェークアップ機能を有効 / 無効にします。 プロトタイプ DWORD WDU_Wakup(WDU_DEVICE_HANDLE hDevice, DWORD dwOptions); パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 dwOptions DWORD 入力 説明 名前 説明 hDevice デバイス / インターフェースのユニークな識別子。 339 W I N D R I V E R dwOptions ユ ー ザ ー ズ ガ イ ド WDU_WAKEUP_ENABLE – ウェークアップ機能を有効にし ます WDU_WAKEUP_DISABLE – ウェークアップ機能を無効にし ます 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 A.9.9 WDU_TransferDefaultPipe() 目的 デフォルトのパイプを使用して、デバイスへ / からデータを転送します。 プロトタイプ DWORD WDU_TransferDefaultPipe(WDU_DEVICE_HANDLE hDevice, DWORD fRead, DWORD dwOptions, PVOID pBuffer, DWORD dwBufferSize, PDWORD pdwBytesTransferred, PBYTE pSetupPacket, DWORD dwTimeout); パラメータ 名前 型 入出力 WD_Transfer() [A.9.7] の説明を参照してください。dwPipeNum はこの関数のパラメータではあ りません。 説明 名前 説明 WD_Transfer() [A.9.7] の説明を参照してください。dwPipeNum はこの関数のパラメータではあり ません。 注釈 WDU_Transfer [A.9.7] の説明を参照してください。 A.9.10 WDU_TransferBulk() 目的 デバイスへ / から Bulk データ転送を実行します。 340 A 付 録 プロトタイプ DWORD WDU_TransferBulk(WDU_DEVICE_HANDLE hDevice, DWORD dwPipeNum, DWORD fRead, DWORD dwOptions, PVOID pBuffer, DWORD dwBufferSize, PDWORD pdwBytesTransferred, DWORD dwTimeout); パラメータ 名前 型 入出力 WD_Transfer() [A.9.7] の説明を参照してください。pSetupPacket はこの関数のパラメータでは ありません。 説明 名前 説明 WD_Transfer() [A.9.7] の説明を参照してください。pSetupPacket はこの関数のパラメータではあ りません。 注釈 WDU_Transfer [A.9.7] の説明を参照してください。 A.9.11 WDU_TransferIsoch() 目的 デバイスへ / から等時性データ転送を実行します。 プロトタイプ DWORD WDU_TransferIsoch(WDU_DEVICE_HANDLE hDevice, DWORD dwPipeNum, DWORD fRead, DWORD dwOptions, PVOID pBuffer, DWORD dwBufferSize, PDWORD pdwBytesTransferred, DWORD dwTimeout); パラメータ 名前 型 入出力 WD_Transfer() [A.9.7] の説明を参照してください。pSetupPacket はこの関数のパラメータでは ありません。 説明 名前 説明 WD_Transfer() [A.9.7] の説明を参照してください。pSetupPacket はこの関数のパラメータではあ りません。 341 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 注釈 WDU_Transfer [A.9.7] の説明を参照してください。 A.9.12 WDU_TransferInterrupt () 目的 デバイスへ / から割り込みデータ転送を実行します。 プロトタイプ DWORD WDU_TransferInterrupt(WDU_DEVICE_HANDLE hDevice, DWORD dwPipeNum, DWORD fRead, DWORD dwOptions, PVOID pBuffer, DWORD dwBufferSize, PDWORD pdwBytesTransferred, DWORD dwTimeout); パラメータ 名前 型 入出力 WD_Transfer() [A.9.7] の説明を参照してください。pSetupPacket はこの関数のパラメータでは ありません。 説明 名前 説明 WD_Transfer() [A.9.7] の説明を参照してください。pSetupPacket はこの関数のパラメータではあ りません。 注釈 WDU_Transfer [A.9.7] の説明を参照してください。 A.9.13 WDU_HaltTransfer() 目的 指定したパイプの転送を停止します (WinDriver が許可する各パイプへの同時転送は 1 つだけです)。 プロトタイプ DWORD WDU_HaltTransfer(WDU_DEVICE_HANDLE hDevice, DWORD dwPipeNum); パラメータ 名前 342 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 dwPipeNum DWORD 入力 付 録 A 説明 名前 説明 hDevice デバイス / インターフェースのユニークな識別子。 dwPipeNum データ転送されるパイプの数。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 A.9.14 WDU_ResetPipe() 目的 パイプのホスト側の停止状態とエンドポイントのストール状態の両方を削除することによって、パイ プをリセットします。この関数は、pipe00 を除くすべてのパイプで有効です。 プロトタイプ DWORD WDU_ResetPipe(WDU_DEVICE_HANDLE hDevice, DWORD dwPipeNum); パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 dwPipeNum DWORD 入力 説明 名前 説明 hDevice デバイス / インターフェースのユニークな識別子。 dwPipeNum データ転送されるパイプの数。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 停止を削除するために、パイプを停止する場合に、この関数を使用します。 343 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.9.15 WDU_ResetDevice() 目的 デバイスが接続状態であるが有効ではない場合、エラーを修復するためにデバイスをリセットします。 プロトタイプ DWORD WDU_ResetDevice(WDU_DEVICE_HANDLE hDevice, DWORD dwOptions); パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 dwOptions DWORD 入力 説明 名前 説明 hDevice デバイス / インターフェースのユニークな識別子。 dwOptions 0 または WD_USB_HARD_RESET に設定できます。デバイスを 無効に設定していない場合でもリセットします。このオプ ションを使用した後、WDU_SetInterface() [A.9.2] を使用してデバ イスのインターフェースを設定することを推奨します。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 Windows でのみ WDU_ResetDevice をサポートします。 Windows USB ドライバはこの関数をサポートしてるので、この関数は、Windows USB ドライバからの 要求を発行して、ハブ ポートをリセットします。 A.9.16 WDU_GetLangIDs() 目的 デバイスからサポートする言語 ID のリストおよび/またはサポートする言語 ID の数を読み取ります。 プロトタイプ DWORD DLLCALLCONV WDU_GetLangIDs(WDU_DEVICE_HANDLE hDevice, PBYTE pbNumSupportedLangIDs, WDU_LANGID *pLangIDs, BYTE bNumLangIDs); 344 A 付 録 パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 pbNumSupportedLangIDs PBYTE 出力 pLangIDs WDU_LANGID * 出力 bNumLangIDs BYTE 入力 説明 名前 説明 hDevice デバイス/インターフェース用のユニークな識別子。 pbNumSupportedLangIDs サポートする言語 ID の数を受け取るパラメータ。 pLangIDs 言語 ID の配列。BNumLangIDs が 0 でない場合、この関数はサ ポートする言語 ID でこの配列を入力します。 bNumLangIDs pLangIDs の配列での ID の数。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します [A.15]。 注釈 • dwNumLangIDs が 0 の場合、この関数はサポートする言語 ID (pbNumSupportedLangIDs) の数のみ返しますが、実際の ID で言語 ID の配列 (pLangIDs) をアップデートしません。このため、pLangIDs は NULL にすることができ ます (参照されたないため)。しかし、pbNumSupoortedLangIDs は NULL にしないでく ださい。 • ユーザーがサポートする言語 ID の数ではなく、サポートする言語 ID のリストのみ受け取 りたい場合、pbNumSupportedLangIDs はNULL にすることができます。この場合、 bNumLangIDs を 0、pLangIDs を NULL にすることはできません。 • デバイスがどの言語 ID もサポートしない場合、この関数は "success (成功)" を返します。 呼び出し元は、この関数が返った後 *pbNumSupportedLangIDs の値を確認します。 • pLangIDs の配列 (bNumLangIDs) のサイズが、デバイス (*pbNumSupportedLangIDs) にサポートされる ID の数より小さい場合、関数は言語 ID でサポートされる最初の bNumLangIDs のみ読み取って返します。 345 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.9.17 WDU_GetStringDesc () 目的 文字列 インデックスでデバイスから読み取られる文字列記述子。 プロトタイプ DWORD DLLCALLCONV WDU_GetStringDesc(WDU_DEVICE_HANDLE hDevice, BYTE bStrIndex, PCHAR pcDescStr, DWORD dwSize, WDU_LANGID langID); パラメータ 名前 型 入出力 hDevice WDU_DEVICE_HANDLE 入力 bStrIndex BYTE 入力 pbBuf PBYTE 出力 dwBufSize DWORD 入力 langID WDU_LANGID 入力 pdwDescSize PDWORD 出力 説明 名前 説明 hDevice デバイス/インターフェースのユニークな識別子。 bStrIndex 文字列 インデックス。 pbBuf 読み取られる文字列記述子 (記述子はバイト配列で返されま す) 。 dwBufSize pbBuf のサイズ。 langID デバイスへ送られる文字列記述子を入手するリクエストで使用 される言語 ID 。langID パラメータが 0 の場合、関数はデバイス から返された最初のサポートする言語 ID を使用します。 pdwDescSize NULL でない場合、返された記述子のサイズでアップデートさ れます。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します [A.15] 。 346 A 付 録 注釈 • PbBuf が文字列記述子を保持するための十分なサイズを持っていない場合 (dwBufSize < *pdwDescSize)、返された記述子は dwBusSize バイトに縮小されます。 A.10 USB – 構造 次の図は、WinDriver の USB API が使用する構造階層を表しています。階層の各レベルに位置する配列 は、図で表されている以上に要素を持っています。矢印はポインタを表しています。分かり易くする ために、階層の各レベルの 1 つの構造のみを、詳細に説明しています (リストされたすべての要素とポ インタ)。 WDU_DEVICE • • • • • Descriptor Pipe0 pConfigs pActiveConfig pActiveInterface WDU_CONFIGURATION WDU_CONFIGURATION WDU_CONFIGURATION • Descriptor • dwNumInterfaces • pInterfaces WDU_INTERFACE WDU_INTERFACE WDU_INTERFACE • pAlternateSettings • dwNumAltSettings • pActiveAltSettings WDU_ALTERNATE_SETTINGTING WDU_ALTERNATE_SETTING WDU_ALTERNATE_SETTING • Descriptor • pEndpointDescriptors • pPipes WDU_ENGPOINT_DESCRIPTOR • • • • bLength bDescriptorType … bInterval WDU_PIPE_INFO • • • • dwNumber dwMaximumPacketSize … dwInterval 347 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.10.1 WDU_MATCH_TABLE Elements 注意: すべての項目の (*) は、値を 0 に設定すると、すべて一致します。 名前 型 説明 wVendorId WORD USB-IF に割り当てられる、検出に必要な USB ベンダー ID。(*) wProductId WORD 製造元に割り当てられる、検出に必要な USB プロダクト ID。(*) bDeviceClass BYTE USB-IF に割り当てられる、デバイスのサブ クラス コー ド。(*) bInterfaceClass BYTE USB-IF に割り当てられる、インターフェースのクラス コード。(*) bInterfaceSubClass BYTE USB-IF に割り当てられる、インターフェースのサブ ク ラス コード。(*) bInterfaceProtocol BYTE USB-IF に割り当てられる、インターフェースのプロトコ ル コード。(*) A.10.2 WDU_ EVENT_TABLE Elements 名前 型 説明 pfDeviceAttach WDU_ATTACH_CALLBACK デバイスを装着したときに WinDriver に呼ばれます。 pfDeviceDetach WDU_DETACH_CALLBACK デバイスを取り外したときに WinDriverに呼ばれます。 pfPowerChange WDU_POWER_CHANGE_CALLBACK デバイスの電源状態が変化すると WinDriver から呼ばれます。 pUserData PVOID コールバックへ渡されるユーザー モード データへのポインタ。 348 付 録 A A.10.3 WDU_DEVICE Elements 名前 型 説明 Descriptor WDU_DEVICE_DESCRIPTOR デバイスの基本情報が含まれます。 Pipe0 WDU_PIPE_INFO デバイスのデフォルトのパイプに関する 情報を格納します。 pConfigs WDU_CONFIGURATION * デバイスの設定に関する情報を含んだ バッファへのポインタ。 pActiveConfig WDU_CONFIGURATION * アクティブな設定に関する情報を含んだ バッファへのポインタ。 pActiveInterface WDU_INTERFACE * アクティブなインターフェースに関する 情報を含んだバッファへのポインタ。 A.10.4 WDU_CONFIGURATION Elements 名前 型 説明 Descriptor WDU_CONFIGURATION_DESCRIPTOR 設定の基本情報が含まれます。 dwNumInterfaces DWORD この設定でサポートされるイン ターフェースの数。 pInterfaces WDU_INTERFACE * この設定にインターフェースに 関する情報を含んだバッファへ のポインタ。 A.10.5 WDU_INTERFACE Elements 名前 型 説明 pAlternateSettings WDU_ALTERNATE_SETTING * インターフェースの代替設定に関する 情報を含んだバッファへのポインタ。 dwNumAltSettings DWORD 代替設定の数。 pActiveAltSetting WDU_ALTERNATE_SETTING * アクティブな代替設定に関する情報を 含んだバッファへのポインタ。 349 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.10.6 WDU_ALTERNATE_SETTING Elements 名前 型 説明 Descriptor WDU_INTERFACE_DESCRIPTOR インターフェースに関する基本情 報を含みます。 pEndpointDescriptors WDU_ENDPOINT_DESCRIPTOR * デバイスのエンドポイントに関す る情報を含んだバッファへのポ インタ。 pPipes WDU_PIPE_INFO * デバイスのパイプに関する情報を 含んだバッファへのポインタ。 A.10.7 WDU_DEVICE_DESCRIPTOR Elements 名前 型 説明 bLength UCHAR 記述子のバイト サイズ (18 バイト)。 bDescriptorType UCHAR デバイス記述子 (0x01)。 bcdUSB USHORT デバイスが対応する USB 仕様の数。 bDeviceClass UCHAR デバイスのクラス。 bDeviceSubClass UCHAR デバイスのサブ クラス。 bDeviceProtocol UCHAR デバイスのプロトコル。 bMaxPacketSize0 UCHAR 転送されるパケットの最大サイズ。 idVendor USHORT USB-IF に割り当てられるベンダー ID。 idProduct USHORT 製造元に割り当てられるプロダクト ID。 bcdDevice USHORT デバイス リリース番号。 iManufacturer UCHAR 製造元文字列記述子のインデックス。 iProduct UCHAR 製品文字列記述子のインデックス。 iSerialNumber UCHAR シリアル番号文字列記述子のインデックス。 bNumConfigurations UCHAR 設定可能な数。 350 A 付 録 A.10.8 WDU_CONFIGURATION_DESCRIPTOR Elements 名前 型 説明 bLength UCHAR 記述子のバイト サイズ。 bDescriptorType UCHAR デバイス記述子 (0x02)。 wTotalLength USHORT 必要なデータの合計バイト長。 bNumInterfaces UCHAR インターフェースの数。 bConfigurationValue UCHAR 設定番号。 iConfiguration UCHAR この設定を記述する文字列記述子のインデック ス。 bmAttributes UCHAR この設定の電源設定: 電源内臓の場合 D6、リモート ウェークアップの場 合 D5 (デバイスはホストをウェーク アップでき ます)。 MaxPower UCHAR 2mA ユニットで、この設定の最大電力消費量。 A.10.9 WDU_INTERFACE_DESCRIPTOR Elements 名前 型 説明 bLength UCHAR 記述子のバイト サイズ (9 バイト)。 bDescriptorType UCHAR デバイス記述子 (0x04)。 bInterfaceNumber UCHAR インターフェース番号。 bAlternateSetting UCHAR 代替設定番号。 bNumEndpoints UCHAR このインターフェースで使用するエンドポイント の数。 bInterfaceClass UCHAR USB-IF に割り当てられるインターフェースのク ラス コード。 bInterfaceSubClass UCHAR USB-IF に割り当てられるインターフェースのサ ブ クラス コード。 bInterfaceProtocol UCHAR USB-IF に割り当てられるインターフェースのプ ロトコル コード。 iInterface UCHAR このインターフェースを記述する文字列記述子の インデックス。 351 W I N D R I V E R ユ ー ザ ー ズ A.10.10 WDU_ENDPOINT_DESCRIPTOR Elements ガ イ ド 名前 型 説明 bLength UCHAR 記述子のバイト サイズ (7 バイト)。 bDescriptorType UCHAR エンドポイント記述子 (0x05)。 bEndpointAddress UCHAR エンドポイント アドレス: エンドポイント番号の ビット 0-3 を使用します。ビット 4-6 を 0 に設定し ます。アウトバウンド データの 0 およびインバ ウンド データの 1 にビット 7 を設定します (制御 エンドポイントのために無視されます)。 bmAttributes UCHAR このエンドポイントの転送タイプを指定します (制御、割り込み、等時性またはバルク)。詳細は、 USB の仕様を参照してください。 wMaxPacketSize USHORT このエンドポイントが送受信可能なパケットの最 大サイズ。 bInterval UCHAR フレーム カウントのエンドポイント データ転送 のポーリング間隔。バルクおよび制御コントロー ルのため無視されます。等時性エンドポイントの 1 に等しいです。割り込みエンドポイントの 1 から 255 の範囲です。 A.10.11 WDU_PIPE_INFO Elements 名前 型 説明 dwNumber DWORD パイプ番号; デフォルトのパイプ番号は 0 です。 dwMaximumPacketSize DWORD このパイプを使用して転送できるパケットの最大 サイズ。 type DWORD このパイプの転送タイプ。 direction DWORD 転送の方法: 等時性、バルクまたは割り込みパイプ の場合 USB_DIR_IN または USB_DIR_OUT、制御 パイプの場合 USB_DIR_IN_OUT。 dwInterval DWORD ミリ秒間隔; 割り込みパイプにのみ適応されます。 352 A 付 録 A.11 プラグアンドプレイおよびパワー マネージメント A.11.1 コール順序 プラグアンドプレイおよびパワーマネージメント イベントに使用される WinDriver API の一般的な呼 び出し順序を示します。 WD_Open() WD_Version() Handle Plug-and-Play and Power Management Events EventRegister() EventUnregister() WD_Close() A.11.2 EventRegister() 目的 定義されている基準に従い、プラグアンドプレイおそびパワー マネージメント イベントの通知をアプ リケーションが受け取るよう登録します。受け取った通知に応じてイベントコールバック関数を呼び 出します。 プロトタイプ DWORD EventRegister(HANDLE *phEvent, HANDLE hWD, WD_EVENT *pEvent, EVENT_HANDLER pFunc, void *pData); パラメータ 名前 型 入出力 phEvent HANDLE * 出力 hWD HANDLE 入力 event WD_EVENT * 入力 handle DWORD 出力 dwAction DWORD 入力 353 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwStatus DWORD N/A dwEventId DWORD N/A dwCardType WD_BUS_TYPE 入力 hKernelPlugIn DWORD 入力 dwOptions DWORD 入力 u Union Pci cardId Struct WD_PCI_ID dwVendorId DWORD 入力 dwDeviceId DWORD 入力 pciSlot WD_PCI_SLOT dwBus DWORD 入力 dwSlot DWORD 入力 dwFunction DWORD 入力 Pcmcia Struct deviceId WD_PCMCIA_ID wManufacturerId WORD 入力 wCardId WORD 入力 pcmciaSlot WD_PCMCIA_SLOT uBus BYTE 入力 uSocket BYTE 入力 uFunction BYTE 入力 uPadding BYTE N/A Func EVENT_HANDLER 入力 data void 入力 dwEventVer DWORD 内部使用 dwNumMatchTables DWORD 入力 matchTables[1] WDU_MATCH_TABLE 入力 354 付 録 A 説明 名前 phEvent 説明 正常終了の場合、phEvent は、EventUnregister( ) [A.11.3] で使用す るハンドルを保持します。 hWD WD_Open [A.1.2] から返される WinDriver のカーネル モード ド ライバへのハンドル。 event 受け取ったイベント通知に登録するための基準設定。 handle 低水準 WD_EventUnregister ( ) 関数が使用するハンドル。イ ベント登録に失敗すると 0 を返します。 dwAction 登録するイベントを示すビット マスク フィールド。 プラグアンドプレイ イベント: WD_INSERT - デバイスを接続 _ WD_REMOVE - デバイスを外す _ デバイスのパワー ステータス: WD_POWER_CHANGED_D0 - フル パワー _ WD_POWER_CHANGED_D1 - スリープ (低) _ WD_POWER_CHANGED_D2 - スリープ (中) _ WD_POWER_CHANGED_D3 - スリープ (フル) _ WD_POWER_SYSTEM_WORKING - 完全にオン _ システムのパワー ステータス: WD_POWER_SYSTEM_SLEEPING1 - スリープの状態で完全に _ オン WD_POWER_SYSTEM_SLEEPING2 - CPU オフ、メモリ オン、PCI _ /PCMCIA オン WD_POWER_SYSTEM_SLEEPING3 - CPU オフ、メモリのリフ _ レッシュ、補助パワーで PCI /PCMCIA を稼動 WD_POWER_SYSTEM_HIBERNATE - シャットダウン前にコン _ テキストを保存 WD_POWER_SYSTEM_SHUTDOWN - コンテキストを保存しな _ い dwCardType WD_BUS_PCI または WD_BUS_USB のいずれか (WD_USB_TYPE オプション)。 hKernelPlugIn WD_KernelPlugInOpen() [A.12.1] から Kernel PlugIn へのハンドル (イベントをハンドルする Kernel PlugIn を使用する場合)。 355 W I N D R I V E R ユ ー ザ ー ズ dwOptions ガ イ ド WD_ACKNOWLEDGE または 0。WD_ACKNOWLEDGE の場合、 ユーザーは、認識する前に要求されたイベントのアクションを 実行できます。ユーザーが WD_EventSend() 関数を呼ぶまで OS はそのイベントを待機します。EventRegister() [A.11.2] ラッパーが 呼ばれた場合、コールバック関数が終了後に自動的に WD_EventSend() を呼びます。 cardId.dwVendorId 登録する PCI ベンダー ID。0 の場合、すべての PCI ベンダー ID に登録します。 cardId.dwDeviceId 登録する PCI デバイス ID。0 の場合、すべての PCI デバイス ID に登録します。 pciSlot.dwBus 登録する PCI バス番号 ID。0 の場合、すべての PCI バス番号 ID に登録します。 pciSlot.dwSlot 登録する PCI スロット。0 の場合、すべての PCI スロットに登 録します。 pciSlot.dwFunction 登録する (デバイス上の) PCI 関数。0 の場合、すべての PCI 関 数に登録します。 deviceId.wManufacturerId 登録する PCMCIA 製造元 ID。0 の場合、すべての PCMCIA 製 造元 ID に登録します。 deviceId.wCardId 登録するカード ID。0 の場合、すべてのカード ID に登録しま す。 pcmciaSlot.uBus 登録する PCMCIA バス番号 ID。0 の場合、すべての PCMCIA バ ス番号 ID に登録します pcmciaSlot.uSocket 登録する PCMCIA ソケット。0 の場合、すべての PCMCIA ソ ケットに登録します pcmciaSlot.uFunction 登録する (カード上の) PCMCIA関数。0 の場合、すべての PCMCIA 関数に登録します。 func イベント通知を受け取って呼び出されるコールバック関数。 data コールバック関数に送るデータ。 dwEventVer 内部ユーザーのみ使用。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 この関数には、低水準の WD_EventRegister()、WD_EventPull()、WD_EventSend および InterruptEnable() [A.5.21] が含まれます。 356 付 録 A 例 HANDLE *event_handle; WD_EVENT event; DWORD dwStatus; BZERO(event); event.dwAction = WD_INSERT | WD_REMOVE; event.dwCardType = WD_BUS_PCI; dwStatus = EventRegister(&event_handle, hWD, &event, event_handler_func, NULL); if (dwStatus!=WD_STATUS_SUCCESS) { printf("Failed register\n"); return; } A.11.3 EventUnregister() 目的 プラグアンドプレイおよびパワー マネージメント イベント通知の受け取りの登録を解除します。 プロトタイプ DWORD EventUnregister(HANDLE hEvent); パラメータ 名前 hEvent 型 入出力 HANDLE * 入力 説明 名前 説明 HEvent EventRegister() [A.11.2] から受信したハンドル。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 この関数には、WD_EventUnregister() および InterruptDisable() [A.5.22] が含まれます。 例 EventUnregister(event_handle); 357 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.12 Kernel PlugIn − ユーザー モード関数 次に Kernel PlugIn の初期化やコールバックを有効にするユーザー モード関数を説明します。 A.12.1 WD_KernelPlugInOpen() Kernel PlugIn への有効なハンドルを取得します。 プロトタイプ DWORD WD_KernelPlugInOpen(HANDLE hWD, WD_KERNEL_PLUGIN *pKernelPlugIn); パラメータ 名前 型 入出力 hWD HANDLE pKernelPlugIn WD_KERNEL_PLUGIN * 出力 hKernelPlugIn DWORD 出力 pcDriverName PCHAR 入力 pcDriverPath PCHAR 入力 pOpenData PVOID 入力 説明 名前 説明 hWD WinDriver へのハンドル pKernelPlugIn WD_KERNEL_PLUGIN 情報へのポインタ hKernelPlugIn Kernel PlugIn へのハンドルを返します。 pcDriverName ロードする Kernel PlugIn 名前。最大 8 文字。 pcDriverPath このフィールドには NULL を設定してください。WinDriver が OS の drivers/modules ディレクトリ内のドライバを検索 します。 pOpenData Kernel PlugIn の KP_Open [A.13.2] コールバックに渡される データのポインタ。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 358 付 録 A 例 WD_KERNEL_PLUGIN kernelPlugIn; BZERO(kernelPlugIn); // Tells WinDriver which driver to open kernelPlugIn.pcDriverName = "KPTEST"; HANDLE hWD = WD_Open(); // validate handle here dwStatus = WD_KernelPlugInOpen(hWD, &kernelPlugIn); if (dwStatus) printf ("Failed opening a handle to the Kernel PlugIn. Error: 0x%x (%s)\n", dwStatus, Stat2Str(dwStatus)); else printf("Opened a handle to the Kernel PlugIn (0x%x)\n", kernelPlugIn.hKernelPlugIn); A.12.2 WD_KernelPlugInClose() WD_KernelPlugInOpen [A.12.1] で取得した WinDriver Kernel PlugIn ハンドルを閉じます。 プロトタイプ DWORD WD_KernelPlugInClose(HANDLE hWD,WD_KERNEL_PLUGIN *pKernelPlugIn); パラメータ 名前 型 入出力 hWD HANDLE 入力 pKernelPlugIn WD_KERNEL_PLUGIN * 入力 説明 名前 説明 hWD WinDriver へのハンドル pKernelPlugIn WD_KERNEL_PLUGIN 情報へのポインタ 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 例 WD_KernelPlugInClose(hWD, &kernelPlugIn); 359 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.12.3 WD_KernelPlugInCall() 目的 Kernel PlugIn 内の実行するルーチンを呼び出します。 プロトタイプ DWORD WD_KernelPlugInCall( HANDLE hWD, WD_KERNEL_PLUGIN_CALL *pKernelPlugInCall); パラメータ 名前 型 入出力 hWD HANDLE 入力 pKernelPlugInCall WD_KERNEL_PLUGIN_CALL * 入力 hKernelPlugIn DWORD 入力 dwMessage DWORD 入力 pData PVOID 入力 dwResult DWORD 出力 説明 名前 説明 hWD WinDriver へのハンドル pKernelPlugInCall WD_KERNEL_PLUGIN_CALL 情報へのポインタ hKernelPlugIn Kernel PlugIn へのハンドル dwMessage KP_Call [A.13.4] コールバックに渡すメッセージ ID。 pData KP_Call コールバックに渡すデータへのポインタ。 dwResult KP_Call コールバックにセットする値。 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 WD_KernelPlugInCall [A.12.3] をユーザー モードで呼び出すと、カーネル モードで KP_Call [A.13.4] コー ルバック関数を呼び出します。Kernel PlugIn の KP_Call 関数は、WD_KERNEL_PLUGIN_CALL 構造体 に渡されたメッセージにしたがってどのルーチンを実行するかを決定します。 360 付 録 A 例 WD_KERNEL_PLUGIN_CALL kpCall; BZERO (kpCall); // Prepare the kpCall structure from WD_KernelPlugInOpen(): kpCall.hKernelPlugIn = hKernelPlugIn; // Set the message to pass to KP_Call(). This will determine // the action performed in the kernel: kpCall.dwMessage = MY_DRV_MSG; kpCall.pData = &mydrv; // The data to pass to the Kernel PlugIn. dwStatus = WD_KernelPlugInCall(hWD, &kpCall); if (dwStatus == WD_STATUS_SUCCESS) printf("Result = 0x%x\n", kpCall.dwResult); else printf("WD_KernelPlugInCall() failed. Error: 0x%x (%s)\n", dwStatus, Stat2Str(dwStatus)); A.12.4 WD_IntEnable() 目的 KernelPlugIn で割り込みを有効にします。 プロトタイプ DWORD WD_IntEnable(HANDLE hWD,WD_INTERRUPT *pInterrupt); パラメータ 名前 型 入出力 hWD HANDLE 入力 pInterrupt WD_INTERRUPT * - WD_KERNEL_PLUGIN_CALL - hKernelPlugIn HANDLE 入力 dwMessage DWORD N/A pData PVOID 入力 dwResult DWORD N/A kpCall 説明 名前 説明 hWD WinDriver へのハンドル。 361 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド pInterrupt WD_INTERRUPT 情報へのポインタ。 hKernelPlugIn Kernel PlugIn へのハンドル。ゼロの場合、KernelPlugIn 割り込み ハンドラはインストールされません。 dwMessage N/A pData KP_IntEnable コールバックに渡すデータへのポインタ。 dwResult N/A 戻り値 正常終了した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、エラーコードを返します。 注釈 Kernel PlugIn への有効なハンドルをこの関数に渡す場合、Kernel PlugIn で割り込みを処理します。 その場合、WD_IntEnable への呼び出しの結果および割り込みの受信をした際に、KP_IntEnable コール バックは実行し、そして作成したカーネルモード KP_IntAtIrql 関数 [A.13.8] は実行します。この関数が 0 より大きい値を返す場合、それに続く KP_IntAtDpc [A.13.9] が呼ばれます。 WD_IntEnable のその他の引数に関する情報は、付録 A の WD_IntEnable [A.6.2] の説明を参照してくださ い。 例 WD_INTERRUPT Intrp; BZERO(Intrp); Intrp.hInterrupt = hInterrupt; // from WD_CardRegister() // from WD_KernelPlugInOpen(): Intrp.kpCall.hKernelPlugIn = hKernelPlugIn; WD_IntEnable(hWD, &Intrp); if (!Intrp.fEnableOk) printf ("failed enabling interrupt\n"); A.13 Kernel PlugIn − カーネル モード関数 次に Kernel PlugIn ドライバに組み込むコールバック関数を説明します。これらはその「呼び出す」イ ベントが発生すると呼び出されます。例えば、KP_Init [A.13.1] はドライバをロードしたときに呼び出 されるコールバック関数です。ロードした際に実行するコードはこの関数に追加してください。 KP_Init はドライバ名と KP_Open 関数を設定します。 KP_Open はドライバのコールバック関数の残りを設定します。 362 A 付 録 例 kpOpenCall->funcClose = KP_Close; kpOpenCall->funcCall = KP_Call; kpOpenCall->funcIntEnable = KP_IntEnable; kpOpenCall->funcIntDisable = KP_IntDisable; kpOpenCall->funcIntAtIrql = KP_IntAtIrql; kpOpenCall->funcIntAtDpc = KP_IntAtDpc; kpOpenCall->funcEvent = KP_Event; 注意: このリファレンスでは便宜上、Kernel PlugIn コールバック関数を KP_XXX として表示します。 つまり、KP_Open、KP_Call など。ただし、Kernel PlugIn で実装するコールバック関数を作成した場合、 KP_Init 以外で、作成した Kernel PlugIn コールバック関数に任意の名前を付けても構いません。たと えば、DriverWizard で生成された Kernel PlugIn コードでは、コールバック関数名で、選択したドライ バ名を使用します (たとえば、<MyKP> ドライバの場合、KP_MyKP_Open、KP_MyKP_Call など)。 A.13.1 KP_Init() 目的 Kernel PlugIn ドライバをロードた際に、呼び出されます。 Kernel PlugIn ドライバの名前と KP_Open [A.13.2] コールバック関数を設定します。 プロトタイプ BOOL __cdecl KP_Init(KP_INIT *kpInit); パラメータ 名前 型 kpInit 入出力 KP_INIT * dwVerWD DWORD 出力 cDriverName[12] CHAR 出力 funcOpne KP_FUNC_OPEN 出力 説明 名前 説明 kpInit KP_INIT エレメント。 dwVerWD WinDriver Kernel PlugIn ライブラリのバージョン。 cDriverName デイバス ドライバ名 (最大 12 文字)。 funcOpen WD_KernelPlugInOpne を呼んだ際に実行される KP_Open コールバック関数。 363 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 正常に終了すると TRUE を返します。その他の場合、FALSE を返します。 注釈 コードに KP_Init 関数を定義して Kernel PlugIn ドライバと WinDriver をリンクする必要があります。 KP_Init はドライバがロードされたときに呼び出されます。ロード時に実行するコードはこの関数に含 まれなければなりません。 例 BOOL { // // // if { __cdecl KP_Init(KP_INIT *kpInit) Check if the version of the WinDriver Kernel PlugIn library is the same version as windrvr.h and wd_kp.h (kpInit->dwVerWD != WD_VER) // You need to re-compile your Kernel PlugIn // with the compatible version of the WinDriver // Kernel PlugIn library, windrvr.h and wd_kp.h return FALSE; } kpInit->funcOpen = KP_Open; strcpy (kpInit->cDriverName, "KPTEST"); // up to 12 chars return TRUE; } A.13.2 KP_Open() 目的 ユーザー モードで WD_KernelPlugInOpen [A.12.1] が呼び出された際に呼び出されます。 Kernel PlugIn コールバック関数 (KP_Call、KP_IntEnable など) の残りを設定し、その他の初期化を実行 します (ドライバ コンテキストのメモリの割り当て、ユーザー モードから渡されたデータで書き込み など)。 返されたドライバ コンテキスト (pDrvContext) を Kernel PlugIn コールバック関数の残りに渡されます。 プロトタイプ BOOL __cdecl KP_Open(KP_OPEN_CALL *kpOpenCall, HANDLE hWD, PVOID pOpenData, PVOID *ppDrvContext); パラメータ 名前 kpOpenCall 364 型 入出力 KP_OPEN_CALL 入力 付 録 hWD HANDLE 入力 pOpenData PVOID 入力 ppDrvContext PVOID * 出力 A 説明 名前 説明 kpOpenCall KP_xxx コールバック関数のアドレスを埋める構造体。 hWD WD_KernelPlugInOpen [A.12.1] が呼び出されたときの WinDriver のハンドル。 pOpenData ユーザー モードから渡されたデータへのポインタ。 ppDrvContext KP_Close [A.13.3]、KP_Call [A.13.4]、KP_IntEnable [A.13.6] お よび KP_Event [A.13.5] 関数が呼ばれた際の、ドライバ コン テキスト データへのポインタ。これを使用してドライバ固 有の情報を保存します。この情報をこれらのコールバック 関数で共有します。 戻り値 正常に終了すると TRUE を返します。FALSE の場合、ユーザー モードから呼ばれた WD_KernelPlugInOpen() に失敗します。 例 BOOL __cdecl KP_Open(KP_OPEN_CALL *kpOpenCall, HANDLE hWD, PVOID pOpenData, PVOID *ppDrvContext) { kpOpenCall->funcClose = KP_Close; kpOpenCall->funcCall = KP_Call; kpOpenCall->funcIntEnable = KP_IntEnable; kpOpenCall->funcIntDisable = KP_IntDisable; kpOpenCall->funcIntAtIrql = KP_IntAtIrql; kpOpenCall->funcIntAtDpc = KP_IntAtDpc; kpOpenCall->funcEvent = KP_Event; // You can allocate driver context memory here: *ppDrvContext = malloc(sizeof(MYDRV_STRUCT)); return *ppDrvContext!=NULL; } 365 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド A.13.3 KP_Close() 目的 ユーザー モードから WD_KernelPlugInClose [A.12.2] が呼ばれた場合に呼び出されます。 Kernel PlugIn の除去を実行するのに使用します (以前にドライバ コンテキストに対して割り当てられ たメモリの解放など)。 プロトタイプ void __cdecl KP_Close(PVOID pDrvContext); パラメータ 名前 pDrvContext 型 PVOID 入出力 入力 説明 名前 pDrvContext 説明 KP_Open [A.13.2] でセットされたドライバ コンテキスト データ。 戻り値 なし。 例 void __cdecl KP_Close(PVOID pDrvContext) { if (pDrvContext) free(pDrvContext); // Free allocated driver context memory } A.13.4 KP_Call() 目的 ユーザー モード アプリケーションが WD_KernelPlugInCall [A.12.3] 関数を呼び出した際に呼び出されま す。この関数は、ユーティリティ関数のメッセージ ハンドラです。 プロトタイプ void __cdecl KP_Call(PVOID pDrvContext, WD_KERNEL_PLUGIN_CALL *kpCall, BOOLl fIsKemeIMode); 366 付 録 A パラメータ 名前 型 pDrvContext PVOID kpCall WD_KERNEL_PLUGIN_CALL 入出力 入力 / 出力 dwMessage DWORD 入力 pData PVOID 入力 / 出力 dwResult DWORD 出力 BOOL 入力 fIsKernelMode 説明 名前 pDrvContext 説明 KP_Open [A.13.2] でセットされたドライバ コンテキスト データで、KP_Close [A.13.3]、KP_IntEnable [A.13.6] および KP_Event [A.13.5] に渡されます。 KpCall WD_KernelPlugInCall [A.12.3] からのユーザーモード情報を 持つ構造体、および / またはユーザーモードへ戻す情報を持 つ構造体。 dwMessage WD_KernelPlugInCall から渡されたメッセージ ID。 pData WD_KernelPlugInCall から渡されたデータへのポインタ、お よび / またはユーザーモードへ戻すデータへのポインタ。 dwResult ユーザーモードに返す値。 fIsKernelMode Windriver のカーネルにより渡されるパラメータ (注釈を参 照)。 戻り値 なし。 注釈 ユーザーモードで WD_KernelPlugInCall [A.12.3] を呼んで、カーネル モードで作成した KP_Call [A.13.4] コールバック関数を呼びます。Kernel PlugIn の KP_Call 関数は、WD_KERNEL_PLUGIN_CALL 構造体 の渡されるメッセージによって、どのルーティンを実行するか決定します。 fIsKernelMode パラメータは、Windriver のカーネルにより KP_Call ルーチンに渡されます。パラメータ について変更する必要はありません。しかし、このパラメータがマクロを正確に機能させるために必 367 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 要な COPY_TO_USER_OR_KERNEL にどのように渡されるのかを注意する必要があります。詳細はセ クション A.13.10 を参照してください。 例 void __cdecl KP_Call(PVOID pDrvContext, WD_KERNEL_PLUGIN_CALL *kpCall, BOOL fIsKernelMode) { kpCall->dwResult = MY_DRV_OK; switch (kpCall->dwMessage) { // in this sample we implement a GetVersion message case MY_DRV_MSG_VERSION: { DWORD dwVer = 100; MY_DRV_VERSION *ver = (MY_DRV_VERSION *)kpCall->pData; COPY_TO_USER_OR_KERNEL(&ver->dwVer, &dwVer, sizeof(DWORD), fIsKernelMode); COPY_TO_USER_OR_KERNEL(ver->cVer, "My Driver V1.00", sizeof("My Driver V1.00")+1, fIsKernelMode); kpCall->dwResult = MY_DRV_OK; } break; // you can implement other messages here default: kpCall->dwResult = MY_DRV_NO_IMPL_MESSAGE; } } A.13.5 KP_Event() 目的 デバイスのプラグ アンド プレイまたはパワー マネージメント イベントを受信した際に呼び出されま す。まず、指定したユーザーモード アプリケーションが、Kernel PlugIn へのハンドルを持つ EventRegister [A.11.2] を呼び出します。 プロトタイプ BOOL __cdecl KP_Event(PVOID pDrvContext, WD_EVENT *wd_event); パラメータ 名前 型 入出力 pDrvContext PVOID 入力 / 出力 wd_event WD_EVENT * 入力 368 付 録 A 説明 名前 説明 pDrvContext KP_Open [A.13.2] によって設定されるドライバ コンテキスト データで、KP_Close [A.13.3]、KP_IntEnable [A.13.6] および KP_Call [A.13.4] へ渡されます。 wd_event ユーザーモードから受信した PnP / パワー マネージメント イ ベント情報へのポインタ。 戻り値 イベントについてユーザーに TRUE を伝える。 注釈 アプリケーションが KernelPlugIn へのハンドルと EventRegister() [A.11.2] を呼び出した場合に KP_Event が呼び出されます。 例 BOOL __cdecl KP_Event(PVOID pDrvContext, WD_EVENT *wd_event) { // handle the event here return TRUE; // Return TRUE to notify the user about the event. } A.13.6 KP_IntEnable() 目的 Kernel PlugIn ハンドルを持つユーザー モードから WD_IntEnable [A.6.2] が呼び出された際に呼び出され ます。割り込みコンテキスト (pIntContext) を Kernel PlugIn 割り込み関数の残りへ渡します。 プロトタイプ BOOL __cdecl KP_IntEnable (PVOID pDrvContext, WD_KERNEL_PLUGIN_CALL *kpCall, PVOID *ppIntContext); パラメータ 名前 型 入出力 pDrvContext PVOID 入力 / 出力 kpCall WD_KERNEL_PLUGIN_CALL 入力 dwMessage DWORD 入力 pData PVOID 入力 / 出力 369 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド dwResult DWORD 入力 ppIntContext PVOID * 入力 / 出力 説明 名前 説明 pDrvContext KP_Open [A.13.2] でセットされたドライバ コンテキスト データで、KP_Close [A.13.3]、KP_Call [A.13.4] および KP_Event [A.13.5] に渡されます。 kpCall WD_IntEnable [A.6.2] からの情報を持つ構造体。 dwMessage WD_IntEnable から渡されたメッセージ ID。 pData WD_IntEnable から渡されたデータへのポインタ、および / またはユーザーモードへ戻すデータへのポインタ。 dwResult ユーザーモードへ戻る値。 ppIntContext KP_IntDisable [A.13.7]、KP_IntAtIrql [A.13.8]、KP_IntAtDpc [A.13.9] 関数と共に呼び出される割り込みコンテキスト データへのポインタ。割り込み関連の特定情報を保持する のに使用します。 戻り値 正常に終了すると TRUE を返します。 注釈 この関数には、Kernel PlugIn 割り込み処理に必要な初期化をすべて含む必要があります。 例 BOOL __cdecl KP_IntEnable(PVOID pDrvContext, WD_KERNEL_PLUGIN_CALL *kpCall, PVOID *ppIntContext) { DWORD *pIntCount; // You can allocate specific memory for each interrupt // in *ppIntContext *ppIntContext = malloc(sizeof (DWORD)); if (!*ppIntContext) return FALSE; // In this sample the information is a DWORD used to // count the incoming interrupts pIntCount = (DWORD *) *ppIntContext; *pIntCount = 0; // reset the count to zero return TRUE; } 370 付 録 A A.13.7 KP_IntDisable() 目的 ユーザー モード アプリケーションが WD_IntDisable [A.6.5] 関数を呼び出した際に呼び出されます。こ の関数は、KP_IntEnable [A.13.6] で割り当てたメモリを解放します。 プロトタイプ void __cdecl KP_IntDisable(PVOID pIntContext); パラメータ 名前 pIntContext 型 入出力 PVOID 入力 説明 名前 説明 PIntContext KP_IntEnable [A.13.6] で設定した割り込みコンテキスト データ。 戻り値 なし。 例 void __cdecl KP_IntDisable(PVOID pIntContext) { // You can free the interrupt specific memory // allocated to pIntContext here free(pIntContext); } A.13.8 KP_IntAtIrql() 目的 割り込みが有効時に、Kernel PlugIn ハンドルを渡す場合、この関数は HIGH IRQL で実行します。 プロトタイプ BOOL __cdecl KP_IntAtIrql(PVOID pIntContext, BOOL *pfIsMyInterrupt); 371 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 型 入出力 pIntContext PVOID 入力 / 出力 pfIsMyInterrupt BOOL * 入力 説明 名前 説明 pIntContext KP_IntEnable [A.13.6] で設定された割り込みコンテキスト データで、KP_IntAtDpc [A.13.9] (実行した場合) および KP_IntDisable [A.13.7] へ渡されます。 pfIsMyInterrupt このドライバの場合、*pfIsMyInterrupt を TRUE に設定しま す。それ以外の場合は、同じ割り込みが呼ばれる他のドライ バのための割り込みサービス ルーチンを可能するために FALSE に設定します。 戻り値 DPC (deferred interrupt processing) を実行する場合は、TRUE を返します。その他の場合、FALSE を返し ます。 注釈 IRQL で実行されるコードは高い優先度の割り込みでないと割り込めません。 IRQL で実行されるコードは、次の制限があります: ページしないメモリに対してのみアクセス可能です。 次の関数だけを呼び出し可能です: IRQL から呼び出し可能な WD_Transfer [A.5.14]、 WD_MultiTransfer [A.5.15]、WD_DebugAdd [A.1.6] および OS 独自のカーネル関数 (Windows DDK 関数など)。OS 独自のカーネル関数を使用する場合、他の OS への互換性が損なわれる ので、ご注意ください。 malloc()、free() または前述以外の WD_xxx API は呼び出せません。 優先度が高いため、HIGH IRQL で実行されるコードは最小限にする必要があります (たとえば、レベ ル センシティブな割り込みの検知のみなど)。残りのコードを KP_IntAtDpc [A.13.9] で記述する必要が あり、遅延 DISPATCH レベルで実行し、上記の制限に従いません。 例 BOOL __cdecl KP_IntAtIrql(PVOID pIntContext, BOOL *pfIsMyInterrupt) { DWORD *pdwIntCount = (DWORD *) pIntContext; /* Check your hardware here to see if the interrupt belongs to you. 372 付 録 A If it does, you must set *pfIsMyInterrupt to TRUE. Otherwise, set *pfIsMyInterrupt to FALSE. */ *pfIsMyInterrupt = FALSE; /* In this example we will schedule a DPC once in every 5 interrupts */ (*pdwIntCount) ++; if (*pdwIntCount==5) { *pdwIntCount = 0; return TRUE; } return FALSE; } A.13.9 KP_IntAtDpc() 目的 これは KP_IntAtIrql [A.13.8] 関数が TRUE を返したときにだけ実行される関数呼び出しです。 プロトタイプ DWORD __cdecl KP_IntAtDpc(PVOID pIntContext, DWORD dwCount); パラメータ 名前 型 入出力 pIntContext PVOID 入力 / 出力 dwCount DWORD 入力 説明 名前 説明 PIntContext KP_IntEnable [A.13.6] で設定した割り込みコンテキスト データで、KP_IntAtIrql [A.13.8] および KP_IntDisable [A.13.7] へ渡されます。 DwCount 最後の DPC 呼び出しから KP_IntAtIrql [A.13.8] が TRUE を 返した回数。dwCount が 1 の場合、最後の DPC 呼び出しか ら KP_IntAtIrql が DPC を一度だけ要求したことを表しま す。値が 1 より大きい場合、KP_IntAtIrql が DPC をすでに 数回要求したことを表します。しかし、その間隔が短かい ために、各 DPC の要求に対し、KP_IntAtDpc が呼び出され なかったことを示します。 373 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 ユーザー モードに通知する回数を返します (WD_IntWait [A.6.3] の戻り値)。 注釈 割り込み処理の多くは、DPC で記述されます。 KP_IntAtDpc が 1 以上の値を返す場合、WD_IntWait は戻し、ユーザーモード割り込みハンドラは戻り 値に設定した回数分実行します。ユーザーモード割り込みハンドラを実行したくない場合、 KP_IntAtDpc は 0 を返す必要があります。 例 DWORD __cdecl KP_IntAtDpc(PVOID pIntContext, DWORD dwCount) { // Return WD_IntWait as many times as KP_IntAtIrql // scheduled KP_IntAtDpc() return dwCount; } A.13.10 COPY_TO_USER_OR_KERNEL、 COPY_FROM_USER_OR_KERNEL() 目的 データをユーザーモードから Kernel PlugIn へコピーまたは Kernel PlugIn からユーザーモードへコピー するマクロ。 注釈 COPY_TO_USER_OR_KERNEL および COPY_FROM_USER_OR_KERNEL は、Kernel PlugIn 内でユー ザー モード メモリ アドレスなどへ / からアクセスする (必要がある) ときにデータのコピーを行うた めのマクロです。ユーザー モード処理が I/O オペレーションの途中で変更されても、データをコピー することで、ユーザー モード アドレスを正しく使用することができます。ユーザー モードの処理が変 更するような長いオペレーションで使用します。マクロを使用したコピーは、サポートするすべての オペレーティング システムで有効です。 KP_IntAtIrql() [A.13.8] または KP_IntAtDpc() [A.13.9] 関数内からユーザー モードにアクセスする場合、 実行する前に Kernel PlugIn の値にデータをコピーすることを推奨します。 COPY_TO_USER_OR_KERNEL および COPY_FROM_USER_OR_KERNEL マクロは WinDriver\include\kpstdlib.h ヘッダー ファイルで定義されています。 COPY_TO_USER_OR_KERNEL の使用例については、kptest.c サンプル ファイル (WinDriver\kerplug\kptest\kermode デイレクトリ) で使用されている KP_Call() [A.13.4] を参照してくださ い。 374 A 付 録 ユーザー モードおよび Kernel PlugIn ルーチン (例、KpIntAtIrql [A.13.8] および KpIntAtDpc [A.13.9]) 間で 安全なデータ バッファの共有についての詳細は、Web サイトのテクニカル ドキュメント #41「Kernel PlugIn と DMA またはその他の目的のユーザー モード プロジェクト間で、メモリ バッファをどのよう に共有しますか?」を参照してください。 A.14 Kernel PlugIn − 構造体リファレンス ここでは、Kernel PlugIn のさまざまな構造体に関する詳細情報を説明します。 ユーザー モード関数では WD_xxx 構造体を使用し、カーネル モード関数では KP_xxx 構造体を使用し ます。 A.14.1 WD_KERNEL_PLUGIN Kernel PlugIn open コマンドを定義します。 WD_KernelPlugInOpen() [A.12.1] および WD_KernelPlugInClose() [A.12.2] で使用します。 メンバー: 型 名前 説明 DWORD hKernelPlugIn Kernel PlugIn へのハンドル。 PCHAR pcDriverName Kernel PlugIn ドライバの名前。12 文字以下でな ければなりません。VXD、SYS 拡張子は含み ません。 PCHAR pcDriverPath この項目には、NULL を設定してください。 WinDriver が OS の drivers / modules ディレク トリのドライバを検索します。 PVOID pOpenData Kernel PlugIn の KP_Open [A.13.2] コールバッ クに渡されるデータ。 A.14.2 WD_INTERRUPT 割り込み情報の記述に使用します。 InterruptEnble [A.5.21]、InterruptDisable [A.5.22]、WD_IntEnable() [A.6.2]、WD_IntDisable() [A.6.5]、 WD_IntWait() [A.6.3]、WD_IntCount() [A.6.4] で使用します。 375 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド メンバー: 型 名前 説明 WD_KERNEL_ PLUGIN_CALL [A.14.3] kpCall kpCall 構造体は Kernel PlugIn へのハンドルの 他に、インストール時にカーネル モード割り 込みハンドラに渡す情報を持ちます。 ハンドルが 0 の場合、割り込みを Kernel PlugIn 割り込みハンドラなしでインストールします。 有効な Kernel PlugIn ハンドラを設定する場合、 この構造体を引数として、KP_IntEnable [A.13.6] Kernel PlugIn コールバック関数へ 渡します。 その他の WD_INTERRUPT のメンバに関する詳細は、セクション A.5.21 を参照してください。 A.14.3 WD_KERNEL_PLUGIN_CALL Kernel PlugIn へ渡される情報を持ちます。Kernel PlugIn へメッセージを渡す際、または Kernel PlugIn 割 り込みをインストールする際に、この構造体を使用します。 WD_KernelPlugInCall [A.12.3]、InterruptEnable [A.5.21] および WD_IntEnable [A.6.2] で使用します。 Kernel PlugIn、KP_Call [A.13.4] および KP_IntEnable [A.13.6] コールバック関数への引数として渡されま す。 メンバー: 型 名前 説明 DWORD hKernelPlugIn Kernel PlugIn へのハンドル。 DWORD dwMessage Kernel PlugIn コールバックへ渡すメッセージ ID。 PVOID pData Kernel PlugIn コールバックへ渡すデータへのポ インタ。 DWORD dwResult ユーザー モードへ返す Kernel PlugIn コール バックがセットした値。 A.14.4 KP_INIT KP_INIT 構造体は、Kernel PlugIn の KP_Init() [A13.1] 関数で使用されます。この構造体は主に アプリケー ションが WD_KernelPlugInOpen() [A.12.1] を呼び出す際にドライバ名とどのカーネル モード関数を呼び 出すかを WinDriver に通知する際に使用します。 376 A 付 録 メンバ−: 型 名前 説明 DWORD dwVerWD CHAR KP_FUNC_OPEN cDriverName[12] funcOpen WinDriver の Kernel PlugIn ライブラリのバー ジョン。 デバイス ドライバの名前。最大 12 文字です。 ユーザーモードから WD_KernelPlugInOpen [A.12.1] を呼び出す際に WinDriver が呼び出 す KP_Open [A.13.2] カーネル モード関数。 A.14.5 KP_OPEN_CALL どの Kernel PlugIn が実装するコールバック名を定義しているかを表す構造体です。KP_Open [A.13.2] Kernel PlugIn 関数で使用されます。 Kernel PlugIn は 7 つのコールバック関数を実装可能です: funcClose − アプリケーションがドライバのインスタンスを終了したときに呼び出されます。 funcCall − アプリケーションが WD_KernelPlugInCall [A.12.3] を呼び出す際に呼び出されます。その中 にカーネル モードで実行する関数を組み込んでください (割り込みハンドラは例外です)。funcCall は渡 されたメッセージを元にどの関数を実行するかを決定します。 funcIntEnable − アプリケーションが Kernel PlugIn ハンドルを持つ WD_IntEnable [A.6.2] / InterruptEnable [A.5.21] を呼び出す際に呼び出されます。カーネル モードで起動する関数を実装します (特別な場合の割り込みハンドラは除きます)。この funcCall は、渡されるメッセージによって、どの関 数を実行するか決定します。 funcIntDisable − アプリケーションが WD_IntEnable [A.6.2] / InterruptDisable [A.5.22] を呼び出す際に呼 び出されるクリーンアップ関数です。 funcIntAtIrql − カーネル モードの割り込みハンドラです。このコールバック関数は、WinDriver がこ の Kernel PlugIn に割り当てられた割り込みを処理する際に、HIGH IRQL で呼び出されます。この関数 が 0 より大きい値を返すと、funcIntAtDpc を Deferred 処理呼び出しとして呼び出されます。 funcIntAtDpc − 割り込みハンドラのコードの大部分はこのコールバックに記述します。これは funcIntAtIrql が 0 より大きい値を返したときに呼び出されます。 funcEvent − アプリケーションが最初に Kernel PlugIn ハンドルを持つ EventRegister [A.11.2] を呼ぶ場 合、プラグ アンド プレイまたはパワー マネージメント イベントが発生する際に呼ばれます。このコー ルバック関数は、プラグ アンド プレイおよびパワー マネージメント イベントをカーネルが処理する ように実装します。 377 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド メンバー: 型 名前 説明 KP_FUNC_CLOSE funcClose カーネル内の KP_Close [A.13.3] 関数名。 KP_FUNC_CALL funcCall カーネル内の KP_Call [A.13.4] 関数名。 KP_FUNC_INT_ENABLE funcIntEnable カーネル内の KP_IntEnable [A.13.6] 関数名。 KP_FUNC_INT_DISABLE funcIntDisable カーネル内の KP_IntDisable [A.13.7] 関数名。 KP_FUNC_INT_AT_IRQL funcIntAtIrql カーネル内の KP_IntAtIrql [A.13.8] 関数名。 KP_FUNC_INT_AT_DPC funcIntAtDpc カーネル内の KP_IntAtDpc [A.13.9] 関数名。 KP_FUNC_EVENT funcEvent カーネル内の KP_Event [A.13.5] 関数名。 A.15 WinDriver ステータス / エラー コード A.15.1 はじめに 多くの WinDriver API 関数はステータス コードを返します。正常終了した場合は 0 (WD_STATUS_SUCCESS) を、異常終了した場合は 0 以外の値を返します。指定したステータス コード の意味を調べるのに Stat2Str [A.16.1] と WDL_Stat2Str を使用します。ステータス コードとその説明を以 下に示します。 A.15.2 WinDriver が返すステータス コード コード 意味 WD_STATUS_SUCCESS Success (成功) WD_STATUS_INVALID_WD_HANDLE Invalid WinDriver handle (無効な WinDriver のハンド ル) WD_WINDRIVER_STATUS_ERROR Error (エラー) WD_INVALID_HANDLE Invalid handle (無効なハンドル) WD_INVALID_PIPE_NUMBER Invalid pipe number (無効なパイプ番号) WD_READ_WRITE_CONFLICT Conflict between read and write operations (読み込みと 書き込み処理の競合) WD_ZERO_PACKET_SIZE Packet size is zero (パケット サイズが 0) WD_INSUFFICIENT_RESOURCES Insufficient resources (不十分なリソース) 378 付 録 WD_UNKNOWN_PIPE_TYPE Unknown pipe type (未知のパイプの種類) WD_SYSTEM_INTERNAL_ERROR Internal system error (内部システム エラー) WD_DATA_MISMATCH Data mismatch (データの不整合) WD_NO_LICENSE No valid license (有効なライセンスがありません) WD_INVALID_PARAMETER Invalid parameter (無効な引数) WD_NOT_IMPLEMENTED Function not implemented (実装されていない関数) WD_KERPLUG_FAILURE KernelPlugin failure (KernelPlugIn の失敗) WD_FAILED_ENABLING_INTERRUPT Failed enabling interrupt (失敗した有効な割り込み) WD_INTERRUPT_NOT_ENABLED Interrupt not enabled (有効ではない割り込み) WD_RESOURCE_OVERLAP Resource overlap (リソースの重複) WD_DEVICE_NOT_FOUND Device not found (デバイスが見つかりません) WD_WRONG_UNIQUE_ID Wrong unique ID (間違った任意の ID) WD_OPERATION_ALREADY_DONE Operation already done (処理済の処理) WD_USB_DESCRIPTOR_ERROR Usb descriptor error (USB 記述子のエラー) WD_SET_CONFIGURATION_FAILED Set configuration operation failed (失敗した設定処理 A を設定) WD_CANT_OBTAIN_PDO Cannot obtain PDO (PDO の取得ができません) WD_TIME_OUT_EXPIRED TimeOut expired (期限切れのタイムアウト) WD_IRP_CANCELED IRP operation cancelled (キャンセルされた IRP 処理) WD_FAILED_USER_MAPPING Failed to map in user space (ユーザー スペースへの割 り当ての失敗) WD_FAILED_KERNEL_MAPPING Failed to map in kernel space (カーネル スペースへの 割り当ての失敗) WD_NO_RESOURCES_ON_DEVICE No resources on the device (デバイスにリソースがあ りません) WD_NO_EVENTS No events (イベントがありません) WD_INVALID_PARAMETER Invalid parameter (不正な引数) WD_INCORRECT_VERSION Incorrect WinDriver version installed (不正な WinDriver のバージョンがインストールされていま す) WD_TRY_AGAIN Try again (再試行) 379 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド WD_INVALID_IOCTL Received an invalid IOCTL (不正な IOCTL を受信し ました) A.15.3 USBD が返すステータス コード 以下に、WinDriver ステータス コードは USB スタック ドライバから返される USBD_XXX ステータス コードに対応します。 コード 意味 USBD ステータスの種類 WD_USBD_STATUS_SUCCESS USBD: Success (成功) WD_USBD_STATUS_PENDING USBD: Operation pending (処理待ち) WD_USBD_STATUS_ERROR USBD: Error (エラー) WD_USBD_STATUS_HALTED USBD: Halted (停止) USBD ステータス コード (注意: 上記のステータスの種類とエラー コードで構成されていま す。たとえば、0XXYYYYYYL の X はステータスの種類、Y はエラーコード。同じエラー コー ドが、他のステータスの種類で現れる場合があります。) HC (ホスト コントローラ) ステータス コード (注意: WD_USBD_STATUS_HALTED のステー タスの種類を使用します。) WD_USBD_STATUS_CRC HC status: CRC WD_USBD_STATUS_BTSTUFF HC status: Bit stuffing (ビット スタッフ) WD_USBD_STATUS_DATA_TOGGLE_MISMATCH HC status: Data toggle mismatch (データ ト グルの不整合) WD_USBD_STATUS_STALL_PID HC status: PID stall (PID 停止) WD_USBD_STATUS_DEV_NOT_RESPONDING HC status: Device not responding (デバイス からの応答がありません) WD_USBD_STATUS_PID_CHECK_FAILURE HC status: PID check failed (PID のチェッ ク失敗) WD_USBD_STATUS_UNEXPECTED_PID HC status: Unexpected PID (予期せぬ PID) WD_USBD_STATUS_DATA_OVERRUN HC status: Data overrun (データの超過) WD_USBD_STATUS_DATA_UNDERRUN HC status: Data underrun (データの不足) WD_USBD_STATUS_RESERVED1 HC status: Reserved1 (予約 1) WD_USBD_STATUS_RESERVED2 HC status: Reserved2 (予約 2) 380 付 録 WD_USBD_STATUS_BUFFER_OVERRUN HC status: Buffer overrun (バッファの超過) WD_USBD_STATUS_BUFFER_UNDERRUN HC status: Buffer Underrun (バファの不足) WD_USBD_STATUS_NOT_ACCESSED HC status: Not accessed (未アクセス) WD_USBD_STATUS_FIFO HC status: Fifo A Windows の場合のみ: WD_USBD_STATUS_XACT_ERROR HC status: The host controller has set the Transaction Error (XactErr) bit in the transfer descriptor's status field (転送ディスクリプ タのステータス フィールドに、ホスト コントローラが Transaction Error (XacctErr) ビットを設定しました) WD_USBD_STATUS_BABBLE_DETECTED HC status: Babble detected (バブルを検出 しました) WD_USBD_STATUS_DATA_BUFFER_ERROR HC status: Data buffer error (データ バッ ファ エラー) Windows CE の場合のみ: WD_USBD_STATUS_NOT_COMPLETE USBD: Transfer not completed (転送が終了 しませんでした) WD_USBD_STATUS_CLIENT_BUFFER USBD: Cannot write to buffer (バッファへ 書き込みできません) すべてのプラットフォームの場合のみ: WD_USBD_STATUS_CANCELED USBD: Transfer cancelled (転送がキャンセ ルされました) 転送が停止されたエンドポイントへ送信された場合、 HCD (ホスト コントロール ドライバ) が返します: WD_USBD_STATUS_ENDPOINT_HALTED HCD: Transfer submitted to stalled endpoint (停止されたエンドポイントへ送信され た転送) ソフトウェア ステータス コード (注意: エラー ビットのみ設定): WD_USBD_STATUS_NO_MEMORY USBD: Out of memory (メモリーがありま せん) WD_USBD_STATUS_INVALID_URB_FUNCTION USBD: Invalid URB function (無効な URB 関数) WD_USBD_STATUS_INVALID_PARAMETER USBD: Invalid parameter (無効な引数) 381 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド クライアントのドライバが、未解決の転送の設定またはエンドポイント / インターフェースを 閉じる場合に返されます。 WD_USBD_STATUS_ERROR_BUSY USBD: Attempted to close endpoint/interface/configuration with outstanding transfer (未解決の転送のエン ドポイント / インターフェース / 設定を 閉じます) URB の要求を完了できない場合に USBD に返されます。基本的に、これは特定の NT のエラー コードを持つ URB のステータス項目 (Irq が完成時) に返されます。Irq ステータスは、 WinDriver の Monitor Debug メッセージ (wddebug_gui) ツールで表示されます: WD_USBD_STATUS_REQUEST_FAILED USBD: URB request failed (URB の要求失 敗) WD_USBD_STATUS_INVALID_PIPE_HANDLE USBD: Invalid pipe handle (無効なパイプ ハンドル) 要求したエンドポイントを開くのに十分な帯域幅が無い場合に返されます: WD_USBD_STATUS_NO_BANDWIDTH USBD: Not enough bandwidth for endpoint (エンドポイントに十分な帯域幅があり ません) 汎用 HC (ホスト コントローラ)エラー: WD_USBD_STATUS_INTERNAL_HC_ERROR USBD: Host controller error (ホスト コント ロール エラー) 短いパケットが転送を終了したときに返されます。たとえば、USBD_SHORT_TRANSFER_OK ビットが設定されていない場合: WD_USBD_STATUS_ERROR_SHORT_TRANSFER USBD: Transfer terminated with short packet (短いパケットで終了された転送) 要求した開始フレームが、USB フレームの USBD_ISO_START_FRAME_RANGE 内に無い場 合、返されます。(注意: 停止ビットが設定されます): WD_USBD_STATUS_BAD_START_FRAME USBD: Start frame outside range (開始フ レームが範囲外です) 等時性転送のすべてのパケットがエラーを起こして終了した場合、HCD (ホスト コントロー ラ デバイス)が返します: WD_USBD_STATUS_ISOCH_REQUEST_FAILED HCD: Isochronous transfer completed with error (エラーを起こして終了した等時性 転送) 382 付 録 A 指定した HC (ホスト コントローラ)のフレーム長コントロールがすでに他のドライバに使用 されている場合、 USBD が返します: WD_USBD_STATUS_FRAME_CONTROL_OWNED USBD: Frame length control already taken (すでに使用されているフレーム長コン トロール) 呼出し元が自分自身のフレーム長コントロールを持っておらず、HC フレーム長を解放または 修正する場合に、USBD が返します: WD_USBD_STATUS_FRAME_CONTROL_NOT_OW USBD: Attempted operation on frame length control not owned by caller (呼出し元が NED 持っていないフレーム長コントロールの 処理) USB 2.0 用に追加したエラー コードです (Windows の場合のみ) : WD_USBD_STATUS_NOT_SUPPORTED USBD: API not supported/implemented (サ ポートされていない / 実装されない API) WD_USBD_STATUS_INAVLID_CONFIGURATION_ USBD: Invalid configuration descriptor (不 正な設定ディスクリプタ) DESCRIPTOR WD_USBD_STATUS_INSUFFICIENT_RESOURCES USBD: Insufficient resources (リソースが 足りません) WD_USBD_STATUS_SET_CONFIG_FAILED USBD: Set configuration failed (設定に失敗 しました) WD_USBD_STATUS_BUFFER_TOO_SMALL USBD: Buffer too small (バッファが小さ過 ぎます) WD_USBD_STATUS_INTERFACE_NOT_FOUND USBD: Interface not found (インター フェースが見つかりません) WD_USBD_STATUS_INAVLID_PIPE_FLAGS USBD: Invalid pipe flags (不正なパイプ フ ラグ) WD_USBD_STATUS_TIMEOUT USBD: Timeout (タイムアウト) WD_USBD_STATUS_DEVICE_GONE USBD: Device gone (デバイスがありま せん) WD_USBD_STATUS_STATUS_NOT_MAPPED USBD: Status not mapped (ステータスが マップされていません) 383 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド USBD から返る拡張等時性エラー コード。 これらのエラーは、等時性転送のパケット ステータス フィールドに表示します: WD_USBD_STATUS_ISO_NOT_ACCESSED_BY_H USBD: The controller did not access the TD associated with this packet (コントローラ W が、このパケットに関連付けた TD にア クセスしませんでした) WD_USBD_STATUS_ISO_TD_ERROR USBD: Controller reported an error in the TD (コントローラが TD でエラーを報告しま した) WD_USBD_STATUS_ISO_NA_LATE_USBPORT USBD: The packet was submitted in time by the client but failed to reach the miniport in time (クライアントがパケットを送信し ましたが、ミニポートに届きませんでし た) WD_USBD_STATUS_ISO_NOT_ACCESSED_LATE USBD: The packet was not sent because the client submitted it too late to transmit (クラ イアントの転送が遅くて、パケットが届 きませんでした) A.16 ユーザーモード ユーティリティ関数 このセクションでは、さまざまな作業を実装するのに役に立つユーザーモード ユーティリティ関数を 説明します。これらのユーティリティ関数をマルチ プラットフォーム (WinDriver がサポートしてるす べてのオペレーティング システム) で実装します。 A.16.1 Stat2Str() 目的 ステータス コードに対応するステータス文字列を取得します。 プロトタイプ const char * Stat2Str(DWORD dwStatus); パラメータ 名前 dwStatus 384 型 入出力 DWORD 入力 A 付 録 説明 名前 説明 dwStatus ステータス コードの番号。 戻り値 指定したステータス コードの番号に対応するステータスの説明 (文字列) を返します。 注釈 ステータス コードと文字列の一覧は、セクション A.15 を参照してください。 A.16.2 get_os_type() 目的 オペレーティング システムの種類を取得します。 プロトタイプ OS_TYPE get_os_type(); パラメータ なし。 戻り値 オペレーティング システムの種類を返します。 オペレーティング システムの種類を検出できなかった場合、OS_CAN_NOT_DETECT を返します。 A.16.3 ThreadStart() 目的 スレッドを作成します。 プロトタイプ DWORD ThreadStart(HANDLE *phThread, HANDLER_FUNC pFunc, void *pData); パラメータ 名前 phThread 型 入出力 HANDLE * 出力 385 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド pFunc HANDLER_FUNC 入力 pData VOID * 入力 説明 名前 説明 phThread 生成したスレッドへのハンドルを返します。 pFunc 新しいスレッドを実行する際のコードの開始アドレス。 pData 新しいスレッドへ渡されるデータへのポインタ。 戻り値 成功した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、対応するエラーコードを返し ます。 A.16.4 ThreadWait() 目的 終了するスレッドを待機します。 プロトタイプ void ThreadWait(HANDLE hThread); パラメータ 名前 hThread 型 入出力 HANDLE 出力 説明 名前 説明 hThread 終了するのを待たれているスレッドへのハンドル。 戻り値 なし。 386 付 録 A A.16.5 OsEventCreate() 目的 イベント オブジェクトを生成します。 プロトタイプ DWORD OsEventCreate(HANDLE *phOsEvent); パラメータ 名前 phOsEvent 型 入出力 HANDLE * 出力 説明 名前 説明 phOsEvent 新しく生成したイベント オブジェクトへのハンドルを受信 する変数へのポインタ。 戻り値 成功した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、対応するエラーコードを返し ます。 A.16.6 OsEventClose() 目的 イベント オブジェクトへのハンドルを閉じます。 プロトタイプ void OsEventClose(HANDLE hOsEvent) パラメータ 名前 hOsEvent 型 入出力 HANDLE 入力 説明 名前 説明 hOsEvent 閉じられるイベント オブジェクトへのハンドル。 387 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 なし。 A.16.7 OsEventWait() 目的 指定したイベント オブジェクトがシグナル状態になるかまたはタイムアウトになるまで待機します。 プロトタイプ DWORD OsEventWait(HANDLE hOsEvent, DWORD dwSecTimeout) パラメータ 名前 型 入出力 hOsEvent HANDLE 入力 dwSecTimeout DWORD 入力 説明 名前 説明 hOsEvent イベント オブジェクトへのハンドル。 dwSecTimeout イベントのタイムアウト インターバル (秒単位)。 dwSecTimeout を INFINITE にすると、関数はタイムアウト になりません。 戻り値 成功した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、対応するエラーコードを返し ます。 A.16.8 OsEventSignal() 目的 指定したイベント オブジェクトをシグナル状態に設定します。 プロトタイプ DWORD OsEventSignal(HANDLE hOsEvent); 388 付 録 A パラメータ 名前 hOsEvent 型 入出力 HANDLE 入力 説明 名前 説明 hOsEvent イベント オブジェクトへのハンドル。 戻り値 成功した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、対応するエラーコードを返し ます。 A.16.9 OsEventReset() 目的 指定したイベント オブジェクトを非シグナル状態に設定します。 プロトタイプ DWORD OsEventReset(HANDLE hOsEvent); パラメータ 名前 hOsEvent 型 入出力 HANDLE 入力 説明 名前 説明 hOsEvent イベント オブジェクトへのハンドル。 戻り値 成功した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、対応するエラーコードを返し ます。 A.16.10 OsMutexCreate() 目的 mutex オブジェクトを生成します。 389 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド プロトタイプ DWORD OsMutexCreate(HANDLE *phOsMutex); パラメータ 名前 phOsMutex 型 入出力 HANDLE * 出力 説明 名前 説明 PhOsMutex 新たに生成した mutex オブジェクトへのハンドルを受信す る変数へのポインタ。 戻り値 成功した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、対応するエラーコードを返し ます。 A.16.11 OsMutexClose() 目的 mutex オブジェクトへのハンドルを閉じます。 プロトタイプ void OsMutexClose(HANDLE hOsMutex); パラメータ 名前 hOsMutex 型 入出力 HANDLE 入力 説明 名前 説明 HOsMutex 閉じられる mutex オブジェクトへのハンドル。 戻り値 なし。 390 付 録 A.16.12 A OsMutexLock() 目的 指定した mutex オブジェクトをロックします。 プロトタイプ DWORD OsMutexLock(HANDLE hOsMutex) パラメータ 名前 hOsMutex 型 入出力 HANDLE 入力 説明 名前 説明 hOsMutex ロックされる mutex オブジェクトへのハンドル。 戻り値 成功した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、対応するエラーコードを返し ます。 A.16.13 OsMutexUnLock() 目的 ロックした mutex オブジェクトを解放 (アンロック) します。 プロトタイプ DWORD OsMutexUnlock(HANDLE hOsMutex); パラメータ 名前 hOsMutex 型 入出力 HANDLE 入力 説明 名前 説明 hOsMutex アンロックされる mutex オブジェクトへのハンドル。 391 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 成功した場合、WD_STATUS_SUCCESS (0) を返します。その他の場合、対応するエラーコードを返し ます。 A.16.14 PrintDbgMessage() 目的 Debug Monitor へデバッグ メッセージを送信します。 プロトタイプ void PrintDbgMessage(DWORD dwLevel, DWORD dwSection, const char *format[, argument]...); パラメータ 名前 型 入出力 dwLevel DWORD 入力 dwSection DWORD 入力 format const char * 入力 argument 入力 説明 名前 説明 dwLevel Debug Monitor (データを宣言します) のレベルを指定しま す。dwLevel が 0 の場合、D_ERROR を宣言します。 詳細は、windrvr.h の DEBUG_LEVEL を参照してください。 dwSection Debug Monitor (データを宣言します) のセクションを指定し ます。dwSection が 0 の場合、S_MISC を宣言します。 詳細は、windrvr.h の DEBUG_SECTION を参照してくださ い。 format Format-control 文字列 argument オプション引数、最大 256 バイト。 戻り値 なし。 392 B 付 録 付録 B WinDriver USB Device Cypress EZ-USB FX2LP CY7C68013A API の リファレンス B.1 ファームウェア ライブラリの API このセクションで説明されている関数は WinDriver\wdf\cypress\FX2LP\include\wdf_cypress_lib.h ヘッダー ファイルで宣言さ れ、DriverWizard で生成された wdf_cypress_lib.c ファイル (登録ユーザーの場合)、または WinDriver\wdf\cypress\FX2LP\ wdf_cypress_fx2lp_eval.lib 評価版ファームウェア ライ ブラリ (評価版ユーザー) で実装されます。詳細は、セクション [15.4.2] を参照してください。 注意: 登録ユーザーはライブラリのソース コードを変更することができます。コードを変更する場 合、開発するボードのハードウェア要件を満たしているかどうかを確認してください (セクション [15.4.3] の注意を参照)。 B.1.1 型および一般的な定義 このセクションで説明される API は WinDriver\wdf\cypress\FX2LP\wdf_cypress_lib.h ヘッ ダー ファイルで定義されています。 EP_DIR 列挙型 エンドポイント方向の列挙型 列挙値 説明 DIR_OUT OUT 方向 (ホストからデバイスへの書き込み) DIR_IN IN 方向 (デバイスからホストへの読み取り) 393 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド EP_TYPE 列挙型 エンドポイントの型の列挙型。 エンドポイントの型は、エンドポイント上で実行される転送の種類 (バルク転送、割り込み転送、 または等時性 (アイソクロナス) 転送) を割り出します 列挙値 説明 ISOCHRONOUS 等時性エンドポイント BULK バルク エンドポイント INTERRUPT 割り込みエンドポイント EP_BUFFERING 列挙型 エンドポイント バッファリングの種類の列挙型 列挙値 説明 DOUBLE_BUFFERING ダブル バッファリング TRIPLE_BUFFERING トリプル バッファリング QUAD_BUFFERING クアドラプル (四重) バッファリング B.1.2 WDF_EP1INConfig() / WDF_EP1OUTConfig() 目的 IN 転送 (WDF_EP1INConfig()) または OUT 転送 (WDF_EPOUTConfig()) へエンドポイント 1 を設定 します。 プロトタイプ void WDF_EP1INConfig(EP_TYPE type); void WDF_EP1OUTConfig(EP_TYPE type); パラメータ 名前 type 型 入出力 EP_TYPE 入力 説明 名前 説明 type エンドポイントの転送の型 [B.1.1] 戻り値 なし 394 付 録 B B.1.3 WDF_EP2Config / WDF_EP6Config() 注意: WDF_EP2Config() および WDF_EP6Config() のプロトタイプおよび説明は、エンドポイント番号を 除いて同じです。以下のセクションではエンドポイント 2 について説明していますが、"2" を "6" に変 換すると WDF_EP6Config() の説明になります。 目的 エンドポント 2 を設定します。 プロトタイプ void WDF_EP2Config(EP_DIR dir, EP_TYPE type, EP_BUFFERING buffering, int size, int nPacketPerMF); パラメータ 名前 型 入出力 dir EP_DIR 入力 type EP_TYPE 入力 buffering EP_BUFFERING 入力 size int 入力 nPacketPerMF int 入力 説明 名前 説明 dir エンドポイントの方向 [B.1.1] type エンドポイントの転送の種類 [B.1.1] buffering エンドポイントのバッファリングの種類 [B.1.1] size エンドポイントの FIFO バッファのバイト単位でのサイズ nPacketPerMF マイクロフレームごとのパケット数 戻り値 なし B.1.4 WDF_EP4Config / WDF_EP8Config() 注意: WDF_EP4Config() および WDF_EP8Config() のプロトタイプおよび説明は、エンドポイント番号 を除いて同じです。以下のセクションではエンドポイント 4 について説明していますが、"4" を "8" に 変換するだけで WDF_EP6Config() の説明になります。 395 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 目的 エンドポント 4 を設定します。 プロトタイプ void WDF_EP4Config(EP_DIR dir, EP_TYPE type); パラメータ 名前 型 入出力 dir EP_DIR 入力 type EP_TYPE 入力 説明 名前 説明 dir エンドポイントの方向 [B.1.1] type エンドポイントの転送の種類 [B.1.1] 戻り値 なし B.1.5 WDF_FIFOReset() 目的 エンドポイントの FIFO (First In First Out) バッファをデフォルト状態に戻します。 プロトタイプ void WDF_FIFOReset(int ep); パラメータ 名前 型 入出力 ep int 入力 説明 名前 説明 ep エンドポイント番号 (アドレス) 戻り値 なし 396 付 録 B B.1.6 WDF_SkipOutPacket() 目的 受け取った OUT パケットを無視するシグナルおよびエンドポイントの FIFO (First In First Out) バッファ。 プロトタイプ void WDF_SkipOutPacket(int ep); パラメータ 名前 型 入出力 ep int 入力 説明 名前 説明 Ep エンドポイント番号 (アドレス) 戻り値 なし B.1.7 WDF_FIFOWrite() 目的 エンドポイントの FIFO (First In First Out) バッファへデータを書き込みます。 この関数は WDF_SetEPByteCount() [B.1.11] を呼び出した後に呼び出します。 プロトタイプ void WDF_FIFOWrite(int ep, BYTE buf[], int size); パラメータ 名前 型 入出力 ep int 入力 buf BYTE [ ] 入力 size int 入力 説明 名前 説明 Ep エンドポイント番号 (アドレス) buf 書き込むデータ バッファ 397 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド size 書き込むバイト数 戻り値 なし B.1.8 WDF_FIFORead() 目的 エンドポイントの FIFO (First In First Out) バッファからデータを読み取ります。 読み取るバイト数を割り出すために、この関数は WDF_GetEPByteCount() [B.1.12] を呼び出す前に呼 び出す必要があります。 プロトタイプ void WDF_FIFORead(int ep, BYTE buf[], int size); パラメータ 名前 型 入出力 ep int 入力 buf BYTE [ ] 出力 size int 入力 説明 名前 説明 ep エンドポイント番号 (アドレス) buf 読み取るデータを保持するバッファ size FIFO バッファから読み取るバイト数 戻り値 なし B.1.9 WDF_FIFOFull() 目的 エンドポイントの FIFO (First In First Out) バッファがフルかどうかを確認します。 プロトタイプ BOOL WDF_FIFOFull(int ep); 398 付 録 B パラメータ 名前 型 入出力 ep int 入力 説明 名前 説明 ep エンドポイント番号 (アドレス) 戻り値 エンドポイントの FIFO (First In First Out) バッファがフルの場合、TRUE を返します。フルでない場 合、FALSE を返します。 B.1.10 WDF_FIFOEmpty() 目的 エンドポイントの FIFO (First In First Out) バッファが空でないかを確認します。 プロトタイプ BOOL WDF_FIFOEmpty(int ep); パラメータ 名前 型 入出力 ep int 入力 説明 名前 説明 ep エンドポイント番号 (アドレス) 戻り値 エンドポイントの FIFO (First In First Out) バッファが空の場合、TRUE を返します。空でない場合、 FALSE を返します。 B.1.11 WDF_SetEPByteCount() 目的 FIFO (First In First Out) バッファのバイト カウントを設定します。 エンドポイント FIFO バッファをホストへ転送するデータでアップデートするために、この関数は WDF_FIFOWrite() [B.1.7] を呼び出す前に呼び出します。 プロトタイプ void WDF_SetEPByteCount(int ep, WORD bytes_count); 399 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 型 入出力 ep int 入力 bytes_count WORD 入力 説明 名前 説明 ep エンドポイント番号 (アドレス) bytes_count 設定するバイト カウント 戻り値 なし B.1.12 WDF_GetEPByteCount() 目的 FIFO (First In First Out) バッファの現在のバイト カウントを取得します。 読み取るバイトの量を割り出すために、この関数は WDF_FIFORead() [B.1.8] を呼び出す前に呼び出 す必要があります。 プロトタイプ WORD WDF_GetEPByteCount(int ep); パラメータ 名前 型 入出力 ep int 入力 説明 名前 説明 ep エンドポイント番号 (アドレス) 戻り値 エンドポイントの FIFO (First In First Out)のバイト カウントを返します。 400 B 付 録 B.2 DriverWizard で生成されたファームウェアの API このセクションで説明されている関数は WinDriver\wdf\cypress\FX2LP\include\periph.h ヘッダー ファイルで宣言され、ウィ ザードで定義されたデバイスの設定情報に従って DriverWizard で生成された periph.c ファイル で実装されます。 このファームウェアのエントリー ポイント (main.c の main() (ソース コードは登録ユーザーのみ に提供されます)) は、周辺のデバイスと通信するために periph.h で宣言された WDF_xxx 関数 (periph.h で実装される) を呼び出す Task Dispatcher (タスク ディスパッチャー) を実装します。 注意: 生成されたコードを変更する場合、開発するボードのハードウェア要件を満たしているかど うかを確認してください (セクション [15.4.3] の注意を参照)。 B.2.1 WDF_Init() 目的 デバイスを初期化します。 デバイスとの通信を有効にする必要な初期設定を実行するために、この関数は自動的にファーム ウェアの main() 関数から呼び出されます。 プロトタイプ void WDF_Init(void); パラメータ なし 戻り値 なし B.2.2 WDF_Poll() 目的 FIFO データ用のデバイスをポーリングします。 Task Dispatcher はデバイスが動作していない間、この関数を繰り返し呼び出します。 プロトタイプ void WDF_Poll(void); パラメータ なし 戻り値 なし 401 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド B.2.3 WDF_Suspend() 目的 この関数は、デバイスがサスペンド モードになる前に Task Dispatcher により呼び出されます。 プロトタイプ BOOL WDF_Suspend(void); パラメータ なし 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 B.2.4 WDF_Resume() 目的 この関数は、デバイスが活動を再開した後 Task Dispatcher により呼び出されます。 プロトタイプ BOOL WDF_Resume(void); パラメータ なし 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 B.2.5 WDF_GetDescriptor() 目的 この関数は、GET DESCRIPTOR コマンドを受け取ったとき Task Dispatcher により呼び出されま す。 プロトタイプ BOOL WDF_GetDescriptor(void); パラメータ なし 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 402 付 録 B B.2.6 WDF_SetConfiguration() 目的 この関数は、SET CONFIGURATION コマンドを受け取ったとき Task Dispatcher により呼び出され ます。 プロトタイプ BOOL WDF_SetConfiguration(BYTE config); パラメータ 名前 config 型 入出力 BYTE 入力 説明 名前 説明 config 設定する設定番号 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 B.2.7 WDF_GetConfiguration() 目的 この関数は、GET CONFIGURATION コマンドを受け取ったとき Task Dispatcher により呼び出され ます。 プロトタイプ BOOL WDF_GetConfiguration(void); パラメータ なし 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 B.2.8 WDF_SetInterface() 目的 この関数は、SET INTERFACE コマンドを受け取ったとき Task Dispatcher により呼び出されます。 プロトタイプ BOOL WDF_SetInterface(BYTE ifc, BYTE alt_set); 403 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド パラメータ 名前 型 入出力 ifc BYTE 入力 alt_set BYTE 入力 説明 名前 説明 ifc 設定するインターフェース番号 alt_set 控えの設定番号 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 B.2.9 WDF_GetInterface() 目的 この関数は、GET INTERFACE コマンドを受け取ったとき Task Dispatcher により呼び出されます。 プロトタイプ BOOL WDF_GetInterface(BYTE ifc); パラメータ 名前 ifc 型 入出力 BYTE 入力 説明 名前 説明 ifc インターフェース番号 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 B.2.10 WDF_GetStatus() 目的 この関数は、GET STATUS コマンドを受け取ったとき Task Dispatcher により呼び出されます。 プロトタイプ BOOL WDF_GetStatus(void); 404 付 録 B パラメータ なし 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 B.2.11 WDF_ClearFeature() 目的 この関数は、CLEAR FEATURE コマンドを受け取ったとき Task Dispatcher により呼び出されます。 プロトタイプ BOOL WDF_ClearFeature(void); パラメータ なし 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 B.2.12 WDF_SetFeature() 目的 この関数は、SET FEATURE コマンドを受け取ったとき Task Dispatcher により呼び出されます。 プロトタイプ BOOL WDF_SetFeature(void); パラメータ なし 戻り値 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 B.2.13 WDF_VendorCmnd() 目的 この関数は、ベンダー特有のコマンドを受け取ったとき Task Dispatcher により呼び出されます。 プロトタイプ BOOL WDF_VendorCmnd(void); パラメータ なし 405 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド RETURN VALUE 成功した場合、TRUE を返します。失敗した場合、FALSE を返します。 406 付 録 C 付録 C WinDriver USB Device Silicon Laboratories C8051F320 API の リファレンス C.1 ファームウェア ライブラリの API このセクションで説明されている関数は WinDriver\wdf\silabs\F320\ include\wdf_silabs_lib.h ヘッダー ファイルで宣言さ れ、DriverWizard で生成された wdf_silabs_lib.c ファイル (登録ユーザーの場合)、または WinDriver\wdf\silabs\F320 wdf_silabs_f320_eval.lib 評価版ファームウェア ライブ ラリ (評価版ユーザー) で実装されます。詳細は、セクション [15.4.2] を参照してください。 注意: 登録ユーザーはライブラリのソース コードを変更することができます。コードを変更する場 合、開発するボードのハードウェア要件を満たしているかどうかを確認してください (セクション [15.4.3] の注意を参照)。 C.1.1 wdf_silabs_lib.h の型および一般的な定義 このセクションで定義されている API は WinDriver\wdf\silabs\F320\wdf_silabs_lib.h ヘッ ダー ファイルで定義されています。 EP_DIR 列挙型 エンドポイント方向の列挙型 列挙値 説明 DIR_OUT OUT 方向 (ホストからデバイスへの書き込み) DIR_IN IN 方向(デバイスからホストへの読み取り) EP_TYPE列挙型 エンドポイントの型の列挙型。 エンドポイントの型は、エンドポイント上で実行される転送の種類 (バルク転送、割り込み転送、 または等時性 (アイソクロナス) 転送) を割り出します。 407 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド EP_BUFFERING 列挙型 エンドポイント バッファリングの型の列挙型 列挙値 説明 NO_BUFFERING バッファリングなし DOUBLE_BUFFERING ダブル バッファリング EP_SPLIT 列挙型 エンドポイントの FIFO (First In First Out) バッファ スプリット モードの列挙型 列挙値 説明 NO_SPLIT エンドポイントの FIFO バッファをスプリットしません SPLIT エンドポイントの FIFO バッファをスプリットします C.1.2 c8051f320.h の型および一般的な定義 このセクションで定義されている API は WinDriver\wdf\silabs\F320\c8051f320.h ヘッダー ファイルで定義されています。 エンドポイント アドレスの定義 以下のプリプロセッサの定義はエンドポイントのアドレス (番号) を示します。 #定義値 説明 EP1_IN エンドポイント 1、IN 方向 - アドレス 0x81 EP1_OUT エンドポイント 1、OUT 方向 - アドレス 0x01 EP2_IN エンドポイント 2、IN 方向 - アドレス 0x82 EP2_OUT エンドポイント 2、OUT 方向 - アドレス 0x02 EP3_IN エンドポイント 3、IN 方向 - アドレス 0x83 EP3_OUT エンドポイント 3、OUT 方向 - アドレス 0x03 エンドポイントの状況の定義 以下のプリプロセッサの定義はエンドポイントの状態を示します。 #定義値 説明 EP_IDLE エンドポイントは作動していません。 EP_TX エンドポイントはデータを転送しています。 EP_ERROR エンドポイントでエラーが発生しました。 408 付 録 EP_HALTED エンドポイントは停止されました。 EP_RX エンドポイントはデータを受信しています。 EP_NO_CONFIGURED エンドポイントは設定されていません。 C EP_INT_HANDLER 関数のポインタ エンドポイント割り込み処理関数のポインタの型。 typedef void (*EP_INT_HANDLER)(PEP_STATUS); EP0_COMMAND エンドポイント (パイプ 0) ホスト コマンドの情報構造体の型を管理します。 この構造体は以下のメンバーで構成されています。 名前 型 説明 bmRequestType BYTE 要求の種類: ビット 7: 要求方向 (0= ホストからデバイスへ Out、1= デバイスからホストへ - In) ビット 5-6: 要求の種類 (0= スタンダード、1= クラ ス、2= ベンダー、3= リザーブ) ビット 0-4: 受信箇所 (0= デバイス、1= インター フェース、2= エンドポイント、3= その他) bRequest BYTE 特定の要求 wValue WORD 要求によって異なる WORD サイズの値 wIndex WORD 要求によって異なる WORD サイズの値。通常、こ の値はエンドポイントまたはインターフェースを 特定するために使用されます。 wLength WORD 要求用のデータ セグメントのバイト単位での長 さ。例えば、データ ステージがある場合の転送す るバイト数など。 EP_STATUS 構造体 IN、OUT、およびエンドポイント 0 (コントロール) 要求で使用されるエンドポイントの状況情報構 造体の型。 この構造体は以下のメンバーで構成されています。 名前 型 説明 bEp BYTE エンドポイントのアドレス [C.1.2] uNumBytes UINT 転送に利用できるバイト数 409 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド uMaxP UINT 最大のパケット サイズ bEpState BYTE エンドポイントの状態 pData void* エンドポイントへ/からの転送データに使用される データ バッファへのポインタ wData WORD pfIsr EP_INT_HANDLE 割り込みサービス ルーチン (ISR) [C.1.2] 小さいデータ パケット用のストレージ R PEP_STATUS 構造体のポインタ EP_STATUS 構造体 [C.1.2] へのポインタ。 IF_STATUS 構造体 インターフェースの状況構造体の型。 この構造体は以下のメンバーで構成されています。 名前 型 説明 bNumAlts BYTE インターフェースのための代替設定の数 bCurrentAlt BYTE 現在アクティブなインターフェースのための代替 設定 bIfNumber BYTE インタフェース番号 PIF_STATUS 構造体のポインタ IF_STATUS 構造体へのポインタ C.1.3 WDF_EPINConfig() 目的 IN 転送用のエンドポイント 1-3 を設定します。 プロトタイプ void WDF_EPINConfig(PEP_STATUS pEpStatus, BYTE address, EP_TYPE type, int maxPacketSize, EP_INT_HANDLER pfIsr, EP_BUFFERING buffering, EP_SPLIT splitMode); パラメータ 名前 型 入出力 pEpStatus PEP_STATUS 出力 address BYTE 入力 410 付 録 type EP_TYPE 入力 maxPacketSize int 入力 pfIsr EP_INT_HANDLER 入力 buffering EP_BUFFERING 入力 splitMode EP_SPLIT 入力 C 説明 名前 説明 pEpStatus エンドポイントの状況情報構造体 [C.1.2] へのポインタ。こ の関数は関連した状況情報で構造体をアップデートしま す。 address エンドポイントのアドレス [C.1.2] type エンドポイントの転送の種類 [C.1.1] maxPacketSize エンドポイントの最大のパケット サイズ pfIsr エンドポイントの割り込みハンドラ [C.1.2] buffering エンドポイントのバッファリングの種類 [C.1.1] splitMode エンドポイントのスプリット モード [C.1.1] 戻り値 なし C.1.4 WDF_EPOUTConfig() 目的 OUT 転送用のエンドポイント 1-3 を設定します。 プロトタイプ void WDF_EPOUTConfig(PEP_STATUS pEpStatus, BYTE address, EP_TYPE type, int maxPacketSize, EP_INT_HANDLER pfIsr, EP_BUFFERING buffering); パラメータ 名前 型 入出力 pEpStatus PEP_STATUS 出力 address BYTE 入力 type EP_TYPE 入力 411 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド maxPacketSize int pfIsr EP_INT_HANDLER 入力 buffering EP_BUFFERING 入力 入力 説明 名前 説明 pEpStatus エンドポイントの状況情報構造体 [C.1.2] へのポインタ。こ の関数は関連した状況情報で構造体をアップデートしま す。 address エンドポイントのアドレス [C.1.2] type エンドポイントの転送の種類 [C.1.1] maxPacketSize エンドポイントの最大のパケット サイズ pfIsr エンドポイントの割り込みハンドラ [C.1.2] buffering エンドポイントのバッファリングの種類 [C.1.1] 戻り値 なし C.1.5 WDF_HaltEndpoint() 目的 エンドポイントを停止します。 プロトタイプ BYTE WDF_HaltEndpoint(PEP_STATUS pEpStatus); パラメータ 名前 pEpStatus 型 入出力 PEP_STATUS 入力/出力 説明 名前 説明 pEpStatus エンドポイントの状況情報構造体 [C.1.2] へのポインタ 戻り値 エンドポイントの状態 [C.1.2] を返します。 412 付 録 C C.1.6 WDF_EnableEndpoint() 目的 エンドポイントを有効にします。 プロトタイプ BYTE WDF_EnableEndpoint(PEP_STATUS pEpStatus); パラメータ 名前 pEpStatus 型 入出力 PEP_STATUS 入力/出力 説明 名前 説明 pEpStatus エンドポイントの状況情報構造体 [C.1.2] へのポインタ 戻り値 エンドポイントの状態 [C.1.2] を返します。 C.1.7 WDF_SetEPByteCount() 目的 FIFO (First In First Out) バッファのバイト カウントを設定します。 エンドポイント FIFO バッファをホストへ転送するデータでアップデートするために、この関数は WDF_FIFOWrite() [C.1.12] を呼び出す前に呼び出します。 プロトタイプ void WDF_SetEPByteCount(BYTE bEp, UINT bytes_count); パラメータ 名前 型 入出力 bEp BYTE 入力 bytes_count UINT 入力 説明 名前 説明 bEp エンドポイントのアドレス [C.1.2] bytes_count 設定するバイト カウント 413 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 なし C.1.8 WDF_GetEPByteCount() 目的 FIFO (First In First Out) バッファの現在のバイト カウントを取得します。 読み取るバイトの量を割り出すために、この関数は WDF_FIFORead() [C.1.13] を呼び出す前に呼び 出す必要があります。 プロトタイプ UINT WDF_GetEPByteCount(BYTE bEp); パラメータ 名前 bEp 型 入出力 BYTE 入力 説明 名前 説明 bEp エンドポイントのアドレス [C.1.2] 戻り値 エンドポイントの FIFO バイト カウントを返します。 C.1.9 WDF_FIFOClear() 目的 エンドポイントの FIFO (First In First Out) バッファを空にします。 プロトタイプ void WDF_FIFOClear(BYTE bEp); パラメータ 名前 bEp 型 入出力 BYTE 入力 説明 名前 説明 bEp エンドポイントのアドレス [C.1.2] 戻り値 なし 414 付 録 C C.1.10 WDF_FIFOFull() 目的 エンドポイントの FIFO (First In First Out) バッファがフルかどうかを確認します。 プロトタイプ BOOL WDF_FIFOFull(BYTE bEp); パラメータ 名前 bEp 型 入出力 BYTE 入力 説明 名前 説明 bEp エンドポイントのアドレス [C.1.2] 戻り値 エンドポイントの FIFO (First In First Out) バッファがフルの場合、TRUE を返します。フルでない場 合、FALSE を返します。 C.1.11 WDF_FIFOEmpty() 目的 エンドポイントの FIFO (First In First Out) バッファが空でないかを確認します。 プロトタイプ BOOL WDF_FIFOEmpty(BYTE bEp); パラメータ 名前 bEp 型 入出力 BYTE 入力 説明 名前 説明 bEp エンドポイントのアドレス [C.1.2] 戻り値 エンドポイントの FIFO (First In First Out) バッファが空の場合、TRUE を返します。空でない場合、 FALSE を返します。 415 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド C.1.12 WDF_FIFOWrite() 目的 エンドポイントの FIFO (First In First Out) バッファへデータを書き込みます。 この関数は WDF_SetEPByteCount() [C.1.7] を呼び出した後に呼び出します。 プロトタイプ void WDF_FIFOWrite (BYTE bEp, UINT uNumBytes, BYTE *pData); パラメータ 名前 型 入出力 bEp BYTE 入力 pData BYTE* 入力 uNumBytes UINT 入力 説明 名前 説明 bEp エンドポイントのアドレス [C.1.2] pData 書き込むデータ バッファ uNumBytes 書き込むバイト数 戻り値 なし C.1.13 WDF_FIFORead() 目的 エンドポイントの FIFO (First In First Out) バッファからデータを読み取ります。 読み取るバイト数を割り出すために、この関数は WDF_GetEPByteCount() [C.1.8] を呼び出す前に呼 び出す必要があります。 プロトタイプ void WDF_FIFORead (BYTE bEp, UINT uNumBytes, BYTE *pData); パラメータ 名前 型 入出力 bEp BYTE 入力 pData BYTE* 出力 uNumBytes UINT 入力 416 付 録 C 説明 名前 説明 bEp エンドポイントのアドレス [C.1.2] pData 読み取るデータを保持するバッファ uNumBytes FIFO バッファから読み取るバイト数 戻り値 なし C.1.14 WDF_GetEPStatus() 目的 エンドポイントの状況情報を取得します。 プロトタイプ PEP_STATUS WDF_GetEPStatus(BYTE bEp); パラメータ 名前 bEp 型 入出力 BYTE 入力 説明 名前 説明 bEp エンドポイントのアドレス [C.1.2] 戻り値 エンドポイントの状況情報 [C.1.2] を保持する構造体へのポインタを返します。 C.2 DriverWizard で生成されたファームウェアの API このセクションで説明されている関数は WinDriver\wdf\silabs\F320\include\periph.h ヘッダー ファイルで宣言され、ウィザードで設定されたデバイス設定情報に従って、DriverWizard で 生成された periph.c ファイルで実装されます。 注意: 生成されたコードを変更する場合、開発するボードのハードウェア要件を満たしているかど うかを確認してください (セクション [15.4.3] の注意を参照)。 C.2.1 WDF_USBReset() 目的 デバイスの状況情報をゼロ (0) に初期化し、すべてのエンドポイントをリセットします。 417 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド プロトタイプ void WDF_USBReset(void); パラメータ なし 戻り値 なし C.2.2 WDF_SetAddressRequest() 目的 SET ADDRESS 要求を処理します。 プロトタイプ void WDF_SetAddressRequest(void); パラメータ None 戻り値 None C.2.3 WDF_SetFeatureRequest() 目的 SET FEATURE 要求を処理します。 プロトタイプ void WDF_SetFeatureRequest(void); パラメータ なし 戻り値 なし C.2.4 WDF_ClearFeatureRequest() 目的 CLEAR FEATURE 要求を処理します。 プロトタイプ void WDF_ClearFeatureRequest(void); 418 付 録 C パラメータ なし 戻り値 なし C.2.5 WDF_SetConfigurationRequest() 目的 SET CONFIGURATION 要求を処理します。 プロトタイプ void WDF_SetConfigurationRequest(void); パラメータ なし 戻り値 なし C.2.6 WDF_SetDescriptorRequest() 目的 SET DESCRIPTOR 要求を処理します。 プロトタイプ void WDF_SetDescriptorRequest(void); パラメータ なし 戻り値 なし C.2.7 WDF_SetInterfaceRequest() 目的 SET INTERFACE 要求を処理します。 プロトタイプ void WDF_SetInterfaceRequest(void); パラメータ なし 419 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 戻り値 なし C.2.8 WDF_GetStatusRequest() 目的 GET STATUS 要求を処理します。 プロトタイプ void WDF_GetStatusRequest(void); パラメータ なし 戻り値 なし C.2.9 WDF_GetDescriptorRequest() 目的 GET DESCRIPTOR 要求を処理します。 プロトタイプ void WDF_GetDescriptorRequest(void); パラメータ なし 戻り値 なし C.2.10 WDF_GetConfigurationRequest() 目的 GET CONFIGURATION 要求を処理します。 プロトタイプ void WDF_GetConfigurationRequest(void); パラメータ なし 戻り値 なし 420 付 録 C C.2.11 WDF_GetInterfaceRequest() 目的 GET INTERFACE 要求を処理します。 プロトタイプ void WDF_GetInterfaceRequest(void); パラメータ なし 戻り値 なし 421 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド 付録 D トラブルシューティングとサポート 開発者向けの技術情報が Web サイト http://www.xlsoft.com/jp/products/windriver/products.html より参照で きます。以下の文書がありますので、参考にしてください。 • テクニカル ドキュメント • FAQ • サンプル コード • クイック スタート ガイド 422 付 録 E 付録 E 評価版 (Evaluation version) の制限 Windows 98 / Me および NT / 2000 / XP / Server 2003 毎回 WinDriver を起動すると評価版であることを示すメッセージが表示されます。 DriverWizard を使用する際に、評価版を起動していることを知らせるメッセージのダイアログ ボックスが、ハードウェアと相互作用するたびに表示されます。 WinDriver は最初のインストールから 30 日間だけ使用可能です。 Windows CE 毎回 WinDriver を起動すると評価版であることを示すメッセージが表示されます。 WinDriver CE Kernel (windrvr6.dll) は 1 度に 60 分間まで動作します。 Windows 2000/XP/Server 2003 上の WinDriver CE エミュレータは 30 日後に動作しなくなりま す。 Linux 毎回 WinDriver を起動すると評価版であることを示すメッセージが表示されます。 DriverWizard を使用を使用する際に、評価版を起動していることを知らせるメッセージのダイ アログ ボックスが、ハードウェアと相互作用するたびに表示されます。 Linux カーネルは 1 度に 60 分間まで動作します。 WinDriver を継続して使用するには、次のコマンドを使用して WinDriver カーネル モジュール をリロード (モジュールの削除および挿入) します。 削除するには: /sbin# rmmod 挿入するには: /sbin# insmod 上記のコマンドのためのパラメータ: "windrvr6" (インストールに成功した場合)。 Solaris 毎回 WinDriver を起動すると評価版であることを示すメッセージが表示されます。 DriverWizard を使用する際に、評価版を起動していることを知らせるメッセージのダイアログ ボックスが、ハードウェアと相互作用するたびに表示されます。 423 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド Soraris カーネルは 1 度に 60 分間まで動作します。 WinDriver を継続して使用するには、次のコマンドを使用して WinDriver カーネル モジュール をリロード (モジュールの削除および挿入) します。 削除するには: /usr/sbin$ rem_drv 挿入するには: /usr/sbin$ add_drv 上記のコマンドのためのパラメータ: "windrvr6" (インストールに成功した場合) VXWorks VXWorks カーネルは 1 度に 60 分間まで動作します。 継続して使用するには、システムを再起動する必要があります。 DriverWizard GUI 毎回 WinDriver を起動すると評価版であることを示すメッセージが表示されます。 DriverWizard を使用する際に、評価版を起動していることを知らせるメッセージのダイアログ ボックスが、ハードウェアと相互作用するたびに表示されます。 424 付 録 F 付録 F WinDriver の購入 必要な WinDriver の製品を選択してください。 Windows 98 / Me / NT / 2000 / XP / XP Embedded / Server 2003 の PCI / PCMCIA / CardBus / ISA / / ISAPnP / CompactPCI および PCI Express 用のデバイスドライバを作成する場合、「WinDriver for Windows」を選択します。 Windows 98 / Me / 2000 / XP / XP Embedded / Server 2003 の USB 用のデバイスドライバを作成す る場合、「WinDriver USB for Windows」を選択します。 USB デバイスのファームウェアを作成する場合、「WinDriver USB Device」を選択します。 Windows CE をサポートする場合、「WinDriver for CE」を選択します。 Linux をサポートする場合、「WinDriver for Linux」を選択します。 Solaris をサポートする場合、「WinDriver for Solaris」を選択します Windows の [スタート] メニューの [プログラム] - [WinDriver] - [Order Form] にある申込用紙に記入し、 電子メール、ファックス、または郵送してください。 WinDriver のライセンスを電子メール、またはファックスで返信致します。 お問い合わせ先: エクセルソフト株式会社 〒108 - 0014 東京都港区芝 5 - 1 - 9 ブゼンヤビル 4F Phone: 03 - 5440 - 7875 メール: xlsoftkk@xlsoft.com Fax: 03 - 5440 - 7876 ホームページ: http://www.xlsoft.com/ 425 W I N D R I V E R ユ ー ザ ー ズ ガ イ ド ドライバの配布 ‐ 法律問題 WinDriver は、開発者ごとにライセンスされます。WinDriver ライセンスは一台のマシンで一人の開発 者が無制限の数のドライバを開発し、ロイヤリティなしで作成したドライバを配布することを許可し ます。 windrvr.h ファイル は配布できません。WinDriver の機能を説明した如何なるソース ファイルの配布も できません。WinDriver のライセンス契約書については、WinDriver\docs\license.txt ファイルを参照して ください。 426 WinDriver ユーザーズ ガイド 2005 年 4 月 18 日 発行 エクセルソフト株式会社 〒108-0014 東京都港区芝5-1-9 ブゼンヤビル4F TEL 03-5440-7875 FAX 03-5440-7876 E-MAIL: xlsoftkk@xlsoft.com ホームページ: http://www.xlsoft.com/ Copyright Jungo Ltd. All Rights Reserved. Translated by 米国 XLsoft Corporation 12K Mauchly Irvine, CA 92618 USA URL: http://www.xlsoft.com/ E-Mail: xlsoft@xlsoft.com 427
© Copyright 2024 Paperzz