Edited at

Raspberry Piで、起動後にUSBモデムを自動認識する

More than 3 years have passed since last update.


背景

既に消えかかっている、世の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の設定を真似しながら…


/etc/udev/rules.d/50-l03d.rules

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.localponしたら、つながった。

  • 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.txtmax_usb_current=1設定による電流リミット解除が必要か。消費電力は、電波状態によると思うが、typicalには300mAくらいか。


ダメ出し

/dev/sr1とかだったら、ダメじゃん。