1. OpenHarmony 驱动框架总览:HDF 架构设计理念、核心组件与分层模型、驱动开发环境搭建
各位同学,咱们今天正式开讲。第一章我打算先带你把 HDF 的骨架摸清楚。说白了,驱动开发最怕什么?最怕你一头扎进代码里,结果连“驱动在系统里到底怎么挂上去的”都没搞明白。我当年刚接触 HDF 时也踩过这个坑,所以这一章咱们先把地图摊开,再动手搭环境。
1.1 HDF 的设计理念:为什么要有这个框架?
OpenHarmony 要跑在各种各样的硬件上——从几百 KB 内存的 IoT 模组,到几 GB 内存的富设备。如果每个芯片厂商都按自己的习惯写驱动,那系统维护起来就是一场噩梦。HDF(Hardware Driver Foundation)就是为了解决这个问题而生的。
它的核心设计理念,我总结成三个词:
- 解耦:驱动逻辑和硬件描述分开。你换一颗引脚不同的芯片,不用改驱动代码,改个配置文件就行。
- 跨内核:同一套驱动代码,既能跑在 LiteOS 上,也能跑在 Linux 上。我在项目中就遇到过客户从 LiteOS 切到 Linux,驱动层几乎没动,只改了平台适配层。
- 即插即用:设备插入时,HDF 自动加载对应的驱动,不需要你手动 insmod。
一句话总结:HDF 是 OpenHarmony 的“驱动操作系统”,它管理驱动的生命周期、资源、消息和配置。
1.2 核心组件与分层模型
HDF 的分层模型,我习惯把它看成“三层两总线”。咱们先看图,再细讲。
从上往下看,HDF 分了三层:
1.2.1 用户态驱动层
这一层跑在用户空间,说白了就是驱动以进程的形式存在。好处是崩溃了不会搞挂内核。我建议你优先把非性能敏感的驱动(比如温湿度传感器、LED 指示灯)放在用户态。调试起来也方便,gdb 直接 attach。
1.2.2 内核态驱动层
这是 HDF 的心脏。它包含几个关键组件:
| 组件 | 职责 | 我踩过的坑 |
|---|---|---|
| 驱动管理 | 驱动的加载、卸载、生命周期管理 | 曾经忘记在 hcs 里配 node,驱动死活不 probe |
| 配置解析 | 读取 .hcs 配置文件,生成设备树 | hcs 语法缩进错了,解析直接报错 |
| 消息总线 | 驱动间通信,类似 Linux 的 bus 机制 | 用户态和内核态驱动通信,记得配好 servname |
| 平台驱动框架 | GPIO/I2C/SPI/UART 等通用外设的驱动模板 | 复用框架代码能省 60% 的工作量 |
1.2.3 硬件抽象层
这一层负责把硬件差异“抹平”。比如同样是 GPIO,海思的寄存器地址和瑞芯微的不一样,但 HAL 层给你封装好了统一的接口。你写驱动时调用的 GpioWrite(),底层会自动映射到对应的寄存器。
我的习惯:拿到一块新开发板,第一件事就是看 HAL 层的板级配置。那里定义了所有外设的基地址、中断号、时钟源。搞清楚了这些,驱动开发就成功了一半。
1.3 驱动开发环境搭建
好,理论讲完了,咱们动手。环境搭建我分三步走:
1.3.1 安装 DevEco Device Tool
这是华为官方出品的 IDE 插件,基于 VS Code。我个人觉得它最大的好处是把编译、烧录、调试集成在一起了,不用来回切窗口。
- 下载 VS Code(建议 1.70 以上版本)
- 在扩展市场搜索“DevEco Device Tool”并安装
- 安装完成后,重启 VS Code,你会看到左侧多了一个“DevEco”图标
注意:DevEco Device Tool 目前主要支持 Windows 和 Ubuntu。如果你用 macOS,建议开个 Ubuntu 虚拟机。我曾经在 macOS 上折腾了半天,最后还是老老实实切回了 Ubuntu。
1.3.2 获取源码并配置编译环境
OpenHarmony 的源码托管在 Gitee 上。我建议你直接拉取 master 分支的最新代码,因为 HDF 框架还在快速迭代中。
# 安装必要工具
sudo apt-get install python3 python3-pip git curl
# 配置 git 用户信息(必须,否则 repo 会报错)
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
# 下载 repo 工具
curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo
chmod a+x /usr/local/bin/repo
# 初始化并同步源码(以 3.2 Release 为例)
mkdir ohos_3.2 && cd ohos_3.2
repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.2-Release --no-repo-verify
repo sync -c -j8
同步完成后,你会看到源码根目录下有个 build.py 脚本。这就是编译入口。
1.3.3 编译第一个 HDF 驱动示例
咱们先不写驱动,先编译一个带 HDF 的最小系统镜像,验证环境是否通。
# 设置编译目标(以 rk3568 为例)
./build.sh --product-name rk3568 --ccache
# 编译完成后,镜像在 out/rk3568/packages/phone/images/ 下
第一次编译会比较慢,我建议你加上 --ccache 参数,第二次编译能快 50% 以上。
验证方法:编译成功后,在 out/rk3568/ 目录下搜索 *.hdf 文件。如果能看到 hdf_core.hdf 之类的文件,说明 HDF 框架已经编译进去了。
1.4 本章小结
这一章咱们干了三件事:
- 理解了 HDF 为什么存在——解耦、跨内核、即插即用
- 看懂了 HDF 的三层模型——用户态、内核态、HAL
- 搭好了开发环境——DevEco Device Tool + 源码编译