RK3568系列21——移远4G模块配置

  拿到手的4G模块是移远的EC200系列,具体型号是EC200N-CN,这个系列和网上流传比较多的EC20系列有所不同,EC20系列一般使用wwan驱动,正确驱动后系统会生成wwan0网卡,而EC200系列走的是ECM驱动,正确驱动后系统生成的是usb0网卡。除了驱动部分,其他步骤基本相似,也有一定参考价值。另外调试模块最好要先跟原厂取得联系,拿到文档和驱动,有技术支持就更好了。

DTS配置

  首先需要一个简单的驱动,来操作上电步骤,让4G模块工作起来,RK提供了一个现成的驱动,代码位于kernel/drivers/net/lte/lte_rm310.c,这里我们直接在DTS中使用这个驱动。正常来讲reset脚一般是低有效,但是我们经过了一个三极管产生了反向,因此变成了高有效,另外power脚根据原理图可以不接,因此这边直接注释掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rk_modem: rk-modem {
status = "okay";
compatible = "4g-modem-platdata";
4G,vbat-gpio = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>;
// 4G,power-gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_LOW>;
4G,reset-gpio = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&lte_power &lte_reset>;
};

&pinctrl {
4g-lte {
lte_power: lte-power {
rockchip,pins = <4 RK_PB2 RK_FUNC_GPIO &pcfg_pull_down>;
};
lte_reset: lte-reset {
rockchip,pins = <4 RK_PB3 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};

  另外原始的驱动是针对RK自己的RM310模块,这里参考移远的《Quectel_EC200N-CN_硬件设计手册_V1.1》修改了一下驱动的上电顺序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
diff kernel/drivers/net/lte/lte_rm310.c
@@ -44,17 +44,17 @@ static int modem_poweron_off(int on_off)
if (pdata) {
if (on_off) {
LOG("%s: 4g modem power up.\n", __func__);
- if (pdata->vbat_gpio) {
+ // for Quectel EC200N
+ if (pdata->vbat_gpio)
gpiod_direction_output(pdata->vbat_gpio, 1);
- msleep(2000);
- }
- if (pdata->power_gpio) {
- gpiod_direction_output(pdata->power_gpio, 0);
- msleep(50);
+ if (pdata->power_gpio)
gpiod_direction_output(pdata->power_gpio, 1);
- msleep(400);
- gpiod_direction_output(pdata->power_gpio, 0);
- }
+ msleep(200);
+ if (pdata->reset_gpio)
+ gpiod_direction_output(pdata->reset_gpio, 1);
+ msleep(400);
+ if (pdata->reset_gpio)
+ gpiod_direction_output(pdata->reset_gpio, 0);
} else {
LOG("%s: 4g modem power down.\n", __func__);
if (pdata->power_gpio) {
@@ -118,14 +118,14 @@ static int modem_platdata_parse_dt(struct device *dev,
memset(data, 0, sizeof(*data));
LOG("%s: LTE modem power controlled by gpio.\n", __func__);
data->vbat_gpio = devm_gpiod_get_optional(dev, "4G,vbat",
- GPIOD_OUT_HIGH);
+ GPIOD_OUT_LOW);
if (IS_ERR(data->vbat_gpio)) {
ret = PTR_ERR(data->vbat_gpio);
dev_err(dev, "failed to request 4G,vbat GPIO: %d\n", ret);
return ret;
}
data->power_gpio = devm_gpiod_get_optional(dev, "4G,power",
- GPIOD_OUT_HIGH);
+ GPIOD_OUT_LOW);
if (IS_ERR(data->power_gpio)) {
ret = PTR_ERR(data->power_gpio);
dev_err(dev, "failed to request 4G,power GPIO: %d\n", ret);

  这两步完成后编译刷机上电,正确的话应该能在dmesg日志中认到这个4G模块,其VendorId不论什么型号,只要是移远的应该均为0x2c7c,例如如下显示。由于4G模块步骤较多,建议一步一步的完成,方便排查问题出在哪个阶段。

1
2
3
4
5
6
7
# dmesg
[ 10.873595] usb 2-1.4: new high-speed USB device number 5 using ehci-platform
[ 10.971484] usb 2-1.4: New USB device found, idVendor=2c7c, idProduct=6002, bcdDevice= 3.18
[ 10.971511] usb 2-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 10.971518] usb 2-1.4: Product: Android
[ 10.971524] usb 2-1.4: Manufacturer: Android
[ 10.971529] usb 2-1.4: SerialNumber: 0000

内核驱动配置

  4G模块能够正确上电后,需要修改串口驱动,使设备能够被识别成modem,这个步骤主要参考《Quectel_EC200T_Linux_USB_Driver_User_Guide_V1.0》和《Quectel_UMTS_LTE_5G_Linux_USB_Driver_User_Guide_V3.0》。

USB驱动中添加VID和PID

  修改kernel/drivers/usb/serial/option.c,识别移远4G模块,事实上最新版的SDK已经包含了,因此并不需要做这个步骤。如果后续出了新型号没有包含的话,再手动添加一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 245 #define QUECTEL_VENDOR_ID           0x2c7c
246 /* These Quectel products use Quectel's vendor ID */
247 #define QUECTEL_PRODUCT_EC21 0x0121
248 #define QUECTEL_PRODUCT_EC25 0x0125
249 #define QUECTEL_PRODUCT_EG91 0x0191
250 #define QUECTEL_PRODUCT_EG95 0x0195
251 #define QUECTEL_PRODUCT_BG96 0x0296
252 #define QUECTEL_PRODUCT_EP06 0x0306
253 #define QUECTEL_PRODUCT_EM12 0x0512
254 #define QUECTEL_PRODUCT_RM500Q 0x0800
255 #define QUECTEL_PRODUCT_EC200S_CN 0x6002
256 #define QUECTEL_PRODUCT_EC200T 0x6026

1098 /* Quectel products using Qualcomm vendor ID */
1099 { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC15)},
1100 { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC20),
1101 .driver_info = RSVD(4) },
1102 /* Yuga products use Qualcomm vendor ID */
1103 { USB_DEVICE(QUALCOMM_VENDOR_ID, YUGA_PRODUCT_CLM920_NC5),
1104 .driver_info = RSVD(1) | RSVD(4) },
1105 /* u-blox products using Qualcomm vendor ID */
1106 { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M),
1107 .driver_info = RSVD(1) | RSVD(3) },
1108 { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R6XX),
1109 .driver_info = RSVD(3) },
1110 /* Quectel products using Quectel vendor ID */
1111 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff),
1112 .driver_info = NUMEP2 },
1113 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0, 0) },
1114 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25, 0xff, 0xff, 0xff),
1115 .driver_info = NUMEP2 },
1116 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25, 0xff, 0, 0) },
1117 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG91, 0xff, 0xff, 0xff),
1118 .driver_info = NUMEP2 },
1119 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG91, 0xff, 0, 0) },
1120 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0xff, 0xff),
1121 .driver_info = NUMEP2 },
1122 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0, 0) },
1123 { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96),
1124 .driver_info = RSVD(4) },
1125 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff),
1126 .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 },
1127 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) },
1128 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0xff, 0xff),
1129 .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 },
1130 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0, 0) },
1131 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0620, 0xff, 0xff, 0x30) }, /* EM160R-GL */
1132 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0620, 0xff, 0, 0) },
1133 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x30) },
1134 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) },
1135 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10),
1136 .driver_info = ZLP },
1137 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) },
1138 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },

