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] |
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
前へ
次へ
ホームページトップへ戻る