2014.4.21

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

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


[第43回]


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

相変わらず超多忙でなかなかホームページの更新にまで手が回りません。
どうか気長にお付き合いください。

前回からの続きです。
前回はホストから出されたGET DESCRIPTOR(STRING)リクエストに対して、PICWRITERが要求されたSTRING DESCRIPTOR(INDEX 0)を返したところを説明しました。
今回はその続きです。

0025900 SOF FNO=73D
0025910 SETUP ADRS=04 ENDP=00 
        DATA0  80 06 03 03 09 04 FF 00   GET_DESCRIPTOR 
        ACK 
0025912 IN ADRS=04 ENDP=00 
        NAK 
0025913 IN ADRS=04 ENDP=00 
        NAK 
0025914 IN ADRS=04 ENDP=00 
        NAK 
0025916 IN ADRS=04 ENDP=00 
        DATA1  10 03 4F 00 6C 00 48 00   
        ACK 
0025918 IN ADRS=04 ENDP=00 
        NAK 
0025918 IN ADRS=04 ENDP=00 
        NAK 
0025919 IN ADRS=04 ENDP=00 
        NAK 
0025920 IN ADRS=04 ENDP=00 
        NAK 
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 

ホストからは続いてまたGET DESCRIPTOR(STRING)リクエストが出されています。

80 06 03 03 09 04 FF 00 です。

最初の 80 06 はGET DESCRIPTORです。
次の 03 03 はその要求がSTRING DESCRIPTORを要求していることを示しています。
4バイト目のコード 03はSTRING DESCRIPTORを示していて、3バイト目の03 はINDEXです。
STRING DESCRIPTOR のINDEX 03は[第38回]で説明しましたDEVICE DESCRIPTORで記述しています。
シリアルナンバーのSTRING DESCRIPTORです。
これは余り重要ではなくて普通は無視されてしまうものだと思うのですが、どういうわけかVENDOR(INDEX 01)やPRODUCT(INDEX 02)についてのSTRING DESCRIPTORを飛ばして、いきなりINDEX 03の要求です(ちょいと首をかしげてしまいます)。

次の2バイトはこのSTRING DESCRIPTORを記述する言語の指定です。
コード0409は英語です。
前回説明しましたSTRING DESCRIPTOR(INDEX 00)で指定しました。

最後の FF 00 は要求しているDESCRIPTORの長さ(バイト数)がFFH(255バイト)であることを示しています。
事実上ホストからは長さを指定しないことになります。

PICWRITERからはその要求に応えてSTRING DESCRIPTOR(INDEX 03)が出力されています。
10 03 4F 00 6C 00 48 00
です。

ディスクリプタの最初の1バイトはそのディスクリプタの長さを指定します。
10ですから16バイトであることを示しています。

ディスクリプタの2バイト目は、そのディスクリプタの種類を示しています。
このディスクリプタがホストから要求されたSTRING DESCRIPTOR(コード03)であることを示しています。
ここではINDEXについては表記していませんが、ホストから要求された通り、INDEX 03を送ります。
INDEX 00以外のSTRING DESCRIPTORの3バイト目以後は文字を示すコードです。
全体が16バイトですから、その次に送出されている8バイトをあわせてちょうど16バイトです。

STRING DESCRIPTORの文字コードは16ビット2バイトで1文字を表します。
英語(ASCIIコード)は8ビット(1バイト)ですから、上位バイトはつねに00になります。
ここでPICWRITERから出力されたSTRING DESCRIPTOR(INDEX 03,シリアルナンバー)の文字コード部分を順に並べて解読してみました。

004F O
006C l
0048 H
006F o
0073 s
0073 s
0000

OlHoss ???
はて?
何でしょう?
まるで符牒か暗号のようです。
さっぱりわけがわかりません。

意味は分かりませんが、このSTRING DESCRIPTORについては興味深いことが読み取れます。
そのことについては[第27回]に書きました。
PICWRITERから送出したSTRING DESCRIPTORは実に丁寧なデータとなっています。
まずは切のよいように8バイトを2回でちょうどデータが完了するようにして、先頭に10H(16バイト)という数を置いています。
これで十分と思うのですが、さらに文字列の最後に0000を置いて、これで文字列が終わりであることを示しています。
それなのにホストからは[第27回]に書きましたように、なおもしつこくINパケットを送出して続きのデータを要求しています。
PICWRITERはそれに応えるべきデータを持っていませんから、空のDATA1を返すと、そこでやっとホストからも空のDATA1が送出されて、やっとSTRING DESCRIPTORの送信が完了しました。

むむ。
なんというひどいルールでしょう。
これはもう理解不能です。

しかし幸いといいますか、STRING DESCRIPTORは省略してもいいらしいので、私はもうSTRING DESCRIPTORは省略してしまうことに決めてしまいました。

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

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