2014.3.21

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

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

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