WWAN设备类型
USB dongle是设备接入互联网的重要方式之一,典型的通过USB接口与主设备连接,然后主设备通过4G/5G接入互联网,作为移动宽带设备,它有那些设备类型及暴露方式呢?
-
移动宽带设备类型:ModemManager能够与几乎所有类型的移动宽带调制解调器进行交互,只要该设备至少暴露一个控制端口。不支持没有控制端口的设备(例如,某些仅暴露网口的USB dongles)。
-
在系统中的暴露方式:对于支持的移动宽带设备,它们通过控制端口与ModemManager进行通信,使其能够管理和控制这些设备的功能。没有控制端口的设备无法被ModemManager支持。
USB devices
USB设备的类型以及它们在系统中的表现如下。
USB设备类型
USB设备是最常见的设备类型,有非常不同的形式因素。USB dongles可以连接到计算机的物理USB端口,但在嵌入式系统和笔记本电脑中,连接在miniPCIe或M.2插槽的模块也非常普遍。
在系统中的表现方式
USB总线中枚举的设备可以在系统中暴露多个端口,因此控制端口或数据端口的数量没有限制。USB调制解调器通常具有多个控制端口,例如允许在不同端口上并行运行不同操作;但也存在具有多个数据端口的调制解调器,例如允许单独连接到多个APN而无需复杂的多路复用设置。
USB设备类型端口
该类型设备预期的端口类型有:
- 串行端口(例如ttyUSB0、ttyACM0…)。
- 网络端口(例如wwan0、usb0、eth0…)。
- QMI或MBIM控制端口(例如cdc-wdm0…)。
- WWAN子系统QMI或MBIM控制端口(例如wwan0mbim0、wwan0qmi0)。
需要USB mode switch切换的设备
有些USB设备默认启动时以非调制解调器的USB布局出现,例如将自己暴露为USB磁盘。这在需要在Windows操作系统中安装特殊驱动程序的USB dongles(例如来自华为、中兴等厂商)中很常见;dongle提供了安装驱动程序的工具。在基于Linux的系统中,用户希望设备能够工作而无需安装任何额外的驱动程序,为实现这一点,有像usb-modeswitch
这样的工具,能够在没有手动干预的情况下将设备自动切换到有效的调制解调器USB布局。
支持多个USB配置的设备
有些设备(例如许多富士康或华为模块)默认情况下暴露多个USB配置,每个配置提供不同的USB接口布局。例如,一个配置可以包括一个MBIM控制端口和一个网络接口,另一个配置可能包括一个AT端口和一个NCM网络接口,依此类推。内核默认会以最匹配通用布局的USB配置暴露设备。例如,如果设备在不同配置中同时暴露了MBIM和QMI布局,内核总是优先选择MBIM布局,因为它被认为比QMI更通用。然而,有时这还不够,因为具有NCM和MBIM布局的设备都是通用的,内核可能默认选择NCM而不是MBIM,而MBIM实际上通常更受欢迎。为了解决这些情况,usb-modeswitch
工具允许自动选择MBIM配置,而不考虑USB设备中是否还有其他配置。
支持通过控制端口配置多种布局的设备
有些设备(例如许多Sierra Wireless模块)允许选择USB布局,例如在原本只有QMI和net端口布局的设备上添加其他AT端口,或者甚至完全从基于QMI的布局切换到基于MBIM的布局。
RS232 devices
由于简单性,RS232设备仍在某些配置中使用,但大多数情况下被支持通过USB连接暴露多个端口的USB调制解调器取代。
集成方式
RS232设备可以通过物理RS232连接或USB转RS232适配器集成到系统中,形成一个单一的串行端口,ModemManager
用于控制和数据传输。
RS232 Modem设置要求
与USB调制解调器不同,RS232调制解调器需要事先与主机协商设置,如波特率、停止位等,配置错误可能导致通信失败。
预期端口类型
平台串行端口(例如ttyS0…)和USB串行端口(例如ttyUSB0…)。
PCI 设备
PCIe设备相较于大多数USB设备更复杂和先进,因为它们需要与主机系统更紧密地集成。这使得它们在进行连接时可以实现比USB 3.0和USB 2.0更高的数据吞吐量。
不同于USB设备,PCIe设备不会暴露多个可选的配置或布局。设备在固件中预先配置了内核驱动程序可以访问的通道列表。虽然可能支持一些可配置性,但与USB设备相比较不常见。
这些设备的形状与miniPCIe或M.2 USB调制解调器相同,但使用的是PCI总线而不是USB总线。以PCIe模式工作的设备无法作为USB设备工作,反之亦然。一些制造商允许通过软件(例如专有AT命令)更改PCIe/USB模式,而其他一些制造商则允许通过硬件(例如更改输入GPIO的电压级别)来更改模式。
PCIe设备已在Linux内核的上游集成,使用了在5.13版本内核中引入的WWAN子系统。该子系统还允许内核明确定义端口上预期使用的控制协议,因此在ModemManager
中不需要自定义端口类型提示。
预期的端口类型:
- 网络端口(例如wwan0)
- WWAN子系统的AT、QMI或MBIM控制端口(例如
wwan0mbim0、wwan0qmi0、wwan0at0
…)
Qualcomm SoCs
Qualcomm SoCs与通常的调制解调器管理情况有很大的不同,因为它没有连接到主机的外部设备,而是集成在主机系统中,因此需要不同的通信方式。
它支持通过QRTR总线中的节点和建立在rpmsg子系统之上的WWAN子系统中的字符设备进行调制解调器控制操作。具体使用哪种方法取决于SoC的功能;较旧的SoC仅支持rpmsg,其他SoC同时支持rpmsg和QRTR(但后者不用于调制解调器管理),而较新的SoC则完全支持QRTR(包括调制解调器管理)。
Qualcomm SoCs中的网络接口支持也有一些不同之处,因为需要将给定的数据连接明确绑定到特定的网络接口。在使用bam-dmux内核驱动程序的SoCs中,通常系统中已经有一定数量的网络接口,而在基于新版ipa驱动程序的设置中,则需要在建立连接时实例化新的虚拟网络接口。
预期的端口类型:
- 网络端口(例如
rmnet_ipa0
) - WWAN子系统的AT或QMI控制端口(例如
wwan0qmi0
、wwan0at0
,在QC MSM8916中) - 通过QRTR总线访问的
QRTR
节点(例如在QC 7cG3中)
这些控制端口不在/dev中暴露任何字符设备,只能通过AF_QIPCRTR套接字进行访问。
查看设备layout命令
USB设备
- 使用lsusb命令的树状视图可以快速检查USB总线上的设备,包括当前选择配置中可用的接口信息。
$ lsusb --tree
- 使用lsusb命令查询USB设备的详细信息,包括所有USB配置(即使当前仅选择其中一个)。
$ lsusb -v -d <vid:pid>
- 使用usb-devices命令提供有关实际管理设备各个端口的内核驱动程序的信息。
$ usb-devices
PCI设备
- 使用lspci命令类似于lsusb,但用于PCI设备。
$ lspci -t
$ lspci -v
QRTR兼容设备
- 对于通过QRTR子系统访问的高通设备,可以使用Bjorn Andersson的GitHub存储库中提供的多个命令行工具。
https://github.com/andersson/qrtr
$ qrtr-lookup
Udev设备遍历
-
运行udevadm来查看udev如何识别给定的端口,特别是在编写新的udev规则时非常方便。
-
使用
sudo udevadm info -p /sys/class/<subsystem>/<name>
命令查询特定设备的所有信息。 -
使用
sudo udevadm info -a /sys/class/<subsystem>/<name>
命令查询设备及其父级(如果有)的所有属性。
这些命令和工具可用于查看各种类型的设备布局,以帮助理解设备的特性和配置。