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 |
rk_modem: rk-modem { |
另外原始的驱动是针对RK自己的RM310模块,这里参考移远的《Quectel_EC200N-CN_硬件设计手册_V1.1》修改了一下驱动的上电顺序。
1 |
diff kernel/drivers/net/lte/lte_rm310.c |
这两步完成后编译刷机上电,正确的话应该能在dmesg日志中认到这个4G模块,其VendorId不论什么型号,只要是移远的应该均为0x2c7c,例如如下显示。由于4G模块步骤较多,建议一步一步的完成,方便排查问题出在哪个阶段。
1 |
dmesg |
内核驱动配置
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 |
245 |
添加Zero Packet机制
修改kernel/drivers/usb/serial/usb_wwan.c。
1 |
static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, |
添加Reset-resume机制
修改kernel/drivers/usb/serial/option.c。
1 |
static struct usb_serial_driver option_1port_device = { |
让网卡被正确的驱动加载
修改kernel/drivers/usb/serial/option.c。让模块的网卡被wwan驱动或ecm驱动加载,而不是USB Serial option驱动,这里针对使用wwan的EC20系列和使用ecm的EC200系列略有不同,我直接整合在了一起,这样更换任意系列都能驱动。
1 |
static int option_probe(struct usb_serial *serial, |
网卡驱动
网卡驱动按照型号分为ECM和WWAN两种,你可以只添加自己需要的,也可以都添加,这样更换4G模块后也能支持使用。
ECM驱动官方文档说明可以直接使用上游内核的版本,因此直接使能即可,事实上最新版的SDK已经使能了,因此并不需要做这个步骤。
1 |
CONFIG_USB_NET_DRIVERS |
WWAN驱动需要经过修改,但是移远官方提供了一个修改好的版本,直接加入即可使用,这里需要从官方拿到《Quetecl_Linux_Android_QMI_WWAN_Driver_V1.2.2》或更新版本。
- 将
qmi_wwan_q.c复制到kernel/drivers/net/usb/下 - 在内核配置中使能,事实上最新版的SDK已经使能了,因此并不需要做这个步骤
1 |
CONFIG_USB_NET_DRIVERS |
- 修改
kernel/drivers/net/usb/Makefile,qmi_wwan_q.o必须添加在qmi_wwan.o之前
1 |
+obj-${CONFIG_USB_NET_QMI_WWAN} += qmi_wwan_q.o |
- 修改
system/core/init/devices.ppp,这一步是否需要未经证实
1 |
diff --git a/init/devices.cpp b/init/devices.cpp |
使能PPP
在内核配置中使能PPP相关的配置,事实上最新版的SDK已经使能了,因此并不需要做这个步骤。
1 |
CONFIG_PPP |
测试
完成这些步骤后编译刷机上电,正确的话应该能在dmesg日志中认到一个网卡设备,例如如下显示。使用ip addr show命令应该也能看到增加了一个新的接口,usb0或wwan0。
1 |
dmesg |
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驱动
- 将驱动中的
libquectel-ril/arm64_v8a/libreference-ril.so复制为vendor/rockchip/common/phone/lib/libreference-ril-quectel.so - 将驱动中的
libquectel-ril/ql-ril.conf复制为vendor/rockchip/common/phone/etc/ql-ril.conf - 将
ql-ril.conf中LTE_Is_Report_SignalStrength=1信号强度反馈功能的注释删掉,打开此功能 - 修改
vendor/rockchip/common/phone.mk文件,让编译时①和②步骤中的两个文件能够被复制到镜像中
1 |
diff --git a/phone/phone.mk b/phone/phone.mk |
配置ril-daemon服务
修改hardware/ril/rild/rild.rc文件。
1 |
diff --git a/rild/rild.rc b/rild/rild.rc |
增加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 |
<hal format="hidl"> |
添加SELinux配置
这一部分可以直接参考移远的官方文档,文件目录分别位于:
device/rockchip/common/ueventd.rockchip.rcdevice/rockchip/common/sepolicy/private/file_contextssystem/sepolicy/vendor/rild.te
替换RK自带的ril服务
修改device/rockchip/common/device.mk文件。
1 |
diff --git a/device.mk b/device.mk |
在板级配置中使能相关配置
修改板级BoardConfig.mk文件。
1 |
BOARD_HAS_RK_4G_MODEM := true |
修改板级alpha.mk文件,EC200系列的/dev/ttyUSB2是modem,其他系列具体请查询移远的文档。另外这里注意rild.libargs中的-d与后面的/dev/ttyUSB2中间不能有空格。
1 |
PRODUCT_PROPERTY_OVERRIDES += \ |
修复usb_dongle的编译错误
修改external/usb_modeswitch/usb_dongle/Android.mk文件。
1 |
diff --git a/usb_dongle/Android.mk b/usb_dongle/Android.mk |
在设置中新增“移动网络”选项
修改device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml文件。
1 |
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml |
添加APN配置
RK自带的已经可以正常使用,文件位于vendor/rockchip/common/phone/etc/apns-full-conf.xml。
测试
完成这些步骤后编译刷机上电,正确的话界面应该可以看到4G图标并上网。使用ip addr show命令应该也能看到usb0或wwan0接口已经获取到了IP地址。