2014.2.22

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

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


[第20回]


●Windows7でのEnumeration(部分)

さていよいよ核心にせまってきました。
私のところにはWindows98からWindows7までパソコンは10台以上あるのですが、その全てでND80ZV(ND80Z3.5)をUSB接続して何の問題もなく認識されています。
Windows7に限ってみてもHome Premium(32bitおよび64bit)だけではなくてProfessional(64bit)も試したのですが全てOKです。
それなのに何人かのお客様から、「不明なデバイスになってしまい、認識されません」というメールをいただきました。
この問題はずっと謎で解決できないままでした。
なにしろ手元にあるパソコンでは全て認識されてしまうものですから手の打ちようがありません。

しかし昨年の暮れになりまして、やっとそんな状況を打開できそうな機会に恵まれました。
葛Z術少年出版の吉崎様から、「何台か入手したパソコン(WindowsXP)に、Legacy8080をUSB接続しようとしたところ不明なデバイスになって接続できません」というメールをいただきました。

これは有難い、というのは誠に不謹慎ではありますが、正直なところそういう気持ちでありました。
さっそく吉崎様にお願いして、そのうちの一台を送っていただきました。
これでやっとUSBで認識されない原因を追求することができます。
それから年をまたいでおよそ2ヶ月近くの間、連日謎の解明に取り組んできました。
現在進行中の当連載は、そのためのツールを作るというテーマで書いております。
説明のほうは途中からUSBプロトコルのお話に飛んでしまいましたが、CPLD+SIMMを使ったUSB信号解析のためのツールはかなり前にできあがっていまして、しっかり役立っています。

下はそのツールを使って取得した信号データを、自作のUSBコード変換プログラムにかけて解読した、Enumeration手続きの実際の記録の一部です。
これは私が所有するWindows7(Homepremium、32bit)に秋月のPICWRITERを接続したときの記録です。

0078706 SOF FNO=412 [101001010100100000110111]
        SETUP ADRS=00 ENDP=00  [101101000000000000001000]
        DATA0 
        80 06 00 01 00 00 40 00   GET_DESCRIPTOR DEVICE
        ACK 
0078800 SOF FNO=413 [101001011100100000101000]
        IN ADRS=00 ENDP=00  [1001011000000000000]
        DATA1 
        12 01 00 02 00 00 00 08   
        ACK 
0078892 SOF FNO=414 [101001010010100000110110]
0078987 ACK 
0079080 SOF FNO=416 [101001010110100000101011]
0081612 SOF FNO=431 [101001011000110000100100]
0081706 SOF FNO=432 [101001010100110000100110]
0081800 SOF FNO=433 [101001011100110000111001]
0081894 SOF FNO=434 [101001010010110000100111]
0081988 SOF FNO=435 [101001011010110000111000]
0082081 SOF FNO=436 [101001010110110000111010]
0082175 SOF FNO=437 [101001011110110000100101]
0082269 SOF FNO=438 [101001010001110000110101]
0082363 SOF FNO=439 [101001011001110000101010]
0082457 SOF FNO=43A [101001010101110000101000]
0082550 SOF FNO=43B [101001011101110000110111]
0082644 SOF FNO=43C [101001010011110000101001]
0082738 SOF FNO=43D [101001011011110000110110]
0082832 SOF FNO=43E [101001010111110000110100]
0082926 SOF FNO=43F [101001011111110000101011]
0083019 SOF FNO=440 [101001010000001000110111]
0083113 SOF FNO=441 [101001011000001000101000]
0083207 SOF FNO=442 [101001010100001000101010]
0083301 SOF FNO=443 [101001011100001000110101]
0083395 SOF FNO=444 [101001010010001000101011]
0083488 SOF FNO=445 [101001011010001000110100]
0083582 SOF FNO=446 [101001010110001000110110]
0083676 SOF FNO=447 [101001011110001000101001]
0083770 SOF FNO=448 [101001010001001000111001]
0083864 SOF FNO=449 [101001011001001000100110]
0083957 SOF FNO=44A [101001010101001000100100]
0084051 SOF FNO=44B [101001011101001000111011]
0084145 SOF FNO=44C [101001010011001000100101]
0084333 SOF FNO=44E [101001010111001000111000]
0084426 SOF FNO=44F [101001011111001000100111]
0084520 SOF FNO=450 [101001010000101000110000]
0084522 SETUP ADRS=00 ENDP=00  [101101000000000000001000]
        DATA0 
        00 05 01 00 00 00 00 00   
        ACK 
