RK3576+Android15+Linux6.1调试EM05 4G模块全记录:从底层到上层的踩坑与破局

频道:保险市场 日期: 浏览:58128

嵌入式Android开发中,4G模块的调试往往是牵一发而动全身的关键环节——既要搞定底层驱动与内核适配,又要打通上层框架与RILRadio Interface Layer服务。最近我们在RK3576开发板+ Android15系统+ Linux6.1内核环境下调试EM05 4G模块时,就遇到了从“RIL起不来库缺失再到上层功能未开的一系列问题。今天就把完整的调试流程、踩过的坑和解决方案整理出来,希望能给做类似开发的同学避坑!

一、调试环境先明确

在开始前,先把核心环境信息列清楚,避免大家因环境差异导致问题复现偏差:

硬件:RK3576开发板+ EM05 4G模块

系统:Android 15(上层框架)

内核:Linux 6.1(底层驱动)

关键依赖:Quectel_Android_RIL_Driver_V4.2.1

二、调试全流程:从“RIL未启动“4G通网

1.初遇困境:模组RIL未启动,rild文件失踪

现象

刚上电调试时,发现4G模组完全没反应,执行service ril-daemon指令无任何输出——核心的RIL(无线接口层)服务根本没起来。

wKgZPGkam2yAe-gpAADeI8HhVJA265.png

排查

RIL服务依赖rild可执行文件,其默认路径是vendor/bin/hw/rild。进入该路径查看,果然没有rild文件——系统编译时压根没把rild编进去

解决方案

需要在代码中添加rild的编译配置,具体是:

hardwarerilrild目录下补充Android.mk文件,通过.mk文件将rild编译进系统。重新编译后,vendor/bin/hw/rild路径下成功生成rild文件。

2.新问题:rild存在,但链接库缺胳膊少腿

好不容易搞定rild,运行后又报错——链接库缺失!这一步遇到了两个典型的库问题,我们逐个解决。

问题2.1android.hardware.radio系列NDK库缺失

现象

执行/vendor/bin/hw/rild验证时,终端报错:

CANNOT LINK EXECUTABLE "/vendor/bin/hw/rild": library "android.hardware.radio.config-V2-ndk.so" not found: needed by /vendor/lib64/libril.so in namespace

显然,libril.so依赖的一系列android.hardware.radio相关NDK库没加进去。

解决方案

修改hardware/ril/rild/Android.mk文件,在LOCAL_SHARED_LIBRARIES中补充缺失的NDK库,具体添加内容如下:

--- a/hardware/ril/rild/Android.mk

+++ b/hardware/ril/rild/Android.mk

@ -14,6 +14, 16 @@ LOCAL_SHARED_LIBRARIES :=

liblog

libril

+LOCAL_SHARED_LIBRARIES += android.hardware.radio.config-V2-ndk

+LOCAL_SHARED_LIBRARIES += android.hardware.radio.data-V2-ndk

+LOCAL_SHARED_LIBRARIES += android.hardware.radio.messaging-V2-ndk

+LOCAL_SHARED_LIBRARIES += android.hardware.radio.modem-V2-ndk

+LOCAL_SHARED_LIBRARIES += android.hardware.radio.network-V2-ndk

+LOCAL_SHARED_LIBRARIES += android.hardware.radio.sim-V2-ndk

+LOCAL_SHARED_LIBRARIES += android.hardware.radio.voice-V2-ndk

+LOCAL_SHARED_LIBRARIES += android.hardware.radio-V2-ndk

添加后重新编译,将生成的库文件直接pushvendor/lib64/路径下。

问题2.2libnetutils.so缺失,访问路径不对

现象

解决NDK库后,查看Logcat又出现新报错(关键词:dlopen failed: library "libnetutils.so" not found):

1547): dlopen failed: dlopen failed: library "libnetutils.so" not found: needed by /vendor/lib64/quectel_ril/libreference-ril.so in namespace (default)

1826): dlopen failed: dlopen failed: library "libnetutils.so" not found: needed by vendor/lib64/quectel_ril/libreference-ril.so in namespace (default)

find命令查找文件位置,发现libnetutils.so其实存在,路径是./system/lib64/libnetutils.so,但libreference-ril.sovendor目录下,访问不到system目录的库。

解决方案

直接将/system/lib64/libnetutils.so移动到/vendor/lib64/路径下(与libreference-ril.so同目录)。

这一步操作后,底层RIL链路终于打通!从Log中能看到AT指令交互(比如查询服务小区的AT+QENG="servingcell"):

wKgZPGkam2yAQgoBAAEf1KRaz7w293.png

3.上层卡点:无RILJ初始化,4G功能未开启

底层打通后,查看系统Log发现一个关键问题:没有RILJRIL Java层)初始化相关操作——上层根本不知道要启用4G功能!

原因

Android系统默认可能关闭了移动数据和电信功能,需要手动开启配置。

解决方案

分两步修改上层配置:

