困ったときは ホストに聞こう (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日は短すぎ
© Copyright 2024 Paperzz