USB 2.0 カーネル デバッグ 後編
毎度 K里です。先月 Windows 7 開発チームブログで、Windows 7 Beta でも Windows Touch 機能が特定の PC で使えるようになったとお知らせがありました (詳細はこちら)。日本ではまだ 1 機種のみとなりますが、既に試されている方もいらっしゃるかと思います。私はまだ実際に試していませんが、面白そうなネタができたらお知らせしようと思います。
さてさて、今回は前回に引き続き USB 2.0 カーネル デバッグの後編でございます。前回は、USB 2.0 カーネル デバッグについて、公開情報を基に基本的な設定手順をお知らせしました。今回は、公開情報にはない情報をまとめてみました。お役に立てれば幸いです。
USB デバッグ接続ができない原因と対処方法
前回にお知らせした手順でデバッグ接続ができない場合、BIOS 設定にて Legacy USB サポート機能の有無をご確認下さい。もし、Enable となっているようであれば、一度 Disable にし、再度デバッグ接続できるかお試し下さい。Legacy USB は、SMI (System Management Interrupts) によるハードウェア割込みを実装しています。SMI は OS に対して透過なものであり、カーネル デバッグの通信に影響を与える可能性があります。これは、特に USB だけに限られた話ではなく、シリアル、1394 ケーブルを用いたカーネルデバッグでも同様のことが言えます。ただ、USB デバッグは、他のインターフェースよりもこの Legacy USB サポート機能によってデバッグ接続できない確率が高い傾向にあるようです。カーネル デバッグを行う場合、何れのケースにおいても、可能な限り Legacy USB サポート機能を無効にすることをお奨めします。
これまでに私たちが確認した限り、一部のチップセットでは動作が不安定 (接続できたりできなかったり) であったり、全く接続できないケースもありました。現段階では、全ての EHCI コントローラーに対して、必ずしも USB 2.0 デバッグができるわけではないことをご容赦下さいませ。その際にはシリアルや 1394 インターフェースでのデバッグをご検討頂けると幸いです。
EHCI コントローラーがカーネルデバッグをサポートしているかを確認する方法
Windbg を使用して、PCI Configuration Space から対象コントローラーの Capability を確認します。手順は以下のとおりです。
(1) ターゲット コンピューターに Debugging Tools for Windows をインストールします
(2) ローカル カーネル デバッグ用のエントリを作成します (*1)
(3) 再起動後、デバッグ モードで起動します
(4) ターゲット コンピューター上で Windbg を管理者権限で起動し、[File] -> [Kernel Debug] -> [Local] を指定します
*1 ローカル カーネル デバッグの設定について
bcdedit.exe にて以下のように設定します。
>bcdedit /copy {current} /d DebugMode
>bcdedit /dbgsettings serial debugport:1 baudrate:115200
>bcdedit /debug {identifier} on
* デバッグ ポート設定は Default (シリアル) に設定しておきましょう。
Windbg から !pci コマンドを実行します。
lkd> !pci PCI Segment 0 Bus 0 00:0 8086:2990.02 Cmd[0106:.mb..s] Sts[2090:c....] Intel Host Bridge SubID:1028:01da 01:0 8086:2991.02 Cmd[0107:imb..s] Sts[0010:c....] Intel PCI-PCI Bridge 0->0x1-0x1 1a:0 8086:2834.02 Cmd[0005:i.b...] Sts[0280:.....] Intel USB Controller SubID:1028:01da 1a:1 8086:2835.02 Cmd[0005:i.b...] Sts[0280:.....] Intel USB Controller SubID:1028:01da 1a:7 8086:283a.02 Cmd[0106:.mb..s] Sts[0290:c....] Intel USB2 Controller SubID:1028:01da 1c:0 8086:283f.02 Cmd[0106:.mb..s] Sts[0010:c....] Intel PCI-PCI Bridge 0->0x2-0x2 1c:4 8086:2847.02 Cmd[0106:.mb..s] Sts[0010:c....] Intel PCI-PCI Bridge 0->0x3-0x3 1d:0 8086:2830.02 Cmd[0005:i.b...] Sts[0280:.....] Intel USB Controller SubID:1028:01da 1d:1 8086:2831.02 Cmd[0005:i.b...] Sts[0280:.....] Intel USB Controller SubID:1028:01da 1d:2 8086:2832.02 Cmd[0005:i.b...] Sts[0280:.....] Intel USB Controller SubID:1028:01da 1d:7 8086:2836.02 Cmd[0106:.mb..s] Sts[0290:c....] Intel USB2 Controller SubID:1028:01da 1e:0 8086:244e.f2 Cmd[0107:imb..s] Sts[0010:c....] Intel PCI-PCI Bridge 0->0x4-0x4 1f:0 8086:2810.02 Cmd[0107:imb..s] Sts[0210:c....] Intel ISA Bridge 1f:2 8086:2820.02 Cmd[0005:i.b...] Sts[02b0:c6...] Intel IDE Controller SubID:1028:01da 1f:3 8086:283e.02 Cmd[0103:im...s] Sts[0280:.....] Intel SMBus Controller SubID:1028:01da 1f:5 8086:2825.02 Cmd[0005:i.b...] Sts[02b0:c6...] Intel IDE Controller SubID:1028:01da |
上記の場合だと、Bus:0 Device:1a Function:7 と Bus:0 Device:1d Function:7 が USB 2.0 コントローラーになります。
次に、!pci コマンドのオプションフラグを用いて、USB 2.0 コントローラーの情報を確認します。
lkd> !pci 100 0 1a 7
PCI Configuration Space (Segment:0000 Bus:00 Device:1a Function:07) Common Header: 00: VendorID 8086 Intel Corporation 02: DeviceID 283a 04: Command 0106 MemSpaceEn BusInitiate SERREn 06: Status 0290 CapList FB2BCapable DEVSELTiming:1 08: RevisionID 02 09: ProgIF 20 USB2 Enhanced Interface 0a: SubClass 03 USB2 Controller 0b: BaseClass 0c Serial Bus Controller 0c: CacheLineSize 0000 0d: LatencyTimer 00 0e: HeaderType 00 0f: BIST 00 10: BAR0 dffffc00 14: BAR1 00000000 18: BAR2 00000000 1c: BAR3 00000000 20: BAR4 00000000 24: BAR5 00000000 28: CBCISPtr 00000000 2c: SubSysVenID 1028 2e: SubSysID 01da 30: ROMBAR 00000000 34: CapPtr 50 3c: IntLine 16 3d: IntPin 03 3e: MinGnt 00 3f: MaxLat 00 Device Private: 40: 00000000 00000000 00000000 00000000 50: c9c25801 00000000 20a0000a 00000000 60: 01ff2020 00000000 01000001 c0000000 70: 03d70000 00000000 00000000 00000000 80: 00000000 00000001 00000000 00000000 90: 00000000 00000000 00000000 00000000 a0: 00000000 00000000 00000000 00000000 b0: 00000000 00000000 00000000 00000000 c0: 00000000 00000000 00000000 00000000 d0: 00000000 00ffaa00 00000000 00000000 e0: 00000000 00000000 00000000 00000000 f0: 00000000 00408588 00020f86 20029706 Capabilities: 50: CapID 01 PwrMgmt Capability 51: NextPtr 58 52: PwrMgmtCap c9c2 PMED0 PMED3Hot PMED3Cold Version=2 54: PwrMgmtCtrl 0000 DataScale:0 DataSel:0 D0
58: CapID 0a Debug Port Capability 59: NextPtr 00 |
上記コマンドの 100 は !pci コマンドにおけるオプションフラグで、指定された PCI デバイスの Configuration Space 情報を取得します。このため、上記コマンドは、Bus:0 Device:1a Function:7 の USB2 Controller における PCI Configuration Space の情報を取得し、表示しています。対象コントローラーがカーネルデバッグ機能をサポートしているかは、Capabilities の欄を確認します (Capability のみの表示は、オプションフラグ 40 となります)。上記 Capability には、58: CapID があります。EHCI Specification for USB より、CapID: 0A は、デバッグ ポートをサポートしていることを意味しています。
上記の例であげました環境では、デバッグポートをサポートする 2 つの EHCI コントローラーが搭載されていることになります。
lkd> !pci 40 0 1a 7 PCI Segment 0 Bus 0 1a:7 8086:283a.02 Cmd[0106:.mb..s] Sts[0290:c....] Intel USB2 Controller SubID:1028:01da Cap[50] ID 01 PowerManagement PMC c9c2 (PME from D3C3H0 v2) WARNING PMC non-zero reserved fields 01c0 PMCSR 0000 (PME_Status=0 PME_En=0 State=D0) Cap[58] ID 0a Debug Port
lkd> !pci 40 0 1d 7 PCI Segment 0 Bus 0 1d:7 8086:2836.02 Cmd[0106:.mb..s] Sts[0290:c....] Intel USB2 Controller SubID:1028:01da Cap[50] ID 01 PowerManagement PMC c9c2 (PME from D3C3H0 v2) WARNING PMC non-zero reserved fields 01c0 PMCSR 0000 (PME_Status=0 PME_En=0 State=D0) Cap[58] ID 0a Debug Port |
ではまた。