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 驱动
- 参考
Quectel_Android_RIL_Driver_User_Guide_V2.0-1.pdf将Quectel_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 - 将驱动中的
libquectel-ril/ql-ril.conf复制为$PROJECT_TOP/vendor/rockchip/common/phone/etc/ql-ril.conf - 解除ql-ril.conf中LTE_Is_Report_SignalStrength=1的注释,打开此功能
- 修改
$PROJECT_TOP/vendor/rockchip/common/phone/phone.mk,使编译时将libreference-ril.so和ql-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 配置
- 修改
$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
- 修改
$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
- 修改
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>
📁附言
参考文章
附件
- Quectel_EC800E-CNEC800Z-CNEC801E-CN_兼容设计手册_V1.0.pdf
- Quectel_Android_RIL_Driver_User_Guide_V2.0-1.pdf
- Quectel_Android_RIL_Driver_V3.6.22.zip