Configured State

.27 2010 AVR-USB comment(0) trackback(0)
プログラムのあちこちにtrapをしかけ、デバッグしたところ、ホストからのConfiguration要求に対して正常に返答していないことがわかりました。
ConfigurationDescriptorの中で指定しているサイズ(=41, 6packet)に対して、実際に送信されているのはそれより少なく(=32, 5packet)なっていました。
よ~く見るとCで指定している送信要求サイズが間違っていたというだけの簡単な話。
またこんな簡単なミスを見つけるのに異常に時間がかかってしまった。簡単なミスほど見落としやすいものです。

これを修正し、Device Descriptor、Configuration Descriptorをホストに送ると、めでたくホストからSET_CONFIGUTATION requestが来ました。
これでAddress StateからConfigured Stateに移行したことになります。

ただ、XPで実験すると音は相変わらず「ぽぽぽん」のままです。Vistaではこの段階で通常の接続音になります。

Configuration Descriptor(の一部)を送信した段階で、Windosの出す「USBポートにゴミが詰まっています」というメッセージが出なくなり、かわりに音がするようになります。
USBポートにデバイスを繋いで「ぽぽぽん」という音がしたら、Device DescriptorとConfiguration Descriptorの一部がホストに送られ、その辺りでつまっていることになります。
「USB ポポポン」でググったところ、iPodとかでたまにそういう現象が起きるようです。尤も大半はデバイス自体の問題ではなくドライバがイってるだけのようですが。

作業メモ
SETUPの内容を処理する前にINパケットが来ると、受信バッファの最初の3byte(INパケットは3byteなので)を上書きしてしまうので対処した。
つまり「recvLen != 0」のときにパケットが来ても受信バッファに保存せず、ACKなら無視し、SETUP, OUTなら次のパケットを待ってNAKを返し、それ以外なら即座にNAKを返すようにした。

確認済みのバグ
USBコネクタを特定の方向から超ゆっくり差し込むとときどきバグります。
趣味の世界ではどうでもいい話ですが面白いので原因を考えてみました。

コネクタを良く見ると、長い端子と短い端子がいることが分かります。
長い端子は電源で、短い端子はD-, D+です。
普通に差し込めば電源が先に入り、デバイスが動き出してからD-, D+がつながって安定して起動できるというわけです。

しかし、ちょっとがんばって変な方向から差し込めばD-, D+の端子から先に繋げることができます。

この場合、おそらく次のような現象が起こっていると考えられます。

D-がつながっている状態で電源ラインが入る。VccとD-の間に1.5kΩの終端抵抗が入っているのでこの時点でホストはデバイスの存在を認識する。
  • この後ホストは数10ms待ち、パケットを送出し始める。
  • その辺りでデバイスが起動する(外部発振子の起動が遅いため)。
  • デバイスは起動直後にD-, D+をLにしてSE0状態にして数10ms待つ。
  • デバイスがSE0を出力している間にホストは何度か返送要求をする。
  • 結局ホストから見れば「返答要求しているにも関わらずSE0」という状態が何度も続くので接続を諦める。
  • ホストが接続を断念した辺りでデバイスがSE0を解除し、割り込みを有効にする。
  • しかし何も起こらない。

だいたいこんな感じだと思います。1.5kΩの終端抵抗を電源直結にしないでデバイスの出力に繋げば、デバイスが立ち上がるまでホストはデバイスの存在を認識しないので、こういうバグは防げるのかもしれないです。

まぁこのバグは「USBコネクタに無理な力を加えないでくださいね」で済ませばいいので次に進みます。

次にホストが発行したSETUPトランザクションは「GET_INTERFACE」。
Alternate Settingをサポートしないのでこの要求は無効。実際返答サイズに0を指定してきています。Request ErrorなのでSTALLを返します。
# というかサイズ0で要求ってことは無効な要求なのを承知の上で送ってるんだよね。変なドライバだな。

良く見たらbmRequestTypeのフィールドがClass Specificだったので見るべき仕様書はHIDのほうでした。結局これはSET_IDLEでした。
お次はいよいよGETDESCRIPTOR(Report)。
そろそろ本格的にHID Descriptorの仕様書とにらめっこしないといけないようです。
関連記事

  • comment
  • secret
  • 管理者にだけ表示を許可する

trackbackURL:http://yuranos.blog11.fc2.com/tb.php/59-a79d06af