0084615 SOF FNO=451 [101001011000101000101111]
        IN ADRS=00 ENDP=00  [1001011000000000000]
        DATA1 
        00 00 FB 81 D2 1B 28 3D   
0084708 SOF FNO=452 [101001010100101000101101]
0084802 SOF FNO=453 [101001011100101000110010]
0084895 SOF FNO=454 [101001010010101000101100]
0084989 SOF FNO=455 [101001011010101000110011]
0085083 SOF FNO=456 [101001010110101000110011]
0085177 SOF FNO=457 [101001011110101000101110]
0085364 SOF FNO=459 [101001011001101000100001]
0085458 SOF FNO=45A [101001010101101000100011]
0085552 SOF FNO=45B [101001011101101000111100]
0085646 SOF FNO=45C [101001010011101000100010]
0085740 SOF FNO=45D [101001011011101000111101]
0085833 SOF FNO=45E [101001010111101000111111]
0085927 SOF FNO=45F [101001011111101000100000]
0086021 SOF FNO=460 [101001010000011000100110]
0086115 SOF FNO=461 [101001011000011000111001]
0086209 SOF FNO=462 [101001010100011000111011]
0086302 SOF FNO=463 [101001011100011000100100]
0086396 SOF FNO=464 [101001010010011000111010]
0086490 SOF FNO=465 [101001011010011000100101]
0086584 SOF FNO=466 [101001010110011000100111]
0086678 SOF FNO=467 [101001011110011000111000]
0086771 SOF FNO=468 [101001010001011000101000]
0086865 SOF FNO=469 [101001011001011000110111]
0086959 SOF FNO=46A [101001010101011000110101]
0087053 SOF FNO=46B [101001011101011000101010]
0087147 SOF FNO=46C [101001010011011000110100]
0087240 SOF FNO=46D [101001011011011000101011]
0087334 SOF FNO=46E [101001010111011000101001]
0087428 SOF FNO=46F [101001011111011000110110]
0087523 SOF FNO=470 [101001010000111000100001]
        SETUP ADRS=01 ENDP=00  [101101001000000000010111]
        DATA0 
        80 06 00 01 00 00 12 00   GET_DESCRIPTOR DEVICE
        ACK 
0087617 SOF FNO=471 [101001011000111000111110]
        IN ADRS=01 ENDP=00  [1001011010000000000]
        DATA1 
        12 01 00 02 00 00 00 08   
        ACK 
0087711 SOF FNO=472 [101001010100111000111100]
        IN ADRS=01 ENDP=00  [1001011010000000000]
        DATA0 
        D8 04 33 00 02 00 01 02   
        ACK 
0087804 SOF FNO=473 [101001011100111000100011]
        IN ADRS=01 ENDP=00  [1001011010000000000]
        DATA1 
        03 02 7F 7E FB 81 D2 0B   
0087898 SOF FNO=474 [101001010010111000111101]
        OUT ADRS=01 ENDP=00  [1000011110000000000]
        DATA1 
        00 00 FB 80 D2 FB 4B 2F   
0087991 SOF FNO=475 [101001011010111000100010]
0088086 SOF FNO=476 [101001010110111000100000]
        SETUP ADRS=01 ENDP=00  [101101001000000000010111]
        DATA0 
        80 06 00 02 00 00 FF 00   GET_DESCRIPTOR CONFIG
        ACK 
0088180 SOF FNO=477 [101001011110111000111111]
        IN ADRS=01 ENDP=00  [1001011010000000000]
        DATA1 
        09 02 29 00 01 01 02 80   
        ACK 
