任务:在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)