板子:rk3568
平台:android11
1.前言
首先你要有移远官方提供的库文件,Quectel_Android_RIL_Driver_V3.3.91_master_beta,里面包含了如下文件
在安卓上层最主要就是添加上面的文件(chat,ip-down,ip-up,libreference-ril.so),也就是支持ril,它是Android的一个电话服务和无线电硬件之间的抽象层结构如下:
内核和应用程序框架之间,由两部分组成: RILD和Vendor RIL。RILD负责套接字和应用程序框架之间的通信,而供应商RIL负责通过AT命令信道进行无线电通信
此外,RIL的java框架还包括两部分:RIL模块和电话模块。这个RIL模块与下RILD通信,而电话模块直接提供电话功能应用程序的接口
2.修改
- 首先将libreference-ril.so拷贝到vendor/rockchip/common/phone/lib目录下,这里我参照了网上的做法取了一个别名libreference-ril-ec20.so
\vendor\rockchip\common\phone\bin\chat
\vendor\rockchip\common\phone\etc\ppp\ip-down
\vendor\rockchip\common\phone\etc\ppp\ip-up
\vendor\rockchip\common\phone\etc\ql-ril.conf
\vendor\rockchip\common\phone\lib\libreference-ril-ec20.so
- 要将上面的这些文件put到Android系统下目录下。这里更改vendor/rockchip/common/phone目录下phone.mk,修改如下:
diff --git a/phone/phone.mk b/phone/phone.mk
index 61881e4..49ebd53 100755
--- a/phone/phone.mk
+++ b/phone/phone.mk
@@ -17,6 +17,15 @@ PRODUCT_COPY_FILES += \
$(CUR_PATH)/phone/lib/libril-dts4108c.so:system/lib/libril.so
endif
+
+PRODUCT_COPY_FILES += \
+ $(CUR_PATH)/phone/etc/ppp/ip-down:system/etc/ppp/ip-down \
+ $(CUR_PATH)/phone/etc/ppp/ip-up:system/etc/ppp/ip-up \
+ $(CUR_PATH)/phone/bin/chat:system/bin/chat \
+ $(CUR_PATH)/phone/etc/ql-ril.conf:system/etc/ql-ril.conf \
+ $(CUR_PATH)/phone/lib/libreference-ril-ec20.so:vendor/lib64/libreference-ril-ec20.so \
+ $(CUR_PATH)/etc/spn-conf.xml:system/etc/spn-conf.xml
+
ifeq ($(strip $(BOARD_HAVE_DONGLE)),true)
PRODUCT_PACKAGES += \
rild \
- 并且在vendor/rockchip/common/phone/etc/的apns-full-conf.xml文件中添加4G物联网卡,添加内容如下:
diff --git a/phone/etc/apns-full-conf.xml b/phone/etc/apns-full-conf.xml
index 5718e10..7fc4e27 100644
--- a/phone/etc/apns-full-conf.xml
+++ b/phone/etc/apns-full-conf.xml
@@ -35497,5 +35497,13 @@
password=""
mvno_type="spn"
mvno_match_data="IENTC"
- />
+ />
+
+ <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" />
+
</apns>
- 修改device/rockchip/common/overlay/frameworks/base/core/res/res/values/目录的config.xml文件,添加APN:
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index 2092e98..0a6c72f 100644
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -20,7 +20,7 @@
<resources>
<!-- This device is not "voice capable"; it's data-only. -->
- <bool name="config_voice_capable">false</bool>
+ <bool name="config_voice_capable">true</bool>
<!-- This device does not allow sms service. -->
<bool name="config_sms_capable">false</bool>
- 设置属性,让系统知道使用的是libreference-ril-ec20.so这个库
(1)修改b/device_sbc_rk3568.mk(这个是我新建工程的时候自己拷贝的一份device.mk,这里根据实际情况来哈),修改如下:
diff --git a/device_sbc_rk3568.mk b/device_sbc_rk3568.mk
index 917e8b9..b9b39a5 100644
--- a/device_sbc_rk3568.mk
+++ b/device_sbc_rk3568.mk
@@ -259,7 +259,7 @@ PRODUCT_PACKAGES += \
CarrierDefaultApp \
CarrierConfig \
rild \
- librk-ril \
+ libreference-ril-ec20 \
dhcpcd
PRODUCT_COPY_FILES += vendor/rockchip/common/phone/etc/apns-full-conf.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/apns-conf.xml
@@ -274,14 +274,16 @@ PRODUCT_PROPERTY_OVERRIDES += \
ifeq ($(strip $(TARGET_ARCH)), arm64)
PRODUCT_PROPERTY_OVERRIDES += \
- vendor.rild.libpath=/vendor/lib64/librk-ril.so
+ vendor.rild.libpath=/vendor/lib64/libreference-ril-ec20.so
+ #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
else
PRODUCT_PROPERTY_OVERRIDES += \
- vendor.rild.libpath=/vendor/lib/librk-ril.so
+ vendor.rild.libpath=/vendor/lib/libreference-ril-ec20.so
+ #vendor.rild.libpath=/vendor/lib/librk-ril.so
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/4g_modem/bin32/dhcpcd:$(TARGET_COPY_OUT_VENDOR)/bin/dhcpcd \
(2)此外还需要修改device/rockchip/rk356x目录下相应的device.mk(我的是device_sbc_rk3568.mk)修改如下:
diff --git a/device_sbc_rk3568.mk b/device_sbc_rk3568.mk
index 8b1fd0e..7cb9b34 100644
--- a/device_sbc_rk3568.mk
+++ b/device_sbc_rk3568.mk
@@ -78,6 +78,9 @@ PRODUCT_PROPERTY_OVERRIDES += \
ro.ril.ecclist=112,911 \
ro.opengles.version=196610 \
wifi.interface=wlan0 \
+ ro.telephony.default_network=9 \
+ rild.libpath=/vendor/lib64/libreference-ril-ec20.so \
+ rild.libargs=-d /dev/ttyUSB2 \
ro.audio.monitorOrientation=true \
debug.nfc.fw_download=false \
debug.nfc.se=false \
(3)其次还要确定hardware/ril/rild下的rild.c下的库路径是否跟上面添加的一致,下面是我的rild.c的部分内容:
#if defined(PRODUCT_COMPATIBLE_PROPERTY)
#define LIB_PATH_PROPERTY "vendor.rild.libpath"
#define LIB_ARGS_PROPERTY "vendor.rild.libargs"
#else
#define LIB_PATH_PROPERTY "rild.libpath"
#define LIB_ARGS_PROPERTY "rild.libargs"
#endif
#define MAX_LIB_ARGS 16
static void usage(const char *argv0) {
fprintf(stderr, "Usage: %s -l <ril impl library> [-- <args for impl library>]\n", argv0);
exit(EXIT_FAILURE);
}
可以看到LIB_PATH_PROPERTY和LIB_ARGS_PROPERTY这两个宏跟我们上面添加的一样,在adb shell终端可以使用getprop命令来查看是否添加到位:
sbc_rk3568:/vendor/lib $ getprop | grep rild
[rild.libargs]: [-d]
[rild.libpath]: [/vendor/lib64/libreference-ril-ec20.so]
[vendor.rild.libpath]: [/vendor/lib64/libreference-ril-ec20.so]
- 修改 ril-daemon服务配置,修改hardware/ril/rild下的rild.rc,修改如下:
diff --git a/rild/rild.rc b/rild/rild.rc
index f6beb54..d1770e0 100644
--- a/rild/rild.rc
+++ b/rild/rild.rc
@@ -1,5 +1,10 @@
-service vendor.ril-daemon /vendor/bin/hw/rild
- class main
- user radio
- group radio cache inet misc audio log readproc wakelock
- capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
+#service vendor.ril-daemon /vendor/bin/hw/rild
+# class main
+# user radio
+# group radio cache inet misc audio log readproc wakelock
+# capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
+service ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril-ec20.so
+ class main
+ user root
+ group radio cache inet misc audio sdcard_rw log
+ capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
当然也可以在init.rc文件中添加,这中我没试过我用的上面的方法:
service ril-daemon /vendor/bin/hw/rild -l <libreference-ril path>
class main
user root
group radio cache inet misc audio sdcard_rw log
capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
- 禁止掉关闭ril-daemon,修改device/rockchip/common目录下的init.rk30board.rc文件修改如下:
diff --git a/init.rk30board.rc b/init.rk30board.rc
index 6b8f9ec..cf913d1 100755
--- a/init.rk30board.rc
+++ b/init.rk30board.rc
@@ -253,9 +253,9 @@ on property:persist.internet_adb_enable=0
restart adbd
# for telephony function
-on property:ro.boot.noril=true
- setprop ro.radio.noril true
- stop ril-daemon
+#on property:ro.boot.noril=true
+# setprop ro.radio.noril true
+# stop ril-daemon
# set ro.serialno
on property:vendor.serialno=*
- 在device/rockchip/common目录下的manifest.xml中添加hidl,这个不添加好像会报错(BOARD_HAS_RK_4G_MODEM):
<hal format="hidl">
<name>android.hardware.radio</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IRadio</name>
<instance>slot1</instance>
</interface>
</hal>
- 在device/rockchip/common目录下ueventd.rockchip.rc文件中给驱动ttyUSB*和cdc-wdm添加权限:
#quectel port
/dev/ttyUSB* 0660 radio radio
/dev/ttyACM* 0660 radio radio
/dev/cdc-wdm* 0660 radio radio
/dev/qcqmi* 0660 radio radio
/dev/cdc-acm* 0660 radio radio
- 添加4G图标,修改device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/目录下的config.xml文件,修改如下 :
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index 9feb244..a22823d 100755
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -32,7 +32,15 @@
<string-array translatable="false" name="networkAttributes">
<item>"wifi,1,1,2,-1,true"</item>
<item>"bluetooth,7,7,0,-1,true"</item>
- <item>"ethernet,9,9,9,-1,true"</item>
+ <item>"ethernet,9,9,9,-1,true"</item>
+ <item>"mobile,0,0,0,-1,true"</item>
+ <item>"mobile_mms,2,0,2,60000,true"</item>
+ <item>"mobile_supl,3,0,2,60000,true"</item>
+ <item>"mobile_dun,4,0,2,60000,true"</item>
+ <item>"mobile_hipri,5,0,3,60000,true"</item>
+ <item>"mobile_fota,10,0,2,60000,true"</item>
+ <item>"mobile_ims,11,0,2,60000,true"</item>
+ <item>"mobile_cbs,12,0,2,60000,true"</item>
</string-array>
<!-- Flag indicating whether we should enable the automatic brightness in Settings.
config_hardware_automatic_brightness_available is not set, so we will use software implementation -->
3.相关报错解决方法:
- BOARD_HAVE_DONGLE报错
--- a/device/rockchip/common/device.mk
+++ b/device/rockchip/common/device.mk
@@ -253,6 +253,12 @@ PRODUCT_PACKAGES += \
android.hardware.wifi@1.0-service
endif
+ifeq ($(BOARD_HAVE_DONGLE),true)
+PRODUCT_PACKAGES += \
+ android.hardware.radio@1.2-radio-service \
+ android.hardware.radio.config@1.0-service
+
+endif
[ 30% 283/935] target C++: usb_dongle <= external/usb_modeswitch/usb_dongle/Misc.cpp
FAILED: out/target/product/rk3568_r/obj/EXECUTABLES/usb_dongle_intermediates/Misc.o
修改external/usb_modeswitch/usb_dongle目录下的Android.mk,修改如下:
diff --git a/usb_dongle/Android.mk b/usb_dongle/Android.mk
index 1ee43ff..c2912c1 100755
--- a/usb_dongle/Android.mk
+++ b/usb_dongle/Android.mk
@@ -19,7 +19,7 @@ common_shared_libraries := \
common_cflags := -Werror -Wall -Wno-missing-field-initializers -Wno-unused-variable -Wno-unused-parameter
-common_local_tidy_flags := -warnings-as-errors=clang-analyzer-security*,cert-*
+#common_local_tidy_flags := -warnings-as-errors=clang-analyzer-security*,cert-*
common_local_tidy_checks := -*,clang-analyzer-security*,cert-*,-cert-err34-c,-cert-err58-cpp
common_local_tidy_checks += ,-cert-env33-c
- 打印如下错误:
[ 2650.466038] init: Control message: Could not find 'android.hardware.radio@1.1::IRadio/slot1' for ctl.interface_start from pid: 149 (/system/bin/hwservicemanager)
可以修改system/core/init目录下的init.cpp和devices.cpp文件,修改如下:
init.cpp
diff --git a/init/init.cpp b/init/init.cpp
index 29859c5f5..7f6a8e7ee 100644
--- a/init/init.cpp
+++ b/init/init.cpp
@@ -420,10 +420,11 @@ static bool HandleControlMessage(std::string_view message, const std::string& na
<< "): " << result.error();
return false;
}
-
- LOG(INFO) << "Control message: Processed ctl." << message << " for '" << name
+ if(strcmp(name.c_str(),"android.hardware.radio@1.1::IRadio/slot1") != 0) {
+ LOG(INFO) << "Control message: Processed ctl." << message << " for '" << name
<< "' from pid: " << from_pid << " (" << process_cmdline << ")";
- return true;
+ }
+ return true;
}
bool QueueControlMessage(const std::string& message, const std::string& name, pid_t pid, int fd) {
devices.cpp
diff --git a/init/devices.cpp b/init/devices.cpp
index 9fbec641b..c98e58d4e 100644
--- a/init/devices.cpp
+++ b/init/devices.cpp
@@ -492,6 +492,10 @@ void DeviceHandler::HandleUevent(const Uevent& uevent) {
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
return;
修改system/libhidl/transport/目录下ServiceManagement.cpp修改如下:
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index a7e9626..8278c98 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -625,8 +625,9 @@ struct Waiter : IServiceNotification {
if (mRegistered) {
break;
}
-
- LOG(WARNING) << "Waited one second for " << mInterfaceName << "/" << mInstanceName;
+ if(strcmp(mInterfaceName.c_str(),"android.hardware.radio@1.1::IRadio") != 0) {
+ LOG(WARNING) << "Waited one second for " << mInterfaceName << "/" << mInstanceName;
+ }
} while (!timeout);
}
@@ -800,7 +801,9 @@ sp<::android::hidl::base::V1_0::IBase> getRawServiceInternal(const std::string&
if (vintfLegacy || !retry) break;
if (waiter != nullptr) {
- ALOGI("getService: Trying again for %s/%s...", descriptor.c_str(), instance.c_str());
+ if(strcmp(descriptor.c_str(),"android.hardware.radio@1.1::IRadio") != 0) {
+ ALOGI("getService: Trying again for %s/%s...", descriptor.c_str(), instance.c_str());
+ }
waiter->wait(true /* timeout */);
}
}
2.调试方法
查看ril库
cat /vendor/etc/init/*rild.rc | grep ril-daemon
或者
cat /init*.rc | grep ril-daemon
打印如下:
sbc_rk3568:/ $ cat /vendor/etc/init/*rild.rc | grep ril-daemon
#service vendor.ril-daemon /vendor/bin/hw/rild
service ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril-ec20.so
查看库是不是移远提供的
sbc_rk3568:/ $ getprop gsm.version.ril-impl
Quectel_Android_RIL_Driver_V3.3.91
这里参照了其他博友的修改以及移远官方的修改方法,写博客也是为了记录一下修改的过程,方便以后学习和参考,贴代码不容易呀,希望博友们多多点赞支持。