LED万歳!!

.30 2010 AVR-USB comment(0) trackback(0)
エラーがでたらエラーの原因のパケットの中身をLEDに表示。これは定石。今回も散々悩んだ挙句、結局この方法であっさり解決できました。

受信したSETUPトランザクションの数をLEDに表示してみます。すると…

デバイス接続時に一気に5個来ていることがわかります。

そのあとドライバをインストールするとLEDの表示は7になります。

6, 7番目に受け取ったトランザクションの処理が怪しかったことになります。

6番目のトランザクションのDATAパケット
0x80, 6, 0, 1, 0, 0, 18, 0
GET_DESCRIPTOR(Device) for 18 byte

これは最初に受け取ったSETUPと同じ。7transaction目が来ているということはこれは正常に処理されていると思われる。

ということは一番怪しいのは次のトランザクション。

7番目のトランザクションのDATAパケット
0x80, 6, 0, 2, 0, 0, 9, 2
これはGET_DESCRIPTOR(Configuration)ですが、
2番目のトランザクションのDATAパケット
0x80, 6, 0, 2, 0, 0, 9, 0
と比較してみると、最後が2になっていることが分かります。

最後の2byteは2つあわせて送信サイズの指定(Little Endian)。ディスクリプタのサイズは32ですが、2番目のトランザクションではmin(9, 32) = 9byteだけ返せばいいのに対して、
7番目のトランザクションではmin(9 + 512, 32) = 32byteすべて返さないといけないのです。

どうせ256byteを超えて指定してくることはないと勝手に思い込んでいたら見事にはめられました。

これを直したらドライバのインストールも完了しました!!

# そういえばSOFパケットってIsochronous転送のときだけしか使われないみたいですね。

次の課題はUusbdで一旦Closeしてもう一度Openするとデバイスが発狂するというバグを直すことです。
動作を見た感じではあるパケットを受信した後、AVRの中でメモリアクセス違反が起こって全体がリセットされていると思われます。

組み込み系のバグって本当にネタが尽きませんねw
関連記事

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

trackbackURL:http://yuranos.blog11.fc2.com/tb.php/63-abf23c08