鸿蒙OpenHarmony HDF 驱动开发

2024-03-10 06:28

本文主要是介绍鸿蒙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配置文件中添加对应的设备描述。

待续…

坚持就有收获

请添加图片描述

这篇关于鸿蒙OpenHarmony HDF 驱动开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793341

相关文章

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本