news 2026/2/22 15:48:45

鸿蒙 HDF 驱动开发初探:如何为 Hi3861 开发板编写一个自定义的 LED 驱动?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙 HDF 驱动开发初探:如何为 Hi3861 开发板编写一个自定义的 LED 驱动?

标签:#HarmonyOS #HDF #驱动开发 #Hi3861 #嵌入式 #南向开发


🧬 前言:为什么一定要用 HDF?

你可能会问:“直接操作寄存器或者调 GPIO 库不香吗?为什么要套这么厚一层 HDF 壳子?”

HDF 的核心价值:

  1. 解耦:驱动代码不依赖具体的 OS 内核。
  2. 统一管理:系统统一加载、管理驱动的生命周期(加载、初始化、卸载)。
  3. 安全性:在标准系统(Standard)中,HDF 驱动运行在用户态,挂了也不会导致内核崩溃。

HDF 驱动架构图 (Mermaid):

内核空间 / HDF 框架

1. HdfIoServiceBind
2. Dispatch
3. Bind/Init
4. GpioWrite

用户态应用 (APP)

HDF 框架管理器

驱动入口 (DriverEntry)

驱动实现逻辑

硬件 (GPIO LED)


📝 一、 配置文件:描述你的硬件 (HCS)

鸿蒙引入了HCS (HDF Configuration Source),类似于 Linux 的设备树 (Device Tree)。我们需要告诉系统:有一个名为sample_led的设备。

找到源码中的device_info.hcs(通常在vendor/hisilicon/hispark_pegasus/hdf_config/ihct/下),添加节点:

root { device_info { match_attr = "hdf_manager"; template host { hostName = "host0"; priority = 100; // 定义一个名为 sample_host 的宿主 device_sample :: device { device0 :: deviceNode { policy = 2; // 2: 对外发布服务,应用层可见 priority = 100; preload = 0; // 0: 按需加载 1: 随系统启动 permission = 0664; moduleName = "HDF_SAMPLE_LED"; // ⚠️ 关键:要与C代码匹配 serviceName = "hdf_led_service"; // 应用层绑定的名字 deviceMatchAttr = "sample_led_config"; } } } } }

💻 二、 驱动实现:核心 C 代码

drivers/hdf_core/adapter/khdf/liteos_m/(或其他驱动目录) 下新建hdf_led_driver.c

驱动开发的核心就是填充HdfDriverEntry结构体。

1. 定义控制指令
#include"hdf_device_desc.h"#include"hdf_log.h"#include"gpio_if.h"// LED 连接的 GPIO 管脚 (Hi3861通常是 GPIO 9)#defineLED_GPIO_PIN9// 命令码enum{LED_WRITE_ON=1,LED_WRITE_OFF,};
2. 业务逻辑 (Dispatch)

这是应用层调用驱动的入口。

// 接收用户态发来的指令staticint32_tLedDriverDispatch(structHdfDeviceIoClient*client,intcmdId,structHdfSBuf*data,structHdfSBuf*reply){if(cmdId==LED_WRITE_ON){// 点亮 LED (低电平还是高电平取决于电路,假设低电平亮)GpioWrite(LED_GPIO_PIN,0);HDF_LOGI("LED Driver: ON");}elseif(cmdId==LED_WRITE_OFF){// 熄灭 LEDGpioWrite(LED_GPIO_PIN,1);HDF_LOGI("LED Driver: OFF");}else{returnHDF_FAILURE;}returnHDF_SUCCESS;}
3. 生命周期绑定 (Bind & Init)
// 1. 驱动对外提供的服务对象staticint32_tHdfLedDriverBind(structHdfDeviceObject*deviceObject){staticstructIDeviceIoServiceservice={.Dispatch=LedDriverDispatch,// 绑定分发函数};deviceObject->service=&service;returnHDF_SUCCESS;}// 2. 驱动初始化 (设置 GPIO 方向)staticint32_tHdfLedDriverInit(structHdfDeviceObject*deviceObject){GpioSetDir(LED_GPIO_PIN,GPIO_DIR_OUT);HDF_LOGI("Hdf Led Driver Init Success!");returnHDF_SUCCESS;}// 3. 驱动卸载staticvoidHdfLedDriverRelease(structHdfDeviceObject*deviceObject){HDF_LOGI("Hdf Led Driver Released");}
4. 注册驱动

这一步将 C 代码与 HCS 配置文件关联起来。

// 定义驱动入口structHdfDriverEntryg_ledDriverEntry={.moduleVersion=1,.moduleName="HDF_SAMPLE_LED",// ⚠️ 必须与 HCS 中的 moduleName 一致.Bind=HdfLedDriverBind,.Init=HdfLedDriverInit,.Release=HdfLedDriverRelease,};// 宏注册HDF_INIT(g_ledDriverEntry);

🔨 三、 编译构建:GN 脚本

鸿蒙使用 GN + Ninja 进行构建。你需要修改BUILD.gn文件,将你的.c文件加入编译列表。

hdf_driver("hdf_sample_led") { sources = [ "hdf_led_driver.c", ] include_dirs = [ "//drivers/hdf_core/framework/include", "//drivers/hdf_core/framework/include/core", "//drivers/hdf_core/adapter/khdf/liteos_m", ] }

🕹️ 四、 应用层调用:点灯时刻

最后,我们写一个简单的 APP 来验证驱动。

#include"hdf_io_service_if.h"voidTestLedDriver(){// 1. 获取驱动服务 (对应 HCS 中的 serviceName)structHdfIoService*serv=HdfIoServiceBind("hdf_led_service");if(serv==NULL){printf("Fail to bind service!\n");return;}// 2. 发送指令staticstructHdfSBuf*data=NULL;staticstructHdfSBuf*reply=NULL;// 亮灯printf("Send command: ON\n");serv->dispatcher->Dispatch(&serv->object,1,data,reply);osDelay(100);// 延时// 灭灯printf("Send command: OFF\n");serv->dispatcher->Dispatch(&serv->object,2,data,reply);// 3. 回收资源HdfIoServiceRecycle(serv);}

🎯 总结

通过这个案例,我们走通了鸿蒙驱动开发的完整链路:

  1. HCS 配置:像填写简历一样描述硬件。
  2. HdfDriverEntry:像填写表格一样实现驱动生命周期。
  3. HdfIoServiceBind:像调用 API 一样在应用层控制硬件。

这比直接写裸机代码要复杂,但它带来的标准化可移植性,是迈向高级嵌入式开发的必经之路。

Next Step:
尝试给驱动增加一个“读取状态”的功能。在LedDriverDispatch中增加一个 cmdId,利用GpioRead读取当前 LED 的电平,并通过reply参数返回给应用层。这能让你理解 HDF 是如何做双向数据传输的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/22 3:52:36

COOH-S-CH2-S-COOH,双羧基和响应性桥链

COOH-S-CH2-S-COOH,双羧基和响应性桥链一、COOH–S–CH₂–S–COOH 的基本描述COOH–S–CH₂–S–COOH 是一种功能化小分子化合物,分子结构可简化表示为:HOOC–S–CH₂–S–COOH其结构特点如下:双羧基(–COOH&#xff…

作者头像 李华
网站建设 2026/2/21 10:05:46

解锁文献综述新姿势:书匠策AI带你玩转学术“拼图游戏”

在学术江湖里,文献综述堪称“通关秘籍”。它不仅是研究的前期铺垫,更是厘清学术脉络、避免重复造轮子的关键。然而,面对浩如烟海的文献,手动梳理往往让人“头秃”——检索如大海捞针,分析如盲人摸象,写作如…

作者头像 李华
网站建设 2026/2/21 4:58:53

基于深度学习的对抗样本攻击算法研究【附代码+数据】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅成品或者定制,扫描文章底部微信二维码。(1) 基于差分进化与C&W攻击结合的通用对抗样本生成算法深度学习模型在图像分类、…

作者头像 李华
网站建设 2026/2/21 10:30:34

自动视力测试仪(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T4622405M设计简介:本设计是基于STM32的自动视力测试仪,主要实现以下功能:1.可通过超声波传感器检测人体距离 2.可通过光…

作者头像 李华
网站建设 2026/2/19 20:58:03

RAG+Langchain部署建筑设计私有知识库

大模型在训练时是包含了海量的建筑设计规范文件的,但是它在回答建筑设计专业问题时仍然会出较多错误。我向网页版Deepseek问了两个问题,它的回答都是错的: 问:无障碍厕所隔间的尺寸是多少? Deepseek答:依据…

作者头像 李华