2014.4.5

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

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


[第38回]


●Enumeration はじめから終わりまでの記録(6)再びGET_DESCRIPTOR(DEVICE)

前回はホストからADDRESS SETリクエストが送られて、PICWRITERがそれに応えて空のDATA1を返したところまでを説明しました。
今回はその続きです。
今回もリストが前回と重複しますが、前回のADDDRESS SETリクエストのところを含めて続きの部分をお見せします。

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 
0019990 SOF FNO=6FE
0020084 SOF FNO=6FF
0020178 SOF FNO=700
0020178 PRE 
0020271 SOF FNO=701
0020365 SOF FNO=702
0020366 PRE 
0020459 SOF FNO=703
0020553 SOF FNO=704
0020553 PRE 
0020647 SOF FNO=705
0020740 SOF FNO=706
0020834 SOF FNO=707
0020928 SOF FNO=708
0020929 PRE 
0021022 SOF FNO=709
0021116 SOF FNO=70A
0021116 PRE 
0021209 ? [10111110] // 0283353 SOF FNO=70B
0021303 SOF FNO=70C
0021304 PRE 
0021397 SOF FNO=70D
0021491 SOF FNO=70E
0021585 SOF FNO=70F
0021678 SOF FNO=710
0021679 PRE 
0021772 SOF FNO=711
0021866 SOF FNO=712
0021867 PRE 
0021960 SOF FNO=713
0022054 SOF FNO=714
0022054 PRE 
0022147 SOF FNO=715
0022241 SOF FNO=716
0022335 SOF FNO=717
0022429 SOF FNO=718
0022429 PRE 
0022523 SOF FNO=719
0022616 SOF FNO=71A
0022617 PRE 
0022710 SOF FNO=71B
0022804 SOF FNO=71C
0022805 PRE 
0022898 SOF FNO=71D
0022992 SOF FNO=71E
0023085 SOF FNO=71F
0023179 SOF FNO=720
0023180 PRE 
0023273 SOF FNO=721
0023367 SOF FNO=722
0023368 PRE 
0023461 SOF FNO=723
0023555 SOF FNO=724
0023648 SOF FNO=725
0023742 SOF FNO=726
0023836 SOF FNO=727
0023930 SOF FNO=728
0023930 PRE 
0024023 SOF FNO=729
0024117 SOF FNO=72A
0024118 PRE 
0024211 SOF FNO=72B
0024305 SOF FNO=72C
0024306 PRE 
0024399 SOF FNO=72D
0024493 SOF FNO=72E
0024586 SOF FNO=72F
0024680 SOF FNO=730
0024680 PRE 
0024774 SOF FNO=731
0024868 SOF FNO=732
0024868 PRE 
0024962 SOF FNO=733
0025055 SOF FNO=734
0025056 PRE 
0025149 SOF FNO=735
0025243 SOF FNO=736
0025337 SOF FNO=737
0025431 SOF FNO=738
0025431 PRE 
0025524 SOF FNO=739
0025618 SOF FNO=73A
0025618 PRE 
0025712 SOF FNO=73B
0025789 SETUP ADRS=04 ENDP=00 
        DATA0  80 06 00 01 00 00 12 00   GET_DESCRIPTOR DEVICE
        ACK 
0025790 IN ADRS=04 ENDP=00 
        NAK 
0025792 IN ADRS=04 ENDP=00 
        NAK 
0025793 IN ADRS=04 ENDP=00 
        NAK 
0025795 IN ADRS=04 ENDP=00 
        DATA1  12 01 00 02 00 00 00 08   
        ACK 
0025796 IN ADRS=04 ENDP=00 
        NAK 
0025800 IN ADRS=04 ENDP=00 
        DATA0  D8 04 33 00 02 00 01 02   
        ACK 
0025806 SOF FNO=73C
0025806 PRE 
0025811 IN ADRS=04 ENDP=00 
        DATA1  03 02 7F 7E 3B A0 F4 FE // DATA1  03 02 7F 7E 1B 50 7A 80
