驱动服务管理

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

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


1. typedef enum {
2. /* 驱动不提供服务 */
3. SERVICE_POLICY_NONE = 0,
4. /* 驱动对内核态发布服务 */
5. SERVICE_POLICY_PUBLIC = 1,
6. /* 驱动对内核态和用户态都发布服务 */
7. SERVICE_POLICY_CAPACITY = 2,
8. /* 驱动服务不对外发布服务,但可以被订阅 */
9. SERVICE_POLICY_FRIENDLY = 3,
10. /* 驱动私有服务不对外发布服务,也不能被订阅 */
11. SERVICE_POLICY_PRIVATE = 4,
12. /* 错误的服务策略 */
13. SERVICE_POLICY_INVALID
14. } ServicePolicy;

使用场景

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

接口说明

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

表 1 服务管理接口

方法 描述
int32_t (Bind)(struct HdfDeviceObject deviceObject); 需要驱动开发者实现Bind函数,将自己的服务接口绑定到HDF框架中。
const struct HdfObject DevSvcManagerClntGetService(const char svcName); 获取驱动的服务。
int HdfDeviceSubscribeService( struct HdfDeviceObject deviceObject, const char serviceName, struct SubscriberCallback callback); 订阅驱动的服务。

开发步骤

驱动服务管理的开发包括驱动服务的编写、绑定、获取或者订阅,详细步骤如下。

  1. 驱动服务发布。

```

  1. 驱动服务结构的定义
  2. struct ISampleDriverService {
  3. struct IDeviceIoService ioService; // 服务结构的首个成员必须是IDeviceIoService类型的成员
  4. int32_t (*ServiceA)(void); // 驱动的第一个服务接口
  5. int32_t (*ServiceB)(uint32_t inputCode); // 驱动的第二个服务接口,有多个可以依次往下累加
  6. };

  7. 驱动服务接口的实现

  8. int32_t SampleDriverServiceA(void)
  9. {
  10. // 驱动开发者实现业务逻辑
  11. return 0;
  12. }

  13. int32_t SampleDriverServiceB(uint32_t inputCode)

  14. {
  15. // 驱动开发者实现业务逻辑
  16. return 0;
  17. } ```
  18. 驱动服务绑定到HDF框架中,实现HdfDriverEntry中的Bind指针函数。

```

  1. int32_t SampleDriverBind(struct HdfDeviceObject *deviceObject)
  2. {
  3. // deviceObject为HDF框架给每一个驱动创建的设备对象,用来保存设备相关的私有数据和服务接口
  4. if (deviceObject== NULL) {
  5. HDF_LOGE("Sample device object is null!");
  6. return -1;
  7. }
  8. static struct ISampleDriverService sampleDriverA = {
  9. .ServiceA = SampleDriverServiceA,
  10. .ServiceB = SampleDriverServiceB,
  11. };
  12. deviceObject->service = &sampleDriverA.ioService;
  13. return 0;
  14. } ```
  15. 驱动服务获取。

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

  • 通过HDF接口直接获取

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

    ```

    1. const struct ISampleDriverService *sampleService =
    2. (const struct ISampleDriverService *)DevSvcManagerClntGetService("sample_driver");
    3. if (sampleService == NULL) {
    4. return -1;
    5. }
    6. sampleService->ServiceA();
    7. sampleService->ServiceB(5); ``` - 通过HDF提供的订阅机制获取

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

    ```

    1. // 订阅回调函数的编写,当被订阅的驱动加载完成后,HDF框架会将被订阅驱动的服务发布给订阅者,通过这个回调函数给订阅者使用
    2. // object为订阅者的私有数据,service为被订阅的服务对象
    3. int32_t TestDriverSubCallBack(struct HdfDeviceObject deviceObject, const struct HdfObject service)
    4. {
    5. const struct ISampleDriverService *sampleService =
    6. (const struct ISampleDriverService *)service;
    7. if (sampleService == NULL) {
    8. return -1;
    9. }
    10. sampleService->ServiceA();
    11. sampleService->ServiceB(5);
    12. }
    13. // 订阅过程的实现
    14. int32_t TestDriverInit(struct HdfDeviceObject *deviceObject)
    15. {
    16. if (deviceObject== NULL) {
    17. HDF_LOGE("Test driver init failed, deviceObject is null!");
    18. return -1;
    19. }
    20. struct SubscriberCallback callBack;
    21. callBack.deviceObject = deviceObject;
    22. callBack.OnServiceConnected = TestDriverSubCallBack;
    23. int32_t ret = HdfDeviceSubscribeService(deviceObject, "sample_driver", callBack);
    24. if (ret != 0) {
    25. HDF_LOGE("Test driver subscribe sample driver failed!");
    26. }
    27. return ret;
    28. } ```