14
13

More than 5 years have passed since last update.

RaspberryPiでL-02Cを使う

Last updated at Posted at 2016-08-10

良記事 を見かけたので、以前いったん挫折したL-02CでQMI接続というのを、もう一回頑張ってみた。

こうやったらOKだった。Raspbian Jessie-lite です。

L-02C のドライバ環境を整える。udev ルールにしておいてもいい。

modprobe qcserial
echo "1004 618f 0000 05c6 9212" > /sys/bus/usb-serial/drivers/qcserial/new_id
modprobe qmi_wwan
echo "1004 618f" > /sys/bus/usb/drivers/qmi_wwan/new_id

L-02C を刺す。CD-ROM としてマウントされた場合は、eject する(同等のことを usb_modeswitch でやってもいい)。そうすると idVendor=1004, idProduct=618f な USB が出てくる。そして、こんな感じで認識されるはず。

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=03 Dev#=  9 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=1004 ProdID=618f Rev=00.00
S:  Manufacturer=NTT DOCOMO, INC.
S:  Product=docomo L02C
C:  #Ifs= 4 Cfg#= 1 Atr=80 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qcserial
I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan

libqmi-utilsをインストールし、/etc/qmi-network.conf を書く。

/etc/qmi-network.conf
APN=iijmio.jp,CHAP,mio@iij,iij

接続には qmi-network を使うと便利。

qmi-network /dev/cdc-wdm0 start

繋がった?ちょっと待ってLEDが反応したのを見計らって実行すると繋がる様子。

ip route
journalctl

ちなみに…バンドを確認しておく。

# qmicli -d /dev/cdc-wdm0 --dms-get-band-capabilities
[/dev/cdc-wdm0] Device band capabilities retrieved:
        Bands: 'gsm-dcs-1800, gsm-900-extended, gsm-900-primary, gsm-pcs-1900, wcdma-2100, wcdma-850-us, wcdma-800'

そうそう、USB電源設定も強化しておきましょう。L-02C も結構電力食うので。

echo usb_max_current=1 >> /boot/config.txt

IPv6

IIJmio の SIM(みおふぉん)では IPv6 も割り当てることもできる。ただし実験した範囲では L-02C では wwan0 上で受け取る IPv6 RA メッセージ内容が壊れていた。てくろぐに「L-02Cでは機器の仕様上、IPv6のDNSサーバを自動的に取得することができない」と書いてあるのと関係があるのかもしれない。

この前提を踏まえつつ、現状 wwan0 に自動的に global scope のアドレスを割り当てる方法は2通りある。

  • NetworkManager + ModemManager の連携機能を使って、qmi プロトコル上で与えられたアドレスを wwan0 に自動的に反映させる方法
  • 6.9.4 以降の dhcpcd5inform6 オプションを使って、DHCPv6 を wwan0 上でいきなり呼び出して反映させる方法

詳しくは別記事を参照。

Windows環境

公式のドライバでは、こう認識されている。

ハードウェアID 名前
usb\vid_1004&pid_618f&mi_00 docomo L02C USB Serial Port
usb\vid_1004&pid_618f&mi_01 docomo L02C NMEA Serial Port
usb\vid_1004&pid_618f&mi_02 docomo L02C (L02CqmiModem)
USB\VID_1004&PID_618F&MI_03 docomo L02C (L02Cqmindis)

L-02C のドライバ Windows 10 版が出てないからしょうがない。Linux でこれを再現しよう。

ATコマンド

AT%USBMODEM=0をあらかじめ設定しておくと、eject動作しなくてもいきなり使える。参考

new_id

Linux kernel driver をリビルドするのが骨が折れるのだけど、よーくよく見てみたら、new_id の挙動が拡張されていた。

idVendor idProduct bInterfaceClass refVendor refProduct の形式で登録できて、refVendor refProduct 相当の動きをするように、変化球をつけられるようになった。ありがたい。今回は gobi1k 相当にする必要があったので、{DEVICE_G1K(0x05c6, 0x9212)}, /* Acer Gobi Modem device */ を使った。もちろん別のものでも良い。ただし ModemManagerblacklist されているものは避けること(G1K一覧の最初にある 05c6 9211 は NG)。

udev rule

udev のルールとして書くとこんな感じ。ModemManagerのルールが 77 番台を使うので、それより前にする。

/etc/udev/rules.d/75-l02c.rules
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="61dd", RUN+="/usr/bin/eject /dev/sr0"
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="618f", RUN+="/sbin/modprobe -b qcserial"
SUBSYSTEM=="drivers", ENV{DEVPATH}=="/bus/usb-serial/drivers/qcserial", ATTR{new_id}="1004 618f 0000 05c6 9212"
SUBSYSTEM=="usb", ATTRS{idVendor}=="1004", ATTRS{idProduct}=="618f", RUN+="/sbin/modprobe -b qmi_wwan"
SUBSYSTEM=="drivers", ENV{DEVPATH}=="/bus/usb/drivers/qmi_wwan", ATTR{new_id}="1004 618f"

雑談

実は昔一度QMI接続を試みたことがあった。が、その時は結局 fon 2.0 の USB ポートに挿せば使えてしまうという簡単さを選択して Linux で認識させるのは一旦ペンディングにしていた。

Routerboard で無線と NAT を引き受けつつ、上流は fon 2.0 から携帯網へ、という構成でしばらく運用してきたけど、人数が多かった時に大いにトラブった。L-02C の網接続が切れまくって、どうにもならず。無線やNAT tableは大丈夫でした。fon 2.0 だからデバッグもできないんですよね…。

というわけで、今回の RPi でのセットアップとなりました。これでまた運用に入れてみよう。

まだ様子見だけど、dhcpcd で不審な挙動をするということは今のところ観測されていない。

運用してみて

調子が悪いと、こんなエラーが出たりして USB 再挿入の動作を繰り返すようだった。qmicli --wds-start-network--wds-follow-network をつけると stdout つなげたままで情報が取れる。

Aug 18 12:25:24 raspberrypi kernel: qmi_wwan 1-1.4:1.3: nonzero urb status received: -71
Aug 18 12:25:24 raspberrypi kernel: qmi_wwan 1-1.4:1.3: wdm_int_callback - 0 bytes
Aug 18 12:25:24 raspberrypi kernel: qmi_wwan 1-1.4:1.3: wdm_int_callback - usb_submit_urb failed with result -19

-71 は ECOMM, -19 は ENODEV なのだろう。この後 USB デバイスが違う番号で再認識されたりしているので、L-02C がリセットしている様子。

NMEA

USB の認識順番をログで確認して、/dev/ttyUSB2 が NMEA インターフェースであることは確認できた。さてひょっとしてこれは GPS が取れるのだろうか?

cat /dev/ttyUSB2 &
echo "\$GPS_START" > /dev/ttyUSB2

果たして出力は…

$GPGGA,,,,,,0,,,,,,,,*66

これが延々と出てくる。うーむ。何か足りないのか…?

14
13
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
14
13