Armadillo-440でFS040Uを使う

結構ハマったので残しておく

# 結果から
この設定で起動時に自動認識されるようになった。
### カーネルコンフィギュレーション

```
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'"
```

これで挿せばモデムとして使える状態になった