Files
LFLede/RM520N-5G/文档/RM520N-MBIM拨号成功路线.md
T
2026-08-21 18:28:33 +08:00

208 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RM520N-GL 5G 模块在 iStoreOS(虚拟化直通)下 MBIM 拨号成功路线
> 日期:2026-08-19
> 环境:宿主飞牛(Fnos) 将移远 RM520N-GL 5G 模块通过 PCIe(vfio-pci) 直通给 iStoreOS 虚拟机
> 目标:让 iStoreOS 能够拨号上网,5G 模块作为宽带备用(wan2)
> 状态:✅ 5G 拨号成功、稳定上网、已固化开机自启
---
## 一、最终成果一句话
在 iStoreOS 里,用 **移远官方 Quectel-CM V1.6.8musl 静态编译)** 通过 **MBIM 模式** 拨号,模块成功拿到运营商内网 IP 并上网(`ping 223.5.5.5` 通)。
**关键结论:RM520N-GL 在 PCIe 直通 + pcie_mhi 驱动下,QMI 模式是死路(模块不响应 QMI),必须用 MBIM 模式。**
---
## 二、环境与拓扑
| 项 | 值 |
|---|---|
| 5G 模块 | 移远 RM520N-GL,固件 `RM520NGLAAR03A04M4G`IMEI 868371050275649 |
| 模块宿主位置 | 飞牛 `06:00.0 17cb:0308` |
| 直通方式 | vfio-pci 直通给 istoreos 虚拟机 |
| 虚拟机内位置 | `00:0a.0 Qualcomm SDX62` |
| iStoreOS IP | 192.168.110.135 |
| iStoreOS 登录 | root / SSH 已开启 |
| 数据通道 | PCIe/RMNET + qmap vlanMBIM 模式走 `rmnet_mhi0.1` |
| AT 通道 | `/dev/mhi_DUN` |
### 关键驱动
- **pcie_mhi 驱动** V1.3.8(移远私有 MHI 驱动)
- 加载参数:`mhi_mbim_enabled=1`**MBIM 模式**
- MBIM 模式设备节点:`/dev/mhi_MBIM`QMI 模式是 `/dev/mhi_QMI0`
---
## 三、为什么是这样(决策记录)
### 走过的弯路
1. **ModemManager 识别不了**:移远 pcie_mhi 驱动把控制通道暴露为私有 `/dev/mhi_QMI0`,不是标准 cdc-wdmmmcli 扫不到。
2. **luci-app-modem 界面管不到**:修好 `at_port=/dev/mhi_DUN` + `manufacturer=quectel` 后,界面能读到信息但不拨号。
3. **QMI 拨号失败(V1.6.7**:系统自带 quectel-CM 1.6.7 只支持 ECM 分支,报 `unsupport software_interface 1`
4. **升级 V1.6.8 仍失败(QMI**V1.6.8 支持 QMI 分支,但 **模块对 QMI 请求从不响应**——手动发 QMI SYNC 能写入但读不到任何响应;换 `qmap_mode`、软重启都不行。判定是 **RM520N-GL + pcie_mhi v1.3.8 的 QMI 硬伤**
5. **✅ 切 MBIM 成功**:驱动 `mhi_mbim_enabled=1``/dev/mhi_MBIM` 出现 → quectel-CM 直接拨号成功。完全复现移远官方日志 `pcie_mhi_mbim.txt` 的流程。
### 核心经验
- **RM520N-GL 在 PCIe/MHI 下能用 MBIMQMI 通道是死的**(至少 pcie_mhi v1.3.8 + 此固件下如此)。
- MBIM 模式**不需要 proxy**`quectel-CM -s <apn>` 直接拨号即可。
- iStoreOS 是 **musl libc**,必须用 **musl-gcc 静态编译** quectel-CMglibc 静态编译的 qmi-proxy 在 musl 上闪退/卡死)。
---
## 四、完整复现步骤
### 步骤 1:确认模块拓扑与直通
```bash
# 宿主(飞牛)
lspci | grep 17cb # 找到 06:00.0 17cb:0308
# 直通给 istoreos VM 后,guest 内
lspci | grep -i qualcomm # 00:0a.0 Qualcomm SDX62
ls /sys/bus/mhi_q/devices/ # 应看到 0308_00.00.0a_DIAG/DUN/EFS/QMI0 等
ls /dev/mhi_DUN /dev/mhi_QMI0 # AT 通道在
```
### 步骤 2:切到 MBIM 模式(关键!)
```bash
# 备份当前配置
cp /etc/modules.d/90-pcie_mhi /etc/modules.d/90-pcie_mhi.bak
# 卸载驱动
rmmod pcie_mhi
# 以 MBIM 模式重新加载
insmod /lib/modules/$(uname -r)/pcie_mhi.ko mhi_mbim_enabled=1
# 验证:/dev/mhi_MBIM 出现,/dev/mhi_QMI0 消失
ls /dev/mhi_MBIM
# 固化(重启自动 MBIM
echo "pcie_mhi mhi_mbim_enabled=1" > /etc/modules.d/90-pcie_mhi
```
### 步骤 3:部署 musl 版 quectel-CM V1.6.8
```bash
# 二进制在 文件/binaries/quectel-CMmusl 静态编译 V1.6.8
# 备份旧版 V1.6.7
cp /usr/bin/quectel-CM /usr/bin/quectel-CM.bak-20260819-167
# 替换
cp quectel-CM /usr/bin/quectel-CM
chmod 755 /usr/bin/quectel-CM
/usr/bin/quectel-CM 2>&1 | head -1 # 应显示 QConnectManager_Linux_V1.6.8
```
### 步骤 4:MBIM 拨号(核心命令)
```bash
# 直接拨号,不需要 proxy
/usr/bin/quectel-CM -s wonet -f /tmp/quectel_cm.log
# 注意:MBIM 模式不要加 -i rmnet_mhi0(会异常);APN 用 wonet(联通卡)
```
成功标志:日志出现 `ActivationState Deactivated -> Activated``rmnet_mhi0.1` 拿到 `inet` IP`ping -I rmnet_mhi0.1 223.5.5.5` 通。
### 步骤 5:开机自启
```bash
# 使用 文件/configs/init.d_modem5g
cp 文件/configs/init.d_modem5g /etc/init.d/modem5g
chmod 755 /etc/init.d/modem5g
/etc/init.d/modem5g enable # 建立 S95modem5g
# 手动测试
/etc/init.d/modem5g start
/etc/init.d/modem5g stop
```
### 步骤 6:开机绑定修复(已确认非必需,默认跳过)
```bash
# 说明 (2026-08-20 更新):
# 原生流程即可自启拨号: 90-pcie_mhi(驱动) -> S95modem5g(拨号) -> S96wan5g-route(策略路由)
# rc.local **不需要**手动 bind mhi_q。
# 教训: 手动强绑`echo 0000:00:0a.0 > /sys/bus/pci/drivers/mhi_q/bind`可能抢设备致 SYS_ERR。
# 若模块失联(无/dev/mhi_DUN),先断电重启飞牛,仍无效才可手动 bind 临时唤醒。
```
---
## 五、已验证的关键事实
### 拨号成功日志(节选,完整见 文件/logs/)
```
[08-19_13:00:xx] Quectel_QConnectManager_Linux_V1.6.8
[08-19_13:00:xx] Modem works in MBIM mode
[08-19_13:00:xx] cdc_wdm_fd = 8 # 成功打开 /dev/mhi_MBIM
[08-19_13:00:xx] mbim_device_caps_query()
[08-19_13:00:xx] DeviceId: 868371050275649
[08-19_13:00:xx] FirmwareInfo: RM520NGLAAR03A04M4G
[08-19_13:00:xx] mbim_subscriber_status_query()
[08-19_13:00:xx] SimIccId: 89860125801671811893
[08-19_13:00:xx] RegisterState Unknown -> Home # 已注册
[08-19_13:00:xx] PacketServiceState Unknown -> Attached
[08-19_13:00:xx] mbim_set_connect(onoff=1, sessionID=0)
[08-19_13:00:xx] ActivationState Deactivated -> Activated # ← 拨号成功!
[08-19_13:00:xx] mbim_ip_config(sessionID=0)
[08-19_13:00:xx] IPv4 = 10.98.xxx.xxx/30 # 拿到内网 IP
```
接口验证:
```
ip addr show rmnet_mhi0.1 # inet 10.98.xxx.xxx/30 ... state UP
ping -c 3 -W 2 -I rmnet_mhi0.1 223.5.5.5 # 2/2 received
```
### 界面管理(MBIM 下 luci 正常)
```
sh /usr/share/modem/modem_info.sh /dev/mhi_DUN quectel quectel 1
# 返回 manufacturer=Quectel, temperature, SIM ready, IMEI/IMSI 正常
```
luci 界面(网络→Modem)可作**状态监控**;但 luci 自动拨号(AT激活)不适用于 PCIe MBIM(数据通道由 quectel-CM 控制)。
---
## 六、目录文件清单
```
RM520N-5G-成功路线/
├── 文档/
│ └── RM520N-MBIM拨号成功路线.md # 本文档
├── 文件/
│ ├── binaries/ # musl 静态编译的 V1.6.8 二进制
│ │ ├── quectel-CM # ★ 拨号主程序(部署到 /usr/bin)
│ │ ├── quectel-qmi-proxy # (备用,QMI 模式才需要)
│ │ ├── quectel-mbim-proxy
│ │ └── quectel-atc-proxy
│ ├── source/ # V1.6.8 完整源码(21 .c + 头文件 + PDF文档)
│ │ └── Quectel_QConnectManager_Linux_User_Guide_V1.0.pdf
│ ├── configs/ # istoreos 配置文件(可直接复用)
│ │ ├── modem_config.txt # /etc/config/modem
│ │ ├── 90-pcie_mhi.txt # /etc/modules.d/90-pcie_mhi (mhi_mbim_enabled=1)
│ │ ├── rc.local # /etc/rc.local (默认无需绑定, 见故障排查文档)
│ │ └── init.d_modem5g # /etc/init.d/modem5g (开机自启拨号)
│ └── logs/
│ ├── quectel_cm_success_log.txt # 本次成功拨号日志(真实)
│ └── 官方参考_pcie_mhi_mbim.txt # 移远官方 MBIM 成功日志(参考)
```
---
## 七、编译说明(如需重编)
iStoreOS 是 musl libc,必须 musl 静态编译:
```bash
# 在 WSL(Ubuntu) 或其他 x86_64 glibc 环境
sudo apt install musl-tools
# musl-gcc 需要 linux 头文件,复制到 musl include
sudo cp -r /usr/include/linux /usr/include/x86_64-linux-musl/
sudo cp -r /usr/include/x86_64-linux-gnu/asm /usr/include/x86_64-linux-musl/
sudo cp -r /usr/include/asm-generic /usr/include/x86_64-linux-musl/
# 编译 quectel-CMV1.6.8QMI 分支)
cd 文件/source
musl-gcc -O1 -static -pthread -o quectel-CM \
QmiWwanCM.c GobiNetCM.c main.c QCQMUX.c QMIThread.c util.c \
qmap_bridge_mode.c mbim-cm.c device.c atc.c atchannel.c at_tok.c udhcpc.c
```
---
## 八、遗留 / 建议
1. **wan2 备份(最终目标)**5G 已能上网,还差把 `rmnet_mhi0.1` 配成 wan2 备份(wan1 宽带优先)。推荐 mwan3 或 OpenWrt 策略路由。
2. **luci 界面**:目前可作状态监控。如需界面控制拨号(启停 modem5g),可在 luci-app-modem 加轻量入口。
3. **QMI 死路提醒**:不要再尝试 QMI 拨号,此模块此驱动下不通,MBIM 是正解。
4. **APN**:本次用 `wonet`(联通)。换卡需改 `/etc/init.d/modem5g` 里的 `-s` 参数。