OpenHarmony标准系统HDF驱动开发基础——驱动框架
HDF(hardware driver foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路,让驱动开发和部署更加规范,旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的驱动管理的开发环境,力求做到一次开发,多系统部署。
驱动加载
HDF驱动框架提供把和配置的设备列表匹配成功的驱动程序加载起来的功能
驱动服务管理
HDF框架可以集中管理驱动服务,开发者可以直接通过HDF框架对外提供的接口获取相关的服务。
驱动消息机制
HDF框架提供统一的驱动消息机制,支持用户态向内核态驱动发送消息,也支持内核态驱动向用户态应用发送消息
配置管理
HCS(HDF Configuration Source) 是HDF框架的配置描述源码,内容Key-Value为主要形式。它实现配置代码与驱动代码解耦。
驱动模型
HDF框架将一类设备驱动放在同一个Host(设备容器)里面,用于管理一组设备的启动加载等过程。在划分Host时,驱动程序是部署在一个Host还是部署在不同的Host,主要考虑驱动程序之间是否存在耦合性,如果两个驱动程序之间存在依赖,可以考虑将这部分驱动程序部署在一个Host里面,否则部署到独立的Host中是更好的选择。Device对应一个真实的物理设备。DeviceNode是设备的一个部件,Device至少有一个DeviceNode。每个DeviceNode可以发布一个设备服务。驱动即驱动程序,每个DevicdNode唯一对应一个驱动,实现和硬件的功能交互。

Host 是一个驱动运行容器,Device 是设备,DeviceNode 是设备在 HDF 中的一个驱动节点,Driver 是真正实现驱动逻辑的代码。
开发指导
场景介绍
关于驱动开发主要目的是实现驱动代码的编写,但是驱动开发过程中需要服务管理、消息机制管理,才能使驱动在代码编译过程中进行加载。
驱动开发实例
基于HDF框架开发主要分为三个部分:驱动实现、驱动编译脚本编写和驱动配置。详细开发流程:
驱动实现
驱动实现包括驱动业务代码实现和驱动入口注册:
- 驱动代码业务
#include "hdf_device_desc.h" // HDF框架对驱动开发相关能力接口的头文件
#include "hdf_log.h" // HDF框架提供的日志接口头文件
#define HDF_LOG_TAG sample_driver // 打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签。
// 将驱动对外提供的服务能力接口绑定到HDF框架。
int32_t HdfSampleDriverBind(struct HdfDeviceObject *deviceObject)
{
HDF_LOGD("Sample driver bind success");
return HDF_SUCCESS;
}
// 驱动自身业务初始化的接口
int32_t HdfSampleDriverInit(struct HdfDeviceObject *deviceObject)
{
HDF_LOGD("Sample driver Init success");
return HDF_SUCCESS;
}
// 驱动资源释放的接口
void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject)
{
HDF_LOGD("Sample driver release success");
return;
}
入口职责
| 入口 | 原因 | 内容 |
| Bind | 建立驱动对象/服务关系 | 创建HdfDeviceObject对应的服务、挂载接口 |
| Init | 真正初始化驱动 | 初始化硬件、GPIO、I2C、寄存器、资源等 |
| Release | 清理驱动 | 释放内存、关闭设备、取消资源 |
- 驱动入口注册到HDF框架
// 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量。
struct HdfDriverEntry g_sampleDriverEntry = {
.moduleVersion = 1,
.moduleName = "sample_driver",
.Bind = HdfSampleDriverBind,
.Init = HdfSampleDriverInit,
.Release = HdfSampleDriverRelease,
};
// 调用HDF_INIT将驱动入口注册到HDF框架中。在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动;当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。
HDF_INIT(g_sampleDriverEntry);
更多推荐


所有评论(0)