CPLD+SIMMを使ってUSBプロトコルの解析を!
VHDLを速習! XC95144XL+16MB・SIMMを使ってUSBプロトコルアナライザを作ってしまいました!
主目的は差し迫った事情からUSBプロトコルの解析をすることだったのですが、その手段として選んだのがコレ!
[第30回]
●Enumeration はじめから終わりまでの記録(1)
当テーマのメインでありますCPLD+SIMM回路を使って記録したEnumeration手続きの一部を[第20回]でお見せしました。
今回はそのはじめから終わりまでの一部始終をお見せします。
葛Z術少年出版の吉崎様からお借りしたWindowsXP(USB3.0)マシンに秋月のPICWRITERを接続したときの記録です。
このところすっかり横道にそれてしまって全然説明が進まないままでいるCPLD+SIMM回路なのですが、それを使うと、これこのとおり、これだけの解析ができるのですよというところを見ていただくのが今回の目的です。
それと同時に私自身にとっても、有用な解析の記録です。
なにはともあれまずは実物をお見せすることにいたします。
(D6PX6CK) 0016988 SOF FNO=6DE 0017000 SETUP ADRS=00 ENDP=00 DATA0 80 06 00 01 00 00 40 00 GET_DESCRIPTOR DEVICE ACK 0017006 IN ADRS=00 ENDP=00 DATA1 12 01 00 02 00 00 00 08 ACK 0017008 OUT ADRS=00 ENDP=00 DATA1 ACK 0019896 SOF FNO=6FD 0019930 SETUP ADRS=00 ENDP=00 DATA0 00 05 04 00 00 00 00 00 ACK 0019932 IN ADRS=00 ENDP=00 DATA1 ACK 0025712 SOF FNO=73B 0025789 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 01 00 00 12 00 GET_DESCRIPTOR DEVICE ACK 0025795 IN ADRS=04 ENDP=00 DATA1 12 01 00 02 00 00 00 08 ACK 0025800 IN ADRS=04 ENDP=00 DATA0 D8 04 33 00 02 00 01 02 ACK 0025806 SOF FNO=73C 0025811 IN ADRS=04 ENDP=00 DATA1 03 02 7F 7E 3B A0 F4 FE 0025812 OUT ADRS=04 ENDP=00 DATA1 ACK 0025841 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 02 00 00 09 00 GET_DESCRIPTOR CONFIG 0025847 IN ADRS=04 ENDP=00 DATA1 09 02 29 00 01 01 02 80 ACK 0025850 IN ADRS=04 ENDP=00 DATA0 32 C1 6A 3B A0 F4 1E 0025851 OUT ADRS=04 ENDP=00 DATA1 ACK 0025876 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 03 00 00 FF 00 GET_DESCRIPTOR ACK 0025880 IN ADRS=04 ENDP=00 DATA1 04 03 09 04 09 78 FB CF 0025882 OUT ADRS=04 ENDP=00 DATA1 ACK 0025900 SOF FNO=73D 0025910 SETUP ADRS=04 ENDP=00 DATA0 80 06 03 03 09 04 FF 00 GET_DESCRIPTOR ACK 0025916 IN ADRS=04 ENDP=00 DATA1 10 03 4F 00 6C 00 48 00 ACK 0025922 IN ADRS=04 ENDP=00 DATA0 6F 00 73 00 73 00 00 00 ACK 0025922 IN ADRS=04 ENDP=00 NAK 0025924 IN ADRS=04 ENDP=00 DATA1 ACK 0025926 OUT ADRS=04 ENDP=00 DATA1 ACK 0025960 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 02 00 00 FF 00 GET_DESCRIPTOR CONFIG ACK 0025965 IN ADRS=04 ENDP=00 DATA1 09 02 29 00 01 01 02 80 ACK 0025971 IN ADRS=04 ENDP=00 DATA0 32 09 04 00 00 02 03 00 ACK 0025976 IN ADRS=04 ENDP=00 DATA1 ? [00000001] ? [10000110] ACK 0025980 IN ADRS=04 ENDP=00 DATA0 22 1D 00 07 05 81 03 40 0025986 IN ADRS=04 ENDP=00 DATA1 00 01 07 05 01 03 40 00 ACK 0025993 SOF FNO=73E 0025994 IN ADRS=04 ENDP=00 DATA0 01 81 7F 3A A0 F4 1E 0026000 OUT ADRS=04 ENDP=00 DATA1 ACK 0026042 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 03 00 00 FF 00 GET_DESCRIPTOR ACK 0026046 IN ADRS=04 ENDP=00 DATA1 04 03 09 04 09 78 1B 50 0026048 OUT ADRS=04 ENDP=00 DATA1 ACK 0026073 SETUP ADRS=04 ENDP=00 DATA0 80 06 02 03 09 04 FF 00 GET_DESCRIPTOR 0026079 IN ADRS=04 ENDP=00 DATA1 48 03 50 00 49 00 43 00 ACK 0026087 SOF FNO=73F 0026089 IN ADRS=04 ENDP=00 DATA0 6B 00 69 00 74 00 20 00 ACK 0026093 IN ADRS=04 ENDP=00 DATA1 32 00 20 00 4D 00 69 00 ACK 0026098 IN ADRS=04 ENDP=00 DATA0 63 00 72 00 6F 00 63 00 ACK 0026103 IN ADRS=04 ENDP=00 DATA1 6F 00 6E 00 74 00 72 00 ACK 0026108 IN ADRS=04 ENDP=00 DATA0 6F 00 6C 00 6C 00 65 00 ACK 0026113 IN ADRS=04 ENDP=00 ? [11100000] DATA1 72 00 20 00 50 00 72 00 ACK 0026118 IN ADRS=04 ENDP=00 DATA0 6F 00 67 00 72 00 61 00 ACK 0026124 IN ADRS=04 ENDP=00 DATA1 6D 00 6D 00 65 00 72 00 ACK 0026126 IN ADRS=04 ENDP=00 DATA0 ACK 0026128 OUT ADRS=04 ENDP=00 DATA1 ACK 0026159 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 03 00 00 FF 00 GET_DESCRIPTOR ACK 0026163 IN ADRS=04 ENDP=00 DATA1 04 03 09 04 09 78 3B A0 0026165 OUT ADRS=04 ENDP=00 DATA1 ACK 0026181 SOF FNO=740 DATA1 0026181 ? [01110111] 0026194 SETUP ADRS=04 ENDP=00 DATA0 80 06 02 03 09 04 FF 00 GET_DESCRIPTOR ACK 0026200 IN ADRS=04 ENDP=00 DATA1 48 03 50 00 49 00 43 00 ACK 0026205 IN ADRS=04 ENDP=00 DATA0 6B 00 69 00 74 00 20 00 ACK 0026210 IN ADRS=04 ENDP=00 DATA1 32 00 20 00 4D 00 69 00 ACK 0026215 IN ADRS=04 ENDP=00 DATA0 63 00 72 00 6F 00 63 00 ACK DATA1 6F 00 6E 00 74 00 72 00 ? [01111101] 0026224 IN ADRS=04 ENDP=00 DATA0 6F 00 6C 00 6C 00 65 00 ACK 0026229 IN ADRS=04 ENDP=00 DATA1 72 00 20 00 50 00 72 00 ACK 0026234 IN ADRS=04 ENDP=00 DATA0 6F 00 67 00 72 00 61 00 ACK 0026238 IN ADRS=04 ENDP=00 DATA1 6D 00 6D 00 65 00 72 00 ACK 0026241 SOF FNO=407 ? [10111000] ACK 0026242 OUT ADRS=04 ENDP=00 DATA1 ACK 0252621 SOF FNO=0AE 0252683 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 03 00 00 FF 00 GET_DESCRIPTOR ACK 0252689 IN ADRS=04 ENDP=00 DATA1 04 03 09 04 09 78 3B A0 0252690 OUT ADRS=04 ENDP=00 DATA1 ACK 0252706 SETUP ADRS=04 ENDP=00 DATA0 80 06 02 03 09 04 FF 00 GET_DESCRIPTOR ACK 0252715 SOF FNO=0AF 0252717 IN ADRS=04 ENDP=00 DATA1 48 03 50 00 49 00 43 00 ACK 0252722 IN ADRS=04 ENDP=00 DATA0 6B 00 69 00 74 00 20 00 ACK 0252727 IN ADRS=04 ENDP=00 DATA1 32 00 20 00 4D 00 69 00 ACK 0252731 IN ADRS=04 ENDP=00 DATA0 63 00 72 00 6F 00 63 00 ACK 0252737 IN ADRS=04 ENDP=00 DATA1 6F 00 6E 00 74 00 72 00 ACK 0252742 IN ADRS=04 ENDP=00 DATA0 6F 00 6C 00 6C 00 65 00 ACK 0514891 IN ADRS=04 ENDP=00 DATA1 72 00 20 00 50 00 72 00 ****************** 0252753 IN ADRS=04 ENDP=00 DATA0 6F 00 67 00 72 00 61 00 ACK 0252758 IN ADRS=04 ENDP=00 DATA1 6D 00 6D 00 65 00 72 00 0252760 IN ADRS=04 ENDP=00 NAK 0252761 IN ADRS=04 ENDP=00 0252761 ACK 0252763 OUT ADRS=04 ENDP=00 DATA1 0252789 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 03 00 00 FF 00 GET_DESCRIPTOR ACK 0252794 IN ADRS=04 ENDP=00 DATA1 04 03 09 04 09 78 3B A0 0252796 OUT ADRS=04 ENDP=00 DATA1 ACK 0252809 SOF FNO=0B0 0252810 PRE 0252814 SETUP ADRS=04 ENDP=00 DATA0 80 06 02 03 09 04 FF 00 GET_DESCRIPTOR ACK 0252821 IN ADRS=04 ENDP=00 DATA1 48 03 50 00 49 00 43 00 ACK 0252826 IN ADRS=04 ENDP=00 DATA0 6B 00 69 00 74 00 20 00 ACK 0252831 IN ADRS=04 ENDP=00 DATA1 32 00 20 00 4D 00 69 00 ACK 0252836 IN ADRS=04 ENDP=00 DATA0 63 00 72 00 6F 00 63 00 ACK 0514986 IN ADRS=04 ENDP=00 DATA1 6F 00 6E 00 74 00 72 00 *********************** ACK 0252846 IN ADRS=04 ENDP=00 DATA0 6F 00 6C 00 6C 00 65 00 ACK 0252851 IN ADRS=04 ENDP=00 DATA1 72 00 20 00 50 00 72 00 ACK 0252857 IN ADRS=04 ENDP=00 DATA0 6F 00 67 00 72 00 61 00 ACK 0252862 IN ADRS=04 ENDP=00 DATA1 6D 00 6D 00 65 00 72 00 ACK 0252863 IN ADRS=04 ENDP=00 NAK 0252864 IN ADRS=04 ENDP=00 DATA0 ACK 0252866 OUT ADRS=04 ENDP=00 DATA1 ACK 0252903 SOF FNO=0B3 0252977 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 01 00 00 12 00 GET_DESCRIPTOR DEVICE ACK 0252982 IN ADRS=04 ENDP=00 DATA1 12 01 00 02 00 00 00 08 ACK 0252986 IN ADRS=04 ENDP=00 DATA0 D8 04 33 00 02 00 01 02 ACK 0515133 IN ADRS=04 ENDP=00 DATA1 03 02 7F 7E 3B A0 F4 3E ****************** 0252989 ACK 0252990 OUT ADRS=04 ENDP=00 DATA1 ACK 0252997 SOF FNO=0B2 0252997 PRE 0253013 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 02 00 00 09 00 GET_DESCRIPTOR CONFIG ACK 0253020 IN ADRS=04 ENDP=00 DATA1 09 02 29 00 01 01 02 80 ACK 0253021 NAK 0253022 IN ADRS=04 ENDP=00 DATA0 32 C1 6A 3B A0 F4 1E 0253023 OUT ADRS=04 ENDP=00 DATA1 ACK 0253045 SETUP ADRS=04 ENDP=00 DATA0 80 06 00 02 00 00 29 00 GET_DESCRIPTOR CONFIG ACK 0253050 IN ADRS=04 ENDP=00 DATA1 09 02 29 00 01 01 02 80 ACK 0253056 IN ADRS=04 ENDP=00 DATA0 32 09 04 00 00 02 03 00 0253057 ACK 0253061 IN ADRS=04 ENDP=00 DATA1 ? [00000001] ? [10000110] 0253067 IN ADRS=04 ENDP=00 DATA0 22 1D 00 07 05 81 03 40 ACK 0253072 IN ADRS=04 ENDP=00 DATA1 00 01 07 05 01 03 40 00 ACK 0253075 IN ADRS=04 ENDP=00 DATA0 01 81 7F 3A A0 F4 7E 00 0253077 OUT ADRS=04 ENDP=00 DATA1 ACK 0253090 SOF FNO=0B3 0253092 SETUP ADRS=04 ENDP=00 DATA0 00 09 01 00 00 00 00 00 SET_CONFIG ACK 0253094 IN ADRS=04 ENDP=00 DATA1 ACK 0258719 SOF FNO=0EF 0258813 PRE 0258831 SETUP ADRS=04 ENDP=00 DATA0 21 0A 00 00 00 00 00 00 ACK 0258833 NAK 0258834 IN ADRS=04 ENDP=00 DATA1 ACK 0258857 SETUP ADRS=04 ENDP=00 DATA0 81 06 00 22 00 00 5D 00 ACK 0258863 IN ADRS=04 ENDP=00 DATA1 06 00 FF 09 01 A1 01 19 ACK 0258868 IN ADRS=04 ENDP=00 DATA0 01 29 40 15 00 26 FF 00 ACK 0258872 IN ADRS=04 ENDP=00 DATA1 75 08 95 40 81 02 19 01 ACK 0258877 IN ADRS=04 ENDP=00 DATA0 29 40 91 02 C0 C3 24 1B 0258878 OUT ADRS=04 ENDP=00 DATA1 ACK 0258906 SOF FNO=0F1 0259000 SOF FNO=0F2 0259001 PRE 0259094 SOF FNO=0F3 0259188 SOF FNO=0F4 0259188 PRE 0259281 SOF FNO=0F5 0259293 IN ADRS=04 ENDP=01 0259375 SOF FNO=0F6 0259387 IN ADRS=04 ENDP=01 NAK 0259469 SOF FNO=0F7 0259481 IN ADRS=04 ENDP=01 NAK |
USB接続の最初に行なわれるEnumerationという手続きは上のリストに見られるような、普通に読める形のデータでやり取りされるのではありません。
SOF、SETUP、IN、OUT、DATA0、DATA1というような文字が実際に送られるのではなくて、すべてがコード化されています。
実際に送られるデータがどのようなもので、そしてそれを「翻訳」するとどうなるのかというあたりについては[第17回]から[第19回]あたりでお見せしています。
CPLD+SIMMを使って記録したナマのデータは1度で16MBになります。
本当は1回で記録するデータは8MBなのですがちょっとわけがあってダブルで記録するので16MBです。
それを自作の解読ソフトにかけると上のリストができあがります。
実際にはこんなものじゃなくってなにしろ16MBのデータを解読するのですからメチャメチャ長いものになります。
しかし実データがなくてSOFだけが連なっているところも沢山有りますし、Enumerationが終わって普通のデータのやりとりになってしまったところも含まれます。
また前にも説明しましたように、コマンドにすぐには応答できなくてNAKを繰り返し送るところもあります。
上のリストではそういう余計な部分は外してしまって見易いリストになるように編集してあります。
実際リストの終わりの部分はENDP=01(エンドポイント1)に対するアクセスが行なわれています。
EnumerationはENDP=0で行なわれます。
それ以外のエンドポイントは普通のデータのやりとりをするパイプです。
上のリストはもとのリストではこのあと、データの最後まで延々とENDP=1のアクセスが続いているのをカットしてあります。
上のリストで見ますとEnumerationが終わったのはFNO=0F1の前で、そのときのデータ行bヘ258906です。
データ行bノついては以前に説明をしました([第19回])。
データの先頭から258906×16=4142496バイトのところです。
上に書きましたようにCPLD+SIMM回路で使ったSIMMは32×8Mビットのもので、一度の記録ではそのうちの8×8Mビット、つまり8Mバイトのデータを記録します。
上のリストの結果でみるとEnumerationの記録はそのうちの半分のところで完了していますから8MBの容量で十分足りています。
実は今回のところを書き始めた時点では、このリストをお見せして、上のようにざっと説明を書いたところでこの項については終わり、のつもりだったのですが。
私自身の備忘録とするためにも、ここはもう少し詳細に説明を加えておいたほうがよいように思い始めました。
本日は時間がありませんので、ここまでにいたしますが、次回から何回かに分けてせっかくの記録データですからもう少し詳細に説明を加えていきたいと思います。
CPLD+SIMMを使ってUSBプロトコルの解析を![第30回]
2014.3.21upload
前へ
次へ
ホームページトップへ戻る