设备节点(HdfDeviceNode)和设备实例(HdfDevice)的区别
在 OpenHarmony 驱动框架 HDF 中,设备节点(HdfDeviceNode
) 和 设备实例(HdfDevice
) 是两个重要的概念,而且非常容易混淆,它们在设备管理和驱动加载过程中扮演不同的角色。以下是它们的区别和联系:
概述
HdfDevice用于对Host大类别下的小类设备(例如I2C小类、UART小类等)进行集中管理,每一个HdfDevice类对象对应device_info.hcs配置文件中的一个device节点,每一个HdfDeviceNode类对象对应device_info.hcs配置文件中的一个deviceNode节点,配置文件信息如下
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
),用于加载和初始化驱动。
- 设备节点包含了设备的元数据,如设备 ID(
- 设备服务发布:
- 设备节点负责将设备的服务发布(PlublishService)到设备服务管理器(
DevSvcManager
),使得其他模块可以通过服务名称访问设备的功能。
- 设备节点负责将设备的服务发布(PlublishService)到设备服务管理器(
- 生命周期管理:
- 设备节点的生命周期从设备驱动匹配开始,到设备服务发布结束。
- 它可以被动态添加或移除,例如通过热插拔机制。
关键属性
devId
: 设备的唯一标识符。driver
: 设备的驱动程序入口(HdfDriverEntry
)。deviceObject
: 设备对象(HdfDeviceObject
),用于设备服务的发布。token
: 设备令牌(IHdfDeviceToken
),用于在设备管理服务中标识设备。servName
: 设备的服务名称,用于发布服务。
2. 设备实例(HdfDevice
)
设备实例是 HDF 框架中用于管理一组设备节点的高层抽象。它负责协调多个设备节点的生命周期,并提供统一的设备管理接口。
特点
- 设备集合管理:
- 设备实例可以管理多个设备节点,将它们组织在一起。
- 它维护了一个设备节点列表(
devNodes
),用于跟踪所有附加到该实例的设备节点。
- 设备生命周期协调:
- 设备实例负责协调设备节点的启动、停止和卸载。
- 它提供统一的接口(如
HdfDeviceAttach
和HdfDeviceDetach
),用于管理设备节点的生命周期。
- 设备 ID 索引管理:
- 设备实例维护设备 ID 的索引,便于通过设备 ID 快速查找设备节点。
关键属性
devNodes
: 设备节点的双向链表,用于管理所有附加的设备节点。deviceCount
: 当前管理的设备节点数量。deviceIdIndex
: 设备 ID 的索引表,用于快速查找设备节点。
3. 区别
特性 | 设备节点(HdfDeviceNode ) | 设备实例(HdfDevice ) |
---|---|---|
作用范围 | 描述单个设备的具体信息和驱动绑定关系 | 管理一组设备节点的生命周期和集合 |
生命周期 | 从驱动匹配到服务发布 | 从设备实例创建到销毁 |
关键功能 | 设备驱动加载、初始化、服务发布 | 设备节点管理、生命周期协调、设备 ID 索引管理 |
核心属性 | devId 、driver 、deviceObject 、token | devNodes 、deviceCount 、deviceIdIndex |
是否可以动态添加 | 可以(例如通过热插拔) | 通常作为高层管理实体,较少动态变化 |
4. 联系
设备节点和设备实例是紧密相关的:
- 设备节点是设备实例的组成部分:
- 设备实例通过设备节点列表(
devNodes
)管理多个设备节点。 - 设备节点的生命周期由设备实例协调。
- 设备实例通过设备节点列表(
- 设备实例提供统一管理接口:
- 设备实例通过接口(如
HdfDeviceAttach
和HdfDeviceDetach
)管理设备节点的附加和分离。 - 设备实例负责为设备节点分配设备 ID,并维护设备 ID 的索引。
- 设备实例通过接口(如
5. 总结
- 设备节点(
HdfDeviceNode
) 是 HDF 框架中描述单个设备的具体实例,负责设备驱动的加载、初始化和服务发布。 - 设备实例(
HdfDevice
) 是用于管理一组设备节点的高层抽象,负责协调设备节点的生命周期,并提供统一的设备管理接口。 - 设备节点是设备实例的组成部分,设备实例通过设备节点列表管理设备节点的生命周期。
理解它们的区别和联系有助于更好地掌握 HDF 框架中设备管理和驱动加载的机制。
参考资料
《沉浸式剖析openharmony源代码》