2012年8月9日木曜日

Android USBホスト機能 便利だけど要注意

Androidは、3.1以降のバージョンでUSBホスト機能がサポートされている。2.3に関しては、2.3.4にUSBホスト機能が拡張ライブラリとして移植されているが、これをサポートするかどうかはメーカーで選択できるようだ。
USBホスト機能が使えるとアマゾンで700円程度の変換ケーブルを買うだけで手持ちのUSBメモリがスマホの外部記憶装置として使えるのでとても便利だ。
スマートフォンであればパソコンにデータを転送するためにアクセサリモードで接続できれば十分かも知れない。しかし、タブレットのようにある程度パネルサイズが大きくなってくると、ちょっとしたノートパソコン代わりのような使い方もするだろう。タブレット向けのAndoroid 3.1からUSBホスト機能がサポートされているのもそのあたりを意識しているのかもしれない。
このホストモード、USBハブ、マウス、キーボードなどがサポートされていて、大抵はうまく認識される。「Google日本語入力」を使えばハードウェアキーボードの設定で、日本語109A配列のキーマップが選べるので、普段使っているUSBキーボードが使える。(「ATOK」でも日本語配列に対応しているようだが、インストールしたことがないので未確認)
USBストレージはFAT16、FAT32がサポートされているようで、USBメモリに限らず、USB接続の外付けHDDなども使える。更に、SDカードやCFカードのリーダーなども挿入するメディアがFAT
ならば使用可能だ。SDカードなどは初期状態でFAT32でフォーマットされていることが多いのでそのまま使える。
AndroidはカーネルがLinuxなので、Linux用のフォーマットが使えるのではないかと思い、手持ちのext4でフォーマットしたHDDをつないでみたが認識されなかった。
GALAXY SIIIの"/proc"に"config.gz"が転がっていたので、中身を確認すると、"CONFIG_EXT4_FS=y"となっているので、読めるはずだと思うのだが、どうもうまくいかない。ハードウェアの問題かもしれない。
もっとも、もしFATのみの対応だったとしても、大容量のHDDが直接つながるとなれば、ハブ経由でキーボード、マウス、HDDなどを接続し、ミニPCとして使いたくなってくる。
ただし、この場合注意が必要だ。
思いのほか厄介なのは給電の問題。ホストモードでは、Android側から各機器に電源を供給することになる。USBメモリ程度ならいいが、HDDとなると、据え置き型のように電源を別に持ったタイプなら大丈夫だが、ポータブルタイプのHDDのようにUSBポートから給電するタイプでは容量が足りない。ただ、この問題に関してはセルフパワータイプのUSBハブをAndroidとHDDの間にはさむことによってどうにかなる。
しかし、どうしても解決できないのはスマートフォン自身の電源。スマートフォンはたいていUSBポートを充電用給電ポートと兼用している。USBポートが給電用として動作するのはアクセサリモードのときだけだ。
例えば、本体のバッテリの残量が少ないときにHDDを接続して直接HDDにサイズの大きいファイルをダウンロードするようなことはやめたほうがいいかもしれない。

蛇足ながら、GALAXY SIII(SD-06D)は、アクセサリモードでもPCから一般的なUSBメモリやHDDのようなマスストレージ(Mass Storage)として認識することができない。(GALAXY SIIはマスストレージモードあり)
PCに接続すると音楽プレイヤー等と同じMTP(Media Transfer Protocol)として認識される。
WindowsであればMTP用のドライバがSAMSUNGから提供されているので大きな問題にはならないが、普段からUbuntuなどのLinuxをメイン機として使っていると結構ややこしいことになる。
これを直接解決するには、どうやら2つのアプローチがあるようだ。
一つ目は、GALAXY SIIIをマスストレージモードが使えるようにする。
もともとAndroidはマスストレージモードを持っている。SAMSUNG側の何の都合だかわからないが、その機能が削られているので、それが使えるようになるアプリをインストールする。
例えば、このあたりを参考に、「SGS3 Easy UMS」という非公式アプリをインストールする。非公式アプリだからとにかく危険ということはないのだが、それ以上に厄介なのは、これを使うにはroot化しなくてはならないことだ。
二つ目は、全く逆転の発想。GALAXY SIIIはそのままで、Linux側にMTPを通常のマスストレージのように扱えるソフトを導入する。ただし、通常のMTPなら、mtpfsというソフトで通常のマスストレージのようにマウントできるのだが、どうやらGALAXY SIII(SIIも)のMTPは普通のMTPではないようで、mtpfsではうまくマウントできない。このあたりを読むとjmtpfsならばうまくいくようだが、こいつは現時点でapt-getではインストールできないのでソースからコンパイルしてやらないといけない。

どちらのアプローチも一長一短あって、ちょっと試してみるにはハードルが高い。とりあえずは、ホストモードを上手く使って、USBメモリー経由でファイルのやり取りをするのが意外に簡単で手早く済むかもしれない。

2 件のコメント:

kesuke さんのコメント...

非常に興味のある記事ですね。

少し私の理解不足ですが、

アクセサリーモードはandroidからusbデバイスへ

電源を与えれない仕様なのですか?

著者 さんのコメント...

遅レスで申し訳ありません。
アクセサリモードでは、Android自身がアクセサリなので、Androidから給電すべき機器は認識されません。PCなどに接続すれば、Android自身が充電されます。
ホストモードではAndroidがホストとなってアクセサリーに給電しなくてはならないので、USBポートからの充電はできないのですね。
Nexus10などのタブレットは充電専用の端子を持っているようで、こういうのだとホストモードのまま充電できて便利そうです。