UMSクラスドライバを改造し、Androidを“CD-ROMドライブ”として認識させる!!:実践しながら学ぶ Android USBガジェットの仕組み(13)(1/3 ページ)
最終回となる今回は、AndroidのUSBマスストレージ(UMS)クラスドライバを改造し、ホストPCにUSB接続したAndroidを“CD-ROMドライブ”として認識させて、Android内のLinux(CDイメージ)にアクセスできるようにする!
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の値に応じて書式は変更します |
Copyright © ITmedia, Inc. All Rights Reserved.