Harmony LiteOS-A 驱动框架深度解析:HDF 让万物互联更简单

关键词:LiteOS-A、HDF、OpenHarmony、驱动框架、一次开发多端部署

在 IoT 碎片化的时代,同一款温湿度传感器可能今天挂在 128 KB 内存的 MCU 上,明天又要跑在 128 MB 内存的 AI 相机里。如何让驱动代码“写一次、到处跑”,Harmony LiteOS-A 给出的答案是:HDF(Hardware Driver Foundation)统一驱动框架。本文将从顶层设计到落地细节,带你拆解 LiteOS-A 中的 HDF 全貌。


1 为什么需要 HDF?

碎片化痛点 HDF 解药
SoC 厂家接口差异大 归一化平台底座,统一 HAL
内核不同(LiteOS-M/A、Linux) OSAL 抽象,驱动与内核解耦
内存跨度百 KB → GB 弹性化架构,可裁剪、可组合
驱动与系统服务耦合 组件化设备模型,服务发现机制

一句话:HDF 让驱动变成可插拔的“积木”,在不同芯片、不同内核、不同容量设备之间自由拼装 。


2 HDF 整体架构

LiteOS-A 内核中,HDF 与基础内核、文件系统、网络协议栈并列,构成“内核 + 框架 + 接口”三层结构 :

┌-------------------------------------------------┐
│              用户态/内核态应用                    │
├-------------------------------------------------┤
│ POSIX 接口(1200+ 标准 API)                    │
├-------------------------------------------------┤
│ 扩展组件:VFS、网络、安全、HDF 框架              │
├-------------------------------------------------┤
│ 基础内核:调度、内存、中断、IPC、虚拟内存         │
└-------------------------------------------------┘

HDF 自身又拆为 Host、Manager、Support 三层 :

模块 职责 代码位置
Host 管理同类设备驱动生命周期:加载、电源、服务发布 drivers/framework/core/host
Manager 全局资源管控:Host 列表、设备电源、服务表 …/core/manager
Support 平台无关的基础能力:
• OSAL(线程、互斥量、定时器)
• Platform(GPIO/I²C/SPI 等硬件抽象)
…/support/{posix,platform}

3 驱动模型:从“入口”到“设备节点”

HDF 把“驱动”拆成 3 个可复用单元:

  1. Driver Entry:驱动代码本身,实现 Bind, Init, Release 回调。
  2. DeviceNode:对应一个物理/逻辑设备,配置在 *.hcs 文件。
  3. Host:同一类设备的容器,可静态或动态加载。

3.1 配置文件示例(sample_config.hcs)

sample_host :: host {
    hostName = "i2c_sensor_host";
    priority = 100;                  // 加载优先级 0~200
    device_sensor :: device {
        device0 :: deviceNode {
            policy   = 2;            // 向内核态+用户态发布服务
            preload  = 0;            // 开机即加载
            moduleName = "hts221";   // 驱动入口名
            serviceName = "humidity_sensor";
            deviceMatchAttr = "hts221_config";
        }
    }
}
  • policy
    0=不发布 1=内核态 2=内核+用户态 3=订阅模式 4=私有模式
  • preload
    0=开机加载 1=快启后加载 2=按需动态加载
  • deviceMatchAttr 与驱动私有表匹配,实现“同驱动多实例” 。

3.2 驱动入口结构体

struct HdfDriverEntry g_sensorDriver = {
    .moduleVersion = 1,
    .moduleName    = "hts221",
    .Bind          = Hts221Bind,   // 创建设备实例
    .Init          = Hts221Init,   // 初始化硬件
    .Release       = Hts221Release,
};
HDF_INIT(g_sensorDriver);

4 弹性化部署:LiteOS-A 与 Linux 双栈支持

目标系统 驱动形态 部署策略
LiteOS-A 轻量设备 仅内核态 公版驱动 + 裁剪配置 → 百 KB 级镜像
标准 Linux 设备 内核态 + 用户态 • 内核态:HDF + 原生 Linux 驱动并存
• 用户态:HDI(Hardware Device Interface)服务化,支持热插拔、动态权限

HDF 通过 OSALmutexthreadmemory 等调用映射到不同内核,实现“零改动”迁移。


5 驱动开发 5 步曲

  1. 实现驱动代码
    使用 HDF 提供的 OSAL & Platform 接口,禁止直接调用底层寄存器。
  2. 编写设备配置
    在板级 hdf.hcs#include 你的 xxx_config.hcs
  3. 添加编译规则
    drivers/adapter/khdf/liteos/BUILD.gn 注册源文件。
  4. 构建 & 烧录
    hb build -f && hb burn
  5. 验证
    用户态通过 DevSvcMgrClntGetService("humidity_sensor") 获取句柄,读写数据。

6 典型应用案例

  • 润和 HiSpark Taurus(Hi3516DV300)
    Camera、LCD、Touch、SDIO-WiFi 全由 HDF 驱动,一套代码跑 LiteOS-A & Linux 双系统 。
  • 智能温湿度计
    128 KB Flash 设备上,仅保留 I²C + Sensor Host,裁剪后固件 < 90 KB。

7 展望:HDF 3.0 路线图

  • 热插拔事件总线(已合入 LTS3.0):USB、SD 卡即插即用
  • HDI-Gen 工具链:IDL 描述硬件接口 → 自动生成用户态 stub & 内核态 proxy
  • 更多公版驱动:Audio、Camera、USB DDK、Sensor Hub 持续新增

8 结语

LiteOS-A 通过 HDF 把“驱动”从重耦合、难移植的内核模块变成了可描述、可配置、可插拔的积木组件
无论你是芯片厂、设备厂还是方案商,只需关注 驱动本身的价值逻辑,剩下的交给 HDF 去适配万物。

参考源码:drivers/framework
官方文档:OpenHarmony HDF 驱动开发指南



研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