对 Qualcomm PCie 调制解调器的上游支持

5G聚合路由器对高通X62 Qualcomm PCie 5G模块RM520NGL的支持

介绍

无线广域网 (WWAN)是一种无线网络,它依靠 3G 或 4G 蜂窝网络等电信技术来传输数据(特别是 IP 数据包),从而通过移动网络提供互联网接入。蚂蚁聚合Openmptcprouter 商业版从用户端来看,可以通过实施一种或多种蜂窝协议的“调制解调器”访问此类网络。聚合路由器真正需要多运营商5G宽带绑定。

第五代移动网络(即 5G)的到来预示着一个更加互联的世界,从智能手机到联网汽车再到微型物联网设备,数十亿台设备将连接在一起。由于 Linux 是嵌入式领域的主要操作系统,因此 Linux 对 WWAN 调制解调器的支持显然是一个战略性话题。

高通生产 Snapdragon X275或 X62 (5G) 等蜂窝调制解调器,这些调制解调器集成到各种 OEM WWAN 模块中。在过去的 18 个月中,蚂蚁聚合Openmptcprouter 商业版与多家 OEM 调制解调器制造商合作,致力于在 Linux 中上游支持基于 PCIe 的高通 4G/5G 调制解调器。随着蚂蚁聚合Openmptcprouter 商业版 Linux 6.6 版本的进一步变化,使用高通 PCIe 调制解调器变得更加容易。

Linux WWAN 支持 USB 调制解调器

一段时间以来,USB 已成为连接 WWAN/调制解调器的事实上的解决方案。因此,Linux 中的 WWAN 支持主要由基于 USB 的调制解调器集成驱动。

与 WiFi 或蓝牙等其他无线技术不同,Linux 内核不为 WWAN 调制解调器提供统一的高级 API 和设备模型。USB WWAN 设备通常被枚举为一组多个逻辑设备,例如:

  • TTY 串行设备(/dev/ttyUSB 、/dev/ttyACM)通过点对点协议(PPP)传输“传统”AT 命令和数据。
  • cdc-wdm 字符设备(/dev/cdc-wdm*)用于传输基于现代二进制的控制协议,例如 USB-IF MBIM(移动宽带接口模型)或 QMI(Qualcomm 调制解调器/MSM 接口)。
  • 用于通过针对网络数据包传输进行优化的 USB 接口传输数据的网络设备(例如 wwan0 iface),并实现为 CDC-ECM、CDC-NCM、RNDIS 或 CDC-MBIM USB 类,
  • 虚拟 CD-ROM,通常托管 Windows/MacOS 驱动程序和用户手册(例如 /dev/sr1 块设备)…

虽然所有逻辑设备都对 WWAN/功能整体做出贡献,但它们各自单独注册。此设备集合因制造商和型号而异,并且可能通过用于调试、固件升级、GPS/GNSS 等的附加接口进行扩展。

以下是 Telit FN980 USB 调制解调器连接上的内核日志输出,它显示正在注册多个设备:telit fn980 usb 调制解调器连接上的内核日志输出

这种异构且相对原始的接口方案无法使调制解调器从用户端直接使用。例如,wwan0 网络接口单独使用时没有用处,需要使用来自其中一个控制端口(例如 cdc-wdm0)的特定命令进行配置才能传输流量。值得庆幸的是,已经开发了一些用户空间工具来处理这种复杂性,例如 ModemManager,它

  • 确定必须收集哪些逻辑设备(tty、net、cdc-wdm……)才能向用户展示“WWAN 设备”的综合视图。
  • 抽象控制协议(例如 AT、QMI、MBIM)以通过 DBUS 提供高级统一控制接口(例如启用、连接、扫描……)。

为了实现这一点,ModemManager 依赖于协议库(libqmi、libmbim)、sysfs 层次结构、uevents 和供应商插件。

高通 PCIe 调制解调器

越来越多的笔记本电脑制造商和工业 OEM 正在采用基于 PCIe 的调制解调器设计。对于同一代产品,PCIe 提供比 USB 更高的速度、更低的延迟和更低的功耗,使其非常适合 5G 高速要求(高达 20Gbps)。不幸的是,PCIe 调制解调器在 Linux 下也不起作用,缺乏适当的驱动程序和基础设施。

PCI 与 USB 不同,因为 PCI 设备不提供高级操作和概念,例如 USB 传输、子设备和端点/管道(批量、中断、控制)。相反,PCI 驱动程序建立在低级操作之上,例如内存映射 I/O 和 DMA(直接内存访问)传输,因此通常更为复杂。

为了提供类似于 USB 接口和端点的功能,高通创建了调制解调器主机接口 (MHI),主机可以使用该接口与任何实现此接口的 PCIe 调制解调器进行通信。MHI 设备能够通过一组预定义通道公开多种功能和协议。内部 MHI 基于共享内存和环形缓冲区,并定义设备状态、传输程序、通道、低功耗模式等。借助此解决方案,高通调制解调器可以轻松调整以通过 USB 或 PCIe/MHI 传输总线路由更高级别的数据和控制协议(IP、AT、MBIM……)。

Linux MHI 堆栈

