1. RK3568与FG650 5G模组初探
RK3568作为瑞芯微推出的高性能嵌入式处理器,在工业控制、边缘计算等领域应用广泛。而广和通FG650 5G模组则是当前市面上性价比较高的5G通信解决方案之一。将两者结合,能为嵌入式设备提供稳定的5G联网能力。
我在实际项目中多次使用FG650模组,它的最大特点是支持USB 2.0/3.0双接口通信,默认工作在NCM模式。NCM(Network Control Model)是USB-IF定义的标准化网络通信协议,相比RNDIS有更好的跨平台兼容性。如果模组工作模式不对,可以通过串口发送AT指令AT+GTUSBMODE=36切换到NCM模式。
2. 内核驱动适配实战
2.1 添加设备VID/PID
首先需要在内核中注册FG650的设备标识。打开drivers/usb/serial/option.c文件,找到option_ids数组。FG650在不同工作模式下会使用不同的PID,建议将所有模式都添加进去:
#define FIBOCOM_VENDOR_ID 0x2CB7 #define FIBOCOM_PRODUCT_FG650_ECM 0x0A04 #define FIBOCOM_PRODUCT_FG650_NCM 0x0A05 #define FIBOCOM_PRODUCT_FG650_RNDIS 0x0A06 static const struct usb_device_id option_ids[] = { { USB_DEVICE(FIBOCOM_VENDOR_ID, FIBOCOM_PRODUCT_FG650_ECM) }, { USB_DEVICE(FIBOCOM_VENDOR_ID, FIBOCOM_PRODUCT_FG650_NCM) }, { USB_DEVICE(FIBOCOM_VENDOR_ID, FIBOCOM_PRODUCT_FG650_RNDIS) }, // 其他设备... };这里有个坑要注意:ECM/NCM/RNDIS模式的PID各不相同,如果只添加当前模式的PID,切换工作模式后驱动就无法识别了。
2.2 接口过滤机制
FG650的USB接口包含通信接口和AT指令接口,需要防止USB串口驱动错误加载网络接口。在option.c的probe函数中添加过滤逻辑:
if (serial->dev->descriptor.idVendor == cpu_to_le16(FIBOCOM_VENDOR_ID) && (serial->dev->descriptor.idProduct == cpu_to_le16(FIBOCOM_PRODUCT_FG650_ECM) || serial->dev->descriptor.idProduct == cpu_to_le16(FIBOCOM_PRODUCT_FG650_NCM) || serial->dev->descriptor.idProduct == cpu_to_le16(FIBOCOM_PRODUCT_FG650_RNDIS)) && serial->interface->cur_altsetting->desc.bInterfaceNumber <= 1) { printk(KERN_INFO "Filter out Fibocom network interface\n"); return -ENODEV; }这段代码会过滤掉前两个接口(通常是网络接口),确保它们由对应的网络驱动处理。
3. 电源管理关键细节
3.1 上电时序控制
FG650模组的上电需要严格遵循时序要求。我整理了一个可靠的启动脚本:
#!/bin/bash case $1 in power_on) # 保持POWER_KEY低电平1.5秒 echo 1 > /sys/class/gpio/gpio15/value sleep 1.5 echo 0 > /sys/class/gpio/gpio15/value # 复位信号40ms低电平 echo 1 > /sys/class/gpio/gpio16/value sleep 0.05 echo 0 > /sys/class/gpio/gpio16/value # 启用USB VBUS供电 echo 1 > /sys/class/gpio/gpio17/value ;; power_off) # POWER_KEY低电平4秒关机 echo 1 > /sys/class/gpio/gpio15/value sleep 4 echo 0 > /sys/class/gpio/gpio15/value # 关闭VBUS echo 0 > /sys/class/gpio/gpio17/value ;; esac实测发现VBUS供电不稳定会导致模组异常断开,建议在硬件设计时增加大容量电容。
3.2 热插拔处理
在RK3568上需要配置好USB热插拔检测。修改设备树文件,确保USB控制器配置了正确的电源管理属性:
&usb_host0_ehci { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&usb_host0_pins>; vbus-supply = <&vcc5v0_host>; };4. 设备枚举与网络配置
4.1 枚举过程分析
FG650的枚举过程分为两个阶段:
- 通过USB2.0接口完成基础枚举
- 通过USB3.0接口建立高速连接
使用lsusb -v命令可以查看枚举详情。正常状态下应该看到三个接口:
- 接口0:AT指令端口(ttyUSB0)
- 接口1:诊断端口(ttyUSB1)
- 接口2:NCM网络接口
4.2 网络接口配置
枚举成功后会出现enx<MAC地址>格式的网络接口。建议创建udev规则固定接口名:
# /etc/udev/rules.d/70-fg650.rules SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="8e:c5:64:fd:4e:18", NAME="wwan0"然后配置NetworkManager或systemd-networkd管理连接。对于NCM模式,不需要特殊驱动配置,内核会自动处理。
5. 拨号上网实战
5.1 AT指令交互
FG650通过ttyUSB0接收AT指令。建议使用atinout工具进行可靠通信:
# 查询信号强度 echo -e "AT+CSQ\r" > /dev/ttyUSB0 # 激活NCM模式 echo -e "AT+GTUSBMODE=36\r" > /dev/ttyUSB0 # 启用数据连接 echo -e "AT+CGDATA=\"M-RAW_IP\",1\r" > /dev/ttyUSB05.2 自动化拨号脚本
我常用的拨号脚本框架如下:
#!/bin/bash # 初始化串口 stty -F /dev/ttyUSB0 115200 raw -echo # 等待模组就绪 while ! echo -e "AT\r" | grep -q "OK"; do sleep 1 done # 配置APN echo -e "AT+CGDCONT=1,\"IP\",\"your_apn\"\r" > /dev/ttyUSB0 # 激活数据连接 echo -e "AT+CGACT=1,1\r" > /dev/ttyUSB0对于需要持久化连接的应用,建议使用pppd或modemmanager进行连接管理。
6. 常见问题排查
6.1 枚举失败处理
如果lsusb看不到设备,按以下步骤排查:
- 检查VBUS电压是否稳定在5V±5%
- 测量POWER_KEY信号是否满足时序要求
- 确认内核配置已启用
USB_NET_CDC_NCM驱动 - 检查USB线材质量,建议使用带屏蔽的USB3.0线缆
6.2 网络连接不稳定
遇到频繁断连时:
# 查看USB错误计数 dmesg | grep usb # 调整USB驱动参数 echo 1000 > /sys/module/usbcore/parameters/autosuspend在RK3568上建议关闭USB自动挂起功能,特别是在工业环境中。