EC800E-CN规格

  • 网络制式:支持 LTE Cat 1,最大下行速率 10 Mbps,上行速率 5 Mbps
  • 封装尺寸:17.7 mm × 15.8 mm × 2.4 mm
  • 接口支持
    • USB 2.0 高速接口
    • UART、PCM、I2C、GPIO 等工业标准接口
    • 支持双 SIM 卡(可选)
    • 支持 GNSS 定位(可选)
  • 操作系统兼容性:支持 Windows 7/8/8.1/10/11、Linux、Android 等操作系统
  • 远程升级:支持 DFOTA(远程在线升级)功能,降低后期运维成本

此项目EC800E-CN通过usb2.0和3566连接

rk3566_r:/ # lsusb
Bus 005 Device 002: ID 2c7c:0903

USB驱动中添加VID和PID

$PROJECT_TOP/kernel/drivers/usb/serial/option.c

@@ -251,6 +251,7 @@ static void option_instat_callback(struct urb *urb);
 #define QUECTEL_PRODUCT_EM12			0x0512
 #define QUECTEL_PRODUCT_RM500Q			0x0800
 #define QUECTEL_PRODUCT_EC200T			0x6026
+#define QUECTEL_PRODUCT_EC800E			0x0903
 
 #define CMOTECH_VENDOR_ID			0x16d8
 #define CMOTECH_PRODUCT_6001			0x6001
@@ -1127,6 +1128,7 @@ static const struct usb_device_id option_ids[] = {
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10),
 	  .driver_info = ZLP },
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC800E, 0xff, 0, 0) },
 
 	{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
 	{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },

添加 Reset-resume 机制

$PROJECT_TOP/kernel/drivers/usb/serial/option.c

@@ -2109,6 +2111,7 @@ static struct usb_serial_driver option_1port_device = {
 #ifdef CONFIG_PM
 	.suspend           = usb_wwan_suspend,
 	.resume            = usb_wwan_resume,
+	.reset_resume = usb_wwan_resume,
 #endif
 };

添加 URB_ZERO_PACKET 机制

$PROJECT_TOP/kernel/drivers/usb/serial/usb_wwan.c

@@ -514,6 +514,13 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
 		     desc->idProduct == cpu_to_le16(0x4e3c)))
 			urb->transfer_flags |= URB_ZERO_PACKET;
 	}
+
+	if (dir == USB_DIR_OUT) {
+		if (desc->idVendor == cpu_to_le16(0x2C7C))
+		{
+			urb->transfer_flags |= URB_ZERO_PACKET;
+		}
+	}
 	return urb;
 }

让网卡被正确的驱动加载

修改$PROJECT_TOP/kernel/drivers/usb/serial/option.c,让模块的网卡被ecm驱动加载,而不是USB Serial option驱动

@@ -2152,6 +2155,31 @@ 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);
+			struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;
+
+			// Quectel EC200T's interface 0 can be used as USB Network device (ecm, rndis)
+			if (serial->interface->cur_altsetting->desc.bInterfaceClass != 0xFF)
+					return -ENODEV;
+
+			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);

使能USB网卡驱动

网卡驱动分为ECM和WWAN两种,EC800E-CN为ECM类型。RK3566_R的SDK已经使能了相关参数。

CONFIG_USB_NET_DRIVERS
CONFIG_USB_USBNET
CONFIG_USB_NET_CDCETHER

使能PPP

在内核配置中使能 PPP 相关的配置,同样RK3566_R的SDK已经使能了相关参数。

CONFIG_PPP
CONFIG_PPP_ASYNC
CONFIG_PPP_SYNC_TTY
CONFIG_PPP_DEFLATE

验证

完成以上步骤,在设备中可以查到如下日志

rk3566_r:/ # dmesg
[    0.929236] usb 5-1: New USB device found, idVendor=2c7c, idProduct=0903, bcdDevice= 2.00
[    0.929304] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    0.929331] usb 5-1: Product: Android
[    0.929354] usb 5-1: Manufacturer: Android
[    1.051600] cdc_ether 5-1:1.0 usb0: register 'cdc_ether' at usb-xhci-hcd.1.auto-1, CDC Ethernet Device, 22:89:84:6a:96:ab
[    1.054336] option 5-1:1.2: GSM modem (1-port) converter detected
[    1.055255] usb 5-1: GSM modem (1-port) converter now attached to ttyUSB0
[    1.057581] option 5-1:1.3: GSM modem (1-port) converter detected
[    1.058483] usb 5-1: GSM modem (1-port) converter now attached to ttyUSB1
[    1.060909] option 5-1:1.4: GSM modem (1-port) converter detected
[    1.061791] usb 5-1: GSM modem (1-port) converter now attached to ttyUSB2

使用ip addr show可以查到新增的网卡

rk3566_r:/ # ip addr show
8: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 22:89:84:6a:96:ab brd ff:ff:ff:ff:ff:ff

