リモートデバッグのデモとして、Android USBガジェットの基本情報を簡単に見ていくことにしましょう。
USBガジェットとしては、幾つかの機能がありますが、今回は、USBマスストレージ機能について見ていきたいと思います。USBマスストレージ機能とは、ターゲットボードに挿したSDカードなどのデータを、USBを通して、ホストPC上で閲覧するための機能です。
まずは、Android USBガジェットの“親玉変数”である「_android_dev」から始めます。以下のコマンドを実行して、「_android_dev」の情報を表示します。
(gdb) graph display *_android_dev
画面左側の文字は、構造体メンバの名前であり、右側の値はそのメンバに設定されている値です。「cdev」というメンバにはアドレス「0xc5afb9a0」が設定されており、ここからメモリ探索していくことで、Android USBガジェットの全ての情報を参照できます。
それでは、マウスで「cdev」を選択し、右クリックのショートカットメニューで「Display」を選択してメモリ探索を開始します。メモリを表示すると、以下のように右側に次のデータ構造が表示されます。
どうやら、「cdev」の先には、USBデバイスの基本情報である「デバイスディスクリプタ」が入っているようです。「desc」というメンバをダブルクリックして、その中を見てみると、デバイスディスクリプタのフィールド名と一致した情報が読み取れます。
ここから、ベンダID(idVendor)は「6353(=0x18D1)」、プロダクトID(idProduct)は「45060(=0xB004)」であることが分かります。
さらに、「configs」というメンバをダブルクリックすると、「interface」というアドレステーブルが表示されます。
USBにおけるインタフェースは、USBデバイスの機能を表しておりますので、本ターゲットボードのAndroid USBデバイスとしては、全部で2つの機能があるということを意味しています。つまり、どちらか一方が、USBマスストレージということになります。
まずは、1つ目(0xc5b26c00)を表示してみると、nameに“usb_mass_storage”とあります。これこそが探し求めていたUSBマスストレージです。
hs_descriptorsには、インタフェースディスクリプタが格納されておりますので、以下のコマンドでその内容を参照できます。
(gdb) graph display *(struct usb_interface_descriptor*) ((_android_dev->cdv->config->interface[0]->hs_descriptors[0])
ちなみに、USBマスストレージの仕様については、http://www.usb.org/developers/devclass_docs/Mass_Storage_Specification_Overview_v1.4_2-19-2010.pdfを参照することで、詳しい内容を確認できます。ここでは、インタフェースディスクリプタの代表的なメンバの値とその内容について示します(表3)。
代表的なメンバ | 値 | 説明 |
---|---|---|
bInterfaceClass | 0x8 | Mass Storage Class |
bInterfaceSubClass | 0x6 | ホストPCからのコマンドフォーマットの種類は「SCSI transparent command set」 |
bInterfaceProtocol | 0x50(=80) | データ転送は、バルク転送(USB Mass Storage Class Bulk-Only (BBB) Transport) |
bNumEndpoints | 2 | エンドポイント数は2個(送受信用) |
表3 インタフェースディスクリプタの代表的なメンバの値とその内容 |
今回は、USB用語が突然出てきたので戸惑われた方も多かったのではないでしょうか。次回からは、USBマスストレージを中心に、詳しく説明していきたいと思います。お楽しみに! (次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.