0088274 SOF FNO=478 [101001010001111000101111]
        IN ADRS=01 ENDP=00  [1001011010000000000]
        DATA0 
        32 09 04 00 00 02 03 00   
        ACK 
0088367 SOF FNO=479 [101001011001111000110000]
        IN ADRS=01 ENDP=00  [1001011010000000000]

いかがでしょうか?
まずはちょいと自慢です。
なかなか見事に解析できておりますでしょう。
あ。
[第18回]ではstuffbitについて説明をしましたが、その後に解析プログラムを改良してstuffbitにも対応するようにしました。
改良前はたとえばFNO=05Fが09Fに化けたりしていたのですが、上のリストを見ていただくと分かりますようにFNO=45Fが文字化けしないでそのまま表示されています。

●WindowsXPでのEnumeration(部分)

そしてこちらが吉崎様からお借りしたWindowsXPパソコンに、秋月のPICWRITERを接続して得られた記録の一部です。
こういうタイトルはフェイクです。
いかにもOSの違いに何かがあるかのような印象を受けてしまいます。
かくいう私自身がそういう思い違いにずっと取り付かれてきました。
実は、そういうことではありませんでした。
それはともかくとしまして、まずは下のリストをご覧ください。
上のリストとほぼ同じ部分です。

0016954 SOF FNO=5F4 [101001010010111110100100]
0016955 PRE 
0016962 SETUP ADRS=00 ENDP=00  [101101000000000000001000]
        DATA0 
        80 06 00 01 00 00 40 00   GET_DESCRIPTOR DEVICE
        ACK 
0016964 IN ADRS=00 ENDP=00  [1001011000000000000]
        NAK 
0016965 IN ADRS=00 ENDP=00  [1001011000000000000]
        NAK 
0016967 IN ADRS=00 ENDP=00  [1001011000000000000]
        NAK 
0016969 IN ADRS=00 ENDP=00  [1001011000000000000]
        DATA1 
        12 01 00 02 00 00 00 08   
        ACK 
0016970 OUT ADRS=00 ENDP=00  [1000011100000000000]
0018080 SOF FNO=600 [101001010000000001100111]
0018080 PRE 
0018174 SOF FNO=601 [101001011000000001111000]
0018268 SOF FNO=602 [101001010100000001111010]
0018268 PRE 
0018361 SOF FNO=603 [101001011100000001100101]
0018455 SOF FNO=604 [101001010010000001111011]
0018456 PRE 
0018549 SOF FNO=605 [101001011010000001100100]
0018643 SOF FNO=606 [101001010110000001100110]
0018737 SOF FNO=607 [101001011110000001111001]
0018830 SOF FNO=608 [101001010001000001101001]
0018831 PRE 
0018924 SOF FNO=609 [101001011001000001110110]
0019018 SOF FNO=60A [101001010101000001110100]
0019018 PRE 
0019112 SOF FNO=60B [101001011101000001101011]
0019206 SOF FNO=60C [101001010011000001110101]
0019206 PRE 
0019299 SOF FNO=60D [101001011011000001101010]
0019393 SOF FNO=60E [101001010111000001101000]
0019487 SOF FNO=60F [101001011111000001110111]
0019581 SOF FNO=610 [101001010000100001100000]
0019582 PRE 
0019675 SOF FNO=611 [101001011000100001111111]
0019768 SOF FNO=612 [101001010100100001111101]
0019769 PRE 
0019862 SOF FNO=613 [101001011100100001100010]
0019897 SETUP ADRS=00 ENDP=00  [101101000000000000001000]
        DATA0 
        00 05 04 00 00 00 00 00   
        ACK 
0019898 IN ADRS=00 ENDP=00  [1001011000000000000]
        NAK 
