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

 

ではまた。