ソフト頒布方法を探る
〜 USB接続のCD-ROMドライブを使用する 〜

 PlayStation2にLinuxが移植・公開されて、期待されるのは同人ソフトの登場。ソフトハウスの作ったゲームだけでなく、趣味のパワーを注がれて作られた個人のソフトがコミックマーケットなどで売られるようになれば面白いですよね。
 しかしここで問題になるのはソフトやデータの頒布方法。今一番簡単なのはネットワーク経由なのですが、それこそCD一枚分にも及ぶデータとなると常時接続環境でも及び腰になってしまうでしょう。でもCD-ROMはPS2本体のDVD-ROMドライブでマウントすると、"PS2 Linux Beta Release 1" でわかっている問題点にもありますが、

ps2cdvd: error: aborted, code_0x01
ps2sif_lock: low level locking violation

というエラーメッセージが出るだけで使いものになりません。メモリカードは単価が高いし容量が小さいし…。

 そこで考えられるのがUSBにCD-ROMドライブを接続してしまう方法。幸いにしてキーボードにマウスをつないでしまえば本体のポートはひとつ空きますし、そうでなくてもHubを使えばつなぐことは可能ですよね。そこで安いCD-ROMドライブを調達してきて接続に挑戦してみました。


買ってきたドライブ

 ふとショップを見ると、USBで接続できるCD-ROMドライブというのがほとんどなくて、あるのはCD-R/RWばかり。もちろんそれはそれで使い出があるのですが、安く済ませたい私としては単機能なモノで十分。
 ということで買ってきたのはティアックシステムクリエイトCD-110PU。これが2001年6月現在では在庫のみのようですがひじょうに安い!ソフマップで税抜き9999円、どこだったかでは人数限定ながら8000円とかいうのがあったようです。社名からわかるようにこれはTEACの子会社で、TEACCD-210PUのOEM商品ということのようです(OEMの方が番号が若いなんて^^;)。これはそろそろCD-110PUMKIIというモデルに代替わりするようですが、どうも添付ソフトが増えるだけでスペックは変わらないみたいですね(^_^;)。UHCIなUSBコントローラならDOSでも使えるという面白い製品です。

ドライブ

 「真のモバイラーに捧ぐ」などと銘打っているのですが、これは電源をUSBのバスパワーのみに頼り、ACアダプタ等の外部電源を不要にしている(つなげられない)ところからきています。手前にボタンが二つあって、特にプレイヤーソフトがなくても電源さえ供給されていれば音楽CDプレイヤーにもなれるという特徴があります。


現状は…?

 試しにPS2 Linuxの動作状態でUSB端子に接続してみると、

usb.c: USB device 2 (prod/vend 0x644/0x1000) is not claimed by any active driver.

というつれないメッセージが画面に現れました。ドライバが読み込まれていないということですね。

 USB接続のCD-ROMを使用するにはusb-storage.oというモジュールが必要なのですが、実はそのモジュールの格納先である/lib/modules/2.2.1/miscにはそれがありません。私はWindowMaker Workstationでインストールしたのであとからソースをインストールする必要がありましたが、そのコンフィグ(config_ps2)にCONFIG_USB_STORAGEの記述がないからなのです。そう、nで外しているんじゃなくて、完全にないんです。念のために"make menuconfig"でコンフィグをメニューから調べてみましたが結果は同じ。果たして、「ない」というのはサポートされないという意味か、単に書いてないということなのか?

 …いやいや、実際は以下の通りにすれば使用することができました。これからそれを説明いたします。


インストール方法

 まずカーネルのソースをインストールしておいてください。ソースはDVD-ROMの

SCEI/RPMS/kernel-source-2.2.1_ps2-6.mipsel.rpm

をrpmコマンドにてインストールすれば/usr/src/linux以下に展開されます。

 次にコンフィグを修正します。/usr/src/linuxに移動してください。
 コンフィグファイルらしきconfig_ps2なるファイルがそこにありますが、これはサンプル(あるいはGENERIC相当?)であってこれを使用するわけではありません。まずは

make menuconfig

を実行して、何も修正せずにExitで抜けてください。最後に

Do you wish to save your new kernel configuration?

と訊いてきますので、Yesでsaveしてください。すると.configというファイルが出力されているはずです。肝心の設定はこれを直接いじることで行います。

 まずは.configの8行目、

CONFIG_EXPERIMENTAL=n

CONFIG_EXPERIMENTAL=y

に修正します。ソース上はusb_storage.oがexperimentalのようなので、この修正が必要になります。
 次に261行目から、

