困ったときは(USB)ホストに聞こう

困ったときは ホストに聞こう
(USB)
ささのたかよし (@uaa)
j2k10@長野県栄村
j2k10@長野県栄村

@yojiroさんと@syuu1228さんのお誘い

会期は2010年9月19日~25日(6泊7日)

1泊2日しか参加できないんですけど
…折角なので行ってみましょう
やったこと。

Intel PCH搭載マシン上でOpenBSDを動かすと、
USBデバイスが認識できないらしい
…という問題の調査と解決

OpenBSDはあんまり詳しくないんだけど、お仕事
でUSBのホスト周りを触ったことがあるので上手く
いくといいよね?
USBの予備知識

USB1.1(1.5Mbps/12Mbps): UHCI/OHCI

USB2.0(480Mbps): EHCI

USB2.0←→USB1.1の速度変換: USBハブ
よくあるUSB1.1/2.0ホストの構成

USB1.1/2.0ホストがそれぞれ存在し、デバイスに
応じて使用するホストが切り替わる
Intel PCHの場合

USB2.0ホストだけ存在し、RMH(Rate Matching
Hub)にUSB1.1への速度変換をお任せ
RMHを使用する際の問題点



USBハブ自体が一つのデバイスなので、USBハブ
との通信がきちんとできないといけない
RMHはチップセットに内蔵されているため、RMHと
の通信をUSBアナライザで解析することはできない
(ここ重要)
RMHとの通信がうまくいってないっぽい
…どんな風にうまくいってないんだろう
OpenBSDでUSBのデバッグ(1)
OpenBSDでUSBのデバッグ(2)
とりあえずprintf()攻撃
ステータスが見えた
※画面はイメージです。問題の発生した時の状況とは異なります。
何が起こっていたか

表示された16進数をEHCIのデータシートと照らし
合わせて状況を把握する


Babble(ホストの要求するサイズよりも多くのデータを
デバイスが返す状態)が発生
ホストは1byteの読み出し要求を出していた
が、RMHは2byteのデータを返そうとしていた
何故こんなことになったのか


USBハブの返すport change statusはポート数
+1bit
PCHは7ポートではなく8ポートのUSBハブ
対策


ポート数に合わせて読み出し要求を発行するように
変更
とりあえず動くようになったっぽい
結論

OSの提供するデバッグ手法に従うのが筋

とりあえずprintf()でもなんとかなるが、状況次第

ハッカソンを本当に楽しむなら1泊2日は短すぎ