0019900 IN ADRS=00 ENDP=00  [1001011000000000000]
0019956 SOF FNO=614 [101001010010100001111100]
0019956 PRE 
0020050 SOF FNO=615 [101001011010100001100011]
0020144 SOF FNO=616 [101001010110100001100001]
0020238 SOF FNO=617 [101001011110100001111110]
0020331 SOF FNO=618 [101001010001100001101110]
0020332 PRE 
0020425 SOF FNO=619 [101001011001100001110001]
0020519 SOF FNO=61A [101001010101100001110011]
0020519 PRE 
0020613 SOF FNO=61B [101001011101100001101100]
0020706 SOF FNO=61C [101001010011100001110010]
0020707 PRE 
0020800 SOF FNO=61D [101001011011100001101101]
0020894 SOF FNO=61E [101001010111100001101111]
0020988 SOF FNO=61F [101001011111100001110000]
0021082 SOF FNO=620 [101001010000010001110110]
0021082 PRE 
0021176 SOF FNO=621 [101001011000010001101001]
0021269 SOF FNO=622 [101001010100010001101011]
0021270 PRE 
0021363 SOF FNO=623 [101001011100010001110100]
0021457 SOF FNO=624 [101001010010010001101010]
0021457 PRE 
0021551 SOF FNO=625 [101001011010010001110101]
0021645 SOF FNO=626 [101001010110010001110111]
0021738 SOF FNO=627 [101001011110010001101000]
0021832 SOF FNO=628 [101001010001010001111000]
0021833 PRE 
0021926 SOF FNO=629 [101001011001010001100111]
0022020 SOF FNO=62A [101001010101010001100101]
0022020 PRE 
0022114 SOF FNO=62B [101001011101010001111010]
0022207 SOF FNO=62C [101001010011010001100100]
0022208 PRE 
0022301 SOF FNO=62D [101001011011010001111011]
0022395 SOF FNO=62E [101001010111010001111001]
0022489 SOF FNO=62F [101001011111010001100110]
0022583 SOF FNO=630 [101001010000110001110001]
0022583 PRE 
0022676 SOF FNO=631 [101001011000110001101110]
0022770 SOF FNO=632 [101001010100110001101100]
0022771 PRE 
0022864 SOF FNO=633 [101001011100110001110011]
0022958 SOF FNO=634 [101001010010110001101101]
0022958 PRE 
0023052 ? [10111101]
0023145 SOF FNO=636 [101001010110110001110000]
0023239 SOF FNO=637 [101001011110110001101111]
0023333 SOF FNO=638 [101001010001110001111111]
0023334 PRE 
0023427 SOF FNO=639 [101001011001110001100000]
0023521 SOF FNO=63A [101001010101110001100010]
0023521 PRE 
0023614 SOF FNO=63B [101001011101110001111101]
0023708 SOF FNO=63C [101001010011110001100011]
0023708 PRE 
0023802 SOF FNO=63D [101001011011110001111100]
0023896 SOF FNO=63E [101001010111110001111110]
0023990 SOF FNO=63F [101001011111110001100001]
0024083 SOF FNO=640 [101001010000001001111101]
0024084 PRE 
0024177 SOF FNO=641 [101001011000001001100010]
0024271 SOF FNO=642 [101001010100001001100000]
0024272 PRE 
0024459 SOF FNO=644 [101001010010001001100001]
0024459 PRE 
0024552 SOF FNO=645 [101001011010001001111110]
0024740 SOF FNO=647 [101001011110001001100011]
0024834 SOF FNO=648 [101001010001001001110011]
0024835 PRE 
0024928 SOF FNO=649 [101001011001001001101100]
0025021 SOF FNO=64A [101001010101001001101110]
0025022 PRE 
0025115 SOF FNO=64B [101001011101001001110001]
0025209 SOF FNO=64C [101001010011001001101111]
0025210 PRE 
0025303 SOF FNO=64D [101001011011001001110000]
0025397 SOF FNO=64E [101001010111001001110010]
0025490 SOF FNO=64F [101001011111001001101101]
0025584 SOF FNO=650 [101001010000101001111010]
0025584 PRE 
0025678 SOF FNO=651 [101101011000101001100101]
0025758 DATA0 
        80 06 00 01 00 00 12 00   GET_DESCRIPTOR DEVICE
        ACK 
