HarmonyOS 鸿蒙驱动消息机制管理

驱动消息机制管理

使用场景

当用户态应用和内核态驱动需要交互时,可以使用HDF框架的消息机制来实现。

接口说明

消息机制的功能主要有以下两种:

  1. 用户态应用发送消息到驱动。

  2. 用户态应用接收驱动主动上报事件。

表1 消息机制接口

方法描述
struct HdfIoService *HdfIoServiceBind(const char *serviceName);用户态获取驱动的服务,获取该服务之后通过服务中的Dispatch方法向驱动发送消息。
void HdfIoServiceRecycle(struct HdfIoService *service);释放驱动服务。
int HdfDeviceRegisterEventListener(struct HdfIoService *target, struct HdfDevEventlistener *listener);用户态程序注册接收驱动上报事件的操作方法。
int HdfDeviceSendEvent(struct HdfDeviceObject *deviceObject, uint32_t id, struct HdfSBuf *data);驱动主动上报事件接口。

开发步骤

1.将驱动配置信息中服务策略policy字段设置为2(SERVICE_POLICY_CAPACITY,参考policy定义)。

   device_sample :: Device {policy = 2;...}

2.配置驱动信息中的服务设备节点权限(permission字段)是框架给驱动创建设备节点的权限,默认是0666,驱动开发者根据驱动的实际使用场景配置驱动设备节点的权限。

3.在服务实现过程中,实现服务基类成员IDeviceIoService中的Dispatch方法。

   // Dispatch是用来处理用户态发下来的消息int32_t SampleDriverDispatch(struct HdfDeviceIoClient *device, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply){HDF_LOGI("sample driver lite A dispatch");return HDF_SUCCESS;}int32_t SampleDriverBind(struct HdfDeviceObject *device){HDF_LOGI("test for lite os sample driver A Open!");if (device == NULL) {HDF_LOGE("test for lite os sample driver A Open failed!");return HDF_FAILURE;}static struct ISampleDriverService sampleDriverA = {.ioService.Dispatch = SampleDriverDispatch,.ServiceA = SampleDriverServiceA,.ServiceB = SampleDriverServiceB,};device->service = (struct IDeviceIoService *)(&sampleDriverA);return HDF_SUCCESS;}

4.驱动定义消息处理函数中的cmd类型。

   #define SAMPLE_WRITE_READ 1    // 读写操作码1

4.用户态获取服务接口并发送消息到驱动。

   int SendMsg(const char *testMsg){if (testMsg == NULL) {HDF_LOGE("test msg is null");return HDF_FAILURE;}struct HdfIoService *serv = HdfIoServiceBind("sample_driver");if (serv == NULL) {HDF_LOGE("fail to get service");return HDF_FAILURE;}struct HdfSBuf *data = HdfSbufObtainDefaultSize();if (data == NULL) {HDF_LOGE("fail to obtain sbuf data");return HDF_FAILURE;}struct HdfSBuf *reply = HdfSbufObtainDefaultSize();if (reply == NULL) {HDF_LOGE("fail to obtain sbuf reply");ret = HDF_DEV_ERR_NO_MEMORY;goto out;}if (!HdfSbufWriteString(data, testMsg)) {HDF_LOGE("fail to write sbuf");ret = HDF_FAILURE;goto out;}int ret = serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply);if (ret != HDF_SUCCESS) {HDF_LOGE("fail to send service call");goto out;}out:HdfSbufRecycle(data);HdfSbbufRecycle(reply);HdfIoServiceRecycle(serv);return ret;}

