鸿蒙 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 是如何做双向数据传输的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1163691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通孔PCB vsSMT贴片:教你选对组装方案

在 PCB 组装环节,通孔插装技术(THT)和表面贴装技术(SMT)是两大主流方案。很多电子工程师在产品设计时都会纠结:到底哪种组装方式更适合自己的项目?今天就从 5 个核心维度对比两者差异&#xff0…

计算机论文写作一站式指南:6款AI工具1天生成8000字附真实参考文献

作为计算机专业的学生或科研人员,你是否常被以下问题困扰? 选题时毫无头绪,不知如何切入研究方向?初稿写作效率低下,半天写不出300字?参考文献格式混乱,手动调整到崩溃?导师改稿意见…

通孔PCB的5大核心优势

今天就来拆解通孔 PCB 的 5 大核心优势,以及它的典型应用场景,带你重新认识这个 “老牌技术” 的硬核实力。​问 1:通孔 PCB 的第一个核心优势是什么?为什么大功率设备离不开它?答:第一个核心优势是超强的功…

【时频分析】面向相交群延迟多分量信号的时频重分配同步挤压频域线性调频小波变换【附MATLAB代码】

面向相交群延迟多分量信号的时频重分配同步挤压频域线性调频小波变换 一、文章题目 面向具有相交群延迟曲线的多分量信号的时频重分配同步挤压频域线性调频小波变换 二、摘要 为分析频率快速变化或含瞬态分量的信号,近年来学者提出了时频重分配同步挤压变换&#xf…

五行代码,逼疯整个硅谷!澳洲放羊大叔,捅开AI编程奇点

只用五行代码,这位养羊大叔就捅破了AI编程的天花板!它让硅谷巨震,Claude Code之父30天没写代码,甚至催生了Cowork的新物种大爆发!最近,一个澳大利亚的养羊大叔用5行代码捅破AI编程天花板的故事,…

计算机领域学术发表地图:CCF与CAAI等分级体系全解析

点击 “AladdinEdu,你的AI学习实践工作坊”,注册即送-H卡级别算力,沉浸式云原生集成开发环境,80G大显存多卡并行,按量弹性计费,教育用户更享超低价。 计算机领域学术发表地图:CCF与CAAI等分级体…

课程论文不用 “水”!虎贲等考 AI 一键解锁高质量写作捷径

每到期末季,课程论文就成了大学生的 “甜蜜负担”。选题太宽泛抓不住重点,文献堆砌毫无逻辑,查重率居高不下,格式混乱被导师打回…… 不少同学为了应付任务,只能东拼西凑 “生产学术垃圾”。但现在,有了虎贲…

COOH-SS-PEG-COOH,羧基-二硫键-聚乙二醇-羧基,适用于药物递送系统

COOH-SS-PEG-COOH,羧基-二硫键-聚乙二醇-羧基,适用于药物递送系统COOH–SS–PEG–COOH(羧基–二硫键–聚乙二醇–羧基) 是一种功能化聚合物,包含二硫键(SS)和聚乙二醇(PEG&#xff0…

人工造问卷 VS 虎贲等考 AI:30 分钟搞定学术调研 “黄金问卷”

还在为设计一份合格的学术问卷熬秃脑袋?查文献找量表耗三天,题项逻辑混乱被导师打回,回收数据一半无效只能重发…… 这些堪称实证研究的 “致命痛点”,曾让无数科研人和学子苦不堪言。 而虎贲等考 AI 智能写作平台(官…

必藏!大模型“记忆力“突破:从2K到百万Token的技术演进与原理详解

想象一下,如果GPT-4只能记住前几句对话,或者Claude无法理解完整的学术论文,我们今天看到的AI应用场景将大大受限。事实上,早期的大模型确实面临这样的困境——它们就像患有"短期记忆障碍"的智者,虽然知识渊博…

数据不会说话?虎贲等考 AI 数据分析:让论文实证硬核到惊艳导师

还在对着一堆问卷数据、实验结果抓耳挠腮?用 SPSS 半天跑不出一个相关性分析,用 Excel 画的图表被批 “小学生水平”?辛苦收集的数据,最后只能用干巴巴的文字描述,论文实证部分毫无说服力? 在论文写作的实…

无缝集成指南,SpringBoot三步接入华为云短信服务

大家好,我是小悟。 华为云短信服务简介 华为云消息&短信服务(MSG&SMS)为企业提供了稳定、合规的全球短信发送能力。它主要有以下特点: 核心功能:支持发送验证码短信(用于登录、注册)和通…

黑灯工厂的本质就是无人经济

黑灯工厂和人工智能原生公司已经在夜间高速运转,无需任何人监督其机械运作。这些零员工公司已经赚得盆满钵满,而它们的“创始人”们却在迪拜悠闲地喝着玛格丽塔。2024 年的某个时候,我煞费苦心地写了一些关于人工智能未来的文章,大…

一张图看懂上下文工程:AI提示技术的核心概念解析

今天聊一个被低估、却把无数人卡住的概念——Context Engineering,中文通常译作“上下文工程”或“语境工程”。它不是什么新出的框架,而是一套为AI系统搭好“前置信息环境”的方法论。它解决的根本问题是:为什么花了大价钱买最好的GPT-4、Cl…

【收藏必备】大模型开发核心技能:格式化输出与解析器全攻略

“ 大模型只能输出文本数据,需要通过转换才能变成我们需要的数据对象。” 在大模型的应用场景中,格式化输出是一个非常重要的环节;特别是对Agent智能体来说,没有格式化输出,智能体就是空中楼阁。 但从技术的角度来说&a…

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…

AI 法律顾问开发:基于 RAG + 知识图谱,如何让大模型精准回答“离婚财产分割”难题?

标签: #LLM #RAG #知识图谱 #LegalTech #Neo4j #LangChain 🤯 前言:为什么 ChatGPT 当不了律师? 在法律咨询中,Context (语境) 和 Logic (逻辑) 是核心。 用户问:“我老公出轨了,离婚时财产怎么分?” 通用 LLM:“根据法律规定,夫妻共同财产一般平均分割…出轨可能影…

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

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

GraphRAG 落地:用 Neo4j 构建知识图谱,让 AI 读懂《红楼梦》的人物关系

标签: #GraphRAG #Neo4j #LLM #知识图谱 #人工智能 #Python 📉 前言:向量检索的局限性 传统的 RAG 流程是: 用户提问 -> 向量化 -> 检索相似文档块 -> 喂给 LLM 但在《红楼梦》这种场景下,如果你问 “贾兰应该叫贾宝玉什么?”: Vector RAG:可能会检索到“贾…

Python+Vue的学生选课管理系统 Pycharm django flask

收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我 项目介绍 随着教育信息化改革的不断深入,高校对于学生选课系统的需求越来越迫切。学生选课系统能够利用信息技术手段,提高选课的自由度和便利性,优化资源配置&…