1. 硬件准备与基础环境搭建
拿到RK3568开发板和移远EC20模块后,我做的第一件事就是检查硬件兼容性。EC20采用Mini PCIe接口,但实际走的是USB协议,这个细节很重要。我用万用表测量了开发板供电电压,确认3.3V和1.8V电平正常后,插入模块时听到了明显的"咔嗒"声——这是硬件接触良好的第一个信号。
开发环境我选择了Ubuntu 20.04 LTS,这是RK官方推荐的编译系统。安装完基础工具链后,需要特别注意两个依赖:
sudo apt-get install repo git-core gitk git-gui gcc-multilib flex bison gperf build-essential sudo apt-get install libncurses5-dev libssl-dev zlib1g-dev libelf-dev编译Android 11源码时遇到第一个坑:JDK版本。RK3568的Android 11需要OpenJDK 8,但Ubuntu 20.04默认是OpenJDK 11。解决方法很经典:
sudo update-alternatives --config java sudo update-alternatives --config javac2. Linux内核驱动配置
驱动配置的核心在于DTS文件的修改。在kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dts中添加以下关键节点:
&usb_host0_xhci { status = "okay"; ec20_modem: usb-device { compatible = "usb-serial,option"; reg = <0>; product = "EC20"; idVendor = <0x2c7c>; idProduct = <0x0125>; }; };这里有几个容易出错的地方:
idVendor和idProduct必须与lsusb查看到的实际值一致- 如果模块被识别为
ttyUSB0-3但无法通信,可能需要添加options参数:
echo 1 > /sys/bus/usb-serial/drivers/option1/new_id编译内核时我遇到了make[1]: *** No rule to make target 'dtbs'. Stop.错误,这是因为RK3568的dtb需要单独指定:
make ARCH=arm64 rockchip/rk3568-evb.dtb3. Android HAL层适配
移远提供的libreference-ril-ec20.so需要替换到vendor/lib64/目录。这里有个隐藏陷阱:某些版本会与系统原有的libril.so冲突。我的解决方案是:
- 备份原厂RIL库
- 修改
device.mk确保只加载EC20专用库:
PRODUCT_PACKAGES += \ rild \ libreference-ril-ec20RIL守护进程的启动配置在ril.rc中需要精确指定USB端口:
service ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril-ec20.so class main user radio group radio cache inet misc audio sdcard_rw log capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW实测发现EC20在冷启动时需要特殊初始化序列,我在init.rc中添加了延迟启动:
on property:sys.boot_completed=1 exec -- /system/bin/sleep 10 start ril-daemon4. 网络与通话功能调试
下拉菜单没有SIM卡图标?这个问题困扰了我两天。最终发现需要修改两处关键配置:
- 在
frameworks/base/core/res/res/values/config.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,true"</item> </string-array>- 修改
TelephonyProvider的数据库权限:
UPDATE carriers SET type='default,mms,supl' WHERE name='4GNET';上网速度慢的问题通过修改RILConstants.java得到改善:
int PREFERRED_NETWORK_MODE = NETWORK_MODE_LTE_GSM_WCDMA;5. 典型问题排查指南
现象:模块识别但无信号
- 检查天线阻抗是否匹配(EC20需要50Ω天线)
- 用AT命令测试基础功能:
adb shell echo "AT+CSQ" > /dev/ttyUSB2 cat < /dev/ttyUSB2正常应返回+CSQ: 24,99格式的信号强度
现象:能上网不能打电话
- 确认
Dialer和TeleService已编译进系统 - 检查APN配置中的语音承载标识:
<apn carrier="VoLTE" bearer="13" />编译错误:tidy检查失败临时解决方案是关闭严格模式:
LOCAL_TIDY_FLAGS := -warnings-as-errors=* 改为 LOCAL_TIDY_FLAGS := -warnings-as-errors=none6. 性能优化实战
通过修改build.prop提升网络切换速度:
ro.telephony.ril.config=simactivation persist.radio.add_power_save=1EC20的USB吞吐量优化(在init.usb.rc中添加):
write /sys/class/net/wwan0/queues/rx-0/rps_cpus f write /sys/class/net/wwan0/queues/tx-0/xps_cpus 1最后分享一个实用技巧:当模块异常发热时,可以通过AT命令降低发射功率:
AT+QSCLK=1 //开启节能模式 AT+QCFG="band",0,4000000,1 //限制频段