OpenHarmony——驱动消息机制管理开发

发布时间:2024年01月17日

1.将驱动配置信息中服务策略policy字段设置为2(SERVICE_POLICY_CAPACITY,policy定义)。

device_sample :: Device {
    policy = 2;
    ...
}

2.配置驱动信息中的服务设备节点权限(permission字段)是框架给驱动创建设备节点的权限,默认是0666,驱动开发者根据驱动的实际使用场景配置驱动设备节点的权限。

3.在服务实现过程中,实现服务基类成员IDeviceIoService中的Dispatch方法。

// Dispatch是用来处理用户态发下来的消息
int32_t SampleDriverDispatch(struct HdfDeviceIoClient *device, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply)
{
    HDF_LOGI("sample driver lite A dispatch");
    return HDF_SUCCESS;
}
int32_t SampleDriverBind(struct HdfDeviceObject *device)
{
    HDF_LOGI("test for lite os sample driver A Open!");
    if (device == NULL) {
        HDF_LOGE("test for lite os sample driver A Open failed!");
        return HDF_FAILURE;
    }
    static struct ISampleDriverService sampleDriverA = {
        .ioService.Dispatch = SampleDriverDispatch,
        .ServiceA = SampleDriverServiceA,
        .ServiceB = SampleDriverServiceB,
    };
    device->service = (struct IDeviceIoService *)(&sampleDriverA);
    return HDF_SUCCESS;
}

4.驱动定义消息处理函数中的cmd类型。

#define SAMPLE_WRITE_READ 1    // 读写操作码1

5.用户态获取服务接口并发送消息到驱动。

int SendMsg(const char *testMsg)
{
    if (testMsg == NULL) {
        HDF_LOGE("test msg is null");
        return HDF_FAILURE;
    }
    struct HdfIoService *serv = HdfIoServiceBind("sample_driver");
    if (serv == NULL) {
        HDF_LOGE("fail to get service");
        return HDF_FAILURE;
    }
    struct HdfSBuf *data = HdfSbufObtainDefaultSize();
    if (data == NULL) {
        HDF_LOGE("fail to obtain sbuf data");
        return HDF_FAILURE;
    }
    struct HdfSBuf *reply = HdfSbufObtainDefaultSize();
    if (reply == NULL) {
        HDF_LOGE("fail to obtain sbuf reply");
        ret = HDF_DEV_ERR_NO_MEMORY;
        goto out;
    }
    if (!HdfSbufWriteString(data, testMsg)) {
        HDF_LOGE("fail to write sbuf");
        ret = HDF_FAILURE;
        goto out;
    }
    int ret = serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("fail to send service call");
        goto out;
    }
out:
    HdfSbufRecycle(data);
    HdfSbbufRecycle(reply);
    HdfIoServiceRecycle(serv);
    return ret;
}

6.用户态接收该驱动上报的消息。

  1. 用户态编写驱动上报消息的处理函数。
    static int OnDevEventReceived(void *priv,  uint32_t id, struct HdfSBuf *data)
    {
        OsalTimespec time;
        OsalGetTime(&time);
        HDF_LOGI("%{public}s received event at %{public}llu.%{public}llu", (char *)priv, time.sec, time.usec);
    
        const char *string = HdfSbufReadString(data);
        if (string == NULL) {
            HDF_LOGE("fail to read string in event data");
            return HDF_FAILURE;
        }
        HDF_LOGI("%{public}s: dev event received: %{public}d %{public}s",  (char *)priv, id, string);
        return HDF_SUCCESS;
    }

    2.用户态注册接收驱动上报消息的操作方法。

    int RegisterListen()
    {
        struct HdfIoService *serv = HdfIoServiceBind("sample_driver");
        if (serv == NULL) {
            HDF_LOGE("fail to get service");
            return HDF_FAILURE;
        }
        static struct HdfDevEventlistener listener = {
            .callBack = OnDevEventReceived,
            .priv ="Service0"
        };
        if (HdfDeviceRegisterEventListener(serv, &listener) != 0) {
            HDF_LOGE("fail to register event listener");
            return HDF_FAILURE;
        }
        ......
        HdfDeviceUnregisterEventListener(serv, &listener);
        HdfIoServiceRecycle(serv);
        return HDF_SUCCESS;
    }

    3.驱动上报事件。

    int32_t SampleDriverDispatch(HdfDeviceIoClient *client, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply)
    {
        ... // process api call here
        return HdfDeviceSendEvent(client->device, cmdCode, data);
    }

文章来源:https://blog.csdn.net/m0_70749039/article/details/135636032
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。