背景
既に消えかかっている、世のUSBモデムは、遠隔制御のような用途を考えると、Raspberry Piと相性が良い。
ところが、世のUSBモデムは、ゼロインストールのために、最初はCD-ROMに見える仕掛けが入っており、Linuxと相性が悪い。
LinuxでUSBモデムを使うには…。
今回のUSBモデム
たまたま中古品を3980円で手に入れることができた、L-03D。
VID=0x1004, PID=0x6327(CD-ROM時), PID=0x6326(モデム時)。
CD-ROMからモデムへ
usb_modeswitch
ググると、まずこれが出てくる。文字通り、USBのモードを変えてくれる。
今現在、既にデフォルトで、/lib/udev/rules.d/40-usb_modeswitch.rules
に、L-03DのVID/PIDの記載がある。
さらに、/etc/usb_modeswitch.d/1004:6327
に内容を記載する必要がありそうだが、検索で出てくる内容を適当にコピペしただけでは、何故か動かない。
usb_modeswitchのバージョンが違うのか、L-03Dのファームウェアのバージョンが違うのか、はたまたググって見つけた情報が古いのか。きっと自分のググり力の問題。
eject
さらにググると、eject /dev/sr0
とすれば、CD-ROMからモデムに変化するとある。簡単そうじゃん。
lsusb
で確認すると、eject
前後で、確かにPIDが0x6327から0x6326に変わる。
モデムからttyへ
ただ、PIDが0x6326に変わっても、/dev/ttyUSB?
は現れない。
PIDが変わった後に、modprobe usbserial vendor=0x1004 product=0x6326
と打つと、確かにttyが現れる。
起動時の自動化
でもこれ、手で打っていたら、遠隔制御できない。起動後に自動的にやって欲しい。
usb_modeswitchなら自動的にやってくれそうだけど、なんか動かないし、どうしよう。
そこで、udev。usb_modeswitchの設定を真似しながら…
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6327", RUN+="/usr/bin/eject /dev/sr0"
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6326", RUN+="/sbin/modprobe usbserial vendor=0x1004 product=0x6326"
とかしたらうまく行くんじゃ? 再起動して…
$ ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3
うまく行った。
蛇足
- PPPで自動的にAPNにつながらないと遠隔操作的には意味がない。RUNでやらせてしまう手もあるが、udevの役割ではない気もする。
/etc/rc.local
でpon
したら、つながった。 - udevでRUNされる時は、
/usr/bin
にはパスが通っているが、/sbin
にはパスが通っていなかった気がする。とりあえずudevのrulesにフルパスで記載。 - OSXやWindowsの専用ドライバでは、Ethernetに見えて、IPv6も使える。Linuxでttyに見せると、pppdの設定に
+ipv6
を追加しても、リンクローカルが設定されない?(詳細未確認) Ethernetに見えればIPv6が使える気がするので、NDIS化試行中。 - L-03Dは、USB上は500mAとなっているが、取説的にはmaxで680mA。2AなどのACアダプタと、
/boot/config.txt
のmax_usb_current=1
設定による電流リミット解除が必要か。消費電力は、電波状態によると思うが、typicalには300mAくらいか。
ダメ出し
/dev/sr1
とかだったら、ダメじゃん。