添加Zero Packet机制

  修改kernel/drivers/usb/serial/usb_wwan.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
usb_sndbulkpipe(serial->dev, endpoint) | dir,
buf, len, callback, ctx);

+ #if 1 //Added by Quectel for zero packet
+ if (dir == USB_DIR_OUT) {
+ struct usb_device_descriptor *desc = &serial->dev->descriptor;
+
+ if (desc->idVendor == cpu_to_le16(0x2C7C))
+ urb->transfer_flags |= URB_ZERO_PACKET;
+ }
+ #endif
+
if (intfdata->use_zlp && dir == USB_DIR_OUT)
urb->transfer_flags |= URB_ZERO_PACKET;

添加Reset-resume机制

  修改kernel/drivers/usb/serial/option.c

1
2
3
4
5
6
7
8
9
static struct usb_serial_driver option_1port_device = {
#ifdef CONFIG_PM
.suspend = usb_wwan_suspend,
.resume = usb_wwan_resume,
+#if 1 // Added by Quectel
+ .reset_resume = usb_wwan_resume,
+#endif
#endif
};

让网卡被正确的驱动加载

  修改kernel/drivers/usb/serial/option.c。让模块的网卡被wwan驱动或ecm驱动加载,而不是USB Serial option驱动,这里针对使用wwan的EC20系列和使用ecm的EC200系列略有不同,我直接整合在了一起,这样更换任意系列都能驱动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
