SORACOM Air対応 USBモデム ABITさんのAK-020 のデバイス認識をudevのみでしっかり行おうという試みです
論よりコード
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="a403", RUN+="/usr/sbin/usb_modeswitch --std-eject --default-vendor 0x15eb --default-product 0xa403 --target-vendor 0x15eb --target-product 0x7d0e"
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="7d0e", RUN+="/sbin/modprobe usbserial vendor=0x15eb product=0x7d0e"
rulesファイルを書き換えたら 再起動 OR $ sudo udevadm control --reload
です
AK-020を挿したら /dev/ttyUSB[0-4] が出来上がっていますので、好きにしてください
$ ls /dev/ttyUSB* | cat
/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2
/dev/ttyUSB3
解説
AK-020は2つのUSBデバイスを持っています
- CD-ROM: idProduct = a403
- USB modem: idProduct = 7d0e
ですので、それぞれで対応するコマンドを RUN で動かすというのが主旨です
usb_modeswitch
usb_modeswitch --std-eject \
--default-vendor 0x15eb --default-product 0xa403 \
--target-vendor 0x15eb --target-product 0x7d0e
現在が default-* で target-* なデバイスの場合は --std-eject をしろ、という意味です
--std-eject は eject コマンドを実行したのと同じになり、これで手動でejectした状態と全く同じになります
modprobe
上記 usb_modeswitch により idProduct = 7d0e で(再)認識されるため、先のrulesの2行目に反応し、modprobeされるわけです (まぁ、insmodでもいいですが)
WIP;
デバイス名の固定化
ちなみに
/dev/ttyUSB*
は mode=0660 group=dialout となっているので sudo gpasswd -a YOUR_ID dialout
とdialoutグループに所属していると利用しやすいかもです
ただし Ubuntuな方は ModemManagerが ttyUSB0とttyUSB1をusedしているので systemctl stop ModemManager
をしないと resource busy となるからハマります
※rootからなら強引に奪えますけど
参考資料
ごめんなさい
rc.localとかobsoluteです