一般的なPCに標準搭載されているUSBポートにUSBデバイスをつないだ時、PCで一体どのような処理がされているのか、電子機器などの動作をブログやYouTubeで解説しているベン・イーター氏が、動画で解説しています。
How does USB device discovery work? – YouTube
[embedded content]
イーター氏が接続に用いたのはDELL製のキーボード。オシロスコープは通信内容の解析用です。
PCはデバイスを検出した際、最初にそのデバイスが低速か高速かを検知します。
オシロスコープでみると、低速デバイスの場合は「D-」が高レベルに、高速デバイスの場合は「D+」が高レベルになります。そして、PCは認識を一度リセットした後、デバイスとの通信を始めます。
波形を拡大してみます。デバイスが最初に接続された時、デバイスからPCにセットアップパケットが送信されます。この段階ではターゲットIDアドレスがデバイスに割り当てられていないため、ターゲットIDアドレスとエンドポイントはどちらも0として表示されます。セットアップはこの0のアドレスを使用して行われ、その後データが送信されます。
その後のセットアップデータはデバイスごとの特定のフォーマットに従い識別が行われます。今回のパケットは「00 05 0C 00 00 00 00 00」。16進数で表記されています。
最初の1バイトはリクエストタイプを表します。
今回接続したキーボードの場合、bmRequestTypeが「00」なので2進数表記すると00000000となります。これをさらにD7、D6・D5、D4~D0とビットでグループ分けして10進数に直します。表を見るとD7は0なので「ホストであるPCからデバイスへパケットが送信されたということ」、D6D5も0なので「標準のリクエストであること」、D4からD0も同じく0なので「受信者がデバイスであること」を指していることが分かります。
次の1バイト(05)は、特定のリクエスト(bRequest)だということを意味します。確認すると、「表9-3を参照してください」との記述があります。
bRequestの値が「05」なので、内容は「SET_ADDRESS」であることがわかります。
次に、リクエストが示す「wValue」「wINdex」「wLength」の値を確認します。
wValue・wIndex・wLengthはどれも2バイトです。
オシロスコープで見ると、今回の場合wValueは「0C 00」、wINdexとwLengthは「00 00」です。
これら3つはすべて特定のリクエストがあるので、見ていきます。wValueが表すのは「Device Address」です。
wValueは「0C 00」、これらはコンバートの際にソートされるので、実際は「000C」、つまり「Device Address」が「C」であることを差します。
wINdexとwLengthは今回の場合「Zero」です。
PCでlsusbコマンドを実行してみます。全てのUSBデバイスが表示されますが、その中に「12(16進数でC)」のデバイスが検出されていることが確認できます。接続したばかりのDELLのキーボードがオシロスコープで見たとおりうまく検出されたようです。
セットアップコマンドはCが割り当てられ0C、エンドポイントは規定の0になっています。
もちろん、USBキーボードからコンピューターへのパケット送信もあります。
USBデバイスがPCにパケットを送信した後、PCからデバイスに返ってきたリクエストは「6」。
「6」は「GET_DESCRIPTOR」で、PCがデバイスに記述子を要求しているということ。コンピュータ内のデバイスは、USBデバイスを認識した時にそれが何なのかは分かりません。マウスかもしれませんし、ハードドライブかもしれません。そのため、PCはデバイスに記述子それが何であるかを説明するものを要求しているのです。
続く数字は「10 01」。これは接続したデバイスがUSB 1.1であることを示します。
他にも、メーカーや製品のシリアル番号も識別します。
イーター氏はより専門的な解説も行っています。また、イーター氏が持っているUSB仕様書はUSBインプリメンターズ・フォーラムの配布ページなどからダウンロードできるので、気になる人は確認してみてください。
この記事のタイトルとURLをコピーする