2014.4.29

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

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


[第45回]


●Enumeration はじめから終わりまでの記録(11)GET_DESCRIPTOR(CONFIGURATION)

今回は[第43回]からの続きです。
[第43回]ではその前回から続いてホストから出されたGET DESCRIPTOR(STRING)リクエストとそれに対するPICWRITERの応答について説明をしました。
今回はその続きです。

0025960 SETUP ADRS=04 ENDP=00 
        DATA0  80 06 00 02 00 00 FF 00   GET_DESCRIPTOR CONFIG
        ACK 
0025961 IN ADRS=04 ENDP=00 
        NAK 
0025962 IN ADRS=04 ENDP=00 
        NAK 
0025964 IN ADRS=04 ENDP=00 
        NAK 
0025965 IN ADRS=04 ENDP=00 
        DATA1  09 02 29 00 01 01 02 80   
        ACK 
0025967 IN ADRS=04 ENDP=00 
        NAK 
0025968 IN ADRS=04 ENDP=00 
        NAK 
0025969 IN ADRS=04 ENDP=00 
        NAK 
0025969 IN ADRS=04 ENDP=00 
        NAK 
0025971 IN ADRS=04 ENDP=00 
        DATA0  32 09 04 00 00 02 03 00   
        ACK 
0025972 IN ADRS=04 ENDP=00 
        NAK 
0025973 IN ADRS=04 ENDP=00 
        NAK 
0025973 IN ADRS=04 ENDP=00 
        NAK 
0025974 IN ADRS=04 ENDP=00 
        NAK 
0025976 IN ADRS=04 ENDP=00 
        DATA1  
        ? [00000001]
        ? [10000110]
        ACK 
0025976 IN ADRS=04 ENDP=00 
        NAK 
0025977 IN ADRS=04 ENDP=00 
        NAK 
0025978 IN ADRS=04 ENDP=00 
        NAK 
0025979 IN ADRS=04 ENDP=00 
        NAK 
0025980 IN ADRS=04 ENDP=00 
        DATA0  22 1D 00 07 05 81 03 40   
0025981 IN ADRS=04 ENDP=00 
        NAK 
0025982 IN ADRS=04 ENDP=00 
        NAK 
0025983 IN ADRS=04 ENDP=00 
        NAK 
0025984 IN ADRS=04 ENDP=00 
        NAK 
0025985 IN ADRS=04 ENDP=00 
        NAK 
        ? [01111110]
0025986 IN ADRS=04 ENDP=00 
        DATA1  00 01 07 05 01 03 40 00   
        ACK 
0025987 IN ADRS=04 ENDP=00 
        NAK 
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 

PICWRITERがSTRING DESCRIPTORを返すとホストからはGET DESCRIPTOR(CONFIGURATION)リクエストが出されます。

80 06 00 02 00 00 FF 00 です。

GET DESCRIPTOR(CONFIGURATION)リクエストは[第40回]でも説明しました。
そこで説明したことと同じですがもう一度書くことにします。

最初の 80 06 はGET DESCRIPTORです。
次の 00 02 はその要求がCONFIGURATION DESCRIPTORを要求していることを示しています。
コード 02はCONFIGURATION DESCRIPTORを示していて、00 はINDEXです(この場合には00になります)。
次の 00 00 はリクエストによって意味が異なりますがこの場合には 00 00 です。
最後の2バイトは要求しているDESCRIPTORの長さ(バイト数)です。
[第40回]では 09 00 でしたが今回は FF 00 になっていて、事実上ホストが長さを指定していないことになります。

PICWRITERからも、今回はCONFIGURATION DESCRIPTORの全部が出力されています。
前にも説明しましたがENUMERATIONのデータの送受信は8バイト毎に区切って行なわれます。
上のリストでも解読ソフトによって、そのように(8バイト毎に区切って)表示していますが、データ内容は必ずしも8バイト毎に区切られているわけではありません。
そこで以下の説明では内容によって区切って説明することにします。

CONFIGURATION DESCRIPTORの最初の部分は

09 02 29 00 01 01 02 80 32 

です(最後の32は次の8バイトの先頭の1バイトです)。
このところも[第40回]で説明をしました。
同じことになりますがもう一度書くことにします。

ディスクリプタの最初の1バイトはそのディスクリプタの長さを指定します。
ここでは09ですから9バイトであることを示しています。
ディスクリプタの2バイト目は、そのディスクリプタの種類を示しています。
このディスクリプタがホストから要求されたCONFIGURATION DESCRIPTOR(コード02)であることを示しています。
次の 29 00 はCONFIGURATION,INTERFACE,ENDPOINTの各DESCRIPTORを合計した全バイト数です。
29H=41ですから全体では41バイトあることを示しています。
次の1バイトはINTERFACE DESCRIPTORの個数(このリストでは01)です。
その次の1バイトは複数のCONFIGRATION DESCRIPTORがあるときにその番号(このリストでは01)です。
次の1バイトはCONFIGURATION DESCRIPTORのSTRING DESCTIPTOR のINDEX(このリストでは02)です。
この2バイトについては[第40回]にも書きましたが意味がよくわかりません。
8バイト目はビット7〜5までに意味があります。ビット4〜0はリザーブされています(全ビット:0)。
このリストでは80ですから、ビット7=1でそれ以外は0です。
ビット7=1はUSBバスラインから+5V電源を取ること(バスパワー)を指定しています。
ビット6は自己電源の指定です。
ビット5はリモートウェイクアップの指定です。
最後の1バイトは2回目の送信データの先頭にある1バイトです。
32 です。
この1バイトはバスパワーを使う場合の最大消費電流です。
2mA単位で指定します。
このリストでは32Hですから500mAということになります。
これはUSB2.0規格での最大値になります。

[第40回]はここまでで終わっていましたが今回は続きがあります。
2回目の送信データの2バイト目から後ろです。

09 04 00 00 02 03 00

もう何回も書きましたようにディスクリプタの最初の1バイトはそのディスクリプタの長さを指定します。
ここでは09ですから9バイトであることを示しています。
ディスクリプタの2バイト目は、そのディスクリプタの種類を示しています。
コード04はINTERFACE DESCRIPTORです。
次の2バイトはINDEXとかなんとか意味があるようなのですが、デフォルトではいずれも00のようです。
次の1バイトは00以外のエンドポイントの数です。
ここでは02ですから、エンドポイントが2つあることになります。
次の03はCLASSコードです。
03はHIDインターフェイスクラスです。
その次の00はサブクラスコードです。
HIDの場合ここは00でよいようです。

さて、このINTERFACE DESCRIPTORも先頭は09ですからトータルでは9バイトになります。
ここまでで7バイトですからあと2バイトあることになります。
ところがリストを見ますとその次のデータは
? [00000001]
となっていてどうやら解読に失敗しているようです。
しかしもとのデータを調べてみましたら、ここはどうも解読プログラムにバグがあるようで、データそのものは解読可能でした。

本日は時間がなくなってしまいましたので、そのことにつきましては次回に説明することにいたします。

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

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