一、说明
1.1 为什么使用4G模组
核心优势 | 具体说明 | 应用场景示例 |
---|---|---|
高速数据传输 | 理论速率达150Mbps(下行),支持高清视频、大文件实时传输。 | 远程监控摄像头、车载娱乐系统、工业设备固件升级。 |
低延迟 | 平均延迟30-50ms,满足实时交互需求(如自动驾驶、远程控制)。 | 无人机直播、VR/AR设备、医疗机器人手术。 |
广泛覆盖 | 全球主流运营商支持,城市/郊区/高速公路信号稳定。 | 智能电表、共享单车锁、物流车辆追踪。 |
低功耗设计 | 支持PSM/eDRX模式,待机电流低至微安级,延长电池寿命。 | 智能水表、环境监测传感器、可穿戴设备。 |
成熟产业链 | 模组成本低至20−50,开发工具链完善,缩短产品上市周期。 | 智能POS机、零售终端、农业灌溉控制系统。 |
高可靠性 | 支持AES加密、网络认证,故障率低于新兴技术(如LoRa)。 | 金融支付终端、工业自动化控制、远程医疗设备。 |
兼容性 | 支持2G/3G回退,适配全球频段,无需更换硬件即可升级。 | 跨境物流设备、国际旅行路由器、出海产品。 |
1.2 4G模组和其他通信技术对比
比维度 | 4G模组 | 5G模组 | Wi-Fi/蓝牙 | LoRa/NB-IoT |
---|---|---|---|---|
速率 | 高速(150Mbps) | 超高速(10Gbps) | 中速(100Mbps) | 低速(50Kbps) |
延迟 | 30-50ms | 1-10ms | 10-100ms | 100ms-1s |
覆盖范围 | 广(全球) | 局部(城市热点) | 短(100米内) | 超广(偏远地区) |
功耗 | 中低(支持省电模式) | 高 | 低 | 超低 |
成本 | 低(20−50) | 高($100+) | 极低(5−10) | 低(10−20) |
适用场景 | 移动设备、实时监控、工业控制 | 自动驾驶、云游戏、8K视频 | 智能家居、室内定位 | 智能抄表、环境监测 |
1.3 Quectel EM05-CE 4G模组
EM05移远通信的一款带分集接收功能的 LTE/UMTS/HSPA+无线通信模块,支持 LTE-FDD、LTE-TDD、DC-HSDPA、HSPA+、HSDPA、HSUPA、WCDMA 和 CDMA 网络数据连接,可提供 GNSS 功能。EM05 模块有三种型号:EM05-CE、EM05-CML 和 EM05-E。EM05 模块支持的频段如下表所示。

