文章目录
- 一、前期准备
- 二、底层配置
- 三、添加厂商提供的ril.so库
- 四、添加对应的配置
- 五、对应的报错解决
- 5.1 状态栏里面没有对应的 Mobile data SIM图标
- 5.2重复打印启动ril-daemon
- 5.3 重复打印Could not find 'android.hardware.radio@1.0::IRadio/slot1
- 5.4 查看log中是否有对应的pppd拨号
- 5.5 ppp拨号失败
- 5.6 无法获取APN
最近在android11上调试一款移远的4G模块(EG25-G)第一次调试4G,做个笔记记录。
一、前期准备
一款新的4G模块,我们需要厂商提供对应的so库,否则无法进行后期的工作,也一并要求厂商提供一定的移植文档。
二、底层配置
厂商提供的一般都是对应的上层配置,我们需要自己去调试底层。
- 首先需要确定供电正确,这和需要你的硬件工程师进行配合,然后你需要注意4G模块的商店时序,可能需要重复的改变一个供电gpio的状态。
- 打开4G模块的通信端口,我使用的usb进行通信,在android的标准代码中,其实已经做好了对应的驱动,我们只需要打开对应的宏就可以了。对应的驱动文件为kernel/drivers/usb/serial/option.c,对应的宏为:CONFIG_USB_SERIAL_OPTION=y
- 这个宏需要在对应的defconfig文件中进行打开,这样才能编译驱动。如果成功则可以在对应的目录看到相关的节点 如:/dev/ttyUSB 0-3
- 通过 ls -l /dev/ttyUSB* 查看所属组和读写权限
mek_8q:/ # ls -l /dev/ttyUSB*
crw-rw-rw- 1 radio radio 188, 0 1970-01-01 08:02 /dev/ttyUSB0
crw-rw-rw- 1 radio radio 188, 1 1970-01-01 08:02 /dev/ttyUSB1
crw-rw-rw- 1 radio radio 188, 2 1970-01-01 08:02 /dev/ttyUSB2
crw-rw-rw- 1 radio radio 188, 3 1970-01-01 08:02 /dev/ttyUSB3
- 通过AT指令对USB口进行通讯
mek_8q:/ # microcom -s 115200 /dev/ttyUSB3
AT
OK
/*对应的命令可以自己去网上找这里*/
- 对应的比较明显的LOG
[ 18.834421] usb 2-1.2: new high-speed USB device number 3 using xhci-hcd
[ 18.948485] usb 2-1.2: New USB device found, idVendor=2c7c, idProduct=0125, bcdDevice= 3.18
[ 18.957056] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 18.964508] usb 2-1.2: Product: EG25-G /*对应的模块*/
[ 18.968387] usb 2-1.2: Manufacturer: Quectel
[ 18.978784] option 2-1.2:1.0: GSM modem (1-port) converter detected
[ 18.985925] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB0
[ 18.993877] option 2-1.2:1.1: GSM modem (1-port) converter detected
[ 19.000973] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB1
[ 19.008924] option 2-1.2:1.2: GSM modem (1-port) converter detected
[ 19.016128] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB2
[ 19.024266] option 2-1.2:1.3: GSM modem (1-port) converter detected
[ 19.031566] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB3
- 解决wwan占用串口
-CONFIG_USB_NET_QMI_WWAN=y
+# CONFIG_USB_NET_QMI_WWAN is not set
修改你对应的defconfig文件,不然你的android界面会一直显示sim卡的图标是灰色的
剩下的就是需要你检查上电时序,模块供电是否正确,如果都没问题你的AT指令应该是可以通的。
三、添加厂商提供的ril.so库
- 首先关闭源码中的对应的ril.so库,通过这种宏定义的方式去屏蔽源码中的ril.so库
修改目录 hardware/ril / reference-ril/Android.mk
diff --git a/reference-ril/Android.mk b/reference-ril/Android.mk
index 6afdbd3..e22c827 100644
--- a/reference-ril/Android.mk
+++ b/reference-ril/Android.mk
@@ -2,6 +2,7 @@
# XXX using libutils for simulator build only...
#
+ifneq ($(BOARD_HAVE_EG25_G),)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
@@ -50,3 +51,4 @@ else
LOCAL_MODULE:= reference-ril
include $(BUILD_EXECUTABLE)
endif
+endif
修改 device/nxp/imx8q/mek_8q/BoardConfig.mk b/imx8q/mek_8q/BoardConfig.mk
diff --git a/imx8q/mek_8q/BoardConfig.mk b/imx8q/mek_8q/BoardConfig.mk
index 65772d44..48b286be 100644
--- a/imx8q/mek_8q/BoardConfig.mk
+++ b/imx8q/mek_8q/BoardConfig.mk
@@ -257,3 +251,14 @@ endif
PRODUCT_COPY_FILES += \
device/nxp/imx8q/mek_8q/TP/goodix_911_cfg.bin:vendor/firmware/goodix_911_cfg.bin
+# -------@4G modem-------
+# for 4G modem
+BOARD_HAVE_EG25_G := true
- 添加厂家自己ril.so库
diff --git a/imx8q/mek_8q/BoardConfig.mk b/imx8q/mek_8q/BoardConfig.mk
index 65772d44..48b286be 100644
--- a/imx8q/mek_8q/BoardConfig.mk
+++ b/imx8q/mek_8q/BoardConfig.mk
@@ -102,12 +102,6 @@ BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
+# -------@4G modem-------
+# for 4G modem
+BOARD_HAVE_EG25_G := true /*刚才的宏*/
+PRODUCT_COPY_FILES += \
+ device/nxp/imx8q/mek_8q/modem/chat:system/bin/chat \
+ device/nxp/imx8q/mek_8q/modem/ip-up:system/etc/ppp/ip-up \
+ device/nxp/imx8q/mek_8q/modem/ip-down:system/etc/ppp/ip-down \
+ device/nxp/imx8q/mek_8q/4G_modem/libreference-ril.so:vendor/lib64/hw/libreference-ril.so \
/*添加ppp拨号工具以及对应的so库*/
添加了库,就要指定你库的路径让别人知道
/* 添加一个prop类型文件,用于指定路径*/
device/nxp/imx8q/mek_8q/system.prop
/*内容如下*/
vendor.rild.libpath=/vendor/lib64/hw/libreference-ril.so
在对应的.mk文件里面去添加这个文件
device/nxp/imx8q/mek_8q/mek_8q.mk
#----------4g modem-------------
TARGET_PRODUCT_PROP := $(IMX_DEVICE_PATH)/system.prop
四、添加对应的配置
- 修改上网权限
在对应的新建立一个文件
device/nxp/imx8q/sepolicy/rild.te
内容如下
allow rild usb_serial_device:chr_file { read write open ioctl };
allow rild rild:packet_socket { create bind write read };
/*这两个应该是对应的上网相关的,我是试过如果不添加后面是无法上网的*/
- 修改对应的服务
修改文件
device/nxp/imx8q/mek_8q/sepolicy/file_contexts
添加如下内容
#4G
/dev/ttyUSB[0-9] u:object_r:radio_device:s0
/dev/ttyACM[0-9] u:object_r:radio_device:s0
/dev/cdc-wdm[0-9] u:object_r:radio_device:s0
/dev/qcqmi[0-9] u:object_r:radio_device:s0
/vendor/bin/hw/rild u:object_r:rild_exec:s0
/dev/socket/rildOemHook u:object_r:rild_socket:s0
#PCIe
/dev/mhi_DUN u:object_r:radio_device:s0
/dev/mhi_DIAG u:object_r:radio_device:s0
/dev/mhi_BHI u:object_r:radio_device:s0
/dev/mhi_LOOPBACK u:object_r:radio_device:s0
/dev/mhi_QMI0 u:object_r:radio_device:s0
/*这些都是对应的4G厂商提供的一些修改,具体作用不知,应该是将对应的权限修改为radio的吧*/
添加对应的apn配置,不然后面无法获得apn,无法上网
添加文件
device/nxp/imx8q/mek_8q/apns-conf.xml
不知道为啥复制不了,可能源码比较长。
这个我会上传到资源里面,需要的可以私信我。
将这个配置文件拷贝到对应的目录
+PRODUCT_COPY_FILES += \
+ device/nxp/imx8q/mek_8q/modem/chat:system/bin/chat \
+ device/nxp/imx8q/mek_8q/modem/ip-up:system/etc/ppp/ip-up \
+ device/nxp/imx8q/mek_8q/modem/ip-down:system/etc/ppp/ip-down \
+ device/nxp/imx8q/mek_8q/4G_modem/libreference-ril.so:vendor/lib64 \
+ device/nxp/imx8q/mek_8q/apns-conf.xml:system/etc/apns-conf.xml
- 修改selinux的权限
修改/system/core/init/selinux.cpp
diff --git a/init/selinux.cpp b/init/selinux.cpp
index 5a0255acd..ae6f1fce9 100644
--- a/init/selinux.cpp
+++ b/init/selinux.cpp
@@ -104,6 +104,7 @@ EnforcingStatus StatusFromCmdline() {
}
bool IsEnforcing() {
+ return false;
if (ALLOW_PERMISSIVE_SELINUX) {
return StatusFromCmdline() == SELINUX_ENFORCING;
}
直接返回,不需要去加载权限
- 修改系统的配置权限
同样是/system/core目录
如果这里不添加对应的配置,他不能上网,而且会报错,是关于ueventd.rc这个文件的,大家可以注意下log
diff --git a/rootdir/ueventd.rc b/rootdir/ueventd.rc
index 9c2cdf27f..50d6a091f 100644
--- a/rootdir/ueventd.rc
+++ b/rootdir/ueventd.rc
@@ -41,6 +41,18 @@ subsystem sound
/dev/pmsg0 0222 root log
# kms driver for drm based gpu
+#quectel port
+/dev/ttyUSB* 0666 radio radio
+/dev/cdc-wdm* 0666 radio radio
+/dev/qcqmi* 0666 radio radio
+/dev/cdc-acm* 0666 radio radio
+#PCIe
+/dev/mhi_DUN 0666 radio radio
+/dev/mhi_DIAG 0666 radio radio
+/dev/mhi_BHI 0666 radio radio
+/dev/mhi_LOOPBACK 0666 radio radio
+/dev/mhi_QMI0 0666 radio radio
+
/dev/dri/* 0666 root graphics
# these should not be world writable
五、对应的报错解决
5.1 状态栏里面没有对应的 Mobile data SIM图标
对应的设置里面也没有 Mobile network的选项
修改device/nxp/imx8q/mek_8q/overlay/frameworks/base/core/res/res/values/config.xml
diff --git a/imx8q/mek_8q/overlay/frameworks/base/core/res/res/values/config.xml b/imx8q/mek_8q/overlay/frameworks/base/core/res/res/values/config.xml
index be3cd041..34c62208 100755
--- a/imx8q/mek_8q/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/imx8q/mek_8q/overlay/frameworks/base/core/res/res/values/config.xml
@@ -61,21 +61,27 @@
<!-- An Array of "[ConnectivityManager connectionType],
[# simultaneous connection types]" -->
+<!--
<string-array translatable="false" name="radioAttributes">
<item>"1,1"</item>
<item>"9,1"</item>
</string-array>
-
+-->
/*注释这里*/
5.2重复打印启动ril-daemon
log为
init: starting service 'ril-daemon'...
init: Untracked pid 14226 exited with status 0
init: Service 'ril-daemon' (pid 14222) received signal 11
init: Sending signal 9 to service 'ril-daemon' (pid 14222) process group...
libprocessgroup: Successfully killed process cgroup uid 1001 pid 14222 in 5ms
init: Untracked pid 14228 exited with status 0
这是你指定的ril库有问题,请检查你的ril.so是否有拷贝,你的ril库是否指定正确
通过命令查看
mek_8q:/ # getprop | grep ril
[init.svc.vendor.ril-daemon]: [running]
[init.svc_debug_pid.vendor.ril-daemon]: [491]
[ro.boottime.vendor.ril-daemon]: [15576768000]
[ro.radio.noril]: [no]
[vendor.rild.libargs]: [-d /dev/ttyUSB3] /*指定的通讯端口,这个可以不用指定 一般来说 对应的so库里面会指定*/
[vendor.rild.libpath]: [/vendor/lib64/hw/libreference-ril.so] /*这是你指定的库的路径,你对应的so库是不是这个*/
请检查你的so库是否有拷贝到你的指定路径下
或则你的vendor.rild.libpath在其余地方有指定
比如 hardware/ril/rild/rild.rc
请修改为这样
service ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/hw/libreference-ril.so /*这个路径和device下的要一样,其余的不变*/
class main
user radio
group radio cache inet misc audio sdcard_rw log
capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
一般来说就不会报错了,如果还有报错,请检查是否有多个so库冲突。
5.3 重复打印Could not find 'android.hardware.radio@1.0::IRadio/slot1
首先检查你的模块供电是否正常,完全掉电再次重启看看,如果还有报错请检查你配置的服务。
如果移植在打印,那么就需要修改软件的xml配置文件
修改
device/nxp/imx8q/mek_8q/manifest.xml
/*添加下面的代码*/
<hal format="hidl">
<name>android.hardware.radio</name>
<transport>hwbinder</transport>
/*这个对应的版本可修改,我这里默认1.1可以改为 1.0 - 1.5,如果版本不对也会报类似的错误,告诉你找不到对应的版本*/
<version>1.1</version>
<interface>
<name>IRadio</name>
<instance>slot1</instance>
</interface>
</hal>
如果你添加了这里的代码,编译有问题,告诉你 android.hardware.radio 最少为1.4 请修改下面的地方
源码目录:hardware/interfaces/
compatibility_matrices/compatibility_matrix.5.xml
+++ b/compatibility_matrices/compatibility_matrix.5.xml
@@ -371,6 +371,7 @@
</hal>
<hal format="hidl" optional="true">
<name>android.hardware.radio</name>
+ <version>1.0</version>
<version>1.4</version>
<version>1.5</version>
<interface>
请在这里添加对应的服务版本,这样就能修改对应的报错了。
5.4 查看log中是否有对应的pppd拨号
通过logcat抓取完整的log,可以看到这些对应的log,那么4g应该就是ok的了
05-16 15:14:24.772 484 2062 D RIL PPPD: chat --> AT
05-16 15:14:24.877 484 2062 D RIL PPPD: chat 6 <--
05-16 15:14:24.877 484 2062 D RIL PPPD: OK
05-16 15:14:24.877 484 2062 D RIL PPPD: chat --> AT+CGREG?
05-16 15:14:24.981 484 2062 D RIL PPPD: chat 40 <--
05-16 15:14:24.981 484 2062 D RIL PPPD: +CGREG: 2,1,"EA10","9BB3303",7
05-16 15:14:24.981 484 2062 D RIL PPPD:
05-16 15:14:24.981 484 2062 D RIL PPPD: OK
05-16 15:14:25.012 2064 2064 E pppd : Couldn't open the /dev/ppp device: Permission denied
05-16 15:14:25.012 2064 2064 E pppd : Sorry - this system lacks PPP kernel support
05-16 15:14:25.013 484 2062 D RIL PPPD: *** pppd: Exit code 4 (EXIT_NO_KERNEL_SUPPORT) retval = 4
pppd拨号成功后,可以在通过ifconfig -a 看到对应的ppp节点
ppp0 Link encap:Point-to-Point Protocol
inet addr:10.86.22.184 P-t-P:10.64.64.64 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:27 errors:0 dropped:0 overruns:0 frame:0
TX packets:39 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:6842 TX bytes:3194
没有这个节点就是你对应的pppd拨号没有成功,请检查是否有什么步骤漏掉,或者有其余的配置出现错误等。
5.5 ppp拨号失败
是否有添加 apns-config.xml文件
对应的so库是否正确,是否是匹配的。
5.6 无法获取APN
log:
05-14 19:39:32.458 792 980 E DCT-C-0 : getPreferredApnSetId: cursor is null
05-14 19:39:32.458 792 980 D DCT-C-0 : hasMatchedTetherApnSetting: APNs=[]
05-14 19:39:33.087 792 792 D DCT-C-0 : shouldRestrictDataForEcbm: isInEcm=false isInImsEcm=false
05-14 19:39:33.098 792 792 D DCT-C-0 : shouldRestrictDataForEcbm: isInEcm=false isInImsEcm=false
05-14 19:39:33.601 792 825 E DCT-C-0 : getPreferredApnSetId: cursor is null
05-14 19:39:33.602 792 825 D DCT-C-0 : hasMatchedTetherApnSetting: APNs=[]
05-14 19:39:33.608 792 792 D DCT-C-0 : shouldRestrictDataForEcbm: isInEcm=false isInImsEcm=false
05-14 19:39:33.859 792 792 D DCT-C-0 : onSimStateUpdated: state=LOADED
出现这个问题可能是你的模块还没有完全起来,你可以等一等,如果一直都是这样,其余的配置已经正确,可以尝试修改下面的内容:
--- a/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
+++ b/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
public class DcTracker extends Handler {
if (!isCarrierConfigApplied()) {
log("onCarrierConfigChanged: Carrier config is not ready yet.");
- return;
+ //return;
}
@@ -2430,7 +2430,8 @@ public class DcTracker extends Handler {
if (mSimState == TelephonyManager.SIM_STATE_ABSENT) {
onSimAbsent();
} else if (mSimState == TelephonyManager.SIM_STATE_LOADED)
{
/*这里我改与每改都可以,应该不会影响*/
- if (mConfigReady) {
+// if (mConfigReady) { //rpdzkj jeff
+ if (true) {
createAllApnList();
setDataProfilesAsNeeded();
setInitialAttachApn();
剩下的就没啥改的了。
以上内容都是自己的调试经验,希望对大家有帮助。