OpenHarmony驱动框架HDF中设备管理服务构建过程详解(二)

在上篇文章《 OpenHarmony驱动框架HDF中设备管理服务构建过程详解(一)》中,介绍了设备管理服务涉及的对象类型及其相应的接口,也初步展示了设备管理服务中的对象类型关系网。如下图所示

在本篇文章中,我们开始叙述这张网的构建过程,按照上图中标识的数字,将本篇文章分为4个章节:

  • 1. 创建DevHostServiceClnt
  • 2. 创建DevHostService
  • 3. 创建HdfDevice
  • 4. 创建HdfDeviceNode

在介绍上述对象类型实体的过程中,也会介绍这些对象是如何进行关联的。

1 DevmgrService 构建DevHostServiceClnt

有上图可知,DevMgrService 并不是管理所有的设备,而只是管理host设备,而且 DevMgrService 管理的不是host设备,而是host设备服务的客户端(DevHostServiceClnt),所以DevMgrService管理的是DevHostServiceClnt。

1.1 DevMgrService的启动过程

DevMgrService的启动以DeviceManagerInit()为起点,以late_initcall()为入口点,被静态编译进内核,在内核启动后期启动,其启动过程如下:

late_initcall(DeviceManagerInit);
|-> DeviceManagerInit()
    |-> DeviceManagerStart()
        | // (1)创建DevMgr对象
        |-> instance = DevmgrServiceGetInstance();
        | // (2)发布DevMgr,"/dev/hdf/"+"dev_mgr"
        |-> ioService = HdfIoServicePublish(DEV_MGR_NODE, DEV_MGR_NODE_PERM);
        | // (3)启动DevMgr服务
        |-> instance->StartService(instance);

如上,在函数 DeviceManagerStart() 内,调用HdfIoServicePublish() 将DevMgrService发布为一个设备服务节点“/dev/hdf/dev_mgr”,是为了能像控制器一般设备服务一样控制DevMgrService服务。

在最后,调用 DevMgrService的接口 StartService,即 DevmgrServiceStartService() 启动设备管理服务主体,其实就是为一个个host设备创建 DevHostServiceClnt ,并启动对应的 Host 设备在Host域内的DevHostService。

1.2 DevmgrService 构建host服务客户端

所有Host设备源于hcs设备配置树,DevMgrService 的 StartService 接口实现 DevmgrServiceStartService()调用HcsGetRootNode()依据hcs设备配置树构建其在内存内的树形结构链表g_hcsTreeRoot,然后GetHdfManagerNode()从该链表内获取根节点"hdf_manager"。然后依次创建Host设备服务在Manager域的Client节点——DevHostServiceClnt,并将该client节点添加到DevMgrService的hosts链表上。
具体过程如下:

DeviceManagerInit()
|-> DeviceManagerStart()
    | // IDevmgrService :: StartService();
    |-> DevmgrServiceStartService()
        |   // 获得DriverInstaller单例类对象指针
        |-> installer = DriverInstallerGetInstance();
        |
        |   // (1.1)初始化host设备链表hostList
        |-> HdfAttributeManagerGetHostList(&hostList)
        |   |   // 由hcs设备配置树构建内存内hcs树,并获得根节点"hdf_manager"
        |   |-> hdfManagerNode = GetHdfManagerNode(HcsGetRootNode());
        |   |-> hostNode = hdfManagerNode->child;
        |   |-> while (hostNode != NULL) {
        |   |->     struct HdfHostInfo *hostInfo = HdfHostInfoNewInstance();
        |   |->     GetHostInfo(hostNode, hostInfo);
        |   |->     hostInfo->hostId = hostId;
        |   |->     HdfSListAddOrder(hostList, &
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值