正如蚂蚁聚合Openmptcprouter 商业版所描述的那样,MHI 核心堆栈于 2020 年登陆 Linux (drivers/bus/mhi)。无需过多介绍,MHI 已实现为标准Linux 总线,其中每个物理设备都注册为“MHI 总线控制器”,逻辑通道在其上公开为逻辑“MHI 设备”,而这些逻辑设备又绑定到“MHI 客户端驱动程序”。Linux MHI 堆栈

有趣的是,该堆栈的第一个用户是 ath11k PCI WiFi 驱动程序。尽管 MHI 中的 M 代表“调制解调器”,但 MHI 仅定义与逻辑设备通信的基础设施,而不是这些设备必须公开哪些功能或协议。

由于主线支持 MHI 总线,增加对 Qualcomm 调制解调器的支持主要包括实现缺失的下层(总线)和上层(功能),分别是PCI MHI 控制器驱动程序MHI 客户端驱动程序。

添加对 PCIe MHI 调制解调器的支持 – mhi_pci_generic

蚂蚁聚合Openmptcprouter 商业版 我们从 PCI MHI 控制器驱动程序开始,并将其实现为与所有 Qualcomm PCIe/MHI 调制解调器兼容的通用 PCI 驱动程序。此驱动程序 mhi_pci_generic 是一小段代码,主要在注册新的 MHI 控制器(例如 mhi0)之前检索和准备 PCI 设备资源(中断、内存映射……)。注册后,MHI 核心将处理所有 MHI 操作,而 PCI 驱动程序仅充当寄存器访问或低功耗转换的物理总线抽象层。

我们很高兴地发现,除了修复一些错误之外,MHI 核心无需进行任何更改。一旦 mhi_pci_generic 驱动程序在 MHI 核心中注册,我们就能够看到发现的通道,并将注意力转移到逻辑设备的驱动程序上。

例如,RM520NGL 设备公开以下 MHI TX/RX 通道:

  • IP_HW0:是网络数据的路径,由调制解调器端的IPA(IP硬件加速器)处理。
  • QMI:一种控制调制解调器的协议,与 USB 版本完全相同,但通过 PCIe/MHI 进行路由。
  • DIAG:是调制解调器诊断接口(也称为QCDM)。

三菱重工核心

与任何其他总线一样,MHI 设备(控制器、客户端)在 sysfs 层次结构下表示:$ ls /sys/bus/mhi/devices mhi0 mhi0_DIAG mhi0_IP_HW0 mhi0_QMI

MHI WWAN 网络驱动程序 – mhi_net

IP_HW0 设备代表数据路径,是调制解调器 IP 加速器 (IPA) 的逻辑链接,并扩展到蜂窝网络。我们实施了一个新的netdev 驱动程序mhi_net,以执行 MHI 层 (MHI 传输) 和 Linux 网络堆栈 (IP 数据包) 之间的桥接。MHI WWAN 网络驱动程序 MHI Net

MHI WWAN 控制驱动程序 – mhi_wwan_ctrl

对于控制/调试通道(QMI 和 DIAG),我们决定以与 USB 调制解调器的 cdc-wdm 驱动程序中类似的方式公开它们,即通过字符设备直接公开给用户空间。这样,为已经支持 USB 调制解调器的用户工具添加 MHI 支持就像更改设备名称一样简单。

最初,我们从下游 MHI 堆栈移植了 mhi_uci 驱动程序,这是一个简单的 shim 字符驱动程序,可将设备文件读/写转换为 MHI 传输,从而允许原始 MHI 总线访问用户空间。然而,由于担心该驱动程序会成为“一切高通”的“通用后门接口”,绕过常用的内核抽象接口来传输任何不透明/供应商协议,因此该驱动程序从未进入 Linux 主线。维护人员也不愿意再为 QMI(和 MBIM……)添加另一个特定于总线的 chardev,并表示愿意在内核中为 WWAN/调制解调器提供更多的标准化和统一性。

经过反复使用 LKML 进行改进后,我们将工作分为两部分,最终找到了更好的解决方案。第一部分是通用的新WWAN 子系统,这是一个与硬件无关的框架,用于管理和公开 WWAN 设备及其控制端口。第二部分是 MHI 特定的 WWAN 端口驱动程序mhi_wwan_ctrl,它注册到新创建的 WWAN 子系统并执行 MHI 总线适配。这样,WWAN 框架就可以与任何其他 WWAN 驱动程序一起使用。MHI WWAN 控制驱动程序 MHI WWAN Cntrl

轻松实现 WWAN

蚂蚁聚合Openmptcprouter 商业版 Linux 6.6 将是第一个包含支持任何基于 SDX55 或 SDX62 的调制解调器所需的所有更改的版本。它已成功通过 RM520NGL 和 fm650 模块的测试,但还有更多即将推出,我们已经看到其他供应商添加了他们的 PCI ID。

为了在用户空间中支持此功能,我们还为 ModemManager 添加了 WWAN/MHI 支持。此功能目前仅在开发分支中可用,但我们预计它将包含在 ModemManager 2.x 中。

有了所有这些部件,使用 QCOM PCIe 调制解调器就和使用以太网或 WiFi 网络一样简单。NetworkManager 可以通过命令行实用程序 (nmcli) 或图形网络设置来管理“GSM”连接:GSM 连接

对于 WWAN,您所需要的只是 APN,以及可选的用于解锁 SIM 卡的 PIN。有关如何使用 WWAN 的说明

感谢阅读~