#
# USB support
#
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set
CONFIG_USB_DEVICEFS=y
# CONFIG_HOTPLUG is not set
# CONFIG_USB_BANDWIDTH is not set
# CONFIG_USB_UHCI is not set
# CONFIG_USB_UHCI_ALT is not set
CONFIG_USB_OHCI=y
CONFIG_USB_PRINTER=m
# CONFIG_USB_SCANNER is not set
CONFIG_USB_AUDIO=m
CONFIG_USB_ACM=m
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_GENERIC=y
# CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
# CONFIG_USB_SERIAL_DEBUG is not set
# CONFIG_USB_IBMCAM is not set
# CONFIG_USB_OV511 is not set
# CONFIG_USB_DC2XX is not set
# CONFIG_USB_DABUSB is not set
CONFIG_USB_RIO500=m
CONFIG_USB_PEGASUS=m
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_HID is not set
CONFIG_USB_KBD=y
CONFIG_USB_MOUSE=y
# CONFIG_USB_WACOM is not set
# CONFIG_USB_WMFORCE is not set
CONFIG_INPUT_KEYBDEV=y
CONFIG_INPUT_MOUSEDEV=m
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_EVDEV is not set

とあると思いますが、この最後にでも

CONFIG_USB_STORAGE=m

というのを追加しておいてください。本当はCONFIG_SCSIとCONFIG_BLK_DEV_SDも関係しますが、あらかじめyやmに定義されていますので気にしなくてよいです。で、これを保存して修正を終了します。

 次にusb-storage.cを修正します。これはLinux-USB device overviewにあるCD-110PUのページで報告のあったもので、1660行目あたりから

{ 0x0644, 0x1000, 0x0133,
"TEAC CD-210PU", US_SC_8020, US_PR_BULK, US_FL_ALT_LENGTH},

を挿入してください。1637行目あたりからずらずらとリストのようなものが続いて、最後に0ばっかりの項目が並ぶのがありますが、それの直前にでも入れればいいでしょう。

 次はコンパイル。カーネルコンフィグをいじったわけですが、カーネルそのものに影響する項目をどうかしたわけではありませんので、モジュールのコンパイルをすればOKです。つまり

make dep clean modules modules_install

ですね。しばらく待てばコンパイルは終了するでしょう。/lib/modules/2.2.1/miscにusb_storage.oはありますか?あるようならそのディレクトリに移動し、整合性を確認しましょう。

depmod -av | grep storage
user function /lib/modules/2.2.1_ps2/misc/usb-storage.o
/lib/modules/2.2.1_ps2/misc/usb-storage.o

とあれば問題ないでしょう。


動作確認

 まずモジュールをロードしておきます。

modprobe usb-storage

このモジュールで動作するデバイスがつながってなければ、特に何もメッセージは出ないはずです。ここでおもむろにCD-ROMのケーブルをUSBコネクタに接続すると、こんなメッセージが出ると思います(出なきゃ/var/log/messagesにあります)。

usb.c: USB new device connect, assigned device number 5
scsi0 : SCSI emulation for USB Mass Storage devices
scsi : 1 host.
Vendor: TEAC  Model: CD-210PU  Rev: 10A3
Type: CD-ROM       ANSI SCSI revision: 02

 ではマウントです。/mnt/cdromは内蔵ドライブ用にとっておくとして、外部ドライブ用にひとつ用意しておきましょう。

mkdir /mnt/cd2

で、マウントします(USBで接続すると、ストレージデバイスはSCSI扱いとなります)。

mount /dev/scd0 /mnt/cd2

すると、次のようなメッセージが出てマウントされます(最初の3行はコンソール向けなので、それ以外の端末からは最後の行しか見えないと思います)。

Detected scsi CD-ROM sr0 at scsi0, channel 0, id 0, lun 0
sr0: disc change detected.
sr0: scsi3-mmc drive: 1x/165x xa/form2 caddy
mount: block device /dev/scd0 is write-protected, mounting read-only

ではlsでも実行してみましょう。Windows98のCD-ROMをマウントしてみました。

ls /mnt/cd2
add_ons   cdsample driversn   setup.exe win98
autorun.inf drivers   readme.txt tools    win98n

簡単に利用する

 このままでは使用時にいちいちmodprobeしないといけません。それは面倒なので、起動時に読み込んでしまうようにしてしまいましょう。/etc/rc.dの下にrc.sysinitというのがあって、この中に

# load PS2 modules
insmod ps2debuglog
insmod soundcore
insmod sound
insmod ps2sd

というのが47行目からありますので、この最後に

insmod usb-storage

というのを追加しておきましょう。保存したらリブートしてうまく組み込めているか確認してください。

 なお、ここでは説明しませんでしたがkerneldを使用するという手もあります。長時間使用しないモジュールはメモリから削除するというメモリの少ないPS2にはありがたい機能がありますが、カーネルのコンパイルが必要なのでパスしました。

戻る