連載
» 2013年07月12日 10時00分 UPDATE

実践しながら学ぶ Android USBガジェットの仕組み(12):Android USBマスストレージクラスのパケットを理解しよう! (1/3)

今回は、USBマスストレージクラスのパケットを解析する上で前提となる「USBプロトコル」の基礎を理解し、解析作業を進める。果たして、Androidをリムーバブルディスクではなく、“CD-ROMドライブ”として認識させるための改造ポイントはどこか?

[村上雅彦、舟元拓斗、森崇(永和システムマネジメント 組込み技術センター),MONOist]

1.はじめに

 通常、AndroidをホストPCにUSB接続すると、“リムーバブルディスク”として認識されますが、われわれの目的は、これを“CD-ROMドライブ”として認識させることす。

 前回は、「UDK(USB Device driver development Kit)」を使用して、AndroidとPCとの間に流れるUSB通信パケットを解析することで、“CD-ROMドライブとして認識させるための手掛かり”を得ようと考えました。しかし、流れているUSB通信パケットを理解するためには、プロトコル仕様の理解が欠かせません。

 そこで今回は、USBマスストレージ(UMS:USB Mass Storage)クラスのパケットを理解する上で必要となる「USBプロトコル(Ver. 2.0)」の基礎的な内容について概説した上で、解析を進めていきます。

 なお、本稿では細かなプロトコル仕様の解説を割愛しています。詳細な仕様を知りたい方は、以下の参考資料をご覧ください。

参考資料 場所
USB 2.0仕様 http://www.usb.org/developers/docs/ Universal Serial Bus Revision 2.0 specification
UMS(バルク転送)仕様 http://www.usb.org/developers/devclass_docs/ Mass Storage Bulk Only 1.0
UMSのSCSIコマンド Mass Storage UFI Command Specification 1.0
Mass Storage Bootability Specification 1.0
参考 USBプロトコル仕様に関する参考資料

2.USB通信モデル

 USBの通信層は、図1のように3階層に分類されています。われわれが解析したいデータは、最上層にいるUMSクラスドライバが発行するものですが、一般的に、パケットキャプチャーが表示するデータは、その下の中間層(赤色の点線枠内)のUSBパケットになります。

USB通信モデル 図1 USB通信モデル【※画像クリックで拡大表示】

 そのため、USBパケットを解析するには、少なくとも以下に示す中間層のUSB通信仕様を理解する必要があります。

  • USBパケットの種類
  • トランザクション

 また、最上位層のUMSクラスでは、以下に示したSCSIコマンドを転送するための通信仕様を理解しておく必要があります。

  • コマンド転送
  • データ転送
  • ステータス転送

3.中間層の通信概要

3.1.USBパケットの種類

 USB通信の最小単位は“パケット”であり、USBホストとデバイスは、このパケットをUSBバスに投入し、データのやりとりを行います。USBパケットキャプチャーで観測する対象は、まさにこのパケットであり、その種類は全部で16種類あります(表1)。ここで、UMSが使用するパケットは9種類あり、このうち正常系のデータ入出力シーケンスを理解するためには、「OUT」「IN」「DATA0」「ACK」の4種類を把握しておけば十分です。

USBパケットの種類 表1 USBパケットの種類

3.2.トランザクション

 パケットがUSB通信の最小単位であることは分かりました。しかし、ホストとデバイスが個々のUSBパケットをバラバラっとUSBバスに投入しても、そのパケットを送られた側は何が何だか分かりません。適切に通信相手にデータ転送を行うためには、USBが定める手順(プロトコル)に従い、ホストとデバイスが協調してパケットの送受信を行う必要があります。それらのパケットの送受信の最小単位が“トランザクション”と呼ばれるものです。

 USBトランザクションでは、必ずホストが主体となって通信を開始することになっています(注1)。USBホストとデバイスは、お互いにUSBバスを監視しており、USBホストがトークンパケットをUSBバスに投入したところからトランザクションが開始されます。

※注1:このため、デバイス側から突然ホストに要求を行うことはありません。


3.2.1.ホストからデバイスへのデータ転送 
 ホストがデバイスへデータ転送する場合は、必ず最初にOUTパケットをUSBバスに投入します。デバイス側ではOUTパケットの投入に気が付くと、次にホスト側からのDATAパケットの到着を待ちます。ホスト側では、送りたいデータをDATAパケットに包み込んでUSBバスに投入します。デバイス側ではそのDATAパケットを受け取り、データ受け取り確認として、ACKパケットをUSBバスに投入します。USBパケット解析で、デバイスへ転送されたデータの内容を確認するためには、このトランザクションを見つけて、DATAパケットの中身を見ればよいことになります。

図 【※画像クリックで拡大表示】

3.2.2.デバイスからホストへのデータ転送 
 デバイスがホストへデータ転送する場合は、デバイスはホストからのINパケットを待ちます。デバイス側は、ホスト側がINパケットをUSBバスに投入したことに気が付くと、送りたいデータをDATAパケットに包み込んでUSBバスに投入します。ホスト側ではそのDATAパケットを受け取り、データ受け取り確認として、ACKパケットをUSBバスに投入します。USBパケット解析で、ホストへ転送されたデータの内容を確認するためには、このトランザクションを見つけて、DATAパケットの中身を見ればよいことになります。

図 【※画像クリックで拡大表示】
       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.