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源代码》

相关推荐
Once_day2 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
坚果派·白晓明23 分钟前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
lbb 小魔仙1 小时前
【HarmonyOS实战】OpenHarmony + RN:自定义 useFormik 表单处理
react native·harmonyos
风指引着方向1 小时前
图编译优化全链路:CANN graph-engine 仓库技术拆解
c语言
果粒蹬i1 小时前
【HarmonyOS】DAY7:鸿蒙跨平台 Tab 开发问题与列表操作难点深度复盘
华为·harmonyos
王码码20352 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
C++ 老炮儿的技术栈2 小时前
VS2015 + Qt 实现图形化Hello World(详细步骤)
c语言·开发语言·c++·windows·qt
Once_day2 小时前
C++之《Effective C++》读书总结(4)
c语言·c++·effective c++
晓13132 小时前
第七章 【C语言篇:文件】 文件全面解析
linux·c语言·开发语言
ITUnicorn2 小时前
【HarmonyOS6】ArkTS 自定义组件封装实战:动画水杯组件
华为·harmonyos·arkts·鸿蒙·harmonyos6