LAP-C(16064)のプロトコル解析(USB)がいい感じに使えそう

正月に買ったLAP-C(16064)なんだが、仕事が暇…ではなくて、技術的好奇心が高ぶったのでちと真面目にいじってみた。いつまでなのかは分からないが、今、秋月やストロベリー・リナックスで買うと追加プロトコル20個が無料という大盤振る舞い状態なんで気になっている方も多いんではないかなぁ…と思います。

実は当初、追加プロトコル20個の申請をしたもののうまく解除キーが発行されないというトラブルに見舞われまして…何度も秋月のサポートの方に色々お世話になるという、あまり巷で聞いたことのない経験をしたりしましたが(笑)サポートの方のご尽力により最終的に解除キーを無事Getしました。秋月のサポートの方、その節はどうもありがとうございました。

でまぁ普通のロジアナとして使えるのは勿論なんですが、一番期待していた「USBのプロトコルアナライザ」として軽く使ってみました。

(注)USB1.1のHUBをまだ手に入れていないため、確実にUSB1.1で動いているであろうLow-speedの「マウス」ではありますが。

使ってみて感じたのは、さすがにCATCとかの本物のアナライザには勿論及ばないものの趣味ベースであれば結構使えそうって事かな。セットアップトランザクションの種別までは表示されないので、USBの仕様書片手にアナライズ結果を人力デコードする必要はありますが、NRZI符号のデコードを自力でやることを考えたらお気楽極楽の世界でしょう(笑)

個人的な話になるが、かつてUSBが1.1どころか机上の規格の1.0だった頃…設計していたUSBのFunction側のASICのシミュレーションにてNRZI符号化されたUSBの波形を自力でデコード&説明しなければならない局面に陥ったことがある。今よりもLSIのシミュレーション環境は相当に貧弱だったとはいえ、さすがにVerilogのシミュレーターにNRZI符号のリファレンスモデルくらいは連携させてあった訳だが…ツール自体に疑いが掛かったりすると最低一度はモデル自体が正しいことを証明しなければならなくなる訳だ。

でも…何で俺がその証明作業をやる羽目になったのかは未だに疑問ではある…(爆)

アマチュアとしてUSBのやり取りを可視化できると嬉しい事としては、デバイスを接続した時の既存ドライバのやり取りが分かる&自作機器で使えるようになるあたりだと思います。真面目に追っかけた訳ではありませんが、この安価なロジアナで出来る事の一端が御紹介できればなぁ…と言うことで、画面のキャプチャと簡単な説明などを。 まぁ縮小してしまうと良く分からないかもしれませんが。

 

「Packet 1~15」

[bRequest = 06] [wValue = 0100]なので[GET_DESCRIPTOR ‘INTERFACE’]

USBのセットアップトークンに関してのやり取りは、トランザクションと言うくくりでデータのやり取りが完結するのが約束事。何だか良く分からないかもしれないがそんなに難しい話ではなくて、トランザクションの最後では「今までとは反対方向」の「データ長が0のデータ」を受け取ったり送ったりして終わるという事です。

「GET_xxxxx」というセットアップトランザクションに対しては、最後に「OUT→データ長が0のデータ→ACK」
「SET_xxxxx」というセットアップトランザクションに対しては、最後に「IN→データ長が0のデータ→ACK」

この場合は「GET_DESCRIPTOR INTERFACE」なので全18Byteのデータをホスト側が受け取った後、「OUT→データ長が0のデータ→ACK」で終わってます。

それから今回はマウス(Low-Speedデバイス)なので最大でも1回あたり8Byteの転送しか発生しませんが、Full-Speedデバイスでは64Byteの転送まで可能です。アイソクロナス転送に関してだけは…最大で1023Byteだったっけかな?

「Packet 16~21」

[bRequest = 05] [wValue = 0001]なので[SET_ADDRESS ‘1’]

一番最初はデフォルトアドレスのADDRESS ‘0’で通信が始まりますが、すぐにホスト側から一意のアドレスが振られます。SET_ADDRESSは、セットアップトークン自体にデータが埋め込まれているopコードみたいなコマンドなので、すぐに「IN→データ長が0のデータ→ACK」で終わってます。

「Packet 235~」

しばらくの間、マウスの構成情報等をホストが吸い上げる通信が続きまして…Packet 235から、ついにマウスからの実データを受信します。
今まではEndpoint0(コントロール転送専用Endpoint)での通信でしたが、ここからはデータ出力専用のEndpoint1(あくまでもこのデバイスの場合)にホストが「INトークン」を発行すると、マウス側からデータが出力されます。4Byte単位で2回出力されるみたいですね。1回目がマウスの移動情報で、2回目がスイッチの状態とかなのかな?

特に操作をしていないからか、最初だけデータが出力されて、それ以降はNAK(データ無し)が返ってます。

一般的なマウスであればHIDクラスで定義された値を送信しているので、ロジアナのデータと仕様書を見比べてみれば内容が判ると思います。
http://www.usb.org/developers/devclass_docs/HID1_11.pdf

まぁPCがちゃんと認識するデバイスであれば、PC上で動くフリーソフトのSnoopyProとかでも大まかには分かるけど…確かNAKとかは表示されなかったような気がするな。

そう言えば昔、SnoopyProの使い方をまともに調べずに適当にいじくり回していたら、PS/2ポートの無いPCのUSBホストのドライバを飛ばしてしまってキーボードが使えなくなって泣きそうになった事があったなぁ…(爆)結局あの時は、セーフモードにして何とか復旧したんだっけかな?

まぁそれにしてもこのロジアナ、趣味レベルなら十二分に使えますね。何と言っても格安だし(喜)持ってて損はない一品だと思います。