6.用户态接收该驱动上报的消息。

  • 用户态编写驱动上报消息的处理函数。
       static int OnDevEventReceived(void *priv,  uint32_t id, struct HdfSBuf *data){OsalTimespec time;OsalGetTime(&time);HDF_LOGI("%{public}s received event at %{public}llu.%{public}llu", (char *)priv, time.sec, time.usec);const char *string = HdfSbufReadString(data);if (string == NULL) {HDF_LOGE("fail to read string in event data");return HDF_FAILURE;}HDF_LOGI("%{public}s: dev event received: %{public}d %{public}s",  (char *)priv, id, string);return HDF_SUCCESS;}
  • 用户态注册接收驱动上报消息的操作方法。
       int RegisterListen(){struct HdfIoService *serv = HdfIoServiceBind("sample_driver");if (serv == NULL) {HDF_LOGE("fail to get service");return HDF_FAILURE;}static struct HdfDevEventlistener listener = {.callBack = OnDevEventReceived,.priv ="Service0"};if (HdfDeviceRegisterEventListener(serv, &listener) != 0) {HDF_LOGE("fail to register event listener");return HDF_FAILURE;}......HdfDeviceUnregisterEventListener(serv, &listener);HdfIoServiceRecycle(serv);return HDF_SUCCESS;}
  • 驱动上报事件。
       int32_t SampleDriverDispatch(HdfDeviceIoClient *client, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply){... // process api call herereturn HdfDeviceSendEvent(client->device, cmdCode, data);}

为了能让大家更好的学习鸿蒙 (OpenHarmony) 开发技术,这边特意整理了《鸿蒙 (OpenHarmony)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (OpenHarmony)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. ……

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门?:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

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

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

相关文章

防御保护笔记02

防火墙 防火墙的主要职责在于:控制和防护 ---- 安全策略 --- 防火墙可以根据安全策略来抓取流量 防火墙分类 按物理特性划分 软件防火墙 硬件防火墙 按性能划分 百兆级防火墙 吞吐量:指对网络、设备、端口、虚电路或其他设施,单位时间内成…

架构整洁之道-价值维度与编程范式

1 设计与架构究竟是什么 结论:二者没有任何区别,一丁点区别都没有。 架构图里实际上包含了所有底层设计细节,这些细节信息共同支撑了顶层的架构设计,底层设计信息和顶层架构设计共同组成了整个架构文档。底层设计细节和高层架构信…

最新GPT4.0使用教程,AI绘画-Midjourney绘画,GPT语音对话使用,DALL-E3文生图+思维导图一站式解决

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

【HarmonyOS应用开发】ArkUI 开发框架-基础篇-第一部分(七)

常用基础组件 一、组件介绍 组件(Component)是界面搭建与显示的最小单位,HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件,我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。组件根据功能可以分为以下五大类…

深入理解Redis:如何设置缓存数据的过期时间及其背后的机制

目录 Redis 给缓存数据设置过期时间 Redis是如何判断数据是否过期的呢? 过期的数据的删除策略 Redis 内存淘汰机制 Redis 给缓存数据设置过期时间 一般情况下,我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢? 因为内存是有…

Django模型(一)

一、介绍 模型,就是python中的类对应数据库中的表 1.1、ORM ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写 ORM 把数据库映射成对象 1.…

【Linux】压缩脚本、报警脚本

一、压缩搅拌 要求: 写一个脚本,完成如下功能 传递一个参数给脚本,此参数为gzip、bzip2或者xz三者之一; (1) 如果参数1的值为gzip,则使用tar和gzip归档压缩/etc目录至/backups目录中,并命名为/backups/etc…

Java-并发高频面试题

1.说一下你对Java内存模型(JMM)的理解? 其实java内存模型是一种抽象的模型,具体来看可以分为工作内存和主内存。 JMM规定所有的变量都会存储再主内存当中,再操作的时候需要从主内存中复制一份到本地内存(c…

C++(6) 继承

文章目录 继承1. 继承1.1 什么是继承1.2 C 继承方式1.2.1 基本案例1.2.2 继承权限组合1.2.3 继承中构造函数的说法1.2.4 继承中析构函数的执行顺序1.2.5 继承中变量名称冲突问题1.2.6 继承中函数【重写】 继承 1. 继承 1.1 什么是继承 面向对象程序设计中最重要的一个概念是继…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令: cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注:cp -r 会把所有source当作普通文件(regular文件)&#x…

把批量M3U8网络视频地址转为MP4视频

在数字媒体时代,视频格式的转换已成为一项常见的需求。尤其对于那些经常处理网络视频的用户来说,将M3U8格式的视频转换为更常见的MP4格式是一项必备技能。幸运的是,现在有了固乔剪辑助手这款强大的工具,这一过程变得异常简单。下面…

03:华为云管理|云主机管理|云项目实战

华为云管理|云主机管理|云项目实战 安全组配置部署跳板机配置yum源,安装软件包优化系统服务安装配置ansible管理主机 模版镜像配置配置yum源,安装软件包优化系统 网站云平台部署实战华为云的负载均衡 安全组配置 设置安全组 云…

MongoDB常用命令

3.1 案例需求 存放文章评论的数据存放到MongoDB中,数据结构参考如下: 数据库:articledb 3.2 数据库操作 3.2.1 选择和创建数据库 选择和创建数据库的语法格式: use 数据库名称 如果数据库不存在则自动创建,例如&a…

VirtualBox配置OpenEuler虚拟机双网卡使用

VirtualBox配置NAT模式时,在宿主机使用WIFI时,虽然能访问互联网,能正常安装软件,但是本地不能访问虚拟机,但是可以配置另一个host-only模式的网卡,通过双网卡实现本地访问虚拟机的同时也能访问互联网。 安装…

GitBook可以搭建知识库吗?有无其他更好更方便的?

在一个现代化的企业中,知识是一项宝贵的资产。拥有一个完善的企业知识库,不仅可以加速员工的学习和成长,还能提高工作效率和团队协作能力。然而,随着企业不断发展和扩大规模,知识库的构建和管理变得更加复杂和耗时。 |…

c++入门语法—————引用,内联函数,auto关键字,基于范围的for循环,nullptr

文章目录 一.引用1.引例2.注意事项3.应用场景1.做参数(a:输出型参数b:内容较大参数)2.做返回值(a:修改返回值,b:减少拷贝) 4.引用和指针的区别 二.内联函数1.为什么有内联函数2.用法和底层3.特性 三.auto关键字1.基础示…

vue项目如何打包,java项目如何打包

目录 vue项目如何打包 java项目如何打jar包 使用Maven打包为JAR(方式一)视图: 先双击clean再双击package即可打包 使用Maven打包为JAR(方式二)命令: 1、确保你已经安装了Maven,并且配置了相应…

腾讯云轻量应用Ubuntu服务器如何一键部署幻兽帕鲁Palworld私服?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏,在帕鲁的世界,玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活,也…

GLog开源库使用

Glog地址:https://github.com/google/glog 官方文档:http://google-glog.googlecode.com/svn/trunk/doc/glog.html 1.利用CMake进行编译,生成VS解决方案 (1)在glog-master文件夹内新建一个build文件夹,用…

使用vs2022将.net8的应用程序发布为一个单独文件

在使用.NetCore3.1时&#xff0c;可以通过设置以下工程配置文本来将项目发布为一个单独的应用程序文件&#xff1a; <Project Sdk"Microsoft.NET.Sdk.WindowsDesktop"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><…