Openharmony - HDF驱动小示例和测试程序

2024-02-19 15:28

本文主要是介绍Openharmony - HDF驱动小示例和测试程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

By: fulinux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

在这里插入图片描述

目录

  • 1. 创建KHDF示例驱动
    • 1.1. 创建KHDF项目
    • 1.2. HDF驱动程序实现
      • 1.2.1. 驱动入口
      • 1.2.2. 实现Dispatch方法
      • 1.2.3. 硬件业务初始化与释放
      • 1.2.4. 驱动完整展示
    • 1.3. Makefile文件
    • 1.4. 修改上一级Makefile文件
    • 1.5. 驱动配置
      • 1.5.1. 驱动设备描述
      • 1.5.2. 驱动私有配置
    • 1.6. 编译烧录效果
  • 2. HDF应用测试程序
    • 2.1. 用户态应用测试程序
    • 2.3. 新建源文件myhdftest.c
    • 2.3.1. 测试程序完整代码
    • 2.4. 添加编译配置BUILD.gn
    • 2.5. 添加编译配置bundle.json
    • 2.6. 修改编译配置config.json
    • 2.7. 编译烧录
  • 3. HDF特性

最近在学习鸿蒙系统,首当其冲是学习HDF,这里有很多文章可以阅读:
https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/driver/driver-overview-foundation.md/
但是千言万语,不如一个好示例。下面就是一个示例,不过适配的是3.1,在我的3.2上有比较多的问题,于是将修改后的内容提出来供大家一起学习。
https://blog.csdn.net/procedurecode/article/details/128906246

1. 创建KHDF示例驱动

本例中基于Openharmony的V3.2版本,创建KHDF驱动程序。

1.1. 创建KHDF项目

创建KHDF驱动程序步骤如下:

  • 添加目录: drivers/hdf_core/adapter/khdf/linux/中创建目录myhdfsample;
  • 添加文件: drivers/hdf_core/adapter/khdf/linux/myhdfsample添加文件myhdfsample.c与Makefile;
  • 添加配置: vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs;
  • 编译烧录运行;

1.2. HDF驱动程序实现

通过HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出:

//myhdfsample.c
#include <linux/rtc.h>
#include "device_resource_if.h"
#include "hdf_device_desc.h"
#include "hdf_log.h"
......
struct HdfDriverEntry g_MyHDFSampleEntry = {.moduleVersion = 1,.Bind = MyHDFSampleBind,.Init = MyHDFSampleInit,.Release = MyHDFSampleRelease,.moduleName = "myhdfsample",
};HDF_INIT(g_MyHDFSampleEntry);

1.2.1. 驱动入口

通过指定Bind,MyHDFSampleBind将相关的服务接口绑定到HDF框架,通过Dispatch对用户态应用的消息进行处理:

//myhdfsample.c
......
#define TEST_WRITE_DATA 1234
static int32_t MyHDFSampleIoServiceDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply)
{
......
}static struct IDeviceIoService MyHDFSampleService = {.Open = NULL,.Dispatch = MyHDFSampleIoServiceDispatch,.Release = NULL,
};static int32_t MyHDFSampleBind(struct HdfDeviceObject *deviceObject)
{HDF_LOGD("enter %s", __func__);deviceObject->service = &MyHDFSampleService;return HDF_SUCCESS;
}
......

1.2.2. 实现Dispatch方法

定义TEST_WRITE_DATA的cmdId号,对写入的数据进行打印,并返回应答数据。HdfDeviceSendEvent对应用端通过HdfDeviceRegisterEventListener方法注册的监听器HdfDevEventlistener对象均可以接受到cmdId消息。HdfDevEventlistener将会应用端进行说明:

#define TEST_WRITE_DATA 1234
static int32_t MyHDFSampleIoServiceDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply)
{HDF_LOGD("enter %s: received cmd %d", __func__, cmdId);if (cmdId == TEST_WRITE_DATA) {const char *readData = HdfSbufReadString(data);if (readData != NULL) {HDF_LOGD("%s: read data is:%s", __func__, readData);}if (HdfSbufWriteString(reply, "I am driver's reply string!")) {return HdfDeviceSendEvent(client->device, cmdId, data);}}HDF_LOGE("%s: return fail", __func__);return HDF_FAILURE;
}

1.2.3. 硬件业务初始化与释放

HdfNewdeviceInit实现驱动自身业务初始的接口,HdfNewdeviceRelease实现驱动资源释放的接口:

static int32_t MyHDFSampleInit(struct HdfDeviceObject *device)
{HDF_LOGD("%s: Hdf dev service:%s init success", __func__, HdfDeviceGetServiceName(device));return HDF_SUCCESS;
}static void MyHDFSampleRelease(struct HdfDeviceObject *device)
{HDF_LOGD("%s: Hdf dev service:%s release success", __func__, HdfDeviceGetServiceName(device));
}

1.2.4. 驱动完整展示

下面完整展示drivers/hdf_core/adapter/khdf/linux/myhdfsam

这篇关于Openharmony - HDF驱动小示例和测试程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

Go Gorm 示例详解

《GoGorm示例详解》Gorm是一款高性能的GolangORM库,便于开发人员提高效率,本文介绍了Gorm的基本概念、数据库连接、基本操作(创建表、新增记录、查询记录、修改记录、删除记录)等,本... 目录1. 概念2. 数据库连接2.1 安装依赖2.2 连接数据库3. 数据库基本操作3.1 创建表(表关

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.