0025760 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025761 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025763 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025765 IN ADRS=04 ENDP=00  [1001011000100000000]
        DATA1 
        12 01 00 02 00 00 00 08   
        ACK 
0025772 SOF FNO=652 [101001010100101001100111]
0025773 PRE 
0025777 IN ADRS=04 ENDP=00  [1001011000100000000]
        DATA0 
        D8 04 33 00 02 00 01 02   
        ACK 
0025778 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025779 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025779 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025781 IN ADRS=04 ENDP=00  [1001011000100000000]
        DATA1 
        03 02 7F 7E 1B 50 7A 7F   
0025783 OUT ADRS=04 ENDP=00  [1000011100100000000]
0025807 SETUP ADRS=04 ENDP=00  [101101000010000000010100]
        DATA0 
        80 06 00 02 00 00 09 00   GET_DESCRIPTOR CONFIG
        ACK 
0025809 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025810 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025811 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025813 IN ADRS=04 ENDP=00  [1001011000100000000]
        DATA1 
        09 02 29 00 01 01 02 80   
        ACK 
0025814 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025815 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025817 IN ADRS=04 ENDP=00  [1001011000100000000]
        DATA0 
        32 C1 6A 1B 50 7A 7F C0   
0025818 OUT ADRS=04 ENDP=00  [1000011100100000000]
0025856 SETUP ADRS=04 ENDP=00  [101101000010000000010100]
        DATA0 
        80 06 00 03 00 00 FF 00   GET_DESCRIPTOR 
        ACK 
0025857 ACK 
0025858 IN ADRS=04 ENDP=00  [1001011000100000000]
        NAK 
0025866 SOF FNO=653 [101001011100101001111000]

USB機器を接続するとEnumerationという手続きが開始されます。
ホスト(パソコン)からSETUPコマンドが送出され、USB機器はそのコマンドに応える形で手続きが進められます。
Enumerationでのコマンドと応答のやり取りは8バイトごとに区切って送られます。
SETUPに続くDATA0の8バイトがホストから送られるコマンドです。
ホストからINパケットが送出されるとそれに続いてUSB機器はDATA1の8バイトで応答します。
答えが8バイトを越える場合は次に送られるINバケットにあわせてDATA0、DATA1、…というようにトグルしながら8バイトずつを送出します。
コマンドやパラメータの意味などにつきましてはいずれ少しずつ説明をしていくつもりですので、今はそれについては触れません。
実はコマンドに対する応答の内容にもどこかにまずいところがあって、それで「不明なデバイス」にされてしまうのではないかとも考えて、しつこくしつこく繰り返しデータを取って解析したり分析したりでたっぷり時間がかかってしまいました。
確かにまずいところも何箇所かみつかりました。
しかし、根本的な原因はそんなところではありませんでした。

実は、上の2つのリストをしっかり見比べてみますと、そこには一部のパソコンで「不明なデバイス」にされてしまう原因がしっかり表れているのです。
最初は解析ツールにもプログラムにもいろいろまずいところがあって、上のようにきれいなリストではなかったこともあって、それで見落としていたということもありましたが、それでもしっかり目を開いて比べていれば、一目瞭然、両者には大変な違いがあることに気がついたはずでした。

こういうことはよくあることで、一旦気がついてしまえばなんでもないことが、何日も何日も穴のあくほど眺めていても気がつかないということをよく経験します。
猟師山を見ずということわざがありますが、まさにその通りでありました。

さて皆様はこの2つのリストのどこに違いがあるかお分かりになりますでしょうか。
コマンドやパラメータの値などの細かい相違ではありません。
もっともっと大きな違いがこの2つにはあるのです。

本日は時間がなくなってしまいましたので、その「驚くべき違い」につきましては次回に説明することにいたします。

CPLD+SIMMを使ってUSBプロトコルの解析を![第20回]
2014.2.22upload

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