平台:RK3588&Android12
内容:外挂小板调试EC20
通过主板的usb口外接一个小板调试移远的4G模块EC20,实现4G上网。
=========================================================================
一、内核
因为是外挂小板,所以dts不用调,usb口可以用就行。
1、驱动
用的驱动是kernel-5.10\drivers\net\lte\lte_rm310.c;
SDK\kernel-5.10\arch\arm64\configs\rockchip_defconfig;
+ CONFIG_LTE=y
+ CONFIG_LTE_RM310=y
SDK\kernel-5.10\drivers\net\Kconfig
source "drivers/net/hyperv/Kconfig"
+ source "drivers/net/lte/Kconfig"
SDK\kernel-5.10\drivers\net\Makefile
obj-$(CONFIG_FUJITSU_ES) += fjes/
+ obj-$(CONFIG_LTE) += lte/
同理增加qmi_wwan_q驱动,把kernel-5.10\drivers\net\usb\qmi_wwan_q.c编进来
二、系统
1、首先打开4G
device/rockchip/common/BoardConfig.mk
#TWRP
BOARD_TWRP_ENABLE ?= false
++ #for rk 4g modem | BOARD_OPENGL_AEP
++ BOARD_HAS_RK_4G_MODEM ?= true
打开BOARD_HAS_RK_4G_MODEM选项后会有一些报错,添加如下补丁:
/vendor/rockchip/common:
--- a/phone/phone.mk
+++ b/phone/phone.mk
@@ -26,8 +26,8 @@ PRODUCT_PACKAGES += \
chat
PRODUCT_PROPERTY_OVERRIDES +=ro.boot.noril=false
-else
-PRODUCT_PROPERTY_OVERRIDES +=ro.boot.noril=true
+# else
+# PRODUCT_PROPERTY_OVERRIDES +=ro.boot.noril=true
endif
/device/rockchip/common:
--- a/modules/4g_modem.mk
+++ b/modules/4g_modem.mk
@@ -38,8 +38,8 @@ PRODUCT_PROPERTY_OVERRIDES += \
vendor.rild.libpath=/vendor/lib64/librk-ril.so
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/4g_modem/bin64/dhcpcd:$(TARGET_COPY_OUT_VENDOR)/bin/dhcpcd \
- $(LOCAL_PATH)/4g_modem/lib64/librk-ril.so:$(TARGET_COPY_OUT_VENDOR)/lib64/librk-ril.so
+ $(LOCAL_PATH)/../4g_modem/bin64/dhcpcd:$(TARGET_COPY_OUT_VENDOR)/bin/dhcpcd \
+ $(LOCAL_PATH)/../4g_modem/lib64/librk-ril.so:$(TARGET_COPY_OUT_VENDOR)/lib64/librk-ril.so
hardware/interfaces:
--- a/compatibility_matrices/compatibility_matrix.6.xml (或者hardware_interfaces_compatibility_matrices.patch两选一)
+++ b/compatibility_matrices/compatibility_matrix.6.xml
@@ -434,6 +434,11 @@
</hal>
<hal format="hidl" optional="true">
<name>android.hardware.radio</name>
+ <version>1.1</version>
+ <version>1.2</version>
+ <version>1.3</version>
+ <version>1.4</version>
+ <version>1.5</version>
<version>1.6</version>
<interface>
<name>IRadio</name>
@@ -450,11 +455,20 @@
<instance>slot1</instance>
</interface>
</hal>
+ <hal format="hidl" optional="true">
+ <name>android.hardware.radio.deprecated</name>
+ <version>1.0</version>
+ <interface>
+ <name>IOemHook</name>
+ <instance>slot1</instance>
+ </interface>
+ </hal>
<hal format="hidl" optional="true">
<name>android.hardware.radio.config</name>
<!--
See compatibility_matrix.4.xml on versioning of radio config HAL.
-->
+ <version>1.0</version>
<version>1.1</version>
<interface>
<name>IRadioConfig</name>
2、RIL库文件
把相应模块的RIL库文件放在device\rockchip\common\4g_modem\lib64\下,
并且更改为librk-ril.so
3、RIL库加载到相应位置
/device/rockchip/common:
--- a/modules/4g_modem.mk
+++ b/modules/4g_modem.mk
@@ -38,8 +38,8 @@ PRODUCT_PROPERTY_OVERRIDES += \
vendor.rild.libpath=/vendor/lib64/librk-ril.so
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/../4g_modem/bin64/dhcpcd:$(TARGET_COPY_OUT_VENDOR)/bin/dhcpcd \
$(LOCAL_PATH)/../4g_modem/lib64/librk-ril.so:$(TARGET_COPY_OUT_VENDOR)/lib64/librk-ril.so \
4、添加cdc-wdmo节点
system\core\init\devices.cpp
// Minors are broken up into groups of 128, starting at "001"
int bus_id = uevent.minor / 128 + 1;
int device_id = uevent.minor % 128 + 1;
devpath = StringPrintf("/dev/bus/usb/%03d/%03d", bus_id, device_id);
}
+#if 1 //add by quectel for mknod /dev/cdc-wdmo
+ } else if (uevent.subsystem == "usbmisc" && !uevent.device_name.empty()) {
+ devpath = "/dev/" + uevent.device_name;
+#endif
} else if (StartsWith(uevent.subsystem, "usb")) {
// ignore other USB events
还要添加权限
device\rockchip\common\rootdir\ueventd.rockchip.rc
/dev/ttyUSB0 0660 radio radio
/dev/ttyUSB1 0660 radio radio
/dev/ttyUSB2 0660 radio radio
/dev/ttyUSB3 0660 radio radio
/dev/ttyUSB4 0660 radio radio
+/dev/cdc-wdm* 0660 radio radio
+/dev/qcqmi* 0660 radio radio
+/dev/cdc-acm* 0660 radio radio
5、加入APN
vendor\rockchip\common\phone\etc\apns-full-conf.xml
<apn carrier="China Telecom" mcc="460" mnc="11" apn="ctnet" type="default,supl" />
<apn carrier="中国移动物联网4G" mcc="460" mnc="04" apn="cmiot" type="default,supl" />
<apn carrier="中国移动物联网2G" mcc="460" mnc="04" apn="cmmtm" type="default,supl" />
<apn carrier="中国联通物联网gzm2mapn" mcc="460" mnc="06" apn="unim2m.gzm2mapn" port="80" type="default,supl" />
<apn carrier="中国联通物联网njm2mapn" mcc="460" mnc="06" apn="unim2m.njm2mapn" type="default,supl" />
<apn carrier="中国电信物联网m2m" mcc="460" mnc="03" apn="CTNET" user="m2m" password="vnet.mobi" type="default" />
三、遇到的问题:
1、RIL库文件不适配,用以前RK3568&Android 11的库文件发现会重复报错:
[ 2492.292235][ T1] init: starting service 'vendor.ril-daemon'...
11-23 07:57:31.041 1 1 I init : starting service 'vendor.ril-daemon'...
11-23 07:57:29.385 6433 6433 D RIL RILC: Quectel RIL Version: Quectel_Android_RIL_Driver_V3.3.47
11-23 07:57:29.385 6433 6433 D RIL RILC: Compiled date: Jul 26 2021 time: 17:31:18
11-23 07:57:29.385 6433 6433 D RIL RIL_READ_CONF: original conf line: LTE_Is_Report_SignalStrength=1
11-23 07:57:29.385 6433 6433 D RIL RIL_READ_CONF: LTE_Is_Report_SignalStrength = 1
11-23 07:57:29.385 6433 6433 E RIL RILC: '/vendor/manifest.xml' not exist.
11-23 07:57:29.385 6433 6433 D RIL RILC: 1.0</version>
11-23 07:57:29.385 6433 6433 E linker : library "/system/lib64/libnetutils.so" ("/system/lib64/libnetutils.so") needed or dlopened by "/vendor/lib64/librk-ril.so" is not accessible for the namespace: [name="vndk", ld_library_paths="", default_library_paths="/vendor/lib64/vndk-sp:/apex/com.android.vndk.v32/lib64:/vendor/lib64", permitted_paths="/odm/lib64/hw:/odm/lib64/egl:/vendor/lib64/hw:/vendor/lib64/egl:/system/vendor/lib64/hw:/system/vendor/lib64/egl:/apex/com.android.vndk.v32/lib64/hw"]
11-23 07:57:29.385 6433 6433 E RIL NDK : dlopen /system/lib64/libnetutils.so failed: dlopen failed: library "/system/lib64/libnetutils.so" needed or dlopened by "/vendor/lib64/librk-ril.so" is not accessible for the namespace "(default)"
11-23 07:57:29.385 6433 6433 F libc : Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 6433 (rild), pid 6433 (rild)
11-23 07:57:29.409 6437 6437 I crash_dump64: obtaining output fd from tombstoned, type: kDebuggerdTombstoneProto
11-23 07:57:29.409 347 347 I tombstoned: received crash request for pid 6433
11-23 07:57:29.410 6437 6437 I crash_dump64: performing dump of process 6433 (target tid = 6433)
[ 2492.407351][ T287] logd: logdr: UID=1001 GID=1001 PID=6437 n tail=0 logMask=8 pid=6433 start=0ns deadline=0ns
11-23 07:57:31.156 287 287 I logd : logdr: UID=1001 GID=1001 PID=6437 n tail=0 logMask=8 pid=6433 start=0ns deadline=0ns
[ 2492.410231][ T287] logd: logdr: UID=1001 GID=1001 PID=6437 n tail=0 logMask=1 pid=6433 start=0ns deadline=0ns
11-23 07:57:31.159 287 287 I logd : logdr: UID=1001 GID=1001 PID=6437 n tail=0 logMask=1 pid=6433 start=0ns deadline=0ns
11-23 07:57:29.477 6437 6437 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-23 07:57:29.477 6437 6437 F DEBUG : Build fingerprint: 'rockchip/rk3588_s/rk3588_s:12/SQ3A.220705.003.A1/eng.androi.20231123.140227:userdebug/release-keys'
11-23 07:57:29.477 6437 6437 F DEBUG : Revision: '0'
11-23 07:57:29.477 6437 6437 F DEBUG : ABI: 'arm64'
11-23 07:57:29.477 6437 6437 F DEBUG : Timestamp: 2023-11-23 07:57:29.412324998+0000
11-23 07:57:29.477 6437 6437 F DEBUG : Process uptime: 0s
11-23 07:57:29.477 6437 6437 F DEBUG : Cmdline: /vendor/bin/hw/rild
11-23 07:57:29.477 6437 6437 F DEBUG : pid: 6433, tid: 6433, name: rild >>> /vendor/bin/hw/rild <<<
11-23 07:57:29.477 6437 6437 F DEBUG : uid: 1001
11-23 07:57:29.478 6437 6437 F DEBUG : tagged_addr_ctrl: 0000000000000001
[ 2492.423678][ T1] init: Untracked pid 6437 exited with status 0
11-23 07:57:29.478 6437 6437 F DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
[ 2492.424951][ T1] init: Service 'vendor.ril-daemon' (pid 6433) received signal 11
11-23 07:57:29.478 6437 6437 F DEBUG : Cause: null pointer dereference
[ 2492.424978][ T1] init: Sending signal 9 to service 'vendor.ril-daemon' (pid 6433) process group...
11-23 07:57:29.478 6437 6437 F DEBUG : x0 0000007c45e85bc8 x1 0000007fec02c118 x2 0000000000000000 x3 0000007fec02c17a
11-23 07:57:29.478 6437 6437 F DEBUG : x4 0000000000000000 x5 0000000000000000 x6 726b68737473646d x7 7f7f7f7f7f7f7f7f
11-23 07:57:29.478 6437 6437 F DEBUG : x8 938dbdbe855922a3 x9 938dbdbe855922a3 x10 0000007fec02b958 x11 fffffffffffffffd
[ 2492.430351][ T1] libprocessgroup: Successfully killed process cgroup uid 1001 pid 6433 in 5ms
11-23 07:57:29.478 6437 6437 F DEBUG : x12 0000007fec02ba70 x13 00000000000000c6 x14 0000007fec02bbf8 x15 0000000ded4c9e9a
[ 2492.431119][ T1] init: Untracked pid 6439 exited with status 0
11-23 07:57:29.478 6437 6437 F DEBUG : x16 0000007c45f31530 x17 0000007c42a14510 x18 0000007c4ed7e000 x19 0000007fec02c178
11-23 07:57:29.478 6437 6437 F DEBUG : x20 0000007c45e81000 x21 0000007c45ea8000 x22 0000007fec02c118 x23 0000000000000003
11-23 07:57:29.478 6437 6437 F DEBUG : x24 00000058e4a75368 x25 0000007c45eaa000 x26 b400007b72826d18 x27 0000000000000000
11-23 07:57:29.478 6437 6437 F DEBUG : x28 0000007c45e85b90 x29 0000007fec02c5e0
11-23 07:57:29.478 6437 6437 F DEBUG : lr 0000007c45e5a3bc sp 0000007fec02c050 pc 0000000000000000 pst 0000000060001000
11-23 07:57:29.478 6437 6437 F DEBUG : backtrace:
11-23 07:57:29.478 6437 6437 F DEBUG : #00 pc 0000000000000000 <unknown>
11-23 07:57:29.478 6437 6437 F DEBUG : #01 pc 000000000001a3b8 /vendor/lib64/librk-ril.so (RIL_Init+500)
11-23 07:57:29.478 6437 6437 F DEBUG : #02 pc 0000000000002378 /vendor/bin/hw/rild (main+804) (BuildId: b8fc2a47b5b5a92dc929e54ab9d144ab)
11-23 07:57:29.478 6437 6437 F DEBUG : #03 pc 00000000000487dc /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+96) (BuildId: cd7952cb40d1a2deca6420c2da7910be)
11-23 07:57:29.482 585 797 W NativeCrashListener: Couldn't find ProcessRecord for pid 6433
11-23 07:57:29.483 347 347 E tombstoned: Tombstone written to: tombstone_39
11-23 07:57:31.172 1 1 I init : Untracked pid 6437 exited with status 0
11-23 07:57:29.486 585 663 I BootReceiver: Copying /data/tombstones/tombstone_39 to DropBox (SYSTEM_TOMBSTONE)
11-23 07:57:29.486 585 663 I DropBoxManagerService: add tag=SYSTEM_TOMBSTONE isTagEnabled=true flags=0x6
11-23 07:57:31.173 1 1 I init : Service 'vendor.ril-daemon' (pid 6433) received signal 11
11-23 07:57:31.173 1 1 I init : Sending signal 9 to service 'vendor.ril-daemon' (pid 6433) process group...
11-23 07:57:31.179 1 1 I libprocessgroup: Successfully killed process cgroup uid 1001 pid 6433 in 5ms
11-23 07:57:31.179 1 1 I init : Untracked pid 6439 exited with status 0
11-23 07:57:29.492 585 663 E NativeTombstoneManager: Tombstone's UID (1001) not an app, ignoring
11-23 07:57:29.493 585 663 I DropBoxManagerService: add tag=SYSTEM_TOMBSTONE_PROTO isTagEnabled=true flags=0x4
后面换了Quectel_Android_RIL_Driver_V3.6.8的库就好了。
2、有信号强度的图标,没有4G那两个小字,也上不了网,但是sim卡已经检测到了,AT指令发送正常,往下分析发现是/dev/cdc-wdm0 节点权限不对
console:/ $ ls -l /dev/cdc-wdm0
crw------- 1 root root 180, 176 2023-12-02 10:22 /dev/cdc-wdm0
但是明明已经给0660了
/dev/ttyUSB8 0660 radio radio
/dev/ttyUSB9 0660 radio radio
/dev/cdc-wdm* 0660 radio radio //目前用到的是这个
/dev/qcqmi* 0660 radio radio
/dev/cdc-acm* 0660 radio radio
搞了半天,发现居然是那个注释导致了,最后改成这样就好了
/dev/ttyUSB8 0660 radio radio
/dev/ttyUSB9 0660 radio radio
#目前用到的是这个/dev/cdc-wdm*
/dev/cdc-wdm* 0660 radio radio
/dev/qcqmi* 0660 radio radio
/dev/cdc-acm* 0660 radio radio
四、小结
内核方面的话因为是外挂小板,所以只要加载驱动就好了,dts打开个usb就行了,省了些事。在接上4G模块的时候/dev会出来四个USB设备(一般是ttyUSB0 1 2 3),这个时候就会通过ttyUSB2发AT指令,对sim卡进行一些操作。所以ril库一定要适配系统,最好还是有供应商配合,还有就是vendor.ril-daemon服务要正常跑起来,相关文件要给到。
五、参考文章
RK3568-ANDROID11-4G-EC20-(详细步骤)_rk3568 ec20_旋风旋风的博客-CSDN博客
RK3568 Android12 移远4G模块EM05-CE 调试心得_device manifest are not declared in fcm <= level 4_Terry.W的博客-CSDN博客
RK3588 Android12 广和通L716 4G模块调试记录 - 代码天地 (codetd.com)
在基于瑞芯微rk3568的android12上添加移远4G通信模块EC200A_java_csudxl801106-华为云开发者联盟 (csdn.net)