板子: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.soendif+
+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 \dhcpcdPRODUCT_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.soPRODUCT_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.soelsePRODUCT_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.soPRODUCT_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        16static 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 mainuser 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=0restart 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-serviceendif+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-cppcommon_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 eventsreturn;

修改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

这里参照了其他博友的修改以及移远官方的修改方法,写博客也是为了记录一下修改的过程,方便以后学习和参考,贴代码不容易呀,希望博友们多多点赞支持。

4G模块-EM05驱动调试分享-02(Android上层更改)相关推荐

  1. 嵌入式linux驱动开发之移远4G模块EC800驱动移植指南

    回顾下移远4G模块移植过程, 还是蛮简单的.一通百通,无论是其他4G模块都是一样的.这里记录下过程,分享给有需要的人.环境使用正点原子的imax6ul开发板,板子默认支持中兴和移远EC20的驱动,这里 ...

  2. TP驱动调试分享——基于Qualcomm SDM710平台Android9.0,TP 采用I2C方式和CPU进行通信

    目录 1 厂商驱动代码的添加 1.1 synaptics_dsx代码放到SDM710 kernel input相应目录 1.2 修改input/touchscreen目录下的Makefile和Kcon ...

  3. LCD驱动调试分享——基于Qualcomm MSM8996平台Android7.1

    LCD 分为LK 和kernel 两部分移植 首先要准备以下东西:屏IC 规格书,初始化代码,硬件原理图  屏IC 规格书->获得时序等数据 初始化代码 ->获得初始化屏幕ic的命令,用于 ...

  4. ubuntu加载4G模块驱动的调试过程记录

    一个工业平板电脑,原本安装的是win7系统,希望改用ubuntu系统.其他的驱动都好说,关键是有个4G模块,平板电脑厂家使用的是一个小品牌的,ubuntu内部没有集成驱动,需要自己编译驱动.这个对li ...

  5. NXP(imx8qxp)上android11的EG25-G(4G)模块调试记录

    文章目录 一.前期准备 二.底层配置 三.添加厂商提供的ril.so库 四.添加对应的配置 五.对应的报错解决 5.1 状态栏里面没有对应的 Mobile data SIM图标 5.2重复打印启动ri ...

  6. 4G网卡驱动调试-ec20

    4G网卡驱动调试分三步走: 一.基本概念 USB 部分的功能接口 APN 二.驱动移植 USB Driver GobiNet Driver 或者 QMI WWAN PPP 拨号配置 三.RIL 移植 ...

  7. [调试记录]3288 7.1平台上移植美格 SLM790 4G模块

    [调试记录]3288 7.1平台上移植美格 SLM790 4G模块 一 驱动配置 1.1 PPP 配置 需要配置 Android 内核来支持 PPP 功能,按照以下步骤来配置 PPP 选项 Devic ...

  8. 移远4G模块调试笔记

    前言: 在项目中集成 4G 网络模块,便可远程实时监控仪器运行状态.收集仪器数据等功能.EC20的USB接口符合USB2.0规范,支持高速(480Mbps)和全速(12Mbps)模式.该接口可用于AT ...

  9. 【RK356X Android11】开发之4G模块(广和通模块NL668)

    目录 前言 一.Kernel调试 二.Android层调试 三.移植过程 四.问题与解决 前言   4G模块主要利用于无线上网和通话功能的移动设备,或者用以没有WIFI或者以太网的地方:这篇文章主要以 ...

最新文章

  1. 修改cpu型号重启不变_猫头鹰展示D系列新款140毫米CPU散热器:更大散热片,能压400瓦...
  2. Android开发-将自定义View布局到Layout中并调用
  3. collect2: error: ld returned 1 exit status编译错误
  4. c++语句和流程控制
  5. win7 VS2013 新建工程 编译lua5.2.0 静态库
  6. python同时监听多个端口_python bottle使用多个端口(多个进程)提高并发
  7. 上财的计算机专业408,【2020考研】上财408分经验分享
  8. java音频实时传输_会议室智能系统建设方案,实时远程视频协作
  9. 【软件领域知识整理】贵金属交易的名词解释(一)
  10. Flutter mac 环境搭建 最简教程
  11. 文化艺术报新闻报道IT诗人(转)
  12. 人工智能白皮书(2022年) 附下载
  13. MySQL数据库基本操作
  14. 深度学习的图片统一设置大小
  15. win7黑屏,提示副本不是正版的激活解决办法
  16. 21届秋招ATL宁德新能源一面面经[数据分析工程师]
  17. 电脑桌面点击计算机反应迟钝,win7系统点击桌面图标反映迟钝影响整体运行速度怎么办【图文】...
  18. 王兴是怎么看待共享单车这块业务的
  19. HTML span 标签 的详细用法
  20. PC客户端(C/S架构)测试点整理

热门文章

  1. 迷你播放器--第一阶段(7)--安全攻防第一战--对抗反编译,代码混淆和对抗动态调试
  2. 计算机考研落榜了怎么办,一位考研落榜者的自述:考研失败的原因
  3. 积木开发系列----Blockly初体验
  4. 【ArcGIS教程】(1)带有经纬度的EXCEL数据如何转换为shp矢量数据?
  5. mysql 创建 innodb_MySQL创建数据表时设定引擎MyISAM/InnoDB操作
  6. WAV文件格式解析及处理
  7. 鼠标使用板载内存和使用计算机上,鼠标怎么选?教你选择适合自己的游戏鼠标。...
  8. 路由懒加载的三种写法
  9. [MAS]智能体交流 Agent Communication
  10. vivado与modelsim联合仿真遇到的问题2