2014.2.17

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

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


[第18回]


●スタッフビット(stuffbit)

前回の終わりのところでお見せした画像に「一箇所おかしいところがあります」と書きましたが、どこだかおわかりになりましたでしょうか?
もう一度その画像をお見せします。



解読したリストの上半分ぐらいはずっと SOF FNO= が並んでいます。
SOF とか FNO は勿論解読プログラムusbckr.comによってコードを翻訳した結果を表示したものです。
SOFはフレームの始まりを示すパケット名です(Start of Frame)。
FNOはFrame Numberの略です。
フレームはホストによって1msごとに送られます。
そのときフレームには連続したフレーム番号がつけられます。
フレーム番号は11ビット長ですので16進数で000〜7FFの番号になります。
000から始まって7FFまでいくとまた000に戻って繰り返されます。
この番号は連続して発行されるフレームに機械的につけられるもので、連番であるということ以上の意味はありません。

その番号をずっと下の方へ見ていきますと、おかしいところがみつかります。
05D、05E、の次が09Fになっています。
その次が060ですから、この09Fは間違いで本当は05Fが正しいのではないか、ということが容易に推測できます。
まあかなり乱暴な回路でデータの取得を行なっていますから、ノイズの影響なのかどうかはわかりませんが、中にはおかしなところがところどころに見られます。
しかしこのFNOについてはノイズの影響やデータの誤読ではありません。

実はこれはUSB信号をパラレルからシリアルに変換して送る場合にある決ったルールで挿入されるスタッフビット(stuffbit)のせいなのです。
[第13回]でNRZI変調について説明をしました。
パラレルデータをシリアルに変換するときに、0のビットのときは前の信号の状態を反転し、1のビットのときは前の状態を維持する、という変換ルールでした。
こうすると0が連続したときは、信号が0101…と反転を繰り返すために、信号を安定して送ることができます(ずっとHレベル、Lレベルのままだとノイズの影響を受けやすくなります)。
するとここで疑問になるのは、それでは1ばかりが続いたらどうなるのかということです。
もとのデータがたとえば連続してFFが続くような場合を考えてみますと、その前の状態によって、0か1が連続して続くことになります。
そこで、もとのデータで1が連続して6個以上続く場合には、6番目の次に強制的に0を挿入して送ります。
0を挿入することで連続して続く状態をそこで反転させてしまうのが目的です。
これをスタッフビット(stuffbit)といいます。
ビットスタッフということもあるようです。

さきほどの例について考えて見ます。



翻訳前のデータを16進数ダンプファイルで表示してみると、問題のFNO=09Fは80 A5 9F 40 F5というデータであることがわかっています。
それを普通のルールで翻訳してみると、上の画像の6〜9行のようになります。
ここではたまたま16進表記でも翻訳後のコードと同じに見えますが、いつもこのようになっているとは限りません。
ここはたまたまそのようになっただけです。
さてそこでA5と9Fのところを見ますと1が連続して6個続いています。
これは受信データをシリアルからパラレルに戻したあとを見ているのですが、送信するときにも同じパラレルデータをシリアルに変換して送出しているはずです。
するとここで1が6個連続していますから、その次の0(¥マークで示す)は実は強制的に挿入された0ではないかという推測が成り立ちます。
そこでその0を削除して、そこから後ろを順に前につめたあと、もう一度解読してみたのが、その下の12行から15行です。
おお。
FNO=05Fになりました。

なおSOFデータの前後にFFが連続していますが、これはデータの’FF’ではなくて、無信号の状態ですのでホストから送出する意味の有る’FF’データではありません。
ですからこの部分にはスタッフビットは挿入されません。

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

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