鸿蒙OpenHarmony HDF 驱动开发

请添加图片描述

目录

  • 一、概述
  • 二、HDF驱动框架
  • 三、驱动程序
  • 四、驱动配置
  • 坚持就有收获

最近忙于适配OpenHarmonyOS LiteOS-M 平台,已经成功实践适配平台GD32F407、STM32F407、STM32G474板卡,LiteOS适配已经算是有实际经验了。
但是,鸿蒙代码学习进度慢下来了。还是得不断学习理论知识丰富自己的认知。接下来时间要把HDF驱动框架熟悉,完善南向开发技术点。

一、概述

HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路,让驱动开发和部署更加规范,旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的驱动管理的开发环境,力求做到一次开发,多系统部署。

HDF支持两种加载方式:

  • 按需加载, HDF框架支持驱动在系统后动过程中默认加载,或者在系统后动之后动态加载。
  • 按序加载, HDF框架支持驱动在系统启动的过程中按照驱动的优先级进行加载。

驱动开发步骤:

  1. 驱动程序实现,包含驱动业务代码和驱动入口注册到HDF框架。
  2. 驱动编译,将业务代码进行编译,同时将结果编译进内核。
  3. 驱动配置,HDF使用HCS作为配置描述源码驱动配置包含两部分HDF框架定义的驱动设备描述和驱动的私有配置信息。

二、HDF驱动框架

HDF驱动框架主要包含三部分:

  • 1、驱动程序部分----完成驱动的功能逻辑。
  • 2、驱动配置信息----指示驱动的加载信息内容。
  • 3、驱动资源配置----配置驱动的硬件配置信息。

三、驱动程序

驱动程序主要是完成驱动功能的逻辑代码,轻量内核LiteOS-M驱动程序代码路径为:drivers/hdf_core/adapter/platform 。
SDK源码使用drivers/hdf_core/adapter/platform目录,放置适配LiteOS-M各个平台驱动程序。

drivers/hdf_core/adapter/platform
├── BUILD.gn
├── can
├── gpio
├── i2c
├── mipi_dsi
├── pwm
├── spi
├── uart
└── watchdog

这里以LiteOS-M GPIO HDF驱动为例,对于开发者首先看到的是驱动入口部分,驱动入口通过结构体DriverEntry进行描述。其中主要包含Bind, Init 和Release三个接口。

/* HdfDriverEntry definitions */
//struct HdfDriverEntry定义在:drivers/hdf_core/interfaces/inner_api/host/shared/hdf_device_desc.h
struct HdfDriverEntry g_GpioDriverEntry = {.moduleVersion = 1,.moduleName = "ST_GPIO_MODULE_HDF", // 职责:与hdf hcs结点moduleName进行匹配.Bind = GpioDriverBind,             // 职责:绑定驱动对外提供的服务接口到HDF.Init = GpioDriverInit,             // 职责:初始化驱动自身的业务.Release = GpioDriverRelease,       // 职责:释放驱动资源,发生异常时也会调用
};
HDF_INIT(g_GpioDriverEntry);            //注册到HDF框架中

Bind接口描述:该接口的作用主要是完成驱动设备和设备服务接口的bind动作。

static int32_t GpioDriverBind(struct HdfDeviceObject *device)
{if (device == NULL) {HDF_LOGE("device object is NULL\n");return HDF_FAILURE;}return HDF_SUCCESS;
}

Init接口描述:当框架完成设备绑定动作后,就开始调用驱动初始化接口,初始化成功后,驱动框架根据配置文件决定是对外创建设备服务接口,还是接口只对当前服务可见。如果Init初始化失败,驱动框架就会主动释放创建的设备接口等信息。

static int32_t GpioDriverInit(struct HdfDeviceObject *device)
{int32_t ret;struct GpioCntlr *gpioCntlr = NULL;if (device == NULL) {HDF_LOGE("%s: device is NULL", __func__);return HDF_ERR_INVALID_PARAM;}ret = PlatformDeviceBind(&g_stmGpioCntlr.device, device);   //绑定设备对象if (ret != HDF_SUCCESS) {HDF_LOGE("%s: bind hdf device failed:%d", __func__, ret);return ret;}gpioCntlr = GpioCntlrFromHdfDev(device);                    //获取gpio控制器if (gpioCntlr == NULL) {HDF_LOGE("GpioCntlrFromHdfDev fail\r\n");return HDF_DEV_ERR_NO_DEVICE_SERVICE;}ret = AttachGpioDevice(gpioCntlr, device);                  /* GpioCntlr add GpioDevice to priv */if (ret != HDF_SUCCESS) {HDF_LOGE("AttachGpioDevice fail\r\n");return HDF_DEV_ERR_ATTACHDEV_FAIL;}gpioCntlr->ops = &g_GpioCntlrMethod;                        /* 绑定控制器控制方法 */ret = GpioCntlrAdd(gpioCntlr);if (ret != HDF_SUCCESS) {HDF_LOGE("GpioCntlrAdd fail %d\r\n", gpioCntlr->start);return HDF_FAILURE;}return HDF_SUCCESS;
}

gpio控制器方法实现。

