• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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&nbsp;HdfDeviceSubscribeService(<br/>struct&nbsp;HdfDeviceObject&nbsp;\*deviceObject,&nbsp;const&nbsp;char&nbsp;\*serviceName,&nbsp;struct&nbsp;SubscriberCallback&nbsp;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