集成 RIL 驱动

  1. 参考Quectel_Android_RIL_Driver_User_Guide_V2.0-1.pdfQuectel_Android_RIL_Driver_V3.6.22.zip中的libquectel-ril/arm64-v8a/libreference-ril.so复制为$PROJECT_TOP/vendor/rockchip/common/phone/lib/libreference-ril-quectel.so
  2. 将驱动中的libquectel-ril/ql-ril.conf复制为$PROJECT_TOP/vendor/rockchip/common/phone/etc/ql-ril.conf
  3. 解除ql-ril.conf中LTE_Is_Report_SignalStrength=1的注释,打开此功能
  4. 修改$PROJECT_TOP/vendor/rockchip/common/phone/phone.mk,使编译时将libreference-ril.soql-ril.conf打包到镜像中
@@ -10,6 +10,10 @@ PRODUCT_COPY_FILES += \
     $(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 += \
     $(CUR_PATH)/phone/bin/rild_dts4108c:system/bin/rild \

配置 ril-daemon 服务

修改$PROJECT_TOP/hardware/ril/rild/rild.rc

@@ -1,5 +1,10 @@
-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
+
+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

添加 SELinux 配置

  1. 修改$PROJECT_TOP/device/rockchip/common/ueventd.rockchip.rc
@@ -192,3 +192,13 @@
 
 # for sensors
 /dev/input/event*    0666   input system
+
+/dev/ttyACM*              0660   radio    radio
+/dev/cdc-wdm*              0660   radio    radio
+/dev/qcqmi*              0660   radio    radio
+/dev/cdc-acm*              0660   radio    radio
+/dev/mhi_DUN              0660   radio    radio
+/dev/mhi_DIAG              0660   radio    radio
+/dev/mhi_BHI              0660   radio    radio
+/dev/mhi_LOOPBACK              0660   radio    radio
+/dev/mhi_QMI0              0660   radio    radio
  1. 修改$PROJECT_TOP/device/rockchip/common/sepolicy/private/file_contexts
@@ -1,2 +1,16 @@
 # file in /system
 /system/bin/move_widevine_data\.sh              u:object_r:move-widevine-data-sh_exec:s0
+
+/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
  1. 修改system/sepolicy/vendor/rild.te
@@ -7,3 +7,5 @@ net_domain(rild)
 # public, but conceptually should go with this
 type rild_exec, exec_type, vendor_file_type, file_type;
 init_daemon_domain(rild)
+
+allow rild self:packet_socket { create bind write read };

使能4G相关配置

修改$PROJECT_TOP/device/rockchip/common/BoardConfig.mk

@@ -403,7 +403,7 @@ BOARD_FORCE_UDISK_VISIBLE ?= true
 BOARD_DISABLE_SAFE_MODE ?= true
 
 #enable 3g dongle
-BOARD_HAVE_DONGLE ?= false
+BOARD_HAVE_DONGLE ?= true
 
 #for boot and shutdown animation ringing
 BOOT_SHUTDOWN_ANIMATION_RINGING ?= false
@@ -434,7 +434,7 @@ BOARD_BLUETOOTH_LE_SUPPORT ?= true
 BOARD_WIFI_SUPPORT ?= true
 
 #for rk 4g modem
-BOARD_HAS_RK_4G_MODEM ?= false
+BOARD_HAS_RK_4G_MODEM ?= true
 
 ifeq ($(strip $(BOARD_HAS_RK_4G_MODEM)),true)
 DEVICE_MANIFEST_FILE += device/rockchip/common/4g_modem/manifest.xml

替换 RK 自带的 ril 服务

修改device/rockchip/common/device.mk

@@ -259,7 +259,7 @@ PRODUCT_PACKAGES += \
     CarrierDefaultApp \
     CarrierConfig \
     rild \
-    librk-ril \
+    libreference-ril-quel \
     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-quel.so
 
 PRODUCT_COPY_FILES += \
 		$(LOCAL_PATH)/4g_modem/bin64/dhcpcd:$(TARGET_COPY_OUT_VENDOR)/bin/dhcpcd \

使能4G模块相关配置

修改device/rockchip/common/BoardConfig.mk

@@ -403,7 +403,7 @@ BOARD_FORCE_UDISK_VISIBLE ?= true
 BOARD_DISABLE_SAFE_MODE ?= true
 
 #enable 3g dongle
-BOARD_HAVE_DONGLE ?= false
+BOARD_HAVE_DONGLE ?= true
 
 #for boot and shutdown animation ringing
 BOOT_SHUTDOWN_ANIMATION_RINGING ?= false
@@ -434,7 +434,7 @@ BOARD_BLUETOOTH_LE_SUPPORT ?= true
 BOARD_WIFI_SUPPORT ?= true
 
 #for rk 4g modem
-BOARD_HAS_RK_4G_MODEM ?= false
+BOARD_HAS_RK_4G_MODEM ?= true
 
 ifeq ($(strip $(BOARD_HAS_RK_4G_MODEM)),true)
 DEVICE_MANIFEST_FILE += device/rockchip/common/4g_modem/manifest.xml

修复 usb_dongle 的编译错误

修改external/usb_modeswitch/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

@@ -31,9 +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,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>

📁附言

参考文章

  1. RK3568移远4G模块EC20_qlril-CSDN博客
  2. RK3568 系列 21—— 移远 4G 模块配置 | 呉真的博客

附件

  1. Quectel_EC800E-CNEC800Z-CNEC801E-CN_兼容设计手册_V1.0.pdf
  2. Quectel_Android_RIL_Driver_User_Guide_V2.0-1.pdf
  3. Quectel_Android_RIL_Driver_V3.6.22.zip