RK356X平台Android 11集成广和通NL668 4G模块实战指南
作为一名长期深耕嵌入式开发的工程师,最近在RK356X平台上调试广和通NL668 4G模块时,遇到了不少令人头疼的问题。从驱动移植到RIL库崩溃,从APN获取失败到信号图标异常,整个过程可谓是一路"踩坑"。本文将分享我在项目中的完整调试经验,希望能帮助遇到类似问题的开发者少走弯路。
1. 硬件准备与内核驱动配置
在开始Android层的调试前,确保硬件连接和内核驱动配置正确是基础。NL668模块通过USB接口与RK356X开发板连接,首先需要确认系统能否正确识别设备。
内核驱动关键配置步骤:
-
添加VID/PID识别
在kernel/drivers/usb/serial/option.c中添加NL668的设备标识:c复制static const struct usb_device_id option_ids[] = { { USB_DEVICE(0x1508, 0x1001) }, /* Fibocom NL668 */ ... }; -
启用USB串口支持
通过make menuconfig确保以下选项已启用:code复制Device Drivers → USB support → USB Serial Converter support → USB driver for GSM and CDMA modems -
DTS节点配置
在设备树中添加4G模块的GPIO控制:dts复制rk_modem: rk-modem { compatible = "4g-modem-platdata"; pinctrl-names = "default"; pinctrl-0 = <<e_vbat <e_power_en <e_reset>; 4G,vbat-gpio = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>; 4G,power-gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_LOW>; 4G,reset-gpio = <&gpio4 RK_PD4 GPIO_ACTIVE_LOW>; status = "okay"; }; -
ECM网络模式支持
在内核配置中启用以下选项:code复制CONFIG_USB_NET_DRIVERS=y CONFIG_USB_USBNET=y CONFIG_NETDEVICES=y CONFIG_USB_NET_CDCETHER=y
验证驱动加载成功:
bash复制ls /dev/ttyUSB* # 应看到ttyUSB0-ttyUSB3节点
dmesg | grep usb # 查看内核日志确认设备识别
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Android系统层关键配置
当内核驱动就绪后,Android系统层的配置才是真正的挑战所在。以下是几个关键配置点:
2.1 RIL库集成与配置
-
替换默认RIL库
将模组厂提供的libreference-ril.so重命名为libreference-ril-nl668.so,并放置到:code复制vendor/rockchip/common/phone/lib/libreference-ril-nl668.so -
修改编译配置
更新vendor/rockchip/common/phone/phone.mk:makefile复制PRODUCT_COPY_FILES += \ $(CUR_PATH)/phone/lib/libreference-ril-nl668.so:vendor/lib64/libreference-ril-nl668.so -
配置RIL服务
修改hardware/ril/rild/init.rc:rc复制service ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril-nl668.so -- -d /dev/ttyUSB0 class main socket rild stream 660 root radio user root group radio cache inet misc audio log
2.2 网络属性与拨号配置
-
启用4G模块支持
在device/rockchip/common/BoardConfig.mk中设置:makefile复制
BOARD_HAS_RK_4G_MODEM ?= true -
配置网络属性
更新device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml:xml复制<string-array name="networkAttributes"> <item>"wifi,1,1,2,-1,true"</item> <item>"mobile,0,0,0,-1,true"</item> <item>"mobile_mms,2,0,2,60000,false"</item> ... </string-array> -
设置拨号模式
在device.mk中添加:makefile复制PRODUCT_PROPERTY_OVERRIDES += \ ril.fibocom.dialmode=1 \ # ECM模式 ril.fibocom.usbmode=18
3. 常见问题排查与解决
在实际调试过程中,我遇到了几个典型问题,以下是解决方案:
3.1 RIL服务不断重启
现象:
日志中出现signal 11段错误,RIL库加载失败。
解决方案:
- 确认RIL库是否针对Android 11编译
- 检查库的依赖关系:
bash复制
readelf -d libreference-ril-nl668.so | grep NEEDED - 与模组厂确认提供最新版本的RIL库
3.2 APN获取失败导致无法注册网络
现象:
日志中出现getPreferredApnSetId: cursor is null错误。
修改方案:
修改frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcTracker.java:
java复制if (!isCarrierConfigApplied()) {
log("onCarrierConfigChanged: Carrier config is not ready yet.");
// return; // 注释掉这行
}
3.3 信号图标显示异常
现象:
状态栏只显示空三角图标,无信号强度指示。
解决方案:
- 修改
qi-ril.conf配置:code复制LTE_ls_Report_SignalStrength=1 - 检查RIL库的信号强度上报逻辑
4. 测试与验证
当所有配置完成后,通过以下步骤验证4G功能:
-
AT指令测试
通过microcom工具测试基础功能:bash复制
microcom -s 115200 /dev/ttyUSB1常用AT指令:
code复制AT+CPIN? # 检查SIM卡状态 AT+CREG? # 检查CS域注册 AT+CEREG? # 检查PS域注册 AT^SYSINFO # 查看系统信息 -
网络连接测试
- 使用
ping测试网络连通性 - 检查路由表:
bash复制
ip route show - 查看网络接口:
bash复制
ifconfig lte0
- 使用
-
日志分析
获取完整的调试日志:bash复制logcat -b radio -b system -b main -v time
在RK356X平台上成功集成NL668模块后,我发现ECM模式相比PPP模式有更好的稳定性和性能表现。特别是在频繁切换网络环境时,ECM模式能更快恢复连接。建议开发者在资源允许的情况下优先考虑ECM方案。
