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

» 2013年07月12日 10時00分 公開
[村上雅彦、舟元拓斗、森崇(永和システムマネジメント 組込み技術センター),MONOist]

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つのフェーズでやりとりを行います。

UMSのSCSIコマンド転送プロトコル 図2 UMSのSCSIコマンド転送プロトコル【※画像クリックで拡大表示】

4.1.コマンド転送

 コマンド転送フェーズでは、ホストがデバイスに対してSCSIコマンドを「CBW(Command Block Wrapper)」というラッパーに包んで転送します。コマンド転送時にUSBバスに流れるトランザクションを以下に示します(図3)。

コマンド転送フェーズでのCBW転送 図3 コマンド転送フェーズでのCBW転送

4.2.データ転送

 SCSIコマンドの種類によっては、コマンド転送フェーズの後、ホストからデバイス、または、デバイスからホストへデータを送信します。例えば、ホストからデバイスへデータの書き込み要求をする場合は、ホストがデータをデバイスに送信します。逆に、ホストがデバイスからデータ読み込み要求をする場合は、デバイスがホストにデータを送信します。データ転送時にUSBバスに流れるトランザクションを図4に示します。なお、データ量が1つのDATAパケットに収まり切らない場合は、このトランザクションを必要な回数だけ繰り返すことになります。

データ転送フェーズでのデータ転送 図4 データ転送フェーズでのデータ転送

4.3.ステータス転送

 コマンド転送フェーズ、または、データ転送フェーズが終了すると、デバイスはステータス転送フェーズで、「CSW(Command Status Wrapper)」を送信し、SCSIコマンドの終了となります。ステータス転送時にUSBバスに流れるトランザクションを以下に示します(図5)。

CSWのデータ転送 図5 CSWのデータ転送

4.4.パケットキャプチャー例

 それでは、これらのUMSクラスのパケットの流れを、UDKを使って実際に観察してみましょう。図6は、AndroidとPCをUSB接続した直後のUMSクラスのパケットキャプチャー結果です。

USBマスストレージ(UMS)クラスのパケットキャプチャー 図6 USBマスストレージ(UMS)クラスのパケットキャプチャー【※画像クリックで拡大表示】

 図6中の青色緑色赤色の部分が、それぞれ「コマンド転送フェーズ」「データ転送フェーズ」「ステータス転送フェーズ」です。

 コマンド転送フェーズでは、ホストからデバイスに対してCBWを転送しますので、エンドポイント番号2(OUT方向)を使用していることが分かります。CBWの中にはSCSIコマンドが入っており、INQUIRYを送信しています。データ転送フェーズでは、デバイスがINQUIRYコマンドの応答のため、エンドポイント番号1(IN方向)を使って、応答データを転送しています。ステータス転送フェーズでは、デバイスが正常終了(bCSWStatus=0)のステータスを送信していることが分かります。

 ここまで理解できれば、UMSクラスの基本的なパケットの流れが分かるようになります。後は、SCSIコマンドのやりとりを見ていくことで、外部記憶装置をどのように制御しようとしているのかが分かるはずです。つまり、われわれの目的であるCD-ROMドライブとして認識させるための手掛かりもつかめることになります。

Copyright © ITmedia, Inc. All Rights Reserved.