続・SL-C760でUSB

USBホストCFカードのドライバ

REX-CFU1がタスクバーのCFアイコンで取り外しが出来ないのは、REX-CFU1のドライバにusbスクリプトが欠けてる為と判明。moroさんがUSBモジュールと共に再パッケージ化したものにも含まれていない。
これはCFカードを挿入した際、/etc/pcmciaにある各confファイルを順番に見て、記述されたカード情報に合致するものがあれば、対応するモジュールをロードするようになっているんだけど、REX-CFU1のドライバで使っている/etc/pcmcia/rex-cfu1.confでは2行目でclass "usb"と定義している箇所があるにもかかわらず、/etc/pcmciaディレクトリにusbって名前のスクリプトが存在しないので、CFアイコンでの取り外しができない模様。
この辺のくだりは実はドライバ作者のhumorumさんがREX-CFU1ドライバの開発日記の中で触れてるんで判った。
と、言う訳でusbスクリプトを下記の手順で作ったら、CFアイコンでの取り外しが出来るようになった。素晴らしい〜。

bash-2.05$ su
# echo "#!/bin/sh" > /etc/pcmcia/usb
# chmod 755 /etc/pcmcia/usb

あと、REX-CFU1ドライバはインストール後、再起動を行うか「/etc/rc.d/init.d/pcmcia restart」を行えば良いとあるが、実際には追加したモジュールが認識(?)されていないのか、REX-CFU1を挿入してもsl811_cs.o、hc_sl811.o、usbcore.oがロードされない。
詳しくは知らないが、これは/sbinにあるdepmodに-aオプションを与えて起動してモジュールの再検索を行えば、以後モジュールのロードが行われるようになる。教えてくれたTAKETYONに感謝。
ついでにREX-CFU1ドライバにはREX-CFU1を挿入した際にロードされるモジュールusbcore.oが含まれておらず、別パッケージのUSBモジュールに含まれてるので、これも含めたパッケージを作り直そう。もちろん、postinstスクリプトにモジュールの再検索とカードサービスの再起動を記述しておいて再起動を不要にしておくってことで。

USBモジュールのロードの自動化

USB機器を繋いだら必要なUSBモジュールをinsmodコマンドでロードしなきゃならない。(キーボードならinput、hid、keybdev、USBメモリとかならsd_mod、scsi_mod、usb-storage)

HotPlug

これはSL-C3000だと2.4系カーネルのHotPlug機構を使ってるみたいなので、SL-C760でも同様に出来ないか調べてみる。
HotPlug機構が動いた時に参照される/proc/sys/kernel/hotplugには/sbin/hotplugとだけ書いてあるので、/sbin/hotplugスクリプトが処理をしてくれることが判る。スクリプトを読むと/etc/hotplugが設定ファイルのあるとこだと認識し、functionsスクリプトを最初に読み込んだ後、引数で渡された抜き差しのあったデバイスの名前(usbdとかnetとか)から対応するagentファイル(usbd.agentとか)を呼び出して処理を行っている模様。
SL-C3000だとusb.agentがあって、これで処理を行ってるみたいだけど、SL-C760でusb.agentを作っても反応なし。これはカーネルのHotPlugの設定がusbdとnetしか見ないようになってるからかな?と、なるとカーネル再構築では汎用性がなくなるのでパス。

USB Manager

てな訳で定番のUSB Managerを使うことにする。昨日悩んでいたUSBの機器1つ1つごとに設定を書かなきゃならないってのは、クラス、サブクラス、プロコトルに対するUSBモジュールのロードが可能だと神居雅志さんのページを見て理解できたので問題なし。
ただ、はやしさんとこのUSB Manager 0.4.8は/sbinにインストールしようとするので、/usr/sbinに置くように/etc/rc.d/init.d/usbmgrを書き換えたmoroさんのパッケージを使ってみる。が、これもusbmgr起動スクリプトの修正が完全でないのでusbmgrが起動しない。どうも、17行目の「. ${FUNC_FILE}」の後にパス設定が変わってしまうのが問題のようで神居さんは${FUNC_FILE}である/etc/rc.d/init.d/functions内にあるパス設定を修正していたが、元からあるファイルに手をつけるのは面倒なので17行目の直後に「PATH=$PATH:/usr/sbin」としてパスの再設定を追加しておく。これで再起動後、usbmgrが動くようになった。

USB Managerの問題

REX-CFU1ドライバを入れておけば、/proc/bus/usb/devicesを見ることで繋がっているUSB機器の情報が表示される。「T:」で始まる行からが1つのUSB機器の情報で、REX-CFU1もルートHUBとして認識される為、USB機器を何か繋いでいる場合は「T:」で始まる行が複数出力される。
この「T:」で始まる行の中に「I:」で始まる行はUSB機器のクラス、サブクラス、プロトコルを表しているんだけど、タッチパッド付USBキーボードなんかだと、これが複数出力される。
が、usbmgr本体およびUSB機器情報取得ツールのdump_usbdevは「I:」で始まる行が複数ある場合は最後のものしか見てくれない為、キーボードのドライバ(USBモジュール)がロードされず、マウスのドライバ(USBモジュール)だけがロードされるといったことになってしまう。
現状では「P:」で始まるベンダーID、プロダクトIDを元に複数の機能をもつUSB機器1つ1つに対してモジュールのロードを行うようにすればいいんだけど、USB Managerで対応してほしいなぁ・・・。
あと、USB ManagerはUSBモジュールのusbcoreが必須のようで、これが無いと起動しない。それはいいんだけど、USBホストCFカードが差さってない状態でもusbcoreがメモリ上に居座るのは嫌なので、これも何とかしたいところ。
これについては最悪、USBホストCFカードの抜き差しのタイミングでusbmgrを起動&停止させるのが一番良いかも知れない。