0025812 OUT ADRS=04 ENDP=00 
        DATA1  
        ACK 

しばらくの間、空のフレームが発行されてFNO(フレームナンバー)だけがアップされています。
途中で一箇所FNOが正しく読み取れなかったところがあります。
そこはこのデータと同時に記録した「予備のデータ」を使って補正しました。
この「予備のデータ」についてはいずれ説明をするつもりです。

リストの下の方でホストからGET_DESCRIPTOR(DEVICE)リクエストが送出されています。
このリクエストは、PICWRITERをWindowsXPパソコンにUSB接続したとき、最初にホスト(WindowsXPパソコン)から送出されたのと同じですが、よく見ると全く同じではなくて少し違っているところがあります。

まず第一にアドレスが違います。
最初はADRS=00で送信受信を行いましたが、前回説明しましたADDRESS SETリクエストによって、ADRS=04が指定されましたから、以後はADRS=04を使って通信が行なわれています。

それから第二に最初のGET_DESCRIPTOR(DEVICE)リクエストでは、DEVICE DESCRIPTORのバイト数が不明なので40H(=64バイト)になっていました。
今回はそのときPICWRITERが応答して送ったDEVICE DESCRIPTORの先頭で、全体の長さが12H(=18バイト)であると記述しましたので、その結果今回のGET_DESCRIPTOR(DEVICE)リクエストではDEVICE DESCRIPTORの長さは12H(18バイト)になっています。

リクエストに応えてPICWRITERからは8バイトずつに区切ってDEVICE DESCRIPTORが送出されています。
端末から送るデータは、DATA1、DATA0、DATA1というようにDATA1から始まって交互にトグルしながら送出します。
これに対してホストから送られるリクエストは必ずDATA0になります。
また端末がデータを送り終わると(あるいはホストが端末からのデータを途中で打ち切るときも)ホストからはデータ無しのDATA1が送出されます。
今回は途中で打ち切られずに18バイトのデータが送信されています。

PICWRITERから送出されたDEVICE DESCRIPTORのうち、最初の8バイトについては[第36回]で説明しました。
そこで次の2番目の8バイトについて説明をします。

先頭の2バイト D8 04 はVID(Vendor ID)です。
04D8はMicrochipのVIDです。
次の2バイト 33 00 はPID(Product ID)です。
これは端末メーカー(Vendor)によって製品ごとに割り当てられるIDで、0033はMicrochipの場合PIC WRITERに割り当てられています。
次の2バイトはシリアルナンバーです。
これも端末メーカー(Vendor)によって任意に割り当てられます。
ホストはVID、PID(およびシリアルナンバー)によって端末を特定のものとして認識します。

次の1バイトはVENDOR名を記述するSTRING DESCRIPTORのインデックス番号(通常は1)です。
STRING DESCRIPTORは省略可能なので、省略する場合には 00 を記述します。
最後の1バイトはPRODUCT名を記述するSTRING DESCRIPTORのインデックス番号(通常は2)です。
省略する場合には 00 を記述します。

残りは2バイトなのですが、実はCPLD+SIMM回路によって記録したデータを解読するために作ったプログラムは「そこそこ解読できればよい」ていどのプログラムですから、DATAは一律に8バイトとして表示しています。
ですので最後のDATA1も8バイト表示されていますが、このうち本当のデータは先頭の2バイト 03 02 だけです。

最初の1バイトはシリアルナンバーを記述するSTRING DESCRIPTORのインデックス番号(通常は3)です。
省略する場合には 00 を記述します。
最後の1バイトはCONFIGURATION DESCRIPTORの個数を記述します。
ここでは02になっていますが、これはちょっと疑問です(普通は01だと思うのですけれど…)。

この最後の8バイトデータについては、もう少し説明しておきたいことがあるのですが、それは次回にすることにいたします。

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

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