static int option_probe(struct usb_serial *serial,
if (device_flags & NUMEP2 && iface_desc->bNumEndpoints != 2)
return -ENODEV;

+#if 1 //Added by Quectel
+ if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {
+ __u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);
+
+ // Quectel EC200T's interface 0 can be used as USB Network device (ecm, rndis)
+ if (serial->interface->cur_altsetting->desc.bInterfaceClass != 0xFF)
+ return -ENODEV;
+
+ struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;
+
+ if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) {
+ // ECM, RNDIS, NCM, MBIM, ACM, UAC, ADB
+ return -ENODEV;
+ }
+
+ if ((idProduct & 0xF000) == 0x0000) {
+ // MDM interface 4 is QMI
+ if (intf->bInterfaceNumber == 4 &&
+ intf->bNumEndpoints == 3 &&
+ intf->bInterfaceSubClass == 0xFF &&
+ intf->bInterfaceProtocol == 0xFF)
+ return -ENODEV;
+ }
+ }
+#endif
+
/* Store the device flags so we can use them during attach. */
usb_set_serial_data(serial, (void *)device_flags);

网卡驱动

  网卡驱动按照型号分为ECM和WWAN两种,你可以只添加自己需要的,也可以都添加,这样更换4G模块后也能支持使用。

  ECM驱动官方文档说明可以直接使用上游内核的版本,因此直接使能即可,事实上最新版的SDK已经使能了,因此并不需要做这个步骤。

1
2
3
CONFIG_USB_NET_DRIVERS
CONFIG_USB_USBNET
CONFIG_USB_NET_CDCETHER

  WWAN驱动需要经过修改,但是移远官方提供了一个修改好的版本,直接加入即可使用,这里需要从官方拿到《Quetecl_Linux_Android_QMI_WWAN_Driver_V1.2.2》或更新版本。

  1. qmi_wwan_q.c复制到kernel/drivers/net/usb/下
  2. 在内核配置中使能,事实上最新版的SDK已经使能了,因此并不需要做这个步骤
1
2
3
4
CONFIG_USB_NET_DRIVERS
CONFIG_USB_USBNET
CONFIG_USB_NET_QMI_WWAN
CONFIG_USB_WDM
  1. 修改kernel/drivers/net/usb/Makefileqmi_wwan_q.o必须添加在qmi_wwan.o之前
1
2
+obj-${CONFIG_USB_NET_QMI_WWAN} += qmi_wwan_q.o
obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o
  1. 修改system/core/init/devices.ppp,这一步是否需要未经证实
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
diff --git a/init/devices.cpp b/init/devices.cpp
index 9fbec641b..719fde8e5 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-wdm0
+ } 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;

使能PPP

  在内核配置中使能PPP相关的配置,事实上最新版的SDK已经使能了,因此并不需要做这个步骤。

1
2
3
4
CONFIG_PPP
CONFIG_PPP_ASYNC
CONFIG_PPP_SYNC_TTY
CONFIG_PPP_DEFLATE

