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


 


ではまた。

Skip to main content