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

电子说

1.4w人已加入

描述

 

 

在嵌入式 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(无线接口层)服务根本没起来。

Linux

 

 

 

排查

 

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 缺失,访问路径不对

Linux

 

 

现象

 

解决 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"):

 

 

Linux

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 @@

 

 

 

 

 

 false

 

 

 

 

 

 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系列 HAL 的 AIDL 配置(版本均为 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”,网络状态稳定。

Linux

 

 

 

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

 

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

 

 

操作类型

 

 

涉及文件路径

 

 

关键修改内容

 

 

修改

 

 

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 模块,遇到类似问题可以参考本文,祝大家少踩坑、快通网!

 


 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分