性能指标如下:
项目 | 详情 |
---|---|
基本信息 | LTE 类别 4 模块,采用标准 M.2 外形尺寸(NGFF),专为 M2M 和 IoT 应用优化 |
网络制式 | 支持 LTE-FDD、LTE-TDD、DC-HSDPA、HSPA+、HSDPA、HSUPA、WCDMA、CDMA 1X/EVDO 和 GSM/GPRS/EDGE 等多种网络制式,其中 WCDMA 支持频段 B1/B8,CDMA 1X/EVDO 支持频段 BC0 |
数据传输速率 | 最大下行速率 150Mbps,最大上行速率 50Mbps |
天线与连接 | MIMO 技术,支持 Antenna DL MIMO 和 Rx-diversity,通常配备 3 根天线座 |
功能特性 | 支持 DFOTA(设备固件空中下载技术)和 DTMF(双音多频)等功能 |
协议与接口 | 内置丰富的互联网协议,集成多个工业标准接口,通过 AT 指令控制 |
操作系统支持 | 提供适用于 Windows XP、Windows Vista、Windows 7、Windows 8/8.1、Windows 10、Linux、Android 等操作系统的 USB 驱动程序 |
应用领域 | 工业路由器、工业 PDA、坚固耐用的平板电脑、视频监控、数字标牌、远程监控系统、手持移动设备、无线 POS 系统、智能计量系统等 |
封装形式 | M.2(NGFF)封装,超薄、紧凑,便于嵌入到小尺寸产品中 |
二、电路图设计
2.1 核心模块与接口
- M.2 接口:作为模块物理连接基础,定义引脚功能,实现模块与主板的数据、电源交互,图中围绕 M.2 展开各类信号走线。
- Quectel EM05 - CE:4G 通信核心,处理无线数据收发、协议转换,依托 M.2 接口与外部电路协同,实现 4G 网络接入。
2.2 电源电路
- VDD_3V3:为模块及周边电路提供 3.3V 电源,如给电容 C96、C97 供电,保障模块基础工作电压;经电阻(如 R211 等)分压、限流,为特定引脚或电路供电。
- 电容作用:C96(10uF)、C97(0.1uF )等是滤波电容,前者滤除低频干扰,后者滤除高频噪声,稳定电源电压,确保模块供电纯净。
2.3 SIM 卡电路(USIM 相关)
- 信号定义:
- USIM_RST_N(复位)、USIM_CLK(时钟)、USIM_DAT(数据):是 SIM 卡通信关键信号,与模块交互,实现身份认证、数据传输,类似标准 SIM 卡接口时序,保障模块识别、使用 SIM 卡联网。
- USIM_VDD(电源):为 SIM 卡提供工作电压,通过电路控制供电,确保 SIM 卡上电、断电符合流程;USIM_DET(检测):用于检测 SIM 卡是否插入,反馈状态给模块,辅助模块初始化 SIM 卡通信。
- 电阻与滤波:电阻(如 R220、R222 等)起限流、分压作用,保护 SIM 卡信号;部分电路可能有隐性滤波设计,保障 SIM 卡通信信号稳定,避免干扰导致认证失败。
2.4 数据通信接口
- USB 接口:图中 USB 相关引脚(如 USB_DP、USB_DN ),是模块与主机(如工控板、电脑)的数据通道,用于传输 4G 网络数据(如上网流量)、模块配置指令(AT 指令交互 ),实现 “模块联网 - 主机数据收发” 功能。
- PCIE 接口:PCIE 信号(如 PCIE_RX、PCIE_TX ),提供高速数据传输通道,满足大带宽需求(如高清视频回传、高速数据采集 ),拓展模块数据交互能力,适配不同应用场景对速率的要求。
2.5 控制与状态信号
- WWAN LED#:模块状态指示灯控制信号,可通过该信号驱动外部 LED,显示模块工作状态(如联网、待机、故障 ),直观反馈模块运行情况。
- Power_OFF#:模块关机控制信号,主机或外部电路可通过该信号控制模块上电、下电,实现节能或重启模块等操作,管理模块电源状态。
2.6 天线相关
- ANT 引脚:图中天线接口(如 GND_ANT 、各类天线信号引脚 ),用于连接 4G 天线,接收、发射无线信号,保障模块与基站通信;通过合理的天线设计(阻抗匹配、布局 ),提升信号强度、稳定性,优化网络连接质量。
2.7 其他辅助电路
- 电阻(R 系列):除上述功能,电阻还用于信号分压、限流,匹配电路阻抗,如 USB、PCIE 信号线路上的电阻,保障信号电平符合接口标准,避免信号过冲、欠压导致通信异常。
- 电容(C 系列):除电源滤波,部分电容用于信号耦合、去耦,如数据信号线上的小容值电容,隔离直流、传递交流信号,同时滤除信号线上的噪声,保障数据传输准确。
三、驱动设计
第一步:添加VID 和PID
vim drivers/usb/serial/option.c
# 增加如下
static const struct usb_device_id option_ids[] = {
{ USB_DEVICE(0x2C7C, 0x0125)},
第二步:使用USBNet 驱动
vim drivers/usb/serial/option.c
# 增加如下
static int option_probe(struct usb_serial *serial,
const struct usb_device_id *id)
{
struct usb_interface_descriptor *iface_desc =
&serial->interface->cur_altsetting->desc;
unsigned long device_flags = id->driver_info;
/* Never bind to the CD-Rom emulation interface */
if (iface_desc->bInterfaceClass == USB_CLASS_MASS_STORAGE)
return -ENODEV;
/*
* Don't bind reserved interfaces (like network ones) which often have
* the same class/subclass/protocol as the serial interfaces. Look at
* the Windows driver .INF files for reserved interface numbers.
*/
if (iface_is_reserved(device_flags, iface_desc->bInterfaceNumber))
return -ENODEV;
/*
* Allow matching on bNumEndpoints for devices whose interface numbers
* can change (e.g. Quectel EP06).
*/
if (device_flags & NUMEP2 && iface_desc->bNumEndpoints != 2)
return -ENODEV;
// 新增
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {
__u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);
struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;
if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) {
//ECM, RNDIS, NCM, MBIM, ACM, UAC, ADB
return -ENODEV;
}
if ((idProduct&0xF000) == 0x0000) {
//MDM interface 4 is QMI
if (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3
&& intf->bInterfaceSubClass == 0xFF &&
intf->bInterfaceProtocol == 0xFF)
return -ENODEV;
}
}
// 结束
/* Store the device flags so we can use them during attach. */
usb_set_serial_data(serial, (void *)device_flags);
return 0;
}
第三步:修改内核配置
CONFIG_USB_SERIAL
CONFIG_USB_SERIAL_WWAN
CONFIG_USB_SERIAL_OPTION
确认是否打开,可以menuconfig搜索或者grep筛选配置文件
第四步:添加零包机制
vim drivers/usb/serial/usb_wwan.c
该代码可以不修改,默认代码中已经开启了零包机制。手册要改的地方:
内核源码已有内容:
第五步:添加Reset-resume 机制
vim drivers/usb/serial/option.c
该代码可以不修改,默认代码中已经开启了零包机制。手册要改的地方:
内核源码已有内容:
第六步: QMI_WWAN 驱动
(1)、内核配置:
CONFIG_USB_NET_DRIVERS
CONFIG_USB_USBNET
CONFIG_USB_NET_QMI_WWAN
CONFIG_USB_WDM 上述配置后,这个也就配置好了
(2)、
vim drivers/net/usb/Makefile
obj-${CONFIG_USB_NET_QMI_WWAN} += qmi_wwan_q.o #add by why.20231109
obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o
(3)、交叉编译V1.6.1,为后来的5G模组做准备
export CROSS_COMPILE=/opt/nvidia/bin/aarch64-buildroot-linux-gnu-
make
第六步:验证
输出如下表示驱动成功
执行:dmesg grep qmi
输出:
4.245366] usbcore: registered new interface driver qmi_wwan_q
4.251456] usbcore: registered new interface driver qmi_wwan
8.991415] qmi_wwan_q 1-4.4:1.4: cdc-wdm0: USB WDM device
8.998449] qmi_wwan_q 1-4.4:1.4: Quectel Android work on RawIP mode
9.005310] qmi_wwan_q 1-4.4:1.4:rx_urb_size =1520
9.010633] qmi_wan_q 1-4.4:1.4 wwan0: register 'qmi_wwan_q' at usb-3610000.xhci-4.4, WWAN/QMI device,fe:cc:f2:6e:42:15
root@baidu-desktop:/home/baidu#./quectel-CM
[11-08_16:40:11:173] QConnectManager_Linux_V1.6.1
[11-08_16:40:11:174] Find /sys/bus/usb/devices/1-4.4 idVendor=0x2c7c idProduct=0x125,bus=0x001, dev=0x003
[11-08_16:40: 11:174] Auto find qmichannel = /dev/cdc-wdm0
[11-08_16:40: 11: 174] Auto find usbnet_adapter = wwan0
[11-08_16:40:11:174] netcard driver = qmi_wwan_q, driver version = V1.2.0.23
[11-08_16:40: 11:174] Modem works in QMI mode
[11-08_16:40:11:182] cdc_wdm_fd=7
[11-08_16:40:11:289] Get clientWDS =7
[11-08_16:40:11:322] Get clientDMS = 1
[11-08_16:40:11:354] Get clientNAS = 2
[11-08_16:40:11:386] Get clientUIM = 1
[11-08_16:40:11:418] Get clientWDA =1
[11-08_16:40:11:450] requestBaseBandVersion EM05CEFCR06A04M1G_ND
[11-08_16:40:11:577] requestGetSIMStatus SIMStatus: SIM_READY
[11-08_16:40:11:611] requestGetProfile[1]///0/IPV4V6
[11-08_16:40:11:643] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE
[11-08_16:40:11:673] requestQueryDataCal1 IPv4ConnectionStatus: DISCONNECTED
[11-08_16:40:11:673] ifconfig wwan0 0.0.0.0
[11-08_16:40:11:679] ifconfig wwan0 down
[11-08_16:40:12:090] requestSetupDataCall WdsConnectionIPv4Handle:0x87248e00
[11-08_16:40:12:219] ifconfig wwan0 up
[11-88_16:40:12:226] No default.script found, it should be in '/usr/share/udhcpc/' or '/etc//udhcpc' depend on your udhcpc version!
[11-08_16:40:12:226] busybox udhcpc -f -n -q -t 5 -i wwan0
sh: 1: busybox: not found
[11-08_16:40: 12: 229] ip -4 address flush dev wwan0
[11-08_16:40:12: 255] ip -4 address add 10.6.139.58/30 dev wwan0
[11-08_16:40: 12:257] ip -4 route add default via 10.6.139.57 dev wwan0
执行:ifconfig
输出:
wwan0: flags=193<UP,RUNNING,NOARP> mtu 1500
inet 10.6.139.58 netmask 255.255.255.252
inet6 fe80::fccc:f2ff:fe6e:4215 prefixlen 64 scopeid 0x20<1ink>
ether fe:cc: f2: 6e:42:15 txqueuelen 1000(Ethernet)
RX packets 16 bytes 1742 (1.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 19 bytes 2210 (2.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
执行"ls dev/cdc-wdm0",显示存在。