测试

  完成这些步骤后编译刷机上电,正确的话应该能在dmesg日志中认到一个网卡设备,例如如下显示。使用ip addr show命令应该也能看到增加了一个新的接口,usb0wwan0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# dmesg
[ 10.873595] usb 2-1.4: new high-speed USB device number 5 using ehci-platform
[ 10.971484] usb 2-1.4: New USB device found, idVendor=2c7c, idProduct=6002, bcdDevice= 3.18
[ 10.971511] usb 2-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 10.971518] usb 2-1.4: Product: Android
[ 10.971524] usb 2-1.4: Manufacturer: Android
[ 10.971529] usb 2-1.4: SerialNumber: 0000
[ 10.978405] cdc_ether 2-1.4:1.0 usb0: register 'cdc_ether' at usb-fd880000.usb-1.4, CDC Ethernet Device, ae:0c:29:a3:9b:6d
[ 10.979553] option 2-1.4:1.2: GSM modem (1-port) converter detected
[ 10.980162] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB0
[ 10.981357] option 2-1.4:1.3: GSM modem (1-port) converter detected
[ 10.982174] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB1
[ 10.983305] option 2-1.4:1.4: GSM modem (1-port) converter detected
[ 10.984216] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB2

Android HAL层配置

  4G模块能够被正确驱动后,需要配置Android的HAL层,这个步骤主要参考《Quectel_Android_RIL_Driver_user_Guide_V2.0》,另外需要拿到RIL驱动。这个驱动很坑,最先使用的是《Quectel_Android_RIL_Driver_V3.5.16_master_beta》,加载时会报找不到已经被废弃的组件"libhidltransport",后来从技术支持拿到的《Qiectel_Android_RIL_Driver_V3.5.14》才成功驱动,甚至前后两次拿到的V3.5.14版本的驱动,其文件大小和校验还不一样,第一次拿到的也无法驱动。

集成RIL驱动

  1. 将驱动中的libquectel-ril/arm64_v8a/libreference-ril.so复制为vendor/rockchip/common/phone/lib/libreference-ril-quectel.so
  2. 将驱动中的libquectel-ril/ql-ril.conf复制为vendor/rockchip/common/phone/etc/ql-ril.conf
  3. ql-ril.confLTE_Is_Report_SignalStrength=1信号强度反馈功能的注释删掉,打开此功能
  4. 修改vendor/rockchip/common/phone.mk文件,让编译时①和②步骤中的两个文件能够被复制到镜像中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
diff --git a/phone/phone.mk b/phone/phone.mk
index 61881e46..c6659f59 100755
--- a/phone/phone.mk
+++ b/phone/phone.mk
@@ -9,6 +9,9 @@ PRODUCT_COPY_FILES += \
$(CUR_PATH)/phone/etc/ppp/ip-up:system/etc/ppp/ip-up \
$(CUR_PATH)/phone/etc/ppp/call-pppd:system/etc/ppp/call-pppd \
$(CUR_PATH)/phone/etc/operator_table:system/etc/operator_table
+PRODUCT_COPY_FILES += \
+ $(CUR_PATH)/phone/lib/libreference-ril-quectel.so:vendor/lib64/libreference-ril-quectel.so \
+ $(CUR_PATH)/phone/etc/ql-ril.conf:system/etc/ql-ril.conf

ifeq ($(strip $(PRODUCT_MODEM)), DTS4108C)
PRODUCT_COPY_FILES += \

配置ril-daemon服务

  修改hardware/ril/rild/rild.rc文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
diff --git a/rild/rild.rc b/rild/rild.rc
index f6beb54..840cfff 100644
--- a/rild/rild.rc
+++ b/rild/rild.rc
@@ -1,5 +1,11 @@
-service vendor.ril-daemon /vendor/bin/hw/rild
+# 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-quectel.so
class main
- user radio
- group radio cache inet misc audio log readproc wakelock
+ user root
+ group radio cache inet misc audio sdcard_rw log
capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW

