What to build
根据已公开的 OpenHarmony NearLink 调用链,为 OpenSparkLink 定义一个有深度的 Controller Backend Interface,并把 vendor lifecycle、channel 和物理 transport 留作 Adapter 内部 Seam;不要在 Linux 内核复刻 HDF/HDI IPC 服务。
建议结构:
Host Modules
-> DLI Host Module
-> Controller Backend Interface
-> NativeBackend
-> UserspaceProxyBackend -> slk-vendord -> OpaqueVendor Adapter
-> VirtualBackend
-> ExternalKernelBackend(可选、非首选)
公开 Controller Backend Interface 应是 probe/start/send/stop/recover 加 RX/fault/hangup callback 和 capability;它收发完整标准 DLI packet,但不暴露 SSAP、配对或 PHY policy。
DLI Host Module 独占标准 DLI command/event/data 语义、opcode 参数编码、event 解码、命令排序、completion 关联、timeout、version/capability 协商与恢复。
Backend variants
NativeBackend:可在 Implementation 内组合 kernel DliChannel 与 USB、serdev/UART、SPI Transport Adapter。
UserspaceProxyBackend:内核 Adapter 通过版本化 backend channel 与独立 slk-vendord 通信。daemon 在用户态加载闭源 vendor library,并将 vendor lifecycle ABI 与 fd channel 归一化为完整 DLI packet。
VirtualBackend:通过内存 queue 和可控 event 实现相同 Interface,用于测试 DLI Host transaction、故障与恢复。
ExternalKernelBackend:只在厂商无法提供标准 DLI 固件或用户态库时作为最后选项,通过小型 versioned C registration Interface 接入 out-of-tree module;不对厂商暴露 Rust ABI。
这里将“Opaque vendor 路径”定义为 UserspaceProxyBackend + slk-vendord + OpaqueVendor Adapter。内核中不 dlopen,也不让闭源库、vendor opcode 或 void * 参数进入公共 kernel Interface。若厂商固件能直接暴露标准 DLI,应优先使用 NativeBackend。
Internal seams
- Kernel
DliChannel Interface:用于 Native/Virtual Adapter,负责 send packet、set receiver、close、backpressure、hangup 与 ownership;可由 USB endpoint、serdev、SPI 或 virtual queue 实现,并集中 framing、长度校验和 partial I/O。
BackendProxy UAPI:仅供受信任 slk-vendord 注册/拥有一个 controller。它传输 lifecycle message 和完整标准 DLI packet,不等同于普通管理 chardev、raw DLI Interface 或 snoop Interface。
- Userspace
VendorLifecycle Interface:在 slk-vendord 内将 size/init/op/close 封装成 typed operation;vendor opcode 和 void * 不得越过 Adapter。
- Userspace
VendorDliChannel Interface:独占 vendor fd,集中 H4/DLI framing、partial I/O、epoll、backpressure、hangup 与 packet validation。
每个 SleDev 独占 DLI Host、Backend handle、channel/parser、queue、pending command、lease/generation 和 recovery state,不通过全局 active state 共享。
Closed vendor userspace integration
kernel DLI Host
-> UserspaceProxyBackend
<-> /dev/sparklink-backendN
<-> slk-vendord
-> typed VendorLifecycle Adapter
-> closed vendor .so
-> vendor fd / chip
BackendProxy UAPI v1 至少包括:
REGISTER(abi_version, size, descriptor, capabilities, max_packet),返回 controller id、独占 lease 与 generation;
START/STOP/RESET/RECOVER 和 READY/FAILED/FAULT/HANGUP/UNREGISTER;
- kernel → daemon 的完整 DLI command/data packet;
- daemon → kernel 的完整 DLI event/data packet;
- version、message type、flags、controller id、generation、length、sequence/correlation id;
- 有界队列、背压、超时、overflow counter 和 fd-close 自动 detach。
第一版使用 read/write/poll 或 readv/writev。只有 benchmark 证明 copy/context switch 成为瓶颈时,才增加可协商的 mmap ring + eventfd;不要让共享内存布局成为 v1 的必要条件。
slk-vendord 必须独立于 slkd:前者只提供 controller transport/backend,后者继续拥有产品启用、D-Bus、配对/信任、SSAP/Profile 和 PHY policy。daemon 或 vendor library 崩溃、阻塞或 fd 关闭时,只使对应 controller unavailable,不拖垮 slkd 或其他 controller。
对应用户态实现与隔离要求由 OpenSparklink/sparklink#7 跟踪。
OpenHarmony reference evidence
已公开的调用链是:
ArkTS/C++ → nearlink_service → nearlink_dli_adapter → NearLink HCI HDI → 通用 peripheral NearLink HDI Implementation → vendor adapter → libnearlink_sle_vendor[_chiptype].z.so → chip
- drivers_interface PR 2004,提交
9ddb3c88f1ff7305034f5dfe8fe4f67e5382539e:HCI v1.0 只有 SleHalInit、SleSendHciPacket、Close 以及 initializationComplete、hciPacketReceived callback;v1.1 只增加 CheckOnBoardState。
- drivers_peripheral PR 8987,提交
b97be697c9cf0484305446f9a3f5104b74c8a629:通用 Implementation 负责 H4/DLI framing、fd watcher、HDI service、动态库加载和 packet callback。
- 公开 vendor ABI 是
SleVendorInterfaceT { size, init(), op(opcode,param), close() }。SLE_OP_DLI_CHANNEL_OPEN 返回 channel fd;通用 watcher/H4 parser 从 fd 读取后,再通过 HDI callback 上送。
- ABI 声明 power、init、LPM、wake、EVENT_CALLBACK 等 opcode,但当前通用 HCI 主路径只实际调用 channel open/close。
init 不接收 callback,EVENT_CALLBACK 也没有当前调用点。
- 动态库按
const.nearlink.slechiptype 选择 libnearlink_sle_vendor[_chiptype].z.so,并要求 NEARLINK_VENDOR_LIB_INTERFACE;公开源码树没有真正芯片 vendor library。
- 通用
CheckOnBoardState 当前硬编码 true,不能作为真实硬件探测。
- 通用 HDI 还在下层编码
DLI_SET_SLE_ADDR 并处理其 CommandComplete。这是标准 DLI 知识向下泄漏的反例,不应复制到 OpenSparkLink Backend。
上述事实说明:值得借鉴的是小型 vendor Adapter 及通用 channel/framing Implementation,不是 OpenHarmony 的 IPC/HDF 服务形态。OpenSparkLink 在 Linux 上进一步把闭源 library 隔离到独立用户态 daemon。
Proposed ownership
| 能力 |
内核 |
用户态 |
| 标准 DLI command/event/data、事务、timeout、capability/version |
DLI Host Module |
不直接操作 |
| Native H4/DLI framing、channel ownership、backpressure、hangup |
Backend 内部 DliChannel |
不拥有 |
| 闭源 vendor lifecycle、vendor fd/H4 framing |
只见 Proxy message |
slk-vendord 私有 |
| power、channel、LPM、wake、probe、recover |
Controller Backend mechanism |
slk-vendord 只执行 vendor Adapter mechanism |
| 固件、mailbox、USB/UART/SPI、厂商私有协议 |
Adapter 私有 Implementation |
仅 opaque vendor Adapter 私有 |
| 链路状态、数据面、加密执行 |
拥有 |
slkd 配置与观察 |
| 配对 mechanism 与时序敏感密码学 |
拥有 |
slkd 拥有 Agent、认证/trust policy、Bond 持久化 |
| TCID/链路数据通道、低层分片流控、安全上下文 |
拥有 |
不拥有 |
| SSAP codec、session、MTU、事务、服务数据库、Profile |
不拥有 |
slkd 拥有 |
| PHY capability、合法性、原子应用、actual state |
拥有 |
slkd 拥有偏好、QoS、自动调优与功耗 policy |
| 产品启用、服务策略、D-Bus 与本地授权 |
不拥有 |
slkd、发行版或产品配置拥有 |
Integration states
必须区分:
- Source registered:源码、Kconfig、package 或 build manifest 中存在。
- Product enabled:具体产品或发行版显式启用内核 Module、
slkd、必要的 slk-vendord 和 policy。
- Backend present:匹配的 Native、UserspaceProxy/OpaqueVendor 或 Virtual Adapter 实际存在,proxy owner/lease 有效。
- Controller ready:channel 已打开,初始化完成,DLI 可收发。
OpenHarmony 的 productdefine 变更只注册 drivers_peripheral_nearlink 和 drivers_interface_nearlink;nearlink_service 仍需产品 config 单独加入,并设置 const.nearlink.enable=1。OpenSparkLink 也不能把 source registered、vendor library 已安装或 daemon 进程存在当成 enabled、Backend present 或 controller ready。
Acceptance criteria
Implementation slices
Blocked by
None - can start immediately.
What to build
根据已公开的 OpenHarmony NearLink 调用链,为 OpenSparkLink 定义一个有深度的 Controller Backend Interface,并把 vendor lifecycle、channel 和物理 transport 留作 Adapter 内部 Seam;不要在 Linux 内核复刻 HDF/HDI IPC 服务。
建议结构:
公开 Controller Backend Interface 应是
probe/start/send/stop/recover加 RX/fault/hangup callback 和 capability;它收发完整标准 DLI packet,但不暴露 SSAP、配对或 PHY policy。DLI Host Module 独占标准 DLI command/event/data 语义、opcode 参数编码、event 解码、命令排序、completion 关联、timeout、version/capability 协商与恢复。
Backend variants
NativeBackend:可在 Implementation 内组合 kernelDliChannel与 USB、serdev/UART、SPI Transport Adapter。UserspaceProxyBackend:内核 Adapter 通过版本化 backend channel 与独立slk-vendord通信。daemon 在用户态加载闭源 vendor library,并将 vendor lifecycle ABI 与 fd channel 归一化为完整 DLI packet。VirtualBackend:通过内存 queue 和可控 event 实现相同 Interface,用于测试 DLI Host transaction、故障与恢复。ExternalKernelBackend:只在厂商无法提供标准 DLI 固件或用户态库时作为最后选项,通过小型 versioned C registration Interface 接入 out-of-tree module;不对厂商暴露 Rust ABI。这里将“Opaque vendor 路径”定义为
UserspaceProxyBackend + slk-vendord + OpaqueVendor Adapter。内核中不dlopen,也不让闭源库、vendor opcode 或void *参数进入公共 kernel Interface。若厂商固件能直接暴露标准 DLI,应优先使用NativeBackend。Internal seams
DliChannel Interface:用于 Native/Virtual Adapter,负责 send packet、set receiver、close、backpressure、hangup 与 ownership;可由 USB endpoint、serdev、SPI 或 virtual queue 实现,并集中 framing、长度校验和 partial I/O。BackendProxy UAPI:仅供受信任slk-vendord注册/拥有一个 controller。它传输 lifecycle message 和完整标准 DLI packet,不等同于普通管理 chardev、raw DLI Interface 或 snoop Interface。VendorLifecycle Interface:在slk-vendord内将size/init/op/close封装成 typed operation;vendor opcode 和void *不得越过 Adapter。VendorDliChannel Interface:独占 vendor fd,集中 H4/DLI framing、partial I/O、epoll、backpressure、hangup 与 packet validation。每个
SleDev独占 DLI Host、Backend handle、channel/parser、queue、pending command、lease/generation 和 recovery state,不通过全局 active state 共享。Closed vendor userspace integration
BackendProxy UAPI v1 至少包括:
REGISTER(abi_version, size, descriptor, capabilities, max_packet),返回 controller id、独占 lease 与 generation;START/STOP/RESET/RECOVER和READY/FAILED/FAULT/HANGUP/UNREGISTER;第一版使用
read/write/poll或readv/writev。只有 benchmark 证明 copy/context switch 成为瓶颈时,才增加可协商的 mmap ring + eventfd;不要让共享内存布局成为 v1 的必要条件。slk-vendord必须独立于slkd:前者只提供 controller transport/backend,后者继续拥有产品启用、D-Bus、配对/信任、SSAP/Profile 和 PHY policy。daemon 或 vendor library 崩溃、阻塞或 fd 关闭时,只使对应 controller unavailable,不拖垮slkd或其他 controller。对应用户态实现与隔离要求由 OpenSparklink/sparklink#7 跟踪。
OpenHarmony reference evidence
已公开的调用链是:
ArkTS/C++ → nearlink_service → nearlink_dli_adapter → NearLink HCI HDI → 通用 peripheral NearLink HDI Implementation → vendor adapter → libnearlink_sle_vendor[_chiptype].z.so → chip
9ddb3c88f1ff7305034f5dfe8fe4f67e5382539e:HCI v1.0 只有SleHalInit、SleSendHciPacket、Close以及initializationComplete、hciPacketReceivedcallback;v1.1 只增加CheckOnBoardState。b97be697c9cf0484305446f9a3f5104b74c8a629:通用 Implementation 负责 H4/DLI framing、fd watcher、HDI service、动态库加载和 packet callback。SleVendorInterfaceT { size, init(), op(opcode,param), close() }。SLE_OP_DLI_CHANNEL_OPEN返回 channel fd;通用 watcher/H4 parser 从 fd 读取后,再通过 HDI callback 上送。init不接收 callback,EVENT_CALLBACK也没有当前调用点。const.nearlink.slechiptype选择libnearlink_sle_vendor[_chiptype].z.so,并要求NEARLINK_VENDOR_LIB_INTERFACE;公开源码树没有真正芯片 vendor library。CheckOnBoardState当前硬编码 true,不能作为真实硬件探测。DLI_SET_SLE_ADDR并处理其 CommandComplete。这是标准 DLI 知识向下泄漏的反例,不应复制到 OpenSparkLink Backend。上述事实说明:值得借鉴的是小型 vendor Adapter 及通用 channel/framing Implementation,不是 OpenHarmony 的 IPC/HDF 服务形态。OpenSparkLink 在 Linux 上进一步把闭源 library 隔离到独立用户态 daemon。
Proposed ownership
slk-vendord私有slk-vendord只执行 vendor Adapter mechanismslkd配置与观察slkd拥有 Agent、认证/trust policy、Bond 持久化slkd拥有slkd拥有偏好、QoS、自动调优与功耗 policyslkd、发行版或产品配置拥有Integration states
必须区分:
slkd、必要的slk-vendord和 policy。OpenHarmony 的 productdefine 变更只注册 drivers_peripheral_nearlink 和 drivers_interface_nearlink;nearlink_service 仍需产品 config 单独加入,并设置
const.nearlink.enable=1。OpenSparkLink 也不能把 source registered、vendor library 已安装或 daemon 进程存在当成 enabled、Backend present 或 controller ready。Acceptance criteria
probe/start/send/stop/recover与 RX/fault/hangup callback,不复制 HDI IPC、death recipient、动态服务框架或op(int, void*)。NativeBackend可组合显式 Transport Adapter;UserspaceProxyBackend不被强制暴露底层 bus;VirtualBackend实现同一 Interface。dlopenvendor library;闭源.so、vendor opcode、void *和 vendor fd 仅存在于独立slk-vendord内。slk-vendord的写入只表示 controller RX/lifecycle,不成为绕过 DLI Host 的任意 command Interface;内核重新校验 packet type、length、controller ownership、generation 和状态迁移。SleDev。Implementation slices
Blocked by
None - can start immediately.