文档概述

说明:

  1. 文章由移远通信技术股份有限公司提供
  2. 以下内容包含了个人理解,仅供参考,如有不合理处,请联系笔者修改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
在这里插入图片描述

五、效果展示

在这里插入图片描述
在这里插入图片描述

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