/* GpioMethod definitions */
struct GpioMethod g_GpioCntlrMethod = {.request = NULL,.release = NULL,.write = GpioDevWrite,.read = GpioDevRead,.setDir = GpioDevSetDir,.getDir = GpioDevGetDir,.toIrq = NULL,.setIrq = GpioDevSetIrq,.unsetIrq = GpioDevUnSetIrq,.enableIrq = GpioDevEnableIrq,.disableIrq = GpioDevDisableIrq,
};

Release接口描述:当用户需要卸载驱动时,驱动框架先通过该接口通知驱动程序释放资源,然后再释放其他内部资源。

static void GpioDriverRelease(struct HdfDeviceObject *device)
{struct GpioCntlr *gpioCntlr = NULL;if (device == NULL) {HDF_LOGE("%s: device is NULL", __func__);return;}gpioCntlr = GpioCntlrFromHdfDev(device);if (gpioCntlr == NULL) {HDF_LOGE("%s: host is NULL", __func__);return;}gpioCntlr->count = 0;
}

四、驱动配置

HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。

驱动配置包含两部分,HDF框架定义的驱动设备描述和驱动的私有配置信息。

设备描述信息

HDF框架加载驱动所需要的信息来源于HDF框架定义的驱动设备描述,因此基于HDF框架开发的驱动必须要在HDF框架定义的device_info.hcs配置文件中添加对应的设备描述。

待续…

坚持就有收获

请添加图片描述

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

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

相关文章

数字化转型导师坚鹏:科技金融政策、案例及数字化营销

科技金融政策、案例及数字化营销 课程背景: 很多银行存在以下问题: 不清楚科技金融有哪些利好政策? 不知道科技金融有哪些成功案例? 不知道科技金融如何数字化营销? 课程特色: 以案例的方式解读原…

万用表数据导出变化曲线图——pycharm实现视频数据导出变化曲线图

万用表数据导出变化曲线图——pycharm实现视频数据导出变化曲线图 一、效果展示二、环境配置三、代码构思四、代码展示五、代码、python环境包链接 一、效果展示 图1.1 效果展示 (左图:万用表视频截图;右图:表中数据变化曲线图&am…

react实战——react旅游网

慕课网react实战 搭建项目问题1.按照官网在index.tsx中引入antd出错?2.typescript中如何使用react-router3.react-router3.1 V63.2 V53.3V6实现私有路由 4.函数式组件接收props参数时定义数据接口?5.使用TypeScript开发react项目:6.要使一个组…

使用Tokeniser估算GPT和LLM服务的查询成本

将LLM集成到项目所花费的成本主要是我们通过API获取LLM返回结果的成本,而这些成本通常是根据处理的令牌数量计算的。我们如何预估我们的令牌数量呢?Tokeniser包可以有效地计算文本输入中的令牌来估算这些成本。本文将介绍如何使用Tokeniser有效地预测和管…

three.js 包围盒

效果&#xff1a; 想要显示包围盒的样子&#xff1b;需要借助 Box3Helper 辅助显示&#xff1b; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div></div><…

探讨系统测试的最佳实践与思维模式!

这是测试活动过程详解系列的最后一篇文章。之前的想法&#xff0c;是对测试过程各重要环节进行拆解&#xff0c;然后介绍这个环节重点要做的事情&#xff0c;为什么要做这些事&#xff0c;以及注意事项。 前面几篇文章分别介绍了单元测试、集成测试、回归测试阶段要解决的问题…

剑指offer经典题目整理(二)

一、斐波那契数列&#xff08;fib&#xff09; 1.链接 斐波那契数列_牛客题霸_牛客网 (nowcoder.com) 2.描述 斐波那契数列就是数列中任意一项数字&#xff0c;都会等于前两项之和&#xff0c;满足f(n) f(n-1) f(n-2) 的一个数列&#xff0c;例如&#xff1a;1 1 2 3 5 8…

Ubuntu平铺左、右、上、下、1/2、1/4窗口(脚本)

前言 之前因为一直在用Ubuntu 18或者Ubuntu 20然后发现装了GNOME插件后&#xff0c;电脑在使用过程中&#xff0c;会时不时的卡死&#xff08;鼠标没问题&#xff0c;键盘输入会有10-20秒的延迟&#xff09;频率基本是一小时一次&#xff0c;因为这种卡顿会很容易打断思路&…

首屏性能优化:提升用户体验的秘籍

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Chrome中如何导出和导入书签

导出书签 如下图所示&#xff1a; 右上角三点->书签和清单->书签管理器->右上角三点->导出书签 然后你选择保存地址即可。打开后如下&#xff1a; 导入书签 如下图所示&#xff1a; 右上角三点->书签和清单->导入书签和设置->选择以前导出的书签&…

存储引擎的详细介绍

通过查询可得&#xff1a; &#xff08;一&#xff09;InnoDB引擎 简介&#xff1a;具备外键支持功能的事务存储引擎 优点&#xff1a; 1.是mysql的默认事务型存储引擎&#xff0c;它被设计用来处理大量短期事务&#xff08;确保事务完整提交和回 滚&#xff09; 2.除了增加…

【数仓】通过Flume+kafka采集日志数据存储到Hadoop

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…