driver-hdf-servicemanage.md 5.3 KB
Newer Older
D
duangavin123 已提交
1
# 驱动服务管理
W
wenjun 已提交
2

N
NEEN 已提交
3

W
wenjun 已提交
4 5
驱动服务是HDF驱动设备对外提供能力的对象,由HDF框架统一管理。驱动服务管理主要包含驱动服务的发布和获取。

D
duangavin123 已提交
6

N
NEEN 已提交
7
HDF框架定义了驱动对外发布服务的策略,是由配置文件中的policy字段来控制,policy字段的取值范围以及含义如下:
W
wenjun 已提交
8

D
duangavin123 已提交
9 10

  
W
wenjun 已提交
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
```
typedef enum {
    /* 驱动不提供服务 */
    SERVICE_POLICY_NONE = 0,
    /* 驱动对内核态发布服务 */
    SERVICE_POLICY_PUBLIC = 1,
    /* 驱动对内核态和用户态都发布服务 */
    SERVICE_POLICY_CAPACITY = 2,
    /* 驱动服务不对外发布服务,但可以被订阅 */
    SERVICE_POLICY_FRIENDLY = 3,
    /* 驱动私有服务不对外发布服务,也不能被订阅 */
    SERVICE_POLICY_PRIVATE = 4,
    /* 错误的服务策略 */
    SERVICE_POLICY_INVALID
} ServicePolicy;
```

D
duangavin123 已提交
28 29

## 使用场景
W
wenjun 已提交
30 31 32

当驱动以接口的形式对外提供能力时,可以使用HDF框架的驱动服务管理能力。

D
duangavin123 已提交
33 34

## 接口说明
W
wenjun 已提交
35 36 37

针对驱动服务管理功能,HDF框架开放了以下接口供开发者调用,如下表所示:

D
duangavin123 已提交
38
  **表1** 服务管理接口
W
wenjun 已提交
39

D
duangavin123 已提交
40 41 42 43 44
| 方法 | 描述 | 
| -------- | -------- |
| int32_t (\*Bind)(struct HdfDeviceObject \*deviceObject); | 需要驱动开发者实现Bind函数,将自己的服务接口绑定到HDF框架中。 | 
| const struct HdfObject \*DevSvcManagerClntGetService(const char \*svcName); | 获取驱动的服务。 | 
| int&nbsp;HdfDeviceSubscribeService(<br/>struct&nbsp;HdfDeviceObject&nbsp;\*deviceObject,&nbsp;const&nbsp;char&nbsp;\*serviceName,&nbsp;struct&nbsp;SubscriberCallback&nbsp;callback); | 订阅驱动的服务。 | 
W
wenjun 已提交
45 46


D
duangavin123 已提交
47
## 开发步骤
W
wenjun 已提交
48

D
duangavin123 已提交
49
驱动服务管理的开发包括驱动服务的编写、绑定、获取或者订阅,详细步骤如下。
W
wenjun 已提交
50

D
duangavin123 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
1. 驱动服务发布。
     
   ```
   驱动服务结构的定义
   struct ISampleDriverService {
       struct IDeviceIoService ioService;   // 服务结构的首个成员必须是IDeviceIoService类型的成员
       int32_t (*ServiceA)(void);               // 驱动的第一个服务接口
       int32_t (*ServiceB)(uint32_t inputCode); // 驱动的第二个服务接口,有多个可以依次往下累加
   };
   
   驱动服务接口的实现
   int32_t SampleDriverServiceA(void)
   {
       // 驱动开发者实现业务逻辑
       return 0;
   }
   
   int32_t SampleDriverServiceB(uint32_t inputCode)
   {
       // 驱动开发者实现业务逻辑
       return 0;
   }
   ```

2. 驱动服务绑定到HDF框架中,实现HdfDriverEntry中的Bind指针函数。
     
   ```
   int32_t SampleDriverBind(struct HdfDeviceObject *deviceObject)
   {
       // deviceObject为HDF框架给每一个驱动创建的设备对象,用来保存设备相关的私有数据和服务接口
       if (deviceObject == NULL) {
           HDF_LOGE("Sample device object is null!");
           return -1;
       }
       static struct ISampleDriverService sampleDriverA = {
           .ServiceA = SampleDriverServiceA,
           .ServiceB = SampleDriverServiceB,
       };
       deviceObject->service = &sampleDriverA.ioService;
       return 0;
   }
   ```

3. 驱动服务获取。
   驱动服务的获取有两种方式,HDF框架提供接口直接获取和HDF框架提供订阅机制获取。

   - 通过HDF接口直接获取
      当明确驱动已经加载完成时,获取该驱动的服务可以通过HDF框架提供的能力接口直接获取,如下所示:

        
      ```
      const struct ISampleDriverService *sampleService =
              (const struct ISampleDriverService *)DevSvcManagerClntGetService("sample_driver");
      if (sampleService == NULL) {
          return -1;
      }
      sampleService->ServiceA();
      sampleService->ServiceB(5);
      ```
   - 通过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 -1;
          }
          sampleService->ServiceA();
          sampleService->ServiceB(5);
      }
      // 订阅过程的实现
      int32_t TestDriverInit(struct HdfDeviceObject *deviceObject)
      {
          if (deviceObject == NULL) {
              HDF_LOGE("Test driver init failed, deviceObject is null!");
              return -1;
          }
          struct SubscriberCallback callBack;
          callBack.deviceObject = deviceObject;
          callBack.OnServiceConnected = TestDriverSubCallBack;
          int32_t ret = HdfDeviceSubscribeService(deviceObject, "sample_driver", callBack);
          if (ret != 0) {
              HDF_LOGE("Test driver subscribe sample driver failed!");
          }
          return ret;
      }
      ```