一、子系统构建背景与技术基石
openvela 已广泛应用于多类消费终端产品,而部分终端(如轻智能 eSIM 手表)对蜂窝通信功能有需求。为满足这一需求,openvela 决定构建标准化、兼容性良好且可持续演进的 Telephony 子系统。
该子系统选择 oFono 作为基础进行扩展开发,原因在于 oFono 是面向基于 Linux 的嵌入式移动设备和桌面系统的 Telephony Host Stack,采用 GPLv2 协议,以 C 语言、GLib 和 DBus 实现,且支持多种调制解调器(ATModem、RILModem、ISIModem 等),其技术优势和开源生态能很好地满足蜂窝通信功能需求。
二、移动通信解决方案架构与功能
openvela 将 oFono 集成到系统中,并增强了其移动通信能力(如支持 VoLTE 语音通话)。通过层级封装和解耦以及多样化的芯片平台集成方式,实现了上层应用程序的跨平台复用,为用户提供优质通信体验。
整体架构以 oFono 作为 Telephony 服务层,对外提供 TAPI(Telephony API)接口,下层对接 RIL(Radio Interface Layer)层,以此实现完整的 Telephony 功能。
核心接口层:TAPI 与 RIL
- Telephony API(TAPI)
TAPI 是基于 DBus Lib 库的 oFono D-Bus 接口封装层,其目标是对 oFono Stack 的所有 D-Bus 接口进行二次封装,使外部应用程序无需感知 D-Bus 或 oFono。TAPI 和 oFono 基于 C/S 架构,通过 D-Bus 实现消息分发和订阅。
内部按业务功能划分为多个模块,具体如下:
模块 | 文件 | 说明 |
---|---|---|
公共接口 | tapi_manager.c、tapi.h | 提供 Telephony 公共接口 |
工具接口 | tapi_utils.c/h | 提供 Telephony 工具类接口 |
通话接口 | tapi_call.c/h、tapi_ussd.c/h | 负责通话管理 |
网络接口 | tapi_network.c/h | 提供网络注册接口 |
数据接口 | tapi_gprs.c/h | 提供数据服务接口 |
SIM 接口 | tapi_sim.c/h、tapi_stk.c/h | 负责 SIM 卡管理 |
短信接口 | tapi_sms.c/h | 负责短信管理 |
IMS 接口 | tapi_ims.c/h | 提供 IMS 服务接口 |
测试工具 | telephony_tools.c | 提供客户端模拟工具 |
- RIL(Radio Interface Layer)
Telephony 通过 RIL 机制与调制解调器(Modem)交互,Telephony 层借助 Socket 与 RILD 进程通信,而 RILD 进程内嵌 Vendor RIL,用于与 Modem 交互。
其设计原则为:参考 Android 12 RIL AOSP 设计,基于 oFono 原生支持的 Android 4.3 RIL 接口,按业务需求挑选接口且参数与 Android 一致;不支持 Android 定义的 CDMA 和 NR5G 相关接口;IMS 相关接口按 openvela 需求独立设计;还会按业务需求扩展定制部分接口。数据结构参考 oFono 源码 gril/parcel.h 中的 Socket 字节流数据结构定义。
此外,Reference RIL 提供适用于 QEMU Emulator 的参考实现,可模拟电话、短信、上网等 Telephony 功能,方便在 QEMU 模拟器上调试应用程序的 Telephony 功能。它分为 openvela LibRIL(接口标准)和 Reference QEMU RIL(QEMU 模拟器参考实现),商用产品中两者共同实现完整 RIL 功能。
三、Telephony 业务适配要点
在 openvela 系统上实现 Telephony 功能,需完成三方面适配工作:
- 蜂窝应用层 APP:调用 TAPI 接口,实现 UI 应用的控制和显示。
- 蜂窝控制面逻辑 Vendor RIL:参考 openvela Reference QEMU RIL 实现与 Modem 的控制面交互。
- 蜂窝数据面:适配语音流和数据流的传输逻辑,具体如下:
- Voice 语音适配:语音控制面逻辑通道为 TAPI -> oFono voice -> RIL -> Modem;语音数据面由 Modem 与 Audio DSP 直接交互,完成语音流的收发和编解码,支持 LTE IMS 的 VoLTE 语音、GSM 和 WCDMA 下的 CS 语音,且需要芯片厂商开发 openvela 的音频驱动。
- Data 数据服务:数据控制面通过 oFono gprs -> RIL -> Modem 逻辑通道实现。数据激活流程中,Vendor RIL 收到 Modem 返回的 IP 信息后,负责创建 openvela OS 的网卡并填充 IP 等信息,蜂窝网卡可在 Vendor RIL 中或 Modem 芯片厂商的 openvela 驱动适配层中创建。蜂窝网卡驱动由 Modem 硬件交互(与外界进行数据收发的 Modem 驱动)和网络设备结构体实现(包含协议栈所需回调函数并注册到协议栈)组成,两者需实现数据高效传递。推荐采用基于 TUN 虚拟网卡的实现方案,适用于对带宽要求不高、不需要极限网络性能的场景,操作简单但可能存在性能瓶颈。
四、系统配置说明
要使 openvela 系统具备完整的蜂窝通信能力,需进行以下配置,同时还需根据具体产品平台启用对应的 modem 配置:
配置类别 | 配置项 |
---|---|
DBUS 配置 | CONFIG_DBUS_DAEMON=y、CONFIG_DBUS_MONITOR=y、CONFIG_DBUS_SEND=y、CONFIG_LIB_DBUS=y、CONFIG_LIBC_EXECFUNCS=y、CONFIG_LIBC_MAX_EXITFUNS=4、CONFIG_NET_LOCAL_SCM=y |
GLIB 配置 | CONFIG_LIB_GLIB=y |
oFono 配置 | CONFIG_OFONO=y、CONFIG_OFONO_RILMODEM=y(启用 rilmodem 以支持 ril 通信)、CONFIG_OFONO_STACKSIZE=32768、CONFIG_SIGNAL_FD=y、CONFIG_LIBC_DLFCN=y(oFono 编译必需的 dlopen 系列接口库) |
GDBUS 配置 | CONFIG_LIB_DBUS=y、CONFIG_ALLOW_BSD_COMPONENTS=y |
Telephony API 配置 | CONFIG_TELEPHONY=y(启用 Telephony 功能,子项建议保持默认)、CONFIG_TELEPHONY_TOOL=y;单卡产品需将 “active modem count” 设为 1,“modem path” 设为 /ril_0 |
通过上述架构设计、功能实现与配置,openvela Telephony 子系统能够为各类终端产品提供稳定、高效的蜂窝通信服务,助力 openvela 生态系统的进一步丰富和发展。