平成26年 5月 31日
SnoopyProの出力
SnpooyProを使ってUSBデバイスとホスト(PC)間の通信内容を記録することが出来ます。難点は、ホスト側のドライバをインストール完了しないと記録を見ることが出来ないので、結果的にデバイス側の設定ミスやドライバ(.infファイル)の記述に問題があった場合には、通信内容を確認できません。
しかし、正しく接続できたときの動作は確認できます。先に記録した通信の記録を以下に示します。画面
1 in down n/a 0.562 GET_DESCRIPTOR_FROM_DEVICE
URB Header (length: 80)
SequenceNumber: 1
Function: 000b (GET_DESCRIPTOR_FROM_DEVICE)
1 in up n/a 0.578 CONTROL_TRANSFER 12 01 00 02 02 00 00 08 0x00000000
URB Header (length: 80)
SequenceNumber: 1
Function: 0008 (CONTROL_TRANSFER)
PipeHandle: 895d2020
SetupPacket:
0000: 80 06 00 01 00 00 12 00
bmRequestType: 80
DIR: Device-To-Host
TYPE: Standard
RECIPIENT: Device
bRequest: 06
GET_DESCRIPTOR
Descriptor Type: 0x0001
DEVICE
TransferBuffer: 0x00000012 (18) length
0000: 12 01 00 02 02 00 00 08 d8 04 0a 00 00 01 01 02
0010: 00 01
bLength : 0x12 (18)
bDescriptorType : 0x01 (1)
bcdUSB : 0x0200 (512)
bDeviceClass : 0x02 (2)
bDeviceSubClass : 0x00 (0)
bDeviceProtocol : 0x00 (0)
bMaxPacketSize0 : 0x08 (8)
idVendor : 0x04d8 (1240)
idProduct : 0x000a (10)
bcdDevice : 0x0100 (256)
iManufacturer : 0x01 (1)
iProduct : 0x02 (2)
iSerialNumber : 0x00 (0)
bNumConfigurations : 0x01 (1)
2 in down n/a 0.578 GET_DESCRIPTOR_FROM_DEVICE
URB Header (length: 80)
SequenceNumber: 2
Function: 000b (GET_DESCRIPTOR_FROM_DEVICE)
2 in up n/a 0.593 CONTROL_TRANSFER 09 02 43 00 02 01 00 c0 0x00000000
URB Header (length: 80)
SequenceNumber: 2
Function: 0008 (CONTROL_TRANSFER)
PipeHandle: 895d2020
SetupPacket:
0000: 80 06 00 02 00 00 09 01
bmRequestType: 80
DIR: Device-To-Host
TYPE: Standard
RECIPIENT: Device
bRequest: 06
GET_DESCRIPTOR
Descriptor Type: 0x0002
CONFIGURATION
TransferBuffer: 0x00000043 (67) length
0000: 09 02 43 00 02 01 00 c0 32 09 04 00 00 01 02 02
0010: 01 00 05 24 00 10 01 04 24 02 02 05 24 06 00 01
0020: 05 24 01 00 01 07 05 81 03 08 00 02 09 04 01 00
0030: 02 0a 00 00 00 07 05 02 02 40 00 00 07 05 82 02
0040: 40 00 00
bLength : 0x09 (9)
bDescriptorType : 0x02 (2)
wTotalLength : 0x0043 (67)
bNumInterfaces : 0x02 (2)
bConfigurationValue: 0x01 (1)
iConfiguration : 0x00 (0)
bmAttributes : 0xc0 (192)
MaxPower : 0x32 (50)
3 ??? down n/a 0.609 SELECT_CONFIGURATION
URB Header (length: 116)
SequenceNumber: 3
Function: 0000 (SELECT_CONFIGURATION)
Configuration Descriptor:
bLength: 9 (0x09)
bDescriptorType: 2 (0x02)
wTotalLength: 67 (0x0043)
bNumInterfaces: 2 (0x02)
bConfigurationValue: 1 (0x01)
iConfiguration: 0 (0x00)
bmAttributes: 192 (0xc0)
0x80: Bus Powered
0x40: Self Powered
MaxPower: 50 (0x32)
(in 2 mA units, therefore 100 mA power consumption)
Number of interfaces: 2
Interface[0]:
Length: 0x0024
InterfaceNumber: 0x00
AlternateSetting: 0x00
Class = 0x00
SubClass = 0x00
Protocol = 0x00
InterfaceHandle = 0x00000000
NumberOfPipes = 0x00000001
Pipe[0]:
MaximumPacketSize = 0x0000
EndpointAddress = 0x00
Interval = 0x00
PipeType = 0x00
UsbdPipeTypeControl
PipeHandle = 0x00000000
MaxTransferSize = 0x00001000
PipeFlags = 0x00
Interface[1]:
Length: 0x0038
InterfaceNumber: 0x01
AlternateSetting: 0x00
Class = 0x00
SubClass = 0x00
Protocol = 0x00
InterfaceHandle = 0x00000000
NumberOfPipes = 0x00000002
Pipe[0]:
MaximumPacketSize = 0x0000
EndpointAddress = 0x00
Interval = 0x00
PipeType = 0x00
UsbdPipeTypeControl
PipeHandle = 0x00000000
MaxTransferSize = 0x00001000
PipeFlags = 0x00
Pipe[1]:
MaximumPacketSize = 0x0000
EndpointAddress = 0x00
Interval = 0x00
PipeType = 0x00
UsbdPipeTypeControl
PipeHandle = 0x00000000
MaxTransferSize = 0x00001000
PipeFlags = 0x00
3 ??? up n/a 0.765 SELECT_CONFIGURATION 0x00000000
URB Header (length: 116)
SequenceNumber: 3
Function: 0000 (SELECT_CONFIGURATION)
Configuration Descriptor:
bLength: 9 (0x09)
bDescriptorType: 2 (0x02)
wTotalLength: 67 (0x0043)
bNumInterfaces: 2 (0x02)
bConfigurationValue: 1 (0x01)
iConfiguration: 0 (0x00)
bmAttributes: 192 (0xc0)
0x80: Bus Powered
0x40: Self Powered
MaxPower: 50 (0x32)
(in 2 mA units, therefore 100 mA power consumption)
Number of interfaces: 2
Interface[0]:
Length: 0x0024
InterfaceNumber: 0x00
AlternateSetting: 0x00
Class = 0x02
SubClass = 0x02
Protocol = 0x01
InterfaceHandle = 0x8971e148
NumberOfPipes = 0x00000001
Pipe[0]:
MaximumPacketSize = 0x0008
EndpointAddress = 0x81
Interval = 0x02
PipeType = 0x03
UsbdPipeTypeInterrupt
PipeHandle = 0x8971e164
MaxTransferSize = 0x00001000
PipeFlags = 0x00
Interface[1]:
Length: 0x0038
InterfaceNumber: 0x01
AlternateSetting: 0x00
Class = 0x0a
SubClass = 0x00
Protocol = 0x00
InterfaceHandle = 0x89a81c28
NumberOfPipes = 0x00000002
Pipe[0]:
MaximumPacketSize = 0x0040
EndpointAddress = 0x02
Interval = 0x00
PipeType = 0x02
UsbdPipeTypeBulk
PipeHandle = 0x89a81c44
MaxTransferSize = 0x00001000
PipeFlags = 0x00
Pipe[1]:
MaximumPacketSize = 0x0040
EndpointAddress = 0x82
Interval = 0x00
PipeType = 0x02
UsbdPipeTypeBulk
PipeHandle = 0x89a81c64
MaxTransferSize = 0x00001000
PipeFlags = 0x00
4 out down n/a 0.765 CLASS_INTERFACE -
URB Header (length: 80)
SequenceNumber: 4
Function: 001b (CLASS_INTERFACE)
PipeHandle: 895d2020
SetupPacket:
0000: 00 21 00 00 00 00 09 01
bmRequestType: 00
DIR: Host-To-Device
TYPE: Standard
RECIPIENT: Device
bRequest: 21
unknown!
No TransferBuffer
4 in up n/a 0.781 CONTROL_TRANSFER 80 25 00 00 00 00 08 0x00000000
URB Header (length: 80)
SequenceNumber: 4
Function: 0008 (CONTROL_TRANSFER)
PipeHandle: 895d2020
SetupPacket:
0000: a1 21 00 00 00 00 07 00
bmRequestType: a1
DIR: Device-To-Host
TYPE: Class
RECIPIENT: Interface
bRequest: 21
TransferBuffer: 0x00000007 (7) length
0000: 80 25 00 00 00 00 08
5 out down n/a 0.781 CLASS_INTERFACE -
URB Header (length: 80)
SequenceNumber: 5
Function: 001b (CLASS_INTERFACE)
PipeHandle: 895d2020
SetupPacket:
0000: 00 22 00 00 00 00 07 00
bmRequestType: 00
DIR: Host-To-Device
TYPE: Standard
RECIPIENT: Device
bRequest: 22
unknown!
No TransferBuffer
5 out up n/a 0.781 CONTROL_TRANSFER - 0x00000000
URB Header (length: 80)
SequenceNumber: 5
Function: 0008 (CONTROL_TRANSFER)
PipeHandle: 895d2020
SetupPacket:
0000: 21 22 00 00 00 00 00 00
bmRequestType: 21
DIR: Host-To-Device
TYPE: Class
RECIPIENT: Interface
bRequest: 22
No TransferBuffer
6 ??? down n/a 0.796 BULK_OR_INTERRUPT_TRANSFER -
URB Header (length: 72)
SequenceNumber: 6
Function: 0009 (BULK_OR_INTERRUPT_TRANSFER)
TransferFlags: 0x00000003
No TransferBuffer
7 ??? down n/a 0.796 BULK_OR_INTERRUPT_TRANSFER -
URB Header (length: 72)
SequenceNumber: 7
Function: 0009 (BULK_OR_INTERRUPT_TRANSFER)
TransferFlags: 0x00000003
No TransferBuffer
少し見難い部分もありますが、十分に動作を追跡できる内容です。SequenceNumberを頼りに通信内容を拾っていくと以下のようになります。
SequenceNumber 内容
1 デバイスディスクリプタ取得
2 コンフィグレーションディスクリプタ取得
3 コンフィグレーションの選択(1個のコンフィグレーションしかないので無意味に見えるが)
4 GET_LINE_CODING(通信仕様情報の要求)
5 SET_CONTROL_LINE_STATE(通信仕様の設定要求)
6 (ホストから見て)受信ポートの受信要求1
7 (ホストから見て)受信ポートの受信要求2
SequenceNumber6と7はホスト(PC)とデバイスの間にある通信ポートの受信データ要求のようです。詳細は未確認です。
ここでは多数の疑問が出てきます。最初の疑問は、デバイスをUSBに接続してデバイスドライバをインストールする前までに、どこまでの通信が行われるのかです。USBにデバイスを接続した段階でデバイスマネージャーには下記のように?マーク付きで表示されます。この段階では既にデバイスのVID/PIDは読み込まれています(プロパティ画面から確認できます)。

SnoopyProが使えないので、上記の通信手順の何処までが行われるのかデバイス側のプログラムにブレークポイントを設定して確認してみました。結果はSequenceNumber1のみが実行されます。コンフィグレーションディスクリプタの取得は、この段階では行われません。これは都合の悪い事態です。現時点ではデバイス側のディスクリプタの書き方とホスト側の.infの記述方法の両方に疑問があります。デバイス側のディスクリプタの大半も評価されていないので、ホスト側のドライバを読み込んだ段階で両者を一気に評価されると、どちらのミスかが判断できません。どちらか一方だけでも正しいと信用できる情報がないと、泥沼状態になりかねない。さて、どうするか。