1# 驱动服务管理 2 3 4驱动服务是HDF驱动设备对外提供能力的对象,由HDF框架统一管理。驱动服务管理主要包含驱动服务的发布和获取。 5 6 7HDF框架定义了驱动对外发布服务的策略,由配置文件中的policy字段来控制,policy字段的取值范围以及含义如下: 8 9 10 11```c 12typedef enum { 13 /* 驱动不提供服务 */ 14 SERVICE_POLICY_NONE = 0, 15 /* 驱动对内核态发布服务 */ 16 SERVICE_POLICY_PUBLIC = 1, 17 /* 驱动对内核态和用户态都发布服务 */ 18 SERVICE_POLICY_CAPACITY = 2, 19 /* 驱动服务不对外发布服务,但可以被订阅 */ 20 SERVICE_POLICY_FRIENDLY = 3, 21 /* 驱动私有服务不对外发布服务,也不能被订阅 */ 22 SERVICE_POLICY_PRIVATE = 4, 23 /* 错误的服务策略 */ 24 SERVICE_POLICY_INVALID 25} ServicePolicy; 26``` 27 28 29## 使用场景 30 31当驱动需要以接口的形式对外提供能力时,可以使用HDF框架的驱动服务管理能力。 32 33 34## 接口说明 35 36针对驱动服务管理功能,HDF框架开放了以下接口供开发者调用,如下表所示: 37 38 **表1** 服务管理接口 39 40| 方法 | 描述 | 41| -------- | -------- | 42| int32_t (\*Bind)(struct HdfDeviceObject \*deviceObject) | 需要驱动开发者实现Bind函数,将自己的服务接口绑定到HDF框架中。 | 43| const struct HdfObject \*DevSvcManagerClntGetService(const char \*svcName)| 获取驱动的服务。 | 44|int HdfDeviceSubscribeService(<br/>struct HdfDeviceObject \*deviceObject, const char \*serviceName, struct SubscriberCallback callback) | 订阅驱动的服务。 | 45 46 47## 开发步骤 48 49驱动服务管理的开发包括驱动服务的编写、绑定、获取或者订阅,详细步骤如下。 50 511. 驱动服务编写。 52 53 ```c 54 // 驱动服务结构的定义 55 struct ISampleDriverService { 56 struct IDeviceIoService ioService; // 服务结构的首个成员必须是IDeviceIoService类型的成员。 57 int32_t (*ServiceA)(void); // 驱动的第一个服务接口。 58 int32_t (*ServiceB)(uint32_t inputCode); // 驱动的第二个服务接口,有多个可以依次往下累加。 59 }; 60 61 // 驱动服务接口的实现 62 int32_t SampleDriverServiceA(void) 63 { 64 // 驱动开发者实现业务逻辑 65 return HDF_SUCCESS; 66 } 67 68 int32_t SampleDriverServiceB(uint32_t inputCode) 69 { 70 // 驱动开发者实现业务逻辑 71 return HDF_SUCCESS; 72 } 73 ``` 74 752. 驱动服务绑定。 76 77 开发者实现HdfDriverEntry中的Bind指针函数,如下的SampleDriverBind,把驱动服务绑定到HDF框架中。 78 79 ```c 80 int32_t SampleDriverBind(struct HdfDeviceObject *deviceObject) 81 { 82 // deviceObject为HDF框架给每一个驱动创建的设备对象,用来保存设备相关的私有数据和服务接口。 83 if (deviceObject == NULL) { 84 HDF_LOGE("Sample device object is null!"); 85 return HDF_FAILURE; 86 } 87 static struct ISampleDriverService sampleDriverA = { 88 .ServiceA = SampleDriverServiceA, 89 .ServiceB = SampleDriverServiceB, 90 }; 91 deviceObject->service = &sampleDriverA.ioService; 92 return HDF_SUCCESS; 93 } 94 ``` 95 963. 驱动服务获取。 97 98 应用程序开发者获取驱动服务有两种方式:通过HDF接口直接获取和通过HDF提供的订阅机制获取。 99 100 - 通过HDF接口直接获取 101 102 当驱动服务获取者明确驱动已经加载完成时,获取该驱动的服务可以通过HDF框架提供的能力接口直接获取,如下所示: 103 104 105 ```c 106 const struct ISampleDriverService *sampleService = 107 (const struct ISampleDriverService *)DevSvcManagerClntGetService("sample_driver"); 108 if (sampleService == NULL) { 109 return HDF_FAILURE; 110 } 111 sampleService->ServiceA(); 112 sampleService->ServiceB(5); 113 ``` 114 - 通过HDF提供的订阅机制获取 115 116 当内核态驱动服务获取者对驱动(同一个host)加载的时机不感知时,可以通过HDF框架提供的订阅机制来订阅该驱动服务。当该驱动加载完成时,HDF框架会将被订阅的驱动服务发布给订阅者(驱动服务获取者),实现方式如下所示: 117 118 119 ```c 120 // 订阅回调函数的编写,当被订阅的驱动加载完成后,HDF框架会将被订阅驱动的服务发布给订阅者,通过这个回调函数给订阅者使用。 121 // object为订阅者的私有数据,service为被订阅的服务对象。 122 int32_t TestDriverSubCallBack(struct HdfDeviceObject *deviceObject, const struct HdfObject *service) 123 { 124 const struct ISampleDriverService *sampleService = 125 (const struct ISampleDriverService *)service; 126 if (sampleService == NULL) { 127 return HDF_FAILURE; 128 } 129 sampleService->ServiceA(); 130 sampleService->ServiceB(5); 131 } 132 // 订阅过程的实现 133 int32_t TestDriverInit(struct HdfDeviceObject *deviceObject) 134 { 135 if (deviceObject == NULL) { 136 HDF_LOGE("Test driver init failed, deviceObject is null!"); 137 return HDF_FAILURE; 138 } 139 struct SubscriberCallback callBack; 140 callBack.deviceObject = deviceObject; 141 callBack.OnServiceConnected = TestDriverSubCallBack; 142 int32_t ret = HdfDeviceSubscribeService(deviceObject, "sample_driver", callBack); 143 if (ret != HDF_SUCCESS) { 144 HDF_LOGE("Test driver subscribe sample driver failed!"); 145 } 146 return ret; 147 } 148 ``` 149