Huawei E3372モデムが起動すると、USB_modeswitchが起動します。

Huawei E3372モデムが起動すると、USB_modeswitchが起動します。

Huawei Brovi E3372-325 USB LTEモデルをRaspberry Piと連携させようとしています。この製品はボックスから取り出されるとすぐに動作し、接続するとCDROMとして表示されます。 (これは明らかにWindowsでドライバのインストールを自動化するために使用されます。)

これまで私が見つけたこの投稿udev ルール構成ファイルを使用します。システムの実行中にusb_modeswitchを実行してモデムをホットプラグすると、それを有効にできます。ただし、起動時にモデムが接続されている場合は機能せず、代わりにCD ROMとして表示されます。

だから今、起動時にusb_modeswitchを実行するシステムサービスを作成しようとしています。これを達成するための手順としてモデムを接続した状態で起動し、設定ファイルでusb_modeswitchコマンドを手動で実行してみました。しかし、これは所望の効果を得ることができなかった。

コマンドは

/sbin/usb_modeswitch -v 3566 -p 2001 -W -R -w 400
/sbin/usb_modeswitch -v 3566 -p 2001 -W -R

これを行うにはどうすればよいですか? udevルール設定は、リストされている2つのコマンドよりも多くのアクションをトリガしますか?それとも、なぜ一見同じコマンドが同じ効果を持たないのでしょうか?

修正する

明らかに電源を入れた後、モデムはしばらくモデムとしてマークされてからCDROMモードに切り替えますが、モデムモードに戻すように指示することはできません。 CDROMモードは、Windowsからドライバを自動的にインストールするために使用されます。ただし、これはドライバをインストールした後できるモデムモードに戻ります。その場合、usb_modeswitchとWindowsドライバは、モデムモードに切り替えるために異なるコマンドを使用するようです。

答え1

このコマンド自体では有用な操作は行われません。どちらもUSBポートをリセットするだけです。実際のモード切り替えはまたは-Jオプション-Xを使用して行われます(前者はCDC擬似イーサネットモードに切り替え、後者はMBIMモデムモードに切り替えます)。

しかし、モデムも同じようです。スタートRNDIS擬似イーサネットモードからCDROMモードへの切り替えは、1秒間RNDISインターフェイスにバインドされていない場合にのみ発生します。したがって、通常の接続(udevがすぐにドライバをロードする準備ができている場合)とシステム起動(USBデバイスの初期化とドライバのロードの間に少し時間がある場合)の動作は異なります。

少なくとも最初に私の製品を受け取ったときはそうでしたが、2日後にその行動は奇妙に変わりました。私はそれがファームウェアアップデート1をダウンロードしたにちがいないと思います。接続すると、1秒間だけ3566:2001に滞在し、12d1:1f01になります。 usb_modeswitchはそれを認識し、CDC falseに切り替えます。イーサネットモード。 (また、たくさん凍った。)


1 単純なモデムではなく、内部Webサーバーと自動更新を備えた完全なLinuxデバイスです。

答え2

ホットスワップに適したソリューションを見つけました。そして起動時に。

1. ソリューションをコピーして貼り付けます。

echo -e "ACTION!=\"add\", GOTO=\"modeswitch_rules_end\"\nSUBSYSTEM!=\"usb\", GOTO=\"modeswitch_rules_end\"\n\n# All known install partitions are on interface 0\nATTRS{bInterfaceNumber}!=\"00\", GOTO=\"modeswitch_rules_end\"\n\n# only storage class devices are handled; negative\n# filtering here would exclude some quirky devices\nATTRS{bDeviceClass}==\"e0\", GOTO=\"modeswitch_rules_begin\"\nATTRS{bInterfaceClass}==\"e0\", GOTO=\"modeswitch_rules_begin\"\nGOTO=\"modeswitch_rules_end\"\n\nLABEL=\"modeswitch_rules_begin\"\n# Huawei E3372-325\nATTRS{idVendor}==\"3566\", ATTRS{idProduct}==\"2001\", RUN+=\"/sbin/usb_modeswitch -v 3566 -p 2001 -W -R -w 400\"\nATTRS{idVendor}==\"3566\", ATTRS{idProduct}==\"2001\", RUN+=\"/sbin/usb_modeswitch -v 3566 -p 2001 -W -R\"\n\nLABEL=\"modeswitch_rules_end\"" | sudo tee /etc/udev/rules.d/40-huawei.rules > /dev/null
echo -e "[Unit]\nDescription=Switch E3372 dongle to modem mode\nAfter=multi-user.target\n\n[Service]\nType=simple\nExecStart=usb_modeswitch -v 3566 -p 2001  -X\nExecStartPost=sleep 1\nExecStartPost=modprobe option\nExecStartPost=sleep 1\nExecStartPost=/bin/bash -c 'echo \"3566 2001 ff\" | sudo tee /sys/bus/usb-serial/drivers/option1/new_id > /dev/null'\nExecStartPost=sleep 1\nExecStartPost=/bin/bash -c 'ls -la /dev/ttyUSB4 | grep dialout && { echo AT^RESET > /dev/ttyUSB4; timeout 2 cat /dev/ttyUSB4; }'\n\n[Install]\nWantedBy=multi-user.target\n" | sudo tee /etc/systemd/system/modeswitch_e3372_modem.service > /dev/null
sudo systemctl daemon-reload
sudo systemctl enable modeswitch_e3372_modem.service

Udevルールは、まずホットプラグのモデムモードをモデムモードに切り替えるために上記で作成されました。この投稿:

ACTION!="add", GOTO="modeswitch_rules_end"
SUBSYSTEM!="usb", GOTO="modeswitch_rules_end"

# All known install partitions are on interface 0
ATTRS{bInterfaceNumber}!="00", GOTO="modeswitch_rules_end"

# only storage class devices are handled; negative
# filtering here would exclude some quirky devices
ATTRS{bDeviceClass}=="e0", GOTO="modeswitch_rules_begin"
ATTRS{bInterfaceClass}=="e0", GOTO="modeswitch_rules_begin"
GOTO="modeswitch_rules_end"

LABEL="modeswitch_rules_begin"
# Huawei E3372-325
ATTRS{idVendor}=="3566", ATTRS{idProduct}=="2001", RUN+="/sbin/usb_modeswitch -v 3566 -p 2001 -W -R -w 400"
ATTRS{idVendor}=="3566", ATTRS{idProduct}=="2001", RUN+="/sbin/usb_modeswitch -v 3566 -p 2001 -W -R"

LABEL="modeswitch_rules_end"

その後、起動後にモデムをリセットして、コマンドを受け付ける1秒間モデムと通信できるようにシステムサービスを作成します(デフォルトでは)。この投稿):

[Unit]
Description=Switch E3372 dongle to modem mode
After=multi-user.target

[Service]
Type=simple
ExecStart=usb_modeswitch -v 3566 -p 2001  -X
ExecStartPost=sleep 1
ExecStartPost=modprobe option
ExecStartPost=sleep 1
ExecStartPost=/bin/bash -c 'echo "3566 2001 ff" | sudo tee /sys/bus/usb-serial/drivers/option1/new_id > /dev/null'
ExecStartPost=sleep 1
ExecStartPost=/bin/bash -c 'ls -la /dev/ttyUSB4 | grep dialout && { echo AT^RESET > /dev/ttyUSB4; timeout 2 cat /dev/ttyUSB4; }'

[Install]
WantedBy=multi-user.target

関連情報