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