2014.3.24

前へ
次へ
ホームページトップへ戻る

CPLD+SIMMを使ってUSBプロトコルの解析を!
VHDLを速習! XC95144XL+16MB・SIMMを使ってUSBプロトコルアナライザを作ってしまいました!
主目的は差し迫った事情からUSBプロトコルの解析をすることだったのですが、その手段として選んだのがコレ!


[第31回]


●Enumeration はじめから終わりまでの記録(2)

前回の終わりに書きましたように、CPLD+SIMM回路によって記録し解析を行なったEnumiration手続きについて、今回から数回の予定で少しずつ区切りながら詳細な説明を加えていきたいと思います。
ここで使う解析リストは葛Z術少年出版の吉崎様からお借りしたWindowsXP(USB3.0)パソコンに秋月のPICWRITERを接続して得られたデータを解析したものです。
まず最初は、WindowsXPパソコンにPICWRITERをUSB接続して、それがWindowsXPパソコンに認識されてEnumerationが開始されるところから説明を始めます。
前回はSOFだけが続くところとか、INパケットに応答できずにNAKを連続して返すところなどは省略したリストをお見せしましたが、少しずつ区切って詳細に説明するということになりますと、省略しないで記録したままをお見せするほうがよいのではと考えましたので、今回からは省略しないでもとのままお見せすることにします。

0012204 SOF FNO=6AB
0012298 SOF FNO=6AC
0012299 PRE 
0012392 SOF FNO=6AD
0012486 SOF FNO=6AE
0012580 SOF FNO=6AF
0012673 SOF FNO=6B0
0012674 PRE 
0012767 SOF FNO=6B1
0012861 SOF FNO=6B2
0012862 PRE 
0012955 SOF FNO=6B3
0013048 SOF FNO=6B4
0013049 PRE 
0013142 SOF FNO=6B5
0013236 SOF FNO=6B6
0013330 SOF FNO=6B7
0013424 SOF FNO=6B8
0013424 PRE 
0013518 SOF FNO=6B9
0013611 SOF FNO=6BA
0013612 PRE 
0013705 SOF FNO=6BB
0013799 SOF FNO=6BC
0013800 PRE 
0013893 SOF FNO=6BD
0013987 SOF FNO=6BE
0014080 SOF FNO=6BF
0014174 ? [10111110]  // 0276318 SOF FNO=6C0
0014174 PRE 
0014268 SOF FNO=6C1
0014362 SOF FNO=6C2
0014362 PRE 
0014456 SOF FNO=6C3
0014549 SOF FNO=6C4
0014550 PRE 
0014643 SOF FNO=6C5
0014737 SOF FNO=6C6
0014831 SOF FNO=6C7
0014925 SOF FNO=6C8
0014925 PRE 
0015018 SOF FNO=6C9
0015112 SOF FNO=6CA
0015112 PRE 
0015206 SOF FNO=6CB
0015300 SOF FNO=6CC
0015301 PRE 
0015394 SOF FNO=6CD
0015487 SOF FNO=6CE
0015581 SOF FNO=6CF
0015675 SOF FNO=6D0
0015676 PRE 
0015769 SOF FNO=6D1
0015863 SOF FNO=6D2
0015863 PRE 
0015956 SOF FNO=6D3
0016050 SOF FNO=6D4
0016051 PRE 
0016144 SOF FNO=6D5
0016238 SOF FNO=6D6
0016332 SOF FNO=6D7
0016425 SOF FNO=6D8
0016426 PRE 
0016519 SOF FNO=6D9
0016613 SOF FNO=6DA
0016613 PRE 
0016707 SOF FNO=6DB
0016801 SOF FNO=6DC
0016801 PRE 
0016894 SOF FNO=6DD
0016988 SOF FNO=6DE
0017000 SETUP ADRS=00 ENDP=00 
        DATA0  80 06 00 01 00 00 40 00   GET_DESCRIPTOR DEVICE
        ACK 
0017002 ? [00010111] // 0279146 IN ADRS=00 ENDP=00
        NAK 
0017003 IN ADRS=00 ENDP=00 
        NAK 
