CPLD+SIMMを使ってUSBプロトコルの解析を!
VHDLを速習! XC95144XL+16MB・SIMMを使ってUSBプロトコルアナライザを作ってしまいました!
主目的は差し迫った事情からUSBプロトコルの解析をすることだったのですが、その手段として選んだのがコレ!
[第46回]
●Enumeration はじめから終わりまでの記録(12)GET_DESCRIPTOR(CONFIGURATION)(その2)
前回からの続きです。
前回はホストから出された2回目の GET DESCRIPTOR(CONFIGURATION)リクエストと、それに応えてPICWRITERから出された
CONFIGURATION DESCRIPTORの途中のところまでを説明しました。
CONFIGURATION DESCRIPTORの2番目の項目、INTERFACE DESCRIPTORは9バイトですが7バイトまでで終わってしまいました。
その次の8バイト目と9バイト目は次の8バイトのデータにあるはずなのですが、解読プログラムが解読に失敗してしまったようです。
このままでは面白くありませんので、昔ながらの紙とエンピツを使った方法で解読を試みました。
25974 FF FF 07 4C 23 40 D1 07 D4 DA FF FF FF FF FF 03 25975 A6 11 A0 E8 01 97 00 00 12 42 02 00 00 02 86 AD 25976 76 40 E9 FD FF FF 07 4C 23 40 D1 07 D4 DA FF FF 03 A6 11 A0 E8 11000000 01100101 10001000 00000101 00010111 | | | | | SYNC IN ADRS=4 EP=0 CRC5 01 97 00 00 12 42 02 00 00 02 86 AD 10000000 11101001 00000000 00000000 01001000 01000010 01000000 00000000 00000000 01000000 01100001 | | | | | | | | | | SYNC DATA1 00 00 09 21 01 00 00 01 CRC16 76 40 E9 FD FF FF 07 4C 23 40 D1 07 D4 DA FF FF 01101110 00000010 10010111 | | SYNC ACK |
おお。
まともにデータが出てきました。
やっぱり解読プログラムにバグがあったようです。
手作業で解読した部分を前回お見せしたリストに落とし込んでみました(*****の行です)。
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 00 00 09 21 01 00 00 01 ***** 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 |
こうすることで前回読めなかったINTERFACE DESCRIPTORの最後の2バイトが読めるようになりました。
しかしせっかく苦労して読んでみたものの2バイトとも00とはがっかりです。
INTERFACE DESCRIPTORの8バイト目はプロトコルコードで特に指定しない場合は00にします。
最後の9バイト目はこのINTERFACE DESCRIPTORを示すSTRING DESCRIPTORのINDEXです。
指定しない場合は00にします。
さてその次のデータ(手作業で解読したデータの3バイト目)を見ますと、やはり先頭は09ですから、次の項目も9バイトのようです。
09 21 01 00 00 01 22 1D 00(終わりの3バイトは次の8バイトデータの先頭の3バイトです)
ディスクリプタの2バイト目は、そのディスクリプタの種類を示しています。
コード21はHID DESCRIPTORです。
次の2バイトはHIDバージョンです。
ここはBCD表現とのことですが、0001ですから、そのまま読むとバージョン00.01ということになってしまいます。
せめて01.00くらいであってほしいと思うのですが、まあこのあたりはかなりいい加減でもよいようです。
次の1バイトは国識別番号で指定しないときは00にします。
その次の01はHIDクラスディスクリプタの数です。
次の1バイトはクラスディスクリプタの型指定です。
HIDレポートディスクリプタの場合は22を指定します。
最後の2バイトはHIDレポートディスクリプタのバイト数です。
1DHですから29バイトです。
このHIDレポートディスクリプタも一体どのように記述するのかいまひとつ不得要領なのですが、実は見ていただいておりますリストの最初から最後まで調べてみましても、HIDレポートディスクリプタなるものは出てこないのです。
なぜでしょう?
このように解析していましてもUSBはいまひとつすっきり理解できないところが残ってしまいます。
ま、しかし、ぼやいていてもはじまりませんから、気を取り直して解読を続けることにいたします。
CPLD+SIMMを使ってUSBプロトコルの解析を![第46回]
2014.5.1upload
前へ
次へ
ホームページトップへ戻る