作为一名长期深耕嵌入式开发的工程师,最近在RK356X平台上调试广和通NL668 4G模块时,遇到了不少令人头疼的问题。从驱动移植到RIL库崩溃,从APN获取失败到信号图标异常,整个过程可谓是一路"踩坑"。本文将分享我在项目中的完整调试经验,希望能帮助遇到类似问题的开发者少走弯路。
在开始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 # 查看内核日志确认设备识别
当内核驱动就绪后,Android系统层的配置才是真正的挑战所在。以下是几个关键配置点:
替换默认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
启用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
在实际调试过程中,我遇到了几个典型问题,以下是解决方案:
现象:
日志中出现signal 11段错误,RIL库加载失败。
解决方案:
bash复制readelf -d libreference-ril-nl668.so | grep NEEDED
现象:
日志中出现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; // 注释掉这行
}
现象:
状态栏只显示空三角图标,无信号强度指示。
解决方案:
qi-ril.conf配置:code复制LTE_ls_Report_SignalStrength=1
当所有配置完成后,通过以下步骤验证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方案。