rk3568 4g 模块调试-ec20(移远模块)

任务:在rk3568 android11 上移植ec20 模块

总体思路:
Linux 驱动:配置 dts 将 rksdk/kernel/driver 中的4g 驱动配置上,然后根据移远文档,添加 usb 枚举和一些代码修改
Android 系统配置:将移远提供的 ril 库替换上,并且根据需求替换其他组件。在 ril.rc 启动 ril 守护进程的时候指定库和 usb 口。根据 rk 配置4g 的需求打开一些配置。

Ril 驱动相关:
RIL分为RILJ和RILD两部分,RILJ属于Java层,RILD属于C层。那先看下RILD所处于的位置,以及与其相关的模块,RILD处于android系统HAL(HARDWARE ABSTRACTION LAYER)这一层。是telephony framework(RILJ属于这一部分,用来与RILD建立通道)与modem(基带芯片)沟通的桥梁。最上层就是通话和短信等APK。
之所以这样设计是因为不同的厂商使用的Modem不一样,而RIL又和Modem紧密联系,所以Android有把和Modem联系紧密的部分和公共部分剥离开,让不同的厂商可以自己实现vendor RIL以适应厂商自己的Modem。也就是 reference-ril.so 这个库,所以我们要使用由移远提供的库进行替换。

调试过程中的特别注意:
在 .mk 中添加了 4g 的配置后编译不过的解决方法:

--- a/external/usb_modeswitch/usb_dongle/Android.mk
+++ b/external/usb_modeswitch/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

添加和修改ril 守护进程的时候,需要添加上网功能,否则无法上网

service ril-daemon system/vendor/bin/hw/rild -l /vendor/lib64/libreference-ril-ec20.so
        class main
        user radio
        group radio cache inet misc audio sdcard_rw log
        capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW   	//在这里添加功能

系统中没有电话短信应用

--- a/device/rockchip/common/device.mk
+++ b/device/rockchip/common/device.mk
@@ -264,7 +264,24 @@ PRODUCT_PACKAGES += \
     CarrierConfig \
     rild \
     librk-ril \
-    dhcpcd
+    dhcpcd \
+    Dialer \			拨号应用
+    messaging \		短信应用
+    TelephonyProvider \
+    TeleService \
+    Telecom

在下拉状态栏和设置中都没有关于 sim 卡的配置

--- a/device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml
@@ -31,6 +31,14 @@
     <!-- the 6th element indicates boot-time dependency-met value. -->
     <string-array translatable="false" name="networkAttributes">
         <item>"wifi,1,1,2,-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>
         <item>"bluetooth,7,7,0,-1,true"</item>
         <item>"ethernet,9,9,9,-1,true"</item>
     </string-array>

如果无法上网,也可以尝试修改上网状态的选择模式

--- a/frameworks/base/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/frameworks/base/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -237,7 +237,7 @@ public interface RILConstants {
     int PREFERRED_NETWORK_MODE = Optional.of(TelephonyProperties.default_network())
             .filter(list -> !list.isEmpty())
             .map(list -> list.get(0))
-            .orElse(NETWORK_MODE_WCDMA_PREF);
+            .orElse(NETWORK_MODE_LTE_GSM_WCDMA);
 
     int BAND_MODE_UNSPECIFIED = 0;      //"unspecified" (selected by baseband automatically)
     int BAND_MODE_EURO = 1;             //"EURO band" (GSM-900 / DCS-1800 / WCDMA-IMT-2000)

你可能感兴趣的:(Android底层开发,Linux内核开发,android)