Android USBマスストレージクラスのパケットを理解しよう!:実践しながら学ぶ Android USBガジェットの仕組み(12)(2/3 ページ)
今回は、USBマスストレージクラスのパケットを解析する上で前提となる「USBプロトコル」の基礎を理解し、解析作業を進める。果たして、Androidをリムーバブルディスクではなく、“CD-ROMドライブ”として認識させるための改造ポイントはどこか?
4.UMSの通信概要
UMSは、USB通信モデル(1ページ目の図1)の最上層にあるUSB機能(ホスト側:クライアントソフトウェア、デバイス側:インタフェース)の1つであり、フロッピーディスク、HDD、USBメモリ、CD/DVDデバイスなどの大容量外部記憶装置を扱うものです。中間層では、データ転送するための手順をトランザクションとして定義していますが、UMSでは外部記憶装置を制御(データのREAD/WRITEなど)するための手順を定義することになります。
UMSの外部記憶装置の制御プロトコルとしては、周辺機器のデータのやりとりを行う標準的な規格である「SCSI(Small Computer System Interface)」を使用します。USB通信でSCSIコマンドを転送するには、図2に示す通り、3つのフェーズでやりとりを行います。
4.1.コマンド転送
コマンド転送フェーズでは、ホストがデバイスに対してSCSIコマンドを「CBW(Command Block Wrapper)」というラッパーに包んで転送します。コマンド転送時にUSBバスに流れるトランザクションを以下に示します(図3)。
4.2.データ転送
SCSIコマンドの種類によっては、コマンド転送フェーズの後、ホストからデバイス、または、デバイスからホストへデータを送信します。例えば、ホストからデバイスへデータの書き込み要求をする場合は、ホストがデータをデバイスに送信します。逆に、ホストがデバイスからデータ読み込み要求をする場合は、デバイスがホストにデータを送信します。データ転送時にUSBバスに流れるトランザクションを図4に示します。なお、データ量が1つのDATAパケットに収まり切らない場合は、このトランザクションを必要な回数だけ繰り返すことになります。
4.3.ステータス転送
コマンド転送フェーズ、または、データ転送フェーズが終了すると、デバイスはステータス転送フェーズで、「CSW(Command Status Wrapper)」を送信し、SCSIコマンドの終了となります。ステータス転送時にUSBバスに流れるトランザクションを以下に示します(図5)。
4.4.パケットキャプチャー例
それでは、これらのUMSクラスのパケットの流れを、UDKを使って実際に観察してみましょう。図6は、AndroidとPCをUSB接続した直後のUMSクラスのパケットキャプチャー結果です。
図6中の青色、緑色、赤色の部分が、それぞれ「コマンド転送フェーズ」「データ転送フェーズ」「ステータス転送フェーズ」です。
コマンド転送フェーズでは、ホストからデバイスに対してCBWを転送しますので、エンドポイント番号2(OUT方向)を使用していることが分かります。CBWの中にはSCSIコマンドが入っており、INQUIRYを送信しています。データ転送フェーズでは、デバイスがINQUIRYコマンドの応答のため、エンドポイント番号1(IN方向)を使って、応答データを転送しています。ステータス転送フェーズでは、デバイスが正常終了(bCSWStatus=0)のステータスを送信していることが分かります。
ここまで理解できれば、UMSクラスの基本的なパケットの流れが分かるようになります。後は、SCSIコマンドのやりとりを見ていくことで、外部記憶装置をどのように制御しようとしているのかが分かるはずです。つまり、われわれの目的であるCD-ROMドライブとして認識させるための手掛かりもつかめることになります。
Copyright © ITmedia, Inc. All Rights Reserved.