我正在尝试让华为 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 规则配置是否会触发比列出的两个命令更多的操作?或者为什么看似相同的命令却没有相同的效果?
更新
显然,在开机后,调制解调器会显示自己为调制解调器一秒钟,然后切换到 CDROM 模式,但似乎不接受将其切换回调制解调器模式的命令。 CDROM 模式用于在 Windows 中自动安装驱动程序。不过,这也意味着安装驱动程序后,驱动器能切换回调制解调器模式。那么,usb_modeswitch 和 Windows 驱动程序似乎使用不同的命令来切换到调制解调器模式?
答案1
这些命令本身不会做任何有用的事情;两者都只重置 USB 端口。实际的模式切换将使用-J
或-X
选项来完成(前者将其切换到 CDC 假以太网模式;后者切换到 MBIM 调制解调器模式)。
然而,调制解调器似乎也开始在 RNDIS 假以太网模式下,只有在一秒钟内没有任何内容绑定到 RNDIS 接口时才切换到 CDROM 模式。因此,正常连接期间(当 udev 准备好立即加载驱动程序时)与系统引导期间(当 USB 设备初始化和驱动程序加载之间需要一段时间时)的行为会有所不同。
至少当我最初得到我的时是这样,但两天后它的行为却神秘地改变了。我相信它一定已经下载了固件更新 1,现在它的“启动”似乎完全不同了——连接时它只停留 3566:2001 一秒钟,然后变成 12d1:1f01,usb_modeswitch 可以识别并切换到 CDC 假以太网模式。 (它也冻结了很多。)
1 它不仅仅是一个调制解调器,它还是一个完整的 Linux 设备,配有内部 Web 服务器和自动更新。
答案2
我找到了一个解决方案,它似乎适用于热插拔和启动时。
一、复制粘贴解决方案:
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"
然后,它创建一个系统服务来在启动后重置调制解调器,以便能够在它接受命令的一秒时间窗口中与其对话(基于来自这个帖子):
[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