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 |
ではまた。