AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 771552
Accepted
LiterallyCode
LiterallyCode
Asked: 2024-03-04 08:04:51 +0800 CST2024-03-04 08:04:51 +0800 CST 2024-03-04 08:04:51 +0800 CST

华为 E3372 调制解调器启动时触发 usb_modeswitch

  • 772

我正在尝试让华为 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 驱动程序使用不同的命令来切换到调制解调器模式?

usb-device
  • 2 2 个回答
  • 27 Views

2 个回答

  • Voted
  1. u1686_grawity
    2024-03-04T14:06:16+08:002024-03-04T14:06:16+08:00

    这些命令本身不会做任何有用的事情;两者都只重置 USB 端口。-J实际的模式切换将使用或选项来完成-X(前者将其切换到 CDC 假以太网模式;后者切换到 MBIM 调制解调器模式)。

    然而,调制解调器似乎也以 RNDIS 假以太网模式启动,只有在一秒钟内没有任何内容绑定到 RNDIS 接口时才会切换到 CDROM 模式。因此,正常连接期间(当 udev 准备好立即加载驱动程序时)与系统引导期间(当 USB 设备初始化和驱动程序加载之间需要一段时间时)的行为会有所不同。

    至少当我最初得到我的时是这样,但两天后它的行为却神秘地改变了。我相信它一定已经下载了固件更新 1,现在它的“启动”似乎完全不同了——连接时它只停留 3566:2001 一秒钟,然后变成 12d1:1f01,usb_modeswitch 可以识别并切换到 CDC 假以太网模式。(它也冻结了很多。)


    1 它不仅仅是一个调制解调器,它还是一个完整的 Linux 设备,配有内部 Web 服务器和自动更新。

    • 1
  2. Best Answer
    LiterallyCode
    2024-03-08T22:13:44+08:002024-03-08T22:13:44+08:00

    我找到了一个解决方案,它似乎在热插拔和启动时都有效。

    一、复制粘贴解决方案:

    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
    
    • 0

相关问题

  • Kinect 0 不存在

  • 一致的 Linux 设备枚举

  • 如何使用 udevadm 修复无法识别的 USB 设备

  • 有没有办法让 systemd 服务找出设备路径并在它发生变化时重新启动?

  • 将 USBIP 用于正在移除和重新连接的设备

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve