文章目录

  • 一、前期准备
  • 二、底层配置
  • 三、添加厂商提供的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库,否则无法进行后期的工作,也一并要求厂商提供一定的移植文档。

二、底层配置

厂商提供的一般都是对应的上层配置,我们需要自己去调试底层。

  1. 首先需要确定供电正确,这和需要你的硬件工程师进行配合,然后你需要注意4G模块的商店时序,可能需要重复的改变一个供电gpio的状态。
  2. 打开4G模块的通信端口,我使用的usb进行通信,在android的标准代码中,其实已经做好了对应的驱动,我们只需要打开对应的宏就可以了。对应的驱动文件为kernel/drivers/usb/serial/option.c,对应的宏为:CONFIG_USB_SERIAL_OPTION=y
  3. 这个宏需要在对应的defconfig文件中进行打开,这样才能编译驱动。如果成功则可以在对应的目录看到相关的节点 如:/dev/ttyUSB 0-3
  4. 通过 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
  1. 通过AT指令对USB口进行通讯
mek_8q:/ # microcom -s 115200 /dev/ttyUSB3
AT
OK
/*对应的命令可以自己去网上找这里*/
  1. 对应的比较明显的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
  1. 解决wwan占用串口
-CONFIG_USB_NET_QMI_WWAN=y
	+# CONFIG_USB_NET_QMI_WWAN is not set

修改你对应的defconfig文件,不然你的android界面会一直显示sim卡的图标是灰色的
剩下的就是需要你检查上电时序,模块供电是否正确,如果都没问题你的AT指令应该是可以通的。

三、添加厂商提供的ril.so库

  1. 首先关闭源码中的对应的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
  1. 添加厂家自己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

四、添加对应的配置

  1. 修改上网权限
    在对应的新建立一个文件
    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 };
/*这两个应该是对应的上网相关的,我是试过如果不添加后面是无法上网的*/
  1. 修改对应的服务

修改文件
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
  1. 修改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;
     }

直接返回,不需要去加载权限

  1. 修改系统的配置权限
    同样是/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();

剩下的就没啥改的了。
以上内容都是自己的调试经验,希望对大家有帮助。