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

板子: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

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

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值