結構ハマったので残しておく
結果から
この設定で起動時に自動認識されるようになった。
カーネルコンフィギュレーション
Linux Kernel Configuration
Device Drivers --->
[*] USB support --->
<*> USB Serial Converter support ---> ← 有効化
[*] USB Generic Serial Driver ← 有効化
<*> USB driver for GSM and CDMA modems ← 有効化
pppd
atmark-dist/user/pppd/preinstall/etc/ppp/options
lock
defaultroute
usepeerdns
name PPPログイン名
認証ファイル
ユーザ名/パスワードは、契約しているSIMに応じて記載してください。
atmark-dist/user/pppd/preinstall/etc/ppp/pap-secrets
# Secrets for authentication using PAP
# client server secret IP addresses
atmark-dist/user/pppd/ppp-2.4.4/scripts/ppp-on-dialer
# !/bin/sh
#
# This is part 2 of the ppp-on script. It will pe
# protocol for the desired connection.
#
exec chat -v \
TIMEOUT 3 \
ABORT '\nBUSY\r' \
ABORT '\nNO ANSWER\r' \
ABORT '\nRINGING\r\n\r\nRINGING\r' \
'' \rAT \
'OK' ATZ \
TIMEOUT 30 \
OK ATDT*99***1# \
CONNECT ''
起動スクリプト
/etc/init.d/pppd
# !/bin/sh -e
### BEGIN INIT INFO
# Provides: pppd
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Should-Start: network-manager
# Should-Stop: network-manager
# X-Start-Before: $x-display-manager gdm kdm xdm wdm ldm sdm nodm
# X-Interactive: true
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: ppp daemon
### END INIT INFO
PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DAEMON=/sbin/pppd
DESC="point to point protocol daemon"
CONFIG_DIR=/etc/ppp
DEV=/dev/ttyUSBmodem
RATE=115200
DIALER=$CONFIG_DIR/ppp-on-dialer
PIDFILE=/var/run/ppp0.pid
test -x $DAEMON || exit 0
test -d $CONFIG_DIR || exit 0
check_device() {
while :
do
if ls /dev |grep ttyUSBmodem > /dev/null; then
break;
fi
echo "waiting device..."
sleep 3
done
}
check_pppd() {
while :
do
if ip addr show |grep ppp0 > /dev/null; then
break;
fi
echo "starting..."
sleep 3
done
}
start_pppd () {
echo "Starting $DESC"
if test -e $DIALER;
then
opts="${DEV} ${RATE} connect ${DIALER}"
$DAEMON $opts
check_pppd
echo "OK"
else
echo "No such file or directory $DIALER"
fi
}
check_device
start_pppd
USBドングルを指してないと起動しない無限ループにはまるので、check_deviceを適当に直して使ってください。
(検証なので手抜きです)
USB_MODESWITCH
ここを参考にusb_modeswitchと依存パッケージを入れる
https://armadillo.atmark-techno.com/howto/use-debian-binary
# dpkg -x libjim0debian2_0.73-3_armel.deb ~/work
# dpkg -x libusb-0.1-4_0.1.12-20+nmu1_armel.deb ~/work
# dpkg -x usb-modeswitch-data_20120815-2_all.deb ~/work
# dpkg -x usb-modeswitch_1.2.3+repack0-1_armel.deb ~/work
# rm -rf ~/work/usr/share/man/
# rm -rf ~/work/usr/share/doc/
# cp -ar ~/work/* atmark-dist/vendors/AtmarkTechno/XXXX/
同様にlsusbもあると便利です
/etc/usb_modeswitch_fs040u.conf
DefaultVendor= 0x1c9e
DefaultProduct= 0x9bfd
TargetVendor= 0x1c9e
TargetProduct= 0x9b02
MessageContent="55534243123456780000000000000606f50402527000000000000000000000"
/etc/udev/rules.d/90-usb.rules
デバイス名を/dev/ttyUSBmodem
に固定しています。
KERNEL=="ttyUSB2",SUBSYSTEMS=="usb-serial",DRIVERS=="option1",SYMLINK+="ttyUSBmodem"
# FS040U
ATTR{idVendor}=="1c9e", ATTR{idProduct}=="9bfd", RUN+="/usr/sbin/usb_modeswitch -c /etc/usb_modeswitch_fs040u.conf"
ATTR{idVendor}=="1c9e", ATTR{idProduct}=="9b02", RUN+="/bin/sh -c 'echo 1c9e 9b02 > /sys/bus/usb-serial/drivers/option1/new_id'"
ここからが闘いの記録
FS040UがどうしてもCD-ROMとして認識されてしまう。
lsusbすると、1c9e:9bfd
linuxのソースから、モデムの時はProductが9b02
になることを確認
https://lore.kernel.org/patchwork/patch/883889/
CD-ROMの場合は9bfd
なので、これを変換できればOK
usb-modeswitch-dataにヒントになるものがないか探す。
https://www.draisberghof.de/usb_modeswitch/usb-modeswitch-data-20191128.tar.bz2
解凍後のusb_modeswitch.dの中に変換データがあるので、'1c9e:9bfd'に近いものを探す。
1c9e:9bfe
が存在!
中身を見ると、# XS Stick W100 (Omega)となっており、同じOmegaなので期待が持てる
TargetProductも9b01と近い
このMessageContentをそのまま使い、
usb_modeswitch_fs040u.confを作成
DefaultVendor= 0x1c9e
DefaultProduct= 0x9bfd
TargetVendor= 0x1c9e
TargetProduct= 0x9b02
MessageContent="55534243123456780000000000000606f50402527000000000000000000000"
これを/etcにいれて
# usb_modeswitch -c /etc/usb_modeswitch_fs040u.conf
# echo 1c9e 9b02 > /sys/bus/usb-serial/drivers/option1/new_id
をすると、USBモデムとして認識された(ttyUSB0~4)が出現
次にUSBを認識した際に自動で行うようにする(udevの設定)
これをudev/rules.d/90-usb.ruleとして保存
KERNEL=="ttyUSB2",SUBSYSTEMS=="usb-serial",DRIVERS=="option1",SYMLINK+="ttyUSBmodem"
# FS040U
ATTR{idVendor}=="1c9e", ATTR{idProduct}=="9bfd", RUN+="/usr/sbin/usb_modeswitch -c /etc/usb_modeswitch_fs040u.conf"
ATTR{idVendor}=="1c9e", ATTR{idProduct}=="9b02", RUN+="/bin/sh -c 'echo 1c9e 9b02 > /sys/bus/usb-serial/drivers/option1/new_id'"
これで挿せばモデムとして使える状態になった