增加HIDL描述清单文件

  按照移远的文档,正常该文件应该位于device/rockchip/common/manifest.xml,RK将这部分内容单独提取到了device/rockchip/common/4g_modem/manifest.xml,编译时会自动合入。另外RK的Android 11的SDK尚不支持IRadio 1.4,因此配置成IRadio 1.1即可,事实上最新版的SDK已经配置了,因此并不需要做这个步骤。

1
2
3
4
5
6
7
<hal format="hidl">
<name>android.hardware.radio</name>
<transport>hwbinder</transport>
<fqname>@1.1::IRadio/slot1</fqname>
<fqname>@1.1::IRadio/slot2</fqname>
<fqname>@1.2::ISap/slot1</fqname>
</hal>

添加SELinux配置

  这一部分可以直接参考移远的官方文档,文件目录分别位于:

  • device/rockchip/common/ueventd.rockchip.rc
  • device/rockchip/common/sepolicy/private/file_contexts
  • system/sepolicy/vendor/rild.te

替换RK自带的ril服务

  修改device/rockchip/common/device.mk文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
diff --git a/device.mk b/device.mk
index 917e8b9..4b74549 100644
--- a/device.mk
+++ b/device.mk
@@ -259,7 +259,7 @@ PRODUCT_PACKAGES += \
CarrierDefaultApp \
CarrierConfig \
rild \
- librk-ril \
+ libreference-ril-quectel \
dhcpcd

PRODUCT_COPY_FILES += vendor/rockchip/common/phone/etc/apns-full-conf.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/apns-conf.xml
@@ -274,7 +274,7 @@ 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-quectel.so

PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/4g_modem/bin64/dhcpcd:$(TARGET_COPY_OUT_VENDOR)/bin/dhcpcd \

在板级配置中使能相关配置

  修改板级BoardConfig.mk文件。

1
2
BOARD_HAS_RK_4G_MODEM := true
BOARD_HAVE_DONGLE := true

  修改板级alpha.mk文件,EC200系列的/dev/ttyUSB2是modem,其他系列具体请查询移远的文档。另外这里注意rild.libargs中的-d与后面的/dev/ttyUSB2中间不能有空格。

1
2
3
PRODUCT_PROPERTY_OVERRIDES += \
rild.libpath=/vendor/lib64/libreference-ril-quectel.so \
rild.libargs=-d/dev/ttyUSB2 \

修复usb_dongle的编译错误

  修改external/usb_modeswitch/usb_dongle/Android.mk文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
diff --git a/usb_dongle/Android.mk b/usb_dongle/Android.mk
index 1ee43ff..d16ca37 100755
--- a/usb_dongle/Android.mk
+++ b/usb_dongle/Android.mk
@@ -19,7 +19,8 @@ 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_flags := -warnings-as-errors=clang-analyzer-security*
common_local_tidy_checks := -*,clang-analyzer-security*,cert-*,-cert-err34-c,-cert-err58-cpp
common_local_tidy_checks += ,-cert-env33-c

在设置中新增“移动网络”选项

  修改device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index 9feb244..0a6bc4c 100755
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -31,9 +31,16 @@
<!-- 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,false"</item>
+ <item>"mobile_supl,3,0,2,60000,true"</item>
+ <item>"mobile_dun,4,0,2,60000,true"</item>
<item>"bluetooth,7,7,0,-1,true"</item>
<item>"ethernet,9,9,9,-1,true"</item>
</string-array>
+
+ <bool name="config_voice_capable">true</bool>
+
<!-- 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 -->
<bool name="config_automatic_brightness_available">true</bool>

添加APN配置

  RK自带的已经可以正常使用,文件位于vendor/rockchip/common/phone/etc/apns-full-conf.xml

测试

  完成这些步骤后编译刷机上电,正确的话界面应该可以看到4G图标并上网。使用ip addr show命令应该也能看到usb0wwan0接口已经获取到了IP地址。

参考文献