news 2026/4/15 3:47:30

鸿蒙 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/4/13 19:24:42

Python+Vue的线上社区信息发布管理平台设计 Pycharm django flask

收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我 项目介绍 随着互联网技术的不断发展,线上社区已经成为了人们日常生活中不可或缺的一部分。在这样的背景下,为了更好地服务社区用户,提高信息传递的效率和准确性&a…

作者头像 李华
网站建设 2026/4/13 16:08:29

Python+Vue的记账系统的设计与实现 Pycharm django flask

收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我 项目介绍 随着社会的快速发展和人们生活水平的提高,财务管理变得越来越重要。记账系统作为一种有效的财务管理工具,逐渐受到广大用户的青睐。传统的理财记账都是人工手动的方…

作者头像 李华
网站建设 2026/4/12 10:09:26

深度学习在相位测量偏折术中的应用【附源码+教程】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅成品或者定制,扫描文章底部微信二维码。 (1) 基于改进U-Net网络的单帧变形条纹相位检索方法 相位测量偏折术是一种高精度的…

作者头像 李华
网站建设 2026/4/12 16:24:02

解锁文献综述新境界:书匠策AI的“学术星图导航仪”

在学术探索的浩瀚宇宙中,文献综述犹如一张精准的星图,它不仅勾勒出前人研究的轨迹,更为我们指明了前行的方向。然而,传统文献综述的撰写过程往往繁琐且耗时,如同在茫茫星海中手动绘制星图,既易出错又效率低…

作者头像 李华
网站建设 2026/4/11 6:34:24

Google面试密码:解码那些挑战思维边界的真题与哲学

Google面试密码:解码那些挑战思维边界的真题与哲学引言:硅谷的智力圣杯在科技世界的圣殿中,Google的面试过程犹如一场现代版的骑士考验,充满了传奇色彩和敬畏感。每年,数百万来自世界各地的顶尖人才竞相申请Google的职…

作者头像 李华
网站建设 2026/4/9 22:08:52

破译微软面试密码:从真题解析到人才选拔哲学的深度探索

破译微软面试密码:从真题解析到人才选拔哲学的深度探索 引言:为何微软面试成为科技行业风向标 在科技行业的人才选拔体系中,微软公司的面试流程一直被视为标杆和风向标。自1975年比尔盖茨和保罗艾伦创立以来,微软不仅塑造了全球…

作者头像 李华