openharmony中HDF驱动框架关键流程说明-观察者模式-订阅服务

时间:2025-02-22 07:48:17

订阅服务,此函数为驱动可以使用的接口函数(hdf_core\interfaces\inner_api\host\shared\hdf_device_desc.h),当驱动需要知到加载时间时可以使用此函数来订阅驱动服务(驱动服务和订阅者必须在同一主机上),在订阅的驱动服务被HDF(硬件驱动框架)加载后,框架会主动向订阅者发布服务接口

int32_t HdfDeviceSubscribeService(struct HdfDeviceObject *deviceObject, const char *serviceName, struct SubscriberCallback callback)
    |-->HdfServiceObserverSubscribeService(&hostService->observer, serviceName, devNode->devId, callback)

通过HDF提供的订阅机制获取

当内核态驱动服务获取者对驱动(同一个host)加载的时机不能感知时,可以通过HDF框架提供的订阅机制来订阅该驱动服务。当该驱动加载完成时,HDF框架会将被订阅的驱动服务发布给订阅者(驱动服务获取者),实现方式如下所示:

// 订阅回调函数的编写,当被订阅的驱动加载完成后,HDF框架会将被订阅驱动的服务发布给订阅者,通过这个回调函数给订阅者使用。
// object为订阅者的私有数据,service为被订阅的服务对象。
int32_t TestDriverSubCallBack(struct HdfDeviceObject *deviceObject, const struct HdfObject *service)
{
  const struct ISampleDriverService *sampleService =(const struct ISampleDriverService *)service;
  if (sampleService == NULL) {
    return HDF_FAILURE;
  }
  sampleService->ServiceA();
  sampleService->ServiceB(5);
}

// 订阅过程的实现
int32_t TestDriverInit(struct HdfDeviceObject *deviceObject)
{
  if (deviceObject == NULL) {
    HDF_LOGE("Test driver init failed, deviceObject is null!");
    return HDF_FAILURE;
  }

  struct SubscriberCallback callBack;
  callBack.deviceObject = deviceObject;
  callBack.OnServiceConnected = TestDriverSubCallBack;
  int32_t ret = HdfDeviceSubscribeService(deviceObject, "sample_driver", callBack);
  if (ret != HDF_SUCCESS) {
    HDF_LOGE("Test driver subscribe sample driver failed!");
  }
  return ret;
}