2014.5.1

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

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

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