連載
» 2013年11月08日 09時30分 UPDATE

実践しながら学ぶ Android USBガジェットの仕組み(13):UMSクラスドライバを改造し、Androidを“CD-ROMドライブ”として認識させる!! (1/3)

最終回となる今回は、AndroidのUSBマスストレージ(UMS)クラスドライバを改造し、ホストPCにUSB接続したAndroidを“CD-ROMドライブ”として認識させて、Android内のLinux(CDイメージ)にアクセスできるようにする!

[村上雅彦、舟元拓斗、森崇(永和システムマネジメント 組込み技術センター),MONOist]

1.はじめに

 われわれの最終目的は、AndroidからPCブートし、Linux(KNOPPIXなど)を起動させることです。そのための技術的な課題は、ホストPCにUSB接続したAndroidを“CD-ROMドライブ”として認識させることでした。CD-ROMドライブとして認識させるためには、Android内のUSBマスストレージUMS:USB Mass Storage)クラスドライバの改造が必要となります。

 最終回となる今回は、AndroidのUMSクラスドライバを改造し、AndroidをCD-ROMドライブとして認識させて、Android内のLinux(CDイメージ)にアクセスできるようにします。



2.USB/SCSIプロトコル

 前回は、AndroidをホストPCにUSB接続し、PCがAndroidをリムーバブルディスクとして認識するまでのSCSIコマンドの流れを見ていきました。

 「AndroidをCD-ROMドライブとして認識させる」という本連載の目的に対して、以下に最適な資料があります。以降、こちらの資料を参照しながら、Androidの改造内容と追加するSCSIプロトコルについて解説していきます。


2.1.デバイスへの要求

(1)インタフェースディスクリプタ
 USB接続時、USBデバイスはホストPCに対して、USBプロトコル仕様で規定されたディスクリプタを送ります。

 その中に、「インタフェースディスクリプタ」というものがあります。このディスクリプタのメンバ(bInterfaceSubClass)で、USBマスストレージクラスの種別を宣言することが可能です。設定できるコードは表1の通りです。

コード 説明
01h Reduced Block Commands(RBC)
02h SFF-8020i、MMC-2(ATAPI)(CD/DVD drives)
03h QIC-157(tape drives)
04h USB Floppy Interface(UFI)
05h SFF-8070i(ATAPI removable rewritable media devices)
06h SCSI transparent command set
表1 設定できるコードについて

 参考資料では、このメンバ値を「02h」または「06h」としています。

 「02h」とした場合は、USB接続時点で“CD-ROMドライブ”と宣言させることになります。一方、「06h」にした場合は、“SCSIデバイス”とだけ宣言し、後続のSCSIコマンド発行時(INQUIRY)に、CD-ROMドライブであることを宣言することになります。

 本稿では、SCSIコマンドだけでデバイス種別を一元管理できるよう「06h」としました。

(2)INQUIRY
 前回の調査では、Androidが返すINQUIRY応答データの「PDT(Peripheral Device Type)」は「0h」でした。一方、参考資料では「05h」としています。PDTの内容を表2に示しますが、「05h」は「CD/DVD device」とありますので、これで“CD-ROMドライブ”として認識させることが分かります。

コード 説明
00h Direct-access block device
05h CD/DVD device
07h Optical memory device
0Eh Reduced block command(RBC) direct-access device
表2 PDT(Peripheral Device Type)の内容

2.1.MMC(Multi-Media Command)デバイス要求

 参考資料では、通常のCD/DVDデバイスで対応するSCSIコマンドを規定しています。これに対し、本稿では、ホストPCと接続して実際に発行されるSCSIコマンドを対応することにしました。詳細は、表3の通りです。

コマンド SCSI仕様 対応有無
INQUIRY SPC-4
READ CAPACITY MMC-6
READ TOC/PMA/ATIP MMC-6
READ(10) MMC-6
REPORT LUNS SPC-4 ×
SECURITY PROTOCOL IN SPC-4 ×
SECURITY PROTOCOL OUT SPC-4 ×
TEST UNIT READY SPC-4
表3 本稿で対応するSCSIコマンドについて

 表3で示した対応SCSIコマンドのうち、「INQUIRY」「READ CAPACITY」「READ TOC/PMA/ATIP」については、現状のAndroidの実装(注1)を変更する必要があります。そのためのプロトコル設定内容を以降で紹介します。

注1:現状は、リムーバブルディスクとして認識するための実装となっています。



2.2.SCSIコマンド

 参考資料を基に、今回、CD-ROMドライブとして認識させるために“改造/追加”するSCSIコマンド応答データを以下に示します(表4表5表6)。

フィールド/ビット 今回設定する値
PERIPHERAL DEVICE TYPE フィールド 05h
RMB ビット 1
ADDITIONAL LENGTH フィールド 1Fh
PRODUCT IDENTIFICATION フィールド ASCIIコード
PRODUCT REVISION LEVEL フィールド ASCIIコード
VERSION DESCRIPTOR フィールド 02h
表4 (1)INQUIRYコマンド応答

フィールド 今回設定する値
LAST LOGICAL BLOCK ADDRESS 最終ブロック番号
BLOCK LENGTH 2048d(バイト)
表5 (2)READ CAPACITYコマンド応答

分類 フィールド 今回設定する値
ヘッダ TOC Data length 0012h
First Track 01h
Last Track 01h
Track1ディスクリプタ ADR/CTL 14h
Track Number 01h
Track Start Address 000000h
Track Aah(Lead-out)ディスクリプタ ADR/CTL 14h
Track Number Aah
Track Start Address 最終ブロック番号+1(
表6 (3)READ TOC/PMA/ATIPコマンド応答 ()MSFの値に応じて書式は変更します

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.