linux 下的4g、5g模组的几种拨号方式
1、ECM
最近在调试移远的4g、5g模块,用到了几种拨号方式如ecm、ncm、rmnet,下面进行一下梳理。不管是什么拨号方式,在Linux下都是一张网卡,用ifconfig可以看到,应用程序使用4g、5g的网卡和使用有线网卡方式完全一样。先看一下在linux嵌入式设备中有线网卡是怎么样的:
从分层网络模型看,数据链路层和物理层是有硬件实现的,其余层是由内核和应用程序实现的。在上图的有线网络中,数据链路层就是芯片的mac控制器,物理层就是phy芯片。linux中用struct net_device结构体表示一张网卡,这张网卡实际上是对应的mac控制器和phy,用register_netdev注册后就可以用ifconfig命令看到一张网卡。类比一下4g、5g模组,这些模组一般都是用usb口连接到soc芯片中的,4g、5g模组可以看做工作在数据链路层和物理层,网络层、传输层都是在内核实现的。网络数据从应用层一层一层的发下来要经过usb发送给4g模组,然后交给模组再转换成4g、5g信号发出去。这样模组和内核就涉及到网络数据和usb数据的交互问题,所以这里就需要做一个中间件,将网络数据通过usb接口发送给4g模组,或接受模组usb数据转换成网络数据提交给上一层。做这件事的就是ecm,ecm的代码在drivers/net/usb/cdc_ether.c中,它是一个usb_driver驱动,通过usbnet_probe函数注册一张网卡usb0,在usbnet_probe中会定义一个struct net_device,最后用register_netdev注册一张网卡。
看代码可以发现它实际上是通过usb口实现网络数据的透传。
ECM:网络数据和usb数据相互转换
NCM:ECM的升级版,将多个以太网包组成一个NTB包在usb总线上传输
2、rmnet
将rmnet之前先看一下高通定义的QMI协议,该协议是4g、5g模组的控制协议,我们知道4g、5g模组可以通过at指令控制,比如读取版本号,查看信号强度、拨号等等。QMI协议也可以完成这些功能。在linux中,要用到QMI需要加载一个驱动驱动cdc_wdm.ko,该驱动在drivers/usb/class/cdc_wdm.c中,加载驱动后,会生成/dev/cdc-wdm0节点,应用程序可以通过该节点来完成QMI协议传输,从而达到控制模组的目的。
rmnet拨号还要加载一个高通的qmi_wwan,ko驱动,该驱动就是类似ECM的功能,加载后会生成一种wwan0的网卡。还有一个quectel-CM的管理程序,它主要通过/dev/cdc-wdm0节点用QMI协议控制模组实现拨号上网。