LoginSignup
11
14

More than 5 years have passed since last update.

USBモデム AK-020 をudevだけで制御する (WIP)

Last updated at Posted at 2016-05-18

SORACOM Air対応 USBモデム ABITさんのAK-020 のデバイス認識をudevのみでしっかり行おうという試みです

論よりコード

/etc/udev/rules.d/40-ak-020.rules
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です

11
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
14