WinDriver USB

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: [email protected]
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:
[email protected]
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
メール: [email protected]
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: [email protected]
ホームページ: 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: [email protected]
427