2014.3.27

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

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


[第33回]


●Enumeration はじめから終わりまでの記録(3) リクエストについて

[第31回]の終わりのところで、Enumerationの始めにホストから送られるGet Device Descriptor(デバイスディスクリプタ要求)コマンドと、デバイスからそれに応答して送られるデバイスディスクリプタについてほんの少しだけ解説じみたことを書きました。
しかしその程度ではほとんど何もわかりません。
せめてもう少し整理して書かなければ、自分自身が後から読んでもなんのことか意味不明になってしまいます。
そこでもう少しは整理してまともなことを書いておくことにいたします。

ホストから送出される8バイトのコマンド(Setup Request)はバイトごとに以下の意味があります。

第1バイト   リクエストの属性(ビットごとに示す)
第2バイト   リクエスト(第1バイトに依存)
第3,4バイト 値(第1,2バイトに依存)
第5,6バイト インデックス(第1,2バイトに依存)
第7,8バイト 長さ(第1,2バイトに依存)

第1バイトはビットごとに以下の意味があります。

ビット7   データの向き
        0=ホスト→デバイス
        1=デバイス→ホスト
ビット6:5 タイプ 
        00=USB標準
        01=クラス定義
        10=ベンダー定義
ビット4:0 ターゲット(Receipient)
        00000=デバイス
        00001=インターフェイス
        00010=エンドポイント

うーん。
これじゃあやっぱりわかりませんねえ。

ただ第1バイトのビットごとの意味をよーく見ていると、通常ホストから送出されるコマンド(リクエスト)は一般には次の3通りらしいことがわかります。
80 デバイスに関するもの
81 インターフェイスに関するもの
82 エンドポイントに関するもの
これらはデバイスからホストにデータを送ることを要求するものです。
それとは逆にホストからデータを送ることを宣言するのが通常は以下の3通りのようです(これをRequestというのはちょいと違和感があります)。
00 デバイスに関するもの
01 インターフェイスに関するもの
02 エンドポイントに関するもの

おお。
なんとなく少しはわかってきたような気がします。
で。
次の第2バイトはといいますと、ここはリクエストを定義しているのですが、第1バイトに依存するとありますように、同じ値であっても第1バイトが違えば別の意味になってしまうようです。
ということになりますと、結局のところは第1バイトと第2バイトをペアにして考えないことには意味がわからないことになります。
もっと言いますと第1バイトはデータ要求の向きや対象を示しているだけで、本当のリクエストの意味については第2バイトが示しているけれども、第1バイトとペアにしないとリクエストを示すことにならない、ということのようです。

実際ホストから送られるリクエストについて解説しているサイトや参考書を見ますと、上記の第1バイトの区分けごとに第2バイトによって示されるリクエストの種類がこと細かく表示されています。
私もそれにならってここにこと細かく表示してもよろしいのですけれど、それをやってみても結局のところは何もよくわからないことに変わりはないと思いますのでやめておきます。

あらためてCPLD+SIMM回路によって記録し解読しましたデータリストをながめてみましたら、ホストからは以下のものしか送出されていないことがわかりました。

80 06 00 01 00 00 40 00  GET DEVICE DESCRIPTOR
80 06 00 02 00 00 09 00  GET CONFIGURATION DESCRIPTOR
80 06 00 03 00 00 FF 00  GET STRING DESCRIPTOR(INDEX=00)
80 06 02 03 09 04 FF 00  GET STRING DESCRIPTOR(INDEX=02)
80 06 03 03 09 04 FF 00  GET STRING DESCRIPTOR(INDEX=03)
81 06 00 22 00 00 5D 00  GET DESCRIPTOR ?
00 05 04 00 00 00 00 00  SET ADDRESS
00 09 01 00 00 00 00 00  SET CONFIGURATION
21 0A 00 00 00 00 00 00  ???

最初の2バイトが 80(または81) 06 はGET DESCRIPTORで、そのとき次の2バイトはDESCRIPTORの種類およびINDEXを示します。
第4バイトが01はDEVICE、02はCONFIGURATION、03はSTRINGです。
それでそこまでをもとにして横に意味を記載しました。
最後の2バイトはDESCRIPTORの長さ(バイト数)を示します。
STRING DESCRIPTORの第5,6バイトは文字コードの指定です。

説明の途中ですが、本日は時間がなくなってしまいました。
この続きは次回にいたします。

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

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