保姆级教程:在RK3568开发板上搞定广和通FG650 5G模组(从驱动修改到自动拨号)
RK3568开发板实战:广和通FG650 5G模组全流程开发指南
当嵌入式设备遇上5G网络,开发者的工具箱需要一次全面升级。RK3568作为一款性能均衡的ARM架构处理器,搭配广和通FG650 5G模组,能够为工业物联网、智能网关等场景提供可靠的无线连接方案。本文将手把手带你完成从驱动适配到自动拨号的全流程,特别针对开发过程中容易忽视的细节进行深度解析。
1. 开发环境准备与硬件连接
在开始前,请确保已准备好以下硬件:
- Rockchip RK3568开发板(运行Linux系统)
- 广和通FG650 5G模组
- 5G天线套装(主天线/GNSS天线各一)
- 稳定的5V/2A电源适配器
硬件连接注意事项:
- 天线安装顺序:先连接天线再上电,避免射频电路受损
- USB接口选择:优先使用开发板的USB3.0 Host接口
- 电源稳定性测试:用万用表确认VBUS电压波动范围在4.9V-5.1V之间
开发软件环境配置:
# 安装基础工具链 sudo apt install build-essential git libncurses-dev flex bison libssl-dev # 获取RK3568内核源码 git clone -b linux-4.19-rockchip https://github.com/rockchip-linux/kernel.git2. 内核驱动深度适配
2.1 USB设备识别配置
FG650模组支持多种工作模式,对应的USB PID各不相同。修改drivers/usb/serial/option.c文件时,需要特别注意模式兼容性:
| 工作模式 | VID | PID | 适用场景 |
|---|---|---|---|
| NCM | 0x2CB7 | 0x0A05 | 默认推荐模式 |
| ECM | 0x2CB7 | 0x0A04 | 兼容旧系统 |
| RNDIS | 0x2CB7 | 0x0A06 | Windows设备支持 |
驱动修改关键代码段:
static const struct usb_device_id option_ids[] = { { USB_DEVICE(0x2CB7, 0x0A04) }, // ECM { USB_DEVICE(0x2CB7, 0x0A05) }, // NCM { USB_DEVICE(0x2CB7, 0x0A06) }, // RNDIS { } // Terminating entry };2.2 接口过滤机制优化
为避免USB串口驱动错误加载网络接口,需要在probe函数中添加过滤逻辑。对于Linux 4.19内核,建议采用动态接口检测方案:
static int option_probe(struct usb_serial *serial, const struct usb_device_id *id) { /* FG650特定接口过滤 */ if (le16_to_cpu(serial->dev->descriptor.idVendor) == 0x2CB7 && (le16_to_cpu(serial->dev->descriptor.idProduct) == 0x0A05 || le16_to_cpu(serial->dev->descriptor.idProduct) == 0x0A06)) { if (serial->interface->cur_altsetting->desc.bInterfaceNumber <= 1) { dev_info(&serial->interface->dev, "Filtering out Fibocom control interface\n"); return -ENODEV; } } return 0; }提示:编译内核前务必执行
make savedefconfig备份配置,驱动修改后建议进行depmod -a更新模块依赖关系。
3. 电源管理与设备树配置
3.1 电源控制脚本开发
FG650模组需要精确的电源时序控制,创建/usr/local/bin/fg650_pwr.sh:
#!/bin/bash PWR_KEY_GPIO="/sys/class/gpio/gpio15" # 根据实际硬件调整 VBUS_CTRL="/sys/class/gpio/gpio20" case $1 in power_on) # 确保VBUS先上电 echo 1 > $VBUS_CTRL/value sleep 0.5 # POWER_KEY拉低1.5秒 echo 0 > $PWR_KEY_GPIO/value sleep 1.5 echo 1 > $PWR_KEY_GPIO/value # 硬件复位脉冲 echo 0 > /sys/class/gpio/gpio16/value sleep 0.1 echo 1 > /sys/class/gpio/gpio16/value ;; power_off) # POWER_KEY拉低4秒关机 echo 0 > $PWR_KEY_GPIO/value sleep 4 echo 1 > $PWR_KEY_GPIO/value # 最后关闭VBUS sleep 1 echo 0 > $VBUS_CTRL/value ;; esac3.2 设备树关键配置
在arch/arm64/boot/dts/rockchip/rk3568-xxx.dts中添加模组相关节点:
&usb_host0_xhci { status = "okay"; #address-cells = <1>; #size-cells = <0>; fibocom_modem: modem@1 { compatible = "usb-fibocom,fg650"; reg = <1>; power-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio0 16 GPIO_ACTIVE_LOW>; vbus-gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>; }; };4. 网络配置与自动拨号
4.1 多模式网络接口管理
FG650在不同工作模式下会产生不同的网络接口名称,建议使用udev规则固定接口名:
# /etc/udev/rules.d/99-fg650.rules SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="0a05", NAME="wwan0"4.2 智能拨号脚本实现
创建自动拨号服务/usr/local/bin/fg650_autodial.sh:
#!/bin/bash AT_PORT="/dev/ttyUSB0" MAX_RETRY=3 DELAY=5 function send_at() { local cmd=$1 local expect=$2 local timeout=${3:-2} for ((i=1; i<=$MAX_RETRY; i++)); do echo -ne "$cmd\r" > $AT_PORT sleep 0.5 response=$(timeout $timeout cat $AT_PORT) if [[ $response == *"$expect"* ]]; then return 0 fi sleep $DELAY done return 1 } # 模组初始化检测 send_at "AT" "OK" || { echo "Modem not responding" exit 1 } # 设置工作模式 send_at "AT+GTUSBMODE=36" "OK" || { echo "Failed to set NCM mode" exit 1 } # 激活网络连接 send_at "AT+CGATT=1" "OK" || { echo "Failed to attach network" exit 1 } # 获取IP地址 send_at "AT+GTRNDIS=1,1" "OK" || { echo "Failed to activate RNDIS" exit 1 } echo "5G connection established"4.3 系统服务集成
创建systemd服务单元/etc/systemd/system/fg650.service:
[Unit] Description=FG650 5G Modem Service After=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/fg650_pwr.sh power_on ExecStartPost=/bin/sleep 10 ExecStartPost=/usr/local/bin/fg650_autodial.sh ExecStop=/usr/local/bin/fg650_pwr.sh power_off [Install] WantedBy=multi-user.target启用服务并测试:
sudo systemctl daemon-reload sudo systemctl enable fg650 sudo systemctl start fg6505. 高级调试技巧
5.1 信号质量监控
通过AT指令获取网络状态:
echo -e "AT+CSQ\r" > /dev/ttyUSB0 # 信号强度 echo -e "AT+COPS?\r" > /dev/ttyUSB0 # 运营商信息 echo -e "AT+CESQ\r" > /dev/ttyUSB0 # 扩展信号质量5.2 网络流量统计
利用Linux TC工具进行流量控制:
# 查看接口统计 tc -s qdisc show dev wwan0 # 限速配置(示例限制为10Mbps) tc qdisc add dev wwan0 root tbf rate 10mbit burst 32kbit latency 400ms5.3 低功耗模式优化
通过AT指令配置节能模式:
# 启用PSM节能模式 echo -e "AT+CPSMS=1,,,\"00000001\",\"00000001\"\r" > /dev/ttyUSB0 # 配置eDRX参数 echo -e "AT+CEDRXS=1,5,\"0000\"\r" > /dev/ttyUSB0在实际项目中,我们发现FG650模组的USB3.0接口在长时间高负载工作时会出现温度升高现象。建议在机箱设计时考虑增加散热措施,同时通过AT+GTTHERMAL命令定期监控模组温度。当环境温度超过60℃时,模组会自动降频保护,此时需要优化数据传输策略或增强散热条件。