0017004 IN ADRS=00 ENDP=00 
        NAK 
0017006 IN ADRS=00 ENDP=00 
        DATA1  12 01 00 02 00 00 00 08   
        ACK 
0017008 OUT ADRS=00 ENDP=00 
        DATA1  
        ACK 
0018114 SOF FNO=6EA
0018115 PRE 

のちほど説明しますがUSBデータを取得するために使ったCPLD+SIMM回路はちょいと乱暴な回路で、そのためうまくデータが読み取れてないところがあります。
解析不能なところは「?」をつけて表示してあります。
もともとUSBアナライザを作ることが目的ではなくて、USB接続で不明なデバイスにされてしまうことの原因を探ることが目的だったものですから、部分的にアバウトなところがあっても構わない、という姿勢で作ったものです。
ですので解読プログラムも完璧を求めずそこそこ解読できればよいという姿勢でつくりましたから、リスト上では「?」になっていたり、スルーしてしまって表示されていないところも詳細にチェックすれば解読データが浮き上がってくるところもあるかと思います。

[2014.3.25追記]
実はそのための対策も仕込んでありまして、そのままでは「?」になってしまうところも、ある程度はあとから手作業で補正できるようになっています。
上のリストでは「?」が2箇所ありますが、そのいずれもうまく補正できました。
//の後ろが補正後のデータです。
どうやって補正するのかについては、またのちほど説明をするつもりです。
もっとも「?」の全てが補正できるとは限りません。
しかし、上に書きましたように、完璧な解析リストを得ることが本来の目的ではありませんから、解析不能な部分についてはあまり深く追求しないで、あくまで全体の流れに注目していきたいと思います。
[追記 ここまで]

それではリストの内容を見ていくことにいたします。
PICWRITERをUSB接続して最初に記録されたFNO(フレームajは6ABです。
そしてFNO=6DEになってホストから最初にSETUPコマンドが送られています。
何回も説明していますように、1フレームのデータ長は1msです。
6DE−6AB=33H(51)ですから、USB接続してから約50ms後にEnumerationが開始されています。
しかしこの50msには余り意味は無いと思います。

EnumerationはホストからDevice Descriptorを要求するGet Descriptorコマンドが送られることから始まります。
Enumerationは最初は必ずアドレス00が指定され、EP(エンドポイント)=0のパイプを使って送受信されます。
Enumerationで1度に送られるコマンドやデータは最大8バイトです。
最初にホストから送られる8バイトのコマンドの、先頭の2バイト 80 06 はGet Descriptor(ディスクリプタの送信要求)です。
その次の 00 01 はDescriptor Index/Device Descriptorを示しています。
以上をあわせて、Get Device Descriptor(デバイスディスクリプタ要求)コマンドであることを示しています。
次の2バイトは 00 00 です。
最後の 40 00 はディスクリプタのデータ長の指定です。
最大長が40H=64バイトとの指定です。

ホストからはGet Device Descriptor(デバイスディスクリプタ要求)コマンドのすぐ後にINパケットが送られます。
デバイスはそのタイミングにあわせて自身のデバイスディスクリプタを送ります。
ここではまず最初の8バイトを送っています。

12 はデバイスディスクリプタのサイズです。12H=18バイトであることを示しています。
01 はディスクリプタの種類が要求されたデバイスディスクリプタ(01)であることを示しています。
次の 00 02 はUSBバージョンを示します(USB2.0)。
次の 00 00 00 はクラスコードですが普通は00にします。
最後の 08 はエンドポイント0の最大パケットサイズの指定です。ここは8バイトを指定します。

このデバイスディスクリプタは18バイトなので、8バイト+8バイト+2バイトというように3回に分けて送ることになるのですが、ここでは最初の8バイトを送るとすぐにホストからデータの終了を示すOUTパケットが送出されて、デバイスディスクリプタの送信を打ち切られています。
USB接続をした直後はホストはデバイスが応答することだけをまず確認したいようで、このタイミングではこのようになります。

CPLD+SIMMを使ってUSBプロトコルの解析を![第31回]
2014.3.24upload
2014.3.25追記

前へ
次へ
ホームページトップへ戻る