前言
如下图,开源鸿蒙系统驱动框架HDF在内核中的实现,可以分为向用户层提供设备服务的管理模块(Manager),和实际管理硬件的Host模块。
Manager分为DeviceManageService和 DeviceServiceManage,前者负责提供服务的设备,包括设备驱动匹配、设备驱动装载、设备启动等;后者负责关联设备提供的服务,包括管理Host端提供的设备服务,和接收用户发起的设备服务订阅请求。
图1 开源鸿蒙系统驱动框架软件架构模块图
本文主要关注点在DeviceManageService,叙述其如何启动设备、创建设备服务节点、装载驱动,以及发布服务的过程。
文章内容简介
开源鸿蒙系统驱动框架HDF内核实现部分完全使用C语言实现,也引入了面向对象编程的思想,使用C语言实现了诸如类继承、虚函数、单例类等的概念,使得HDF内核部分包含了大量的对象类型,对象类型又通过的接口形式对外提供服务。
为了向读者展现开源鸿蒙系统驱动框架HDF内核实现蓝图,本文仅仅介绍介绍DevMgr过程中Manager域和Host域内的对象类型与其接口,先奠定读者对HDF内对象类型的基本认识;然后,在下一篇文章中介绍DevMgrService如何启动设备、装载驱动、发布设备服务的整个过程。
本文章节内容如下:
-
- DevMgr域中的对象类型及接口
-
- Host域中的对象类型及接口
1 DevMgr域中的对象类型及接口
1.1 DevmgrService
1.1.1 DevmgrService及接口
DevmgrService是设备管理的总入口,其Hosts域是一个双向链表,hcs设备配置中的所有Host设备被挂载在这个Hosts双向链表上。
DevmgrService内容及其接口定义如下:
struct IDevmgrService {
struct HdfObject base;
struct HdfDeviceObject object;
// 将Host节点链接到DevMgr的hosts列表
int (*AttachDeviceHost)(struct IDevmgrService *, uint16_t, struct IDevHostService *);
// 将HDF设备节点以Token的形式连接到host的devices列表
int (*AttachDevice)(struct IDevmgrService *, const struct HdfDeviceInfo *, struct IHdfDeviceToken *);
// 启动DevmgrService服务
int (*StartService)(struct IDevmgrService *);
int (*PowerStateChange)(struct IDevmgrService *, enum HdfPowerState pEvent);
};
struct DevmgrService {
struct IDevmgrService super;
struct DListHead hosts;
struct OsalMutex devMgrMutex;
};
由DevmgrService结构体的内容可知,DevmgrService只管理者host设备节点。 有下面章节可知,Host节点下的所有设备则由Host自己管理。
1.1.2 DevMgrService构建过程
下面DevMgrService构建过程,HDF内核实现部分中使用static局部变量实现了C++中单例类的概念,将DevMgrService作为一个单例类,所有的对象指向同一个实体。
DevmgrServiceCreate()
| // C++,单例类概念
|-> static struct DevmgrService devmgrServiceInstance;
|-> DevmgrServiceConstruct(&devmgrServiceInstance)
|-> devMgrSvcIf = (struct IDevmgrService *)inst;
|
|-> devMgrSvcIf->AttachDevice = DevmgrServiceAttachDevice;
|-> devMgrSvcIf->AttachDeviceHost = DevmgrServiceAttachDeviceHost;
|-> devMgrSvcIf->StartService = DevmgrServiceStartService;
|-> devMgrSvcIf->PowerStateChange = DevmgrServicePowerStateChange;
1.1.3 IDevmgrService接口介绍
(1)StartService:DevmgrServiceStartService()
DevmgrServiceStartService()主要功能是挂载并启动hcs设备配置中的所有host设备节点DevmgrService的hosts链表;然后,启动host节点,间接地启动Host节点下的所有设备(装载设备驱动、发布设备服务等)。
DevmgrServiceStartService()
|-> DevmgrServiceStartDeviceHosts()
|-> DriverInstallerGetInstance() // installer
| // (1) 为每一个Hcs配置中的Host设备创建一个DevHostClnt
|-> HdfAttributeManagerGetHostList(&hostList);
|-> HdfSListIteratorInit(&it, &hostList);
|-> hostAttr = HdfSListIteratorNext(&it);
|
|-> hostClnt = DevHostServiceClntNewInstance(
| hostAttr->hostId,
| hostAttr->hostName);
| // (2) 添加HostClnt到DevMgr的hosts链表
|-> DListInsertTail(&hostClnt->node, &inst->hosts);
|
| // (3) 启动host设备对应的DevHostClnt。
|-> hostClnt->hostPid = installer->StartDeviceHost()
(2)AttachDeviceHost:DevmgrServiceAttachDeviceHost()
DevmgrServiceAttachDeviceHost()遍历host节点先的所有设备信息,使用DriverLoader构建设备节点,装载驱动,发布服务,然后将设备链接到Host的devices列表。
DevmgrServiceAttachDeviceHost( struct IDevmgrService *inst, uint16_t hostId,
| struct IDevHostService *hostService)
|
| // DevHostServiceClnt 已经在 StartDeviceHost() 内按照hcs设备配置树中的host节点创建
|-> struct DevHostServiceClnt *hostClnt = DevmgrServiceFindDeviceHost(inst, hostId);
|
|-> hostClnt->hostService = hostService;
| // 获得Host节点下所有的设备节点配置信息
|-> hostClnt->deviceInfos = HdfAttributeManagerGetDeviceList()
|-> hostClnt->devCount = HdfSListCount(hostClnt->deviceInfos);
|
|-> DevHostServiceClntInstallDriver(hostClnt)
| // 遍历 Host 节点下的所有设备(设备+驱动),并将它们挂载到host的devices列表
|-> HdfSListIteratorInit(&it, hostClnt->deviceInfos);
|-> deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&it);
|-> devHostSvcIf->AddDevice(devHostSvcIf, deviceInfo);
(3) AttachDevice:DevmgrServiceAttachDevice
被AttachDeviceHost接口实现DevmgrServiceAttachDeviceHost()调用,在完成host下的设备的驱动匹配、装载及设备服务发布后,将HdfDeviceNode以Token的Token 的形式挂接到 DevHostServiceClnt 的 devices 链表。具体过程如下:
DevmgrServiceAttachDevice(struct IDevmgrService *inst,
| const struct HdfDeviceI