一 内核驱动集成
参考:Quectel_LTE&5G_Linux_USB_Driver_V1.0.zip
EC20 内核驱动有两个版本 ,一个是 qmi_wwan, 一个是 GOBNet , 这里用的是 qmi_wwan版本
1.1 添加 USBNET 驱动文件
将驱动包里的 qmi_wwan_q.c 拷到 kernel/driver/net/usb/ 下
修改 kernel/driver/net/usb/Makefile, 增加
obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan_q.o
修改 kernel/.config
CONFIG_USB_NET_QMI_WWAN=y
1.2 修改 usb转串口
--- a/kernel/drivers/usb/serial/option.c
+++ b/kernel/drivers/usb/serial/option.c
@@ -596,9 +596,12 @@ static const struct usb_device_id option_ids[] = {
{ USB_DEVICE(0x2C7C, 0x0191) }, /* Quectel EG91 */
{ USB_DEVICE(0x2C7C, 0x0195) }, /* Quectel EG95 */
{ USB_DEVICE(0x2C7C, 0x0306) }, /* Quectel EG06/EP06/EM06 */
- { USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG96 */
+ { USB_DEVICE(0x2C7C, 0x0512) }, /* Quectel EG12/EM12/EG18 */
+ { USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG95 */
+ { USB_DEVICE(0x2C7C, 0x0700) }, /* Quectel BG96 */
{ USB_DEVICE(0x2C7C, 0x0435) }, /* Quectel AG35 */
{ USB_DEVICE(0x2C7C, 0x6002) }, /* Quectel EC200s */
+ { USB_DEVICE(0x2C7C, 0x0620) }, /* Quectel EG20 */
{ USB_DEVICE(0x2c7c, 0x6026) }, //EC200T
{ USB_DEVICE(0x2dee, 0x4d20) }, //for meige SLM790
{ USB_DEVICE(0x05c6, 0xf601) }, //for meige SLM730
@@ -2175,6 +2178,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
};
@@ -2217,6 +2223,19 @@ static int option_probe(struct usb_serial *serial,
*/
if (device_flags & NUMEP2 && iface_desc->bNumEndpoints != 2)
return -ENODEV;
+ #if 1 //Added by Quectel
+ //Quectel modules鈥檚 interface 4 can be used as USB network device
+ if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {
+ //some interfaces can be used as USB Network device (ecm, rndis, mbim)
+ if (serial->interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
+ return -ENODEV;
+ }
+ //interface 4 can be used as USB Network device (qmi)
+ else if (serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) {
+ return -ENODEV;
+ }
+ }
+#endif
修改 usb_wwan zero_packet 配置
/* Store the device flags so we can use them during attach. */
usb_set_serial_data(serial, (void *)device_flags);
diff --git a/kernel/drivers/usb/serial/usb_wwan.c b/kernel/drivers/usb/serial/usb_wwan.c
index c604ff4546..752bb7f133 100644
--- a/kernel/drivers/usb/serial/usb_wwan.c
+++ b/kernel/drivers/usb/serial/usb_wwan.c
@@ -506,6 +506,7 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
usb_sndbulkpipe(serial->dev, endpoint) | dir,
buf, len, callback, ctx);
+
if (intfdata->use_zlp && dir == USB_DIR_OUT)
urb->transfer_flags |= URB_ZERO_PACKET;
@@ -513,6 +514,9 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
if ((desc->idVendor == cpu_to_le16(0x1286) &&
desc->idProduct == cpu_to_le16(0x4e3c)))
urb->transfer_flags |= URB_ZERO_PACKET;
+
+ if (desc->idVendor == cpu_to_le16(0x2C7C))
+ urb->transfer_flags |= URB_ZERO_PACKET;
}
return urb;
}
重新 编译烧写后 板子下应该能看到 EC20的 网络接口以及 AT 拨号串口
二 FIRMWARE 层驱动集成
2.1 AT 串口文件 /dev/cdc-wdm0
--- a/system/core/init/devices.cpp
+++ b/system/core/init/devices.cpp
@@ -492,7 +492,15 @@ void DeviceHandler::HandleUevent(const Uevent& uevent) {
int device_id = uevent.minor % 128 + 1;
devpath = StringPrintf("/dev/bus/usb/%03d/%03d", bus_id, device_id);
}
- } else if (StartsWith(uevent.subsystem, "usb")) {
+ }
+
+#if 1 //add by quectel for mknod /dev/cdc-wdmo
+ 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;
} else {
2.2 cdc-wdm 文件权限
--- a/device/rockchip/common/ueventd.rockchip.rc
+++ b/device/rockchip/common/ueventd.rockchip.rc
@@ -87,6 +87,8 @@
/dev/ttyUSB8 0660 radio radio
/dev/ttyUSB9 0660 radio radio
+#for cdc-wdm0
+/dev/cdc-wdm* 0660 radio radio
2.2 4G 拨号服务
4G 拨号服务由 libreference-ril.so android 标准服务以及一堆配置和脚本 组成
libreference-ril.so 由移远提供的 Quectel_Android_RIL_Driver_V3.5.49.zip 包中包含,选择 andriod10 64bit 即可, 这里为不跟别的4G模块冲突,改为 librefernce-ril-ec20.so
2.2.1 添加 librefernce-ril-ec20.so 开机 服务
--- a/device/rockchip/common/rootdir/init.rk30board.rc
+++ b/device/rockchip/common/rootdir/init.rk30board.rc
@@ -347,7 +347,7 @@ on property:flash.success=1
setprop vendor.flash.success 1
#hardware/ril/rild/rild.rc
-service vendor.ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libquectel-ril.so
+service vendor.ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril-ec20.so
class main
user root
group radio vpn cache inet misc audio log readproc wakelock
index f6beb5468f..f3e4682483 100644
--- a/hardware/ril/rild/rild.rc
+++ b/hardware/ril/rild/rild.rc
@@ -1,4 +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
+# capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
+
+service vendor.ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril-ec20.so
2.2.2 添加 librefernce-ril-ec20.so 拨号配置
添加 vendor/rockchip/common/phone/etc/ql-ril.conf , 内容如下
#This file is in a state of unavailability.
#In most cases, there is no need to open any option.
#In special cases, please use it under the guidance of FAE.
#LTE_SignalStrength=-1
#LTE_Is_Report_SignalStrength=1
#At_Cmds_For_Customer_Initialize=at+csq;at+cgreg?;at+cops?;at+qcfg="nwscanmodeex"
#At_Cmds_For_Customer_Initialize=AT+QSIMDET=1,1;AT+QCFG="usbcfg",0x2C7C,0x0125,1,1,1,1,1,1,1
At_Cmds_For_Customer_Initialize=AT+QCFG="usbcfg",0x2C7C,0x0125,1,1,1,1,1,0,1;
#Icc_Constants=EF_ICCID
#support_CDMPhone=1
#URC_delay_mseconds=2000
#Query_Available_Networks=1
#0-not support; 1-support low level; 2-support high level
Sim_Hot_Plugging=2
LTE_Is_Report_SignalStrength=1 # 不打开没有信号 指示
2.2.3 其余 FIRMWARE 配置 (适配 EC20)
--- a/device/rockchip/common/5g_modem/manifest.xml
+++ b/device/rockchip/common/5g_modem/manifest.xml
@@ -17,12 +17,12 @@
</hal> -->
<hal format="hidl">
- <name>android.hardware.radio.config</name>
+ <name>android.hardware.radio</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
- <name>IRadioConfig</name>
- <instance>default</instance>
+ <name>IRadio</name>
+ <instance>slot1</instance>
</interface>
</hal>
--- a/device/rockchip/common/BoardConfig.mk
+++ b/device/rockchip/common/BoardConfig.mk
@@ -437,7 +437,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
--- a/device/rockchip/common/init.rk30board.rc
+++ b/device/rockchip/common/init.rk30board.rc
@@ -256,9 +256,9 @@ on property:persist.internet_adb_enable=0
restart adbd
# for telephony function
-on property:ro.boot.noril=true
- setprop ro.radio.noril true
- stop ril-daemon
+#on property:ro.boot.noril=true
+# setprop ro.radio.noril true
+# stop ril-daemon
--- a/device/rockchip/common/manifest.xml
+++ b/device/rockchip/common/manifest.xml
@@ -73,15 +73,6 @@
<fqname>@1.1::IRadio/slot2</fqname>
<fqname>@1.2::ISap/slot1</fqname>
</hal>
- <hal format="hidl">
- <name>android.hardware.radio.deprecated</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IOemHook</name>
- <instance>slot1</instance>
- </interface>
- </hal>
<kernel target-level="5"/>
</manifest>
2.3 COPY FIRMWARE 文件到生产系统
--- a/device/rockchip/common/device.mk
+++ b/device/rockchip/common/device.mk
@@ -271,7 +271,7 @@ PRODUCT_PACKAGES += \
CarrierDefaultApp \
CarrierConfig \
rild \
- librk-ril \
+ libreference-ril-ec20 \
dhcpcd
@@ -286,14 +286,14 @@ 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-ec20.so
--- a/device/rockchip/rk356x/device.mk
+++ b/device/rockchip/rk356x/device.mk
@@ -59,13 +59,13 @@ $(call inherit-product, device/rockchip/common/rootdir/rootdir.mk)
$(call inherit-product, device/rockchip/common/modules/5g_modem.mk)
PRODUCT_COPY_FILES += \
device/rockchip/common/5g_modem/ql-ril.conf:vendor/etc/ql-ril.conf \
- device/rockchip/common/5g_modem/lib64/libreference-ril.so:vendor/lib64/libquectel-ril.so \
kernel/drivers/pcie_mhi/pcie_mhi.ko:vendor/lib/modules/pcie_mhi.ko \
device/rockchip/common/5g_modem/pcie_modem.sh:vendor/bin/pcie_modem.sh \
device/rockchip/common/5g_modem/lib64/chat:system/bin/chat \
device/rockchip/common/5g_modem/lib64/call-pppd:system/etc/ppp/call-pppd \
device/rockchip/common/5g_modem/lib64/ip-down:system/etc/ppp/ip-down \
device/rockchip/common/5g_modem/lib64/ip-up:system/etc/ppp/ip-up \
+ device/rockchip/common/5g_modem/manifest.xml:/vender/manifest.xml \
out/soong/.intermediates/system/core/libcutils/libcutils/android_arm64_armv8-a_cortex-a55_shared/libcutils.so:vendor/lib64/libcutils.so \
out/soong/.intermediates/system/core/libnetutils/libnetutils/android_arm64_armv8-a_cortex-a55_shared_cfi/libnetutils.so:vendor/lib64/libnetutils.so
# device/rockchip/common/5g_modem/switch-card1.sh:vendor/bin/switch-card1.sh \
@@ -99,12 +99,13 @@ PRODUCT_COPY_FILES += \
#4G
PRODUCT_PACKAGES += rild
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/libquectel-ril/arm64-v8a/libreference-ril.so:vendor/lib64/libquectel-ril.so \
$(LOCAL_PATH)/libquectel-ril/arm64-v8a/chat:system/bin/chat \
$(LOCAL_PATH)/libquectel-ril/arm64-v8a/ip-up:system/bin/ip-up \
$(LOCAL_PATH)/libquectel-ril/arm64-v8a/ip-down:system/bin/ip-down \
- $(LOCAL_PATH)/libquectel-ril/ql-ril.conf:/system/etc/ql-ril.conf \
- $(LOCAL_PATH)/libquectel-ril/apns-conf.xml:system/etc/apns-conf.xml
+ $(LOCAL_PATH)/libquectel-ril/apns-conf.xml:system/etc/apns-conf.xml \
+ vendor/rockchip/common/phone/lib/libreference-ril-ec20.so:vendor/lib64/libreference-ril-ec20.so \
+ vendor/rockchip/common/phone/etc/ql-ril.conf:system/etc/ql-ril.conf \
+
PRODUCT_PACKAGES += \
messaging
@@ -117,7 +118,7 @@ PRODUCT_PROPERTY_OVERRIDES += \
ro.opengles.version=196610 \
wifi.interface=wlan0 \
ro.telephony.default_network=9 \
- vendor.rild.libpath=/vendor/lib64/libquectel-ril.so \
+ vendor.rild.libpath=/vendor/lib64/libreference-ril-ec20.so \
vendor.rild.libargs=-d/dev/ttyUSB2 \
ro.audio.monitorOrientation=true \
debug.nfc.fw_download=false \
三 问题诊断
可以通过 LOGCAT 看到 AT 拨号及日志, (略)