openharmony中hdf框架的设备节点(HdfDeviceNode)和设备实例(HdfDevice)的区别

设备节点(HdfDeviceNode)和设备实例(HdfDevice)的区别

在 OpenHarmony 驱动框架 HDF 中,设备节点(HdfDeviceNode设备实例(HdfDevice 是两个重要的概念,而且非常容易混淆,它们在设备管理和驱动加载过程中扮演不同的角色。以下是它们的区别和联系:


概述

HdfDevice用于对Host大类别下的小类设备(例如I2C小类、UART小类等)进行集中管理,每一个HdfDevice类对象对应device_info.hcs配置文件中的一个device节点,每一个HdfDeviceNode类对象对应device_info.hcs配置文件中的一个deviceNode节点,配置文件信息如下

c 复制代码
root {
    device_info {
        platform :: host {
            hostName = "platform_host";
            priority = 50;
            device_uart :: device { //对应HDdevice节点
                device5 :: deviceNode { //对应HDdeviceNode节点
                    policy = 2;
                    priority = 10;
                    permission = 0660;
                    moduleName = "UART_SAMPLE";
                    serviceName = "HDF_PLATFORM_UART_5";
                    deviceMatchAttr = "sample_uart_5";
                }
                device1 :: deviceNode { //一个HDdevice可以内含多个HDdeviceNode节点
                    xxx....
                }
            }
        }
    }
}

为了更清楚的了解他们之间的关系,画了如下类图:

根据以上类图和业务代码的梳理可得出以下信息:

1. 设备节点(HdfDeviceNode

设备节点是 HDF 框架中用于描述单个设备的具体实例 (例如UART0、I2C1等)。它包含了设备的详细信息和驱动程序的绑定关系,是设备驱动加载和设备服务发布的基础

特点
  • 具体设备的描述
    • 设备节点包含了设备的元数据,如设备 ID(devId)、设备管理策略(policy)、服务名称(servName)等。
    • 它还包含了设备的驱动程序入口(driver),用于加载和初始化驱动。
  • 设备服务发布
    • 设备节点负责将设备的服务发布(PlublishService)到设备服务管理器(DevSvcManager),使得其他模块可以通过服务名称访问设备的功能。
  • 生命周期管理
    • 设备节点的生命周期从设备驱动匹配开始,到设备服务发布结束。
    • 它可以被动态添加或移除,例如通过热插拔机制。
关键属性
  • devId: 设备的唯一标识符。
  • driver: 设备的驱动程序入口(HdfDriverEntry)。
  • deviceObject: 设备对象(HdfDeviceObject),用于设备服务的发布。
  • token: 设备令牌(IHdfDeviceToken),用于在设备管理服务中标识设备。
  • servName: 设备的服务名称,用于发布服务。

2. 设备实例(HdfDevice

设备实例是 HDF 框架中用于管理一组设备节点的高层抽象。它负责协调多个设备节点的生命周期,并提供统一的设备管理接口。

特点
  • 设备集合管理
    • 设备实例可以管理多个设备节点,将它们组织在一起。
    • 它维护了一个设备节点列表(devNodes),用于跟踪所有附加到该实例的设备节点。
  • 设备生命周期协调
    • 设备实例负责协调设备节点的启动、停止和卸载。
    • 它提供统一的接口(如 HdfDeviceAttachHdfDeviceDetach),用于管理设备节点的生命周期。
  • 设备 ID 索引管理
    • 设备实例维护设备 ID 的索引,便于通过设备 ID 快速查找设备节点。
关键属性
  • devNodes: 设备节点的双向链表,用于管理所有附加的设备节点。
  • deviceCount: 当前管理的设备节点数量。
  • deviceIdIndex: 设备 ID 的索引表,用于快速查找设备节点。

3. 区别

特性 设备节点(HdfDeviceNode 设备实例(HdfDevice
作用范围 描述单个设备的具体信息和驱动绑定关系 管理一组设备节点的生命周期和集合
生命周期 从驱动匹配到服务发布 从设备实例创建到销毁
关键功能 设备驱动加载、初始化、服务发布 设备节点管理、生命周期协调、设备 ID 索引管理
核心属性 devIddriverdeviceObjecttoken devNodesdeviceCountdeviceIdIndex
是否可以动态添加 可以(例如通过热插拔) 通常作为高层管理实体,较少动态变化

4. 联系

设备节点和设备实例是紧密相关的:

  • 设备节点是设备实例的组成部分
    • 设备实例通过设备节点列表(devNodes)管理多个设备节点。
    • 设备节点的生命周期由设备实例协调。
  • 设备实例提供统一管理接口
    • 设备实例通过接口(如 HdfDeviceAttachHdfDeviceDetach)管理设备节点的附加和分离。
    • 设备实例负责为设备节点分配设备 ID,并维护设备 ID 的索引。

5. 总结

  • 设备节点(HdfDeviceNode 是 HDF 框架中描述单个设备的具体实例,负责设备驱动的加载、初始化和服务发布。
  • 设备实例(HdfDevice 是用于管理一组设备节点的高层抽象,负责协调设备节点的生命周期,并提供统一的设备管理接口。
  • 设备节点是设备实例的组成部分,设备实例通过设备节点列表管理设备节点的生命周期。

理解它们的区别和联系有助于更好地掌握 HDF 框架中设备管理和驱动加载的机制。

参考资料

《沉浸式剖析openharmony源代码》

相关推荐
survivorsfyh2 小时前
zsh: command not found: hdc - 鸿蒙 HarmonyOS Next
华为·harmonyos·鸿蒙
qq_553760324 小时前
HarmonyOS:WebView 控制及 H5 原生交互实现
华为·harmonyos·鸿蒙
北冥有鱼被烹6 小时前
【工具】如何将一个脚本作为C语言的一个文件被include到新的C文件中然后执行?(C语言 array的方式)
c语言
旧时光林7 小时前
P10905 [蓝桥杯 2024 省 C] 回文字符串
c语言·c++·蓝桥杯·模拟·枚举
猫猫头有亿点炸9 小时前
C语言for循环嵌套if相关题目
c语言·开发语言
阿巴~阿巴~9 小时前
蓝桥杯速成刷题清单(上)
c语言·c++·算法·蓝桥杯
别说我什么都不会11 小时前
OpenHarmony实战开发之测试适配的HDF驱动
嵌入式·harmonyos·领域驱动设计
要下雨了吗12 小时前
指针数组 vs 数组指针
c语言·数据结构·c++·算法·visual studio
Star76813 小时前
鸿蒙系统中实现保存pdf至本地
app·harmonyos
小郝 小郝13 小时前
【C语言】内存函数
c语言·开发语言