步骤1:开启移动数据能力(修改config.xml

修改overlay/frameworks/base/core/res/res/values/config.xml,添加config_mobile_data_capabletrue(表示支持移动数据),具体diff

--- a/overlay/frameworks/base/core/res/res/values/config.xml

+++ b/overlay/frameworks/base/core/res/res/values/config.xml

@@ -24,6 +24,11 @@

true

步骤2:添加电信功能权限(修改device.mk

修改device.mk,添加电信功能的权限配置文件拷贝,确保系统识别为支持电信功能的设备

+++ b/device.mk

@@ -260,6 +260,9 @@ PRODUCT_COPY_FILES +=

frameworks/native/data/etc/android.hardware.location.gps.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.location.gps.xml

endif

+PRODUCT_COPY_FILES +=

frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml

4.再遇波折:HAL配置缺失,功能仍不通

修改完上层配置后,运行还是没通——查了半天发现,缺少4G模块对应的HAL(硬件抽象层)配置,导致上层无法与底层RIL服务通信

解决方案

devicerockchipcommon4g_modem目录下创建/修改manifest.xml,添加android.hardware.radio系列HALAIDL配置(版本均为V2,对应之前的NDK库版本):

android.hardware.radio.config

2

IRadioConfig/default

android.hardware.radio.data

2

IRadioData/slot1

android.hardware.radio.messaging

2

IRadioMessaging/slot1

android.hardware.radio.modem

2

IRadioModem/slot1

android.hardware.radio.network

2

IRadioNetwork/slot1

android.hardware.radio.sim

2

IRadioSim/slot1

android.hardware.radio.voice

2

IRadioVoice/slot1

5.最后一公里ril-daemon服务被停止

配置完HAL后,功能还是没通!用getprop |grep ril查看服务状态,发现关键问题:

[init.svc.ril-daemon]:[stopped]

——ril-daemon服务被莫名关掉了,电话服务也随之停用。

解决方案

关闭系统中可能导致ril-daemon停止的配置(具体需结合实际设备的初始化脚本,此处为针对性关闭冲突配置)。

操作后重启服务,ril-daemon终于保持“running”状态!

6.验证:4G功能完全打通

至此,所有问题解决!我们做了三项验证,确认4G功能正常:

1.网卡信息正常wwan0网卡已识别,获取到运营商分配的IP

wwan0

Link encap:Ethernet HWaddr e28b6f:c4 Driver qmi_wwan_q

inet addr:10.35.91.190 Mask:255.255.255.252

inet6 addr: fe80:8bff6fc4/64 Scope:Link

UP RUNNING NOARP MTU:1500 Metric:1

RX packets:31 errors:0 dropped:0 overruns:0 frame:0

TX packets:46 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:5678 TX bytes:3960

1.Ping通外网:执行ping www.baidu.com,无丢包,延迟正常:

PING www.a.shifen.com (157.148.69.151) 56(84) bytes of data.

64 bytes from 157.148.69.151: icmp_seq=1 ttl=52 time=29.9 ms

64 bytes from 157.148.69.151: icmp_seq=2 ttl=52 time=48.6 ms

64 bytes from 157.148.69.151: icmp_seq=3 ttl=52 time=55.3 ms

--- www.a.shifen.com ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2003ms

1.系统显示正常Android界面显示连接China Unicom / 4G”,网络状态稳定。

三、关键代码修改记录汇总

为了方便大家后续复用,这里把调试过程中所有修改/新增的文件列出来(含路径),避免遗漏:

操作类型

涉及文件路径

关键修改内容

修改

hardware/ril/rild/Android.mk

补充android.hardware.radio系列NDK库依赖

修改

overlay/frameworks/base/core/res/res/values/config.xml

开启config_mobile_data_capable

修改

device.mk(含device/rockchip/common/device.mkdevice/rockchip/rk3576/device.mk

添加android.hardware.telephony.gsm.xml拷贝

修改

device/rockchip/common/4g_modem/manifest.xml

配置android.hardware.radio系列HAL

移动

/system/lib64/libnetutils.so → /vendor/lib64/

调整库文件路径,解决访问问题

新增

hardware/ril/rild/Android.mk

编译rild文件进系统

其他修改

build/make/core/Makefiledevice/rockchip/common/BoardConfig.mkkernel-6.1/drivers/net/usb/qmi_wwan_q.c

适配内核驱动、系统编译配置

新增目录/文件

device/rockchip/common/4g_modem/device/rockchip/rk3576/em05_quectel_ril/external/usb_modeswitch/

4G模块依赖文件、工具

四、调试心得

这次EM05 4G模块调试,本质是从底层到上层的逐层排查:

1.先解决有没有:比如rild文件是否存在、库文件是否齐全,这是基础;

2.再解决通不通:比如库路径是否正确、HAL配置是否匹配,这是链路;

3.最后解决启不启:比如服务是否运行、上层功能是否开启,这是功能。

过程中一定要善用dmesg(内核日志)、logcatAndroid日志)、getprop(系统属性)、find(文件查找)等命令,定位问题会事半功倍。

如果大家也在RK3576+Android15环境下调试4G模块,遇到类似问题可以参考本文,祝大家少踩坑、快通网!


  • 随机文章
  • 热门文章
  • 热评文章