スパイス  組み込み制御装置の受注製作

USBから複数シリアルポートを
平成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の記述方法の両方に疑問があります。デバイス側のディスクリプタの大半も評価されていないので、ホスト側のドライバを読み込んだ段階で両者を一気に評価されると、どちらのミスかが判断できません。どちらか一方だけでも正しいと信用できる情報がないと、泥沼状態になりかねない。さて、どうするか。

目次へ  前へ  次へ