USB に関する FAQ: 中級レベル最終更新日: 2008年 10月 20日 このペーパーでは、Microsoft Windows 用 USB デバイスおよびドライバーの開発について、よく寄せられる質問に回答しています。 目次
はじめに
Windows 98 以降のバージョンには、ユニバーサル シリアル バス (USB) デバイス用のネイティブ サポートが含まれています。ここでは、Windows でサポートされている USB スタックと USB の機能について、中級レベルの詳細情報を必要としているドライバー開発者からよく寄せられる質問への回答を載せました。 USB デバイスやドライバーのサポートに関するその他のドキュメントについては、USB に関する FAQ: 初級レベル、Windows Driver Kit (WDK) の最新バージョン、および USB アーキテクチャとドライバー サポートの Web ページ http://msdn.microsoft.com/ja-jp/windows/hardware/gg463155.aspxを参照してください。 注:特に指定のない限り、このペーパー内の情報は、Windows 2000 以降のオペレーティング システムに適用されます。 Windows でのサポートと USB
このセクションでは、Windows が USB をどのようにサポートするかについての一般的な質問に回答します。 私の USB 2.0 ハブは単一 TT とマルチ TT のどちらですか。USB 2.0 ハブには、ダウンストリーム側のすべてのポートに対して 1 つのトランザクション トランスレーター (TT) を持つことができるハブ (単一 TT) と、ダウンストリーム側の各ポートに対して 1 つの TT を持つことができるハブ (マルチ TT) があります。 USB デバイス ディスクリプタの bDeviceProtocolフィールドおよび USB インターフェイス ディスクリプタの bInterfaceProtocolフィールドの値は、ハブが単一 TT とマルチ TT のどちらであるかを示します。
Usbhub.sys は、この設定を使用して、マルチ TT モードまたは単一 TT モードを有効にします。Windows XP 以降において、Usbhub.sys は、マルチ TT ハブでマルチ TT モードを常に有効にします。 TT レイアウトの詳細については、USB 2.0 仕様のセクション 11.14.1.3 および 11.23.1 を参照してください。この仕様は、http://www.usb.org/developers/docs どのような文字またはバイト値を USB シリアル番号に使用できますか。USB デバイス ディスクリプタの iSerialNumberフィールドは、デバイスがシリアル番号を持っているかどうか、またその番号がどこに格納されるかを示します。
デバイスにシリアル番号がある場合、シリアル番号により、同じデバイスの各インスタンスが一意に識別される必要があります。たとえば、2 つのデバイス ディスクリプタが idVendor、idProduct、および bcdDeviceの各フィールドで同じ値の場合、iSerialNumberフィールドでは値が異なり、互いに識別される必要があります。 プラグ アンド プレイでは、USB シリアル番号の毎バイトが有効である必要があります。1 バイトでも無効な場合、Windows はそのシリアル番号を破棄し、デバイスはシリアル番号がないものとして扱われます。 次のバイト値は、USB シリアル番号で有効ではありません。
iSerialNumber 値についての詳細は、USB 2.0 仕様のセクション 9.6.1 を参照してください。 どの LANGID が、Windows のローカライズ版ビルドの文字列要求で使用されますか。USB デバイスは、USB デバイス ディスクリプタの iSerialNumber フィールドをシリアル番号の string インデックスに設定することにより、シリアル番号の存在を示します。シリアル番号を取得するため、Windows は 0x0409 (英語 (米国)) に設定されている言語識別子 (LANGID) を使って、文字列要求を発行します。Windows では、他の言語にローカライズされる Windows の バージョンであっても、常にこの LANGID を使用して USB シリアル番号を取得します。 どのLANGID が、デバイスのシリアル番号を展開するために使用されますか。USB デバイスは、USB デバイス ディスクリプタの iSerialNumber フィールドをシリアル番号の string インデックスに設定することにより、シリアル番号の存在を示します。シリアル番号を取得するため、Windows は 0x0409 (英語 (米国)) に設定されている言語識別子 (LANGID) を使って、文字列要求を発行します。Windows では、他の言語にローカライズされる Windows の バージョンであっても、常にこの LANGID を使用して USB シリアル番号を取得します。 IsDeviceHighSpeed 関数は何を示しますか。IsDeviceHighSpeed バス ドライバー・インターフェイス関数は、現在のツリー トポロジにおけるデバイスの実際の動作モードを返します。Hi-Speed をサポートするデバイスが USB 1.1 ハブまたは Full Speed ホスト コントローラーに接続されている場合、この関数は、デバイスが Full Speed で動作していることを示します。詳細については、WDK 内の関数のリファレンス ページを参照してください。 各 Windows バージョンの USB 転送の最大サイズはいくつですか。「各種オペレーティング システムにおける USB 転送の最大サイズ」 を参照してください。 どのように番号を複合デバイスの複数のインターフェイスに割り当てる必要がありますか。Windows は、初期設定の複数のインターフェイスを含む USB デバイスを、複合デバイスとして扱います。
インターフェイス番号に関するその他の情報については、下記のリソース セクションで一覧表示される「Composite USB devices whose interfaces are not sequentially numbered do not work in Windows XP" listed in the Resources section below」を参照してください。 Windows のすべてのバージョンで、インターフェイスの代替設定は次のように割り当てられる必要があります。
代替設定についての詳細情報については、USB 2.0 仕様の 9.6.5 セクションを参照してください。 SB 複合デバイスは、どの親ドライバーを読み込む必要がありますか。Windows では、Windows 98 以降、USB 複合デバイスをサポートしています。Usbhub.sys は、下記の OS に対する複合デバイスに対応しています。
Windows Millennium Edition (Me) で、複合デバイスの新しいドライバーである Usbccgp.sys がリリースされました。Usbccgp.sys は、下記の OS に対する複合デバイスに対応しています。
現在でも、これらの Windows バージョンで複合デバイスの親ドライバーとして Usbhub.sys を読み込むことができることもありますが、お勧めしません。Usbccgp.sys を使用してください。複合デバイスの正しいドライバーを確実に読み込むには、INF ファイル内で次のように Include と Needsディレクティブを使用します。 Include = USB.INF 重要:複合デバイス ドライバーとして Usbhub.sys を誤って参照する INF は、将来的にハードウェア互換性テストに Fail する可能性があります。複合デバイスを持っている場合は、Usbhub.sys の代わりに Usbccgp.sys を参照する必要があります。 詳細については、WDK で「USB Common Class Generic Parent Driver」 を参照してください。 Usbccgp.sys によって生じた主な制限は何ですか。Usbccgp.sys によってハードウェア デバイスやドライバーで生じた主な制限は、次のとおりです。
Usbccgp はUSB コア バイナリのデバッグはどうすれば有効にできますか。カーネル デバッグを可能にするには:
表 1. カーネル デバッグ設定 (Windows 2000)
表 2. カーネル デバッグ設定 (Windows XP および Windows Server 2003)
USB コア スタックのデバッグの詳細については、「さまざまなドライバーやサブシステムで詳細なデバッグ トレースを有効にする方法」を参照してください。 Windows XP 以降のバージョンの Windows で、バグチェック コード 0xFE はどういう意味ですか。http://msdn.microsoft.com/en-us/library/ms797153.aspxを参照してください。 USB コア スタックのデバッグの詳細については、最新の WDK と Windows 用デバッグ ツールに含まれるドキュメントを参照してください。 EHCI 仕様でまだ実装されていないのは、どの機能ですか。Windows XP は、Enhanced Host Controller Interface (EHCI) 仕様の複数の機能をサポートしていますが、実装されていない機能もいくつかあります。下記をご覧ください。
これらの機能は、Windows の将来のバージョンでサポートされる可能性があります。 Windows は Interface Association Descriptor をサポートしますか。はい。USB 2.0 Interface Association Descriptor (IAD) Engineering Change Notification (ECN) では、1 つのファンクション内で複数のインターフェイス、およびそれらの代替設定のグループ化を記述するための新しい標準方法が導入されています。IAD を利用することにより、単一ファンクション内で、複数の連続するインターフェイスおよび代替設定を識別できます。 Microsoft は現在、IHV と共同で、IAD をサポートするデバイスを開発しています。下記のオペレーティング システムには、IAD のサポートがあります。
IAD の詳細については、下記のリソース セクションで「Windows での USB Interface Association Descriptor のサポート」を参照してください。 USB スタックは、URB で、MDL を処理しますか。いいえ。この機能は、Windows に含まれている USB スタックではサポートされていません。 ドライバーは、IRP に複数の URB を持つことができますか。いいえ。この機能は、Windows に含まれている USB スタックではサポートされていません。 Windows は USB コンポジット ハブ をサポートしますか。コンポジット USB デバイス (多機能 USB デバイスとも呼ばれる) は、各々独立デバイスとして扱うことができる複数の機能を公開します。システムは、各デバイス機能の親ドライバーとしてサービスするように、USB 汎用親ドライバー、Usbccgp.sys をロードします。USB 汎用親ドライバーは、あたかも分離した USB デバイスのように複合デバイスの機能を列挙し、PDO を作成し、各機能用のデバイス スタックを構築します。 コンポジット USB デバイスは、ハブとしてサービスする機能を公開できません。Windows ではそのようなハブは適切に列挙されず、そのデバイスのインストールを試みるとシステム クラッシュを引き起こす場合があります。 カーネル デバッグ用の USB 2.0 接続の使用
USB 2.0 は、デバッグ ホストを対象コンピューターへ接続するための、シリアルおよび 1394 の通信リンクに代わる選択肢です。FAQ のこのセクションは、USB 2.0 カーネル デバッグについての質問に回答します。 Windows のどのバージョンが、USB 2.0 カーネル デバッグをサポートしていますか。USB 2.0 カーネル デバッグは、現在 Windows Vista 以降のバージョンでサポートされています。 どのシステムのサポートが USB 2.0 カーネル デバッグに必要ですか。USB 2.0 カーネル デバッグには、次のシステムのサポートが必要です。
注:Usbview.exe は Windows のデバッグ ツールに含まれるユーティリティです。これにより、コントローラーの各ポートに接続しているデバイスと同様に、コンピューターの USB コントローラーを表示できます。 EHCI コントローラーがカーネル デバッグをサポートしているかどうかをどのように判定しますか。それらがコントローラーの PCI 構成空間でその機能をサポートすることを報告するために、デバッグ ポートを実装する USB コントローラーがサポートされています。残念ながら現時点では、この情報をユーザーへの報告するために利用可能なソフトウェアはありません。 すべての Intel EHCI コントローラーは、PORT1 上の USB カーネル デバッグをサポートします。 対象のコンピューターに複数の EHCI コントローラーがあった場合、どうなりますか。対象のコンピューターに複数の EHCI コントローラーがあった場合、カーネル デバッグに使用すべきコントローラーを指定する必要があります。そうしないと、あるコントローラーのデバッグ ポート コネクタに USB デバッグ ケーブルが差し込まれているのに、対象のコンピューター上のオペレーティング システムが別の EHCI コントローラーのデバッグ ポートを使用しようとする場合があります。テスト コンピューターに複数の EHCI コントローラーがある場合、カーネル デバッグに使用するコントローラーを指定しないと、USB カーネル デバッグは通常機能しません。 カーネル デバッグに使用する EHCI コントローラーを指定するには、対象のコンピューターのコマンド プロンプト ウィンドウに昇格した権限で下記を入力します。 bcdedit -set {current} loadoptions busparams=x.y.z x、y、および z の値は、カーネル デバッグに使用される EHCI コントローラーのバス、デバイス、および機能番号から計算されます。この情報はデバイス マネージャーから、下記の手順で取得できます。
これにより、対象のコンピューター上のオペレーティング システムは、コンピューターの特定の場所にあるカーネル デバッグ用の EHCI コントローラーを使用します。 たとえば、カーネル デバッグに使用する EHCI コントローラーの場所が、デバイス マネージャーに PCI bus 0, device 29, function 7と示された場合、対応する bcdedit コマンドは次のとおりです。 bcdedit -set {current} loadoptions busparams=0.1D.7 どのケーブルを USB 2.0 カーネル デバッグに使用できますか。USB 2.0 デバッグ接続用に特別に設計されたデバッグ デバイスを使用する必要があります。このデバイスにより、標準 USB ケーブルをホスト コンピューターとデバッグ デバイス間に接続でき、別の標準 USB ケーブルを対象のコンピューターとデバッグ デバイス間に接続できます。ホストと対象のコンピューター間にこのデバッグ デバイスがインストールされていない場合、USB カーネル デバッグは行えません。 PLX Technology は、Net20DC という USB デバッグ デバイスを製造しています。LX Technology の Web サイトへのリンクについては、この FAQ のリソース セクションを参照してください。他のメーカーの互換デバイスが利用可能な場合がありますが、Microsoft は PLX Net20DC 以外のデバッグ デバイスをテストしていません。 PLX デバッグ デバイスはどこで入手できますか。http://www.semiconductorstore.com/pages/search/searchinventory.asp?query=net20dc どのデバッグ ツールが USB 2.0 カーネル デバッグをサポートしていますか。Windows 用デバッグ ツール パッケージの最新バージョン (Version 6.10.3 以降) を使用する必要があります。ホスト コンピューター、usb2dbg.sys の USB 2.0 デバッグをサポートするドライバーは、デバッグ ツールと共にインストールされます。ドライバー パッケージは、Program Files\Debugging Tools for Windows\Usb フォルダー内にあります。USB カーネル デバッグが指定された場合、デバッガーは USB デバッグ ドライバーをホスト コンピューター上に読み込みます。必要なサポートが Windows Vista 以降の Windows の バージョンに組み込まれているため、対象のコンピューターにその他の USB デバッグ ドライバーをインストールする必要はありません。 Microsoft オペレーティング システム ディスクリプタ
Microsoft オペレーティング システム (OS) ディスクリプタは、ハードウェア メーカーがさまざまなメーカー固有の情報をデバイス ファームウェア内に格納する方法を提供します。FAQ のこのセクションでは、Microsoft OS ディスクリプタについての質問に回答します。 Microsoft OS ディスクリプタの詳細については、Microsoft OS ディスクリプタのドキュメントを参照してください。 Microsoft OS ディスクリプタとは何ですか。Microsoft オペレーティング システム (OS) ディスクリプタは、ハードウェア メーカーがさまざまなメーカー固有の情報を、ユーザーにデバイスとは別に配布するのではなく、OS 機能ディスクリプタとしてデバイス ファームウェア内に格納する方法を提供します。Microsoft OS ディスクリプタに対応しているバージョンの Windows または Windows アプリケーションは、制御要求を使用して、ユーザーの操作なしで、デバイスからディスクリプタを取得します。特に、Windows は、デバイスが最初にプラグインされたとき自動的にディスクリプタを取得し、その情報を使用して、より滑らかなプラグ アンド プレイ エクスペリエンスを提供します。 Windows ではどのタイプの OS 機能ディスクリプタがサポートされていますか。機能ディスクリプタとして格納される各情報は、Microsoft が定義した標準フォーマットのうちの 1 つに準拠する必要があります。Microsoft の同意なしに、その他の機能ディスクリプタを定義し、実装することはできません。Microsoft は、下記の機能ディスクリプタを定義しました。 Extended Compat ID 拡張プロパティ ジャンル Windows のどのバージョンが、Microsoft OS ディスクリプタをサポートしますか。下記の表は、各ディスクリプタとそれをサポートする Windows のバージョンを示しています。 Microsoft OS ディスクリプタのサポート
OS 文字列ディスクリプタが、インデックス 0xEE に格納される必要があるのはなぜですか。Microsoft OS ディスクリプタをサポートするデバイスは、OS 文字列ディスクリプタを含み、string インデックス 0xEE に格納しておく必要があります。OS 文字列ディスクリプタは、複数の目的に役立つ標準 USB 文字列ディスクリプタです。
0xEE に文字列ディスクリプタがない場合、またはそのインデックス内の文字列ディスクリプタが有効な OS 文字列ディスクリプタでない場合、Windows はそのデバイスが OS 機能ディスクリプタを含まないと仮定します。 Microsoft OS ディスクリプタについての詳細情報はどこにありますか。http://msdn.microsoft.com/ja-jp/windows/hardware/gg463179.aspxを参照してください。 リソース
USB デバイスの Windows サポートに関するその他の情報については、下記のリソースを参照してください。 インターフェイス番号が連続していない複合 USB デバイスが Windows XP 上で動作しない Windows 用デバッグ ツール さまざまなドライバーやサブシステムで詳細なデバッグ トレースを有効にする方法 IsDeviceHighSpeed 各種オペレーティング システムにおける USB 転送の最大サイズ Microsoft OS ディスクリプタのドキュメント WHDC の USB に関するリソース USB 2.0 Specification Windows Hardware Developer Central |