OpenHarmony适配外挂Modem模组
文章由移远通信技术股份有限公司提供以下内容包含了个人理解,仅供参考,如有不合理处,请联系笔者修改18770704023(微信同号)本文档记录了作者在rk3562 OpenHarmony 5.0.3适配外挂modem模组的大致流程(型号EG800AK-CN)。作者这里介绍的是不走鸿蒙框架的适配方法,依据鸿蒙框架适配Modem模组可以参考社区专家chenyu大神的文章。
文档概述
说明:
- 文章由移远通信技术股份有限公司提供
- 以下内容包含了个人理解,仅供参考,如有不合理处,请联系笔者修改18770704023(微信同号)
本文档记录了作者在rk3562 OpenHarmony 5.0.3适配外挂modem模组的大致流程(型号EG800AK-CN)。作者这里介绍的是不走鸿蒙框架的适配方法,目前只实现了上网的功能。
一、适配USB驱动
查看Linux_USB驱动_用户指导.pdf文档可以看到EG800K系列模组支持ECM,RNDIS,USB转串口 option等USB驱动。

这里作者选择适配ECM驱动,这个相对简单一些。在rk3562_standard_defconfig文件里添加
CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_USBNET=y
CONFIG_USB_NET_CDCETHER=y
二、移植quectel-CM拨号工具
先找淘宝客服要一份Quectel_QConnectManager_Linux_V1.6源码,要把quectel-CM拨号工具移植到鸿蒙上,主要就是根据源码里面的Makefile来编写一份对应的BUILD.gn文件供鸿蒙编译的时候使用。
从这个Makefile文件里可以看到quectel-CM拨号工具是由
"QmiWwanCM.c",
"GobiNetCM.c",
"main.c",
"QCQMUX.c",
"QMIThread.c",
"util.c",
"qmap_bridge_mode.c",
"mbim-cm.c",
"device.c",
"atc.c",
"atchannel.c",
"at_tok.c",
"udhcpc.c"
等文件通过$(CC) ${CFLAGS} ${QL_CM_SRC} ${QL_CM_DHCP} -o quectel-CM ${LDFLAGS}命令编译出来的。作者在third_party目录下面创建quectel目录,并把工具包命名为quectel-cm复制到third_party\quectel目录下面,参考上面的Makefile再创建一个BUILD.gn文件,具体内容如下:
此外,我们还需要把quectel-cm-group添加到base\telephony\ril_adapter\bundle.json编译
执行./build.sh --product-name rk3562 --ccache命令编译可以在out/rk3562/packages/phone/system/bin目录下面看到quectel-CM可执行文件。
三、自启动quectel-CM拨号工具
在init.rk3562.cfg里参考ispserver服务自启动,来实现quectel-cm自启动。
这里有需要注意的一点是secon进程配置这里,我一开始配置的是"secon" : “u:r:quectel-cm:s0”,发现自启动失败。后来去了解了一下secon这个配置的相关知识点:
secon的格式通常为u:r:domain:s0,各部分含义:
u:用户(user),通常固定为 u(unix user);
r:角色(role),通常固定为 r(role);
domain:域(核心部分,决定权限),进程运行在哪个域,就拥有该域定义的所有权限;
s0:安全级别(通常用于 MLS/MCS 策略,一般固定为 s0)。
secon 的作用是:限制进程的权限范围。通过给进程指定特定的 domain(域),SELinux 会依据预定义的策略(.te 文件),仅允许该进程访问其工作必需的资源,禁止访问无关资源,从而增强系统安全性。
为什么我一开始配置"secon" : "u:r:quectel-cm:s0"会自启动失败,是因为quectel-cm是我自定义的域,系统默认没有这个域的策略,SELinux 遵循 “默认拒绝” 原则:如果某个域没有在策略中明确被允许访问某类资源,访问会被拒绝。而u:r:su:s0 是 su 程序(获取 root 权限的工具)的默认域,这个域在系统中被预定义了 非常宽泛的权限,后面我修改为u:r:su:s0 ,quectel-cm服务自启动成功。
编译烧录使用ps -ef | grep quectel-cm 查看进程在运行说明,自启动成功。
四、遇到的问题
问题一:缺少busybox工具
烧录镜像成功后发现有报错,缺少busybox工具,这里我们内置一下busybox工具进系统即可。
问题二:缺少default.script文件
这个文件是在上面的QConnectManager 工具包里面,和busybox一样直接内置进系统里面。但是这里需要注意的是default.script原本是基于Linux适配的,需要简单的修改一下,把/sbin/route改成busybox route,/sbin/ifconfig改成ifconfig。另外需要在/build/ohos/images/mkimage/dac.txt文件里为default.script文件添加权限
问题三:quectel-cm和/dev/ttyUSB1的时序问题
从内核日志上看还有一个问题,10.4s 启动 quectel-cm → 10.5s 退出(仅 1 秒),此时系统还未识别到 Quectel USB 设备(11.6s 才出现 usb 1-1.3: Manufacturer: Quectel),这导致quectel-cm没有报错就正常退出了。
这里的解决思路是等待/dev/ttyUSB1创建出来之后再去启动quectel-cm。在init.rk3562.cfg文件里,执行start quectel-cm 之前添加wait /dev/ttyUSB1。
修改效果如下:
问题四:dns解析问题
将build\config\components\musl\BUILD.gn文件里面的
OHOS_DNS_PROXY_BY_NETSYS
OHOS_FWMARK_CLIENT_BY_NETSYS都修改为0
实际上在项目过程中我们会发现OHOS_DNS_PROXY_BY_NETSYS设置为0了还是不生效,修改没起作用,一开始以为是没有删除out目录编译才导致了,后来发现并不是。通过阅读代码发现,是third_party\musl\src\network\resolvconf.c这里的问题,逻辑上应该是#if OHOS_FWMARK_CLIENT_BY_NETSYS但是这里写成了#ifdef OHOS_FWMARK_CLIENT_BY_NETSYS,感觉应该是个bug
五、效果展示


更多推荐





所有评论(0)