Android USBパケットをキャプチャーし、UMSプロトコルを解析する!!:実践しながら学ぶ Android USBガジェットの仕組み(11)(3/3 ページ)
今回は、USBデバイスドライバを効率的に開発するための統合開発環境「UDK(USB Device driver development Kit)」を使用して、UMS(USB Mass Storage)のパケットの流れとSCSIデータを解析する。
4.UDKを使ってUMSのパケットの流れとSCSIデータを解析する
それでは、UDKを使ってUMSのパケットを解析してみましょう。解析するまでの流れは図3の通りです。
4.1.コンパイル
UDKでは、Linuxカーネルのソースコードを、Eclipseプロジェクトとしてインポートし、USBデバイスドライバの修正および、コンパイル(ビルド)できます。
4.2.起動
ビルドで生成したカーネルイメージを、Eclipseの実行構成にて指定し、Androidエミュレータを起動できます。同様に、OSイメージを指定することで、仮想ホストマシンも起動できます。
通常であれば、ROM焼きしてAndroidを起動しなければなりませんが、ボタン1つでホストマシンとAndroidを起動できるので、手軽にデバッグできます。
4.3.USB接続
仮想USBホストマシンとAndroidエミュレータを起動した状態で、[USB接続]ボタンを押下すると、実機と同じようにUSB接続状態となります。このため、通常のUSB操作の動作確認が可能です。本例では、Android側から[Mount]ボタンを押下すると、ホストマシン上でリムーバルディスクが表示され、ディスク内のファイルアクセスが可能です。
4.4.パケット解析
USBドライバ開発では、USBプロトコルアナライザの存在は必須といえるでしょう。UDKでは、USB接続後、USBパケットを確認したいタイミングで、[USBアナライザ起動]ボタンを押すと、Wiresharkが起動され、リアルタイムで流れているUSBパケットを表示してくれます。
本例の場合、AndroidがUSB Mass StorageとしてUSB接続された時のUSBパケットの流れが表示されています。
それでは、本題に戻りましょう。われわれの本来の目的は、ホスト側にAndroidを“CD-ROMドライブ”として認識させることです。しかし、現時点でホスト側は、Androidを“リムーバブルディスク”として認識しています。
これは、Androidがホスト側に対して、リムーバブルディスクとして認識させるための“ある仕掛け”をしているためです。その仕掛けは、USB接続からMountまでのSCSIコマンドの中に秘められています。
そこで、まずはホストPCとAndroidをUSB接続し、Mountするまでの間をUSBアナライザで調べてみたいと思います。
code | SCSIコマンド | 概要 | 発行回数 | |
---|---|---|---|---|
0x00 | TEST UNIT READY | ターゲットデバイスへの診断コマンド(データ転送可否など) | 44 | |
0x03 | REQUEST SENSE | ターゲットデバイスのセンスデータ(ステータス/エラー情報)を取得する | 30 | |
0x12 | INQUIRY | ターゲットデバイスの基本情報を取得する | 1 | |
0x1A | MODE SENSE(6) | ターゲットデバイスの現在の状態を取得する | 7 | |
0x1E | PREVENT ALLOW MEDIUM REMOVAL | メディアの挿抜可否設定 | 8 | |
0x25 | READ CAPACITY | ターゲットデバイスのデータ容量情報を取得する | 24 | |
0x23 | READ FORMAT CAPACITIES | フォーマット可能なデータ容量情報を取得する | 3 | |
0x28 | READ(10) | ターゲットデバイスからホストへデータ転送する | 757 | |
合計 874 | ||||
表2 USBアナライザで観測したSCSIコマンド一覧 |
表2は、ホスト側から発行されていたSCSIコマンドのサマリーです。USB接続からMountまでの間に874回ものパケットが流れているようです。しかし、その種類は限定的で実は8種類しかありません。ホスト側は、これら8種類のSCSIコマンドの応答のどこかで、リムーバブルディスクとして認識するに至ったと考えられます。
数も少ないことですし、1つずつSCSIコマンドの仕様をひもといていくことで、その仕掛けを見いだすことができるはずです。そして、それが、最終的にはCD-ROMドライブとして認識させるための手掛かりにもつながります。
それでは早速……、といきたいところなのですが、誌面の都合で今回はここまでにしたいと思います。それに、いきなり仕様解説を始めると多少難解になる恐れもありますし……。
そこで次回は、少し基礎的な内容になりますが、「USB/SCSIプロトコル」について解説したいと思います。お楽しみに! (次回に続く)
関連キーワード
組み込みAndroid開発 | 実践しながら学ぶ Android USBガジェットの仕組み | USB | Android | 組み込み | Androidケータイ | アプリケーション開発 | Androidがもたらす組み込み開発の新たな可能性 | 組み込み開発 | 作りながら理解するファイルシステムの仕組み
Copyright © ITmedia, Inc. All Rights Reserved.