淘先锋技术网

首页 1 2 3 4 5 6 7

鸿蒙驱动消息机制实现原理(一)

 

本文主要讲解HDF框架下用户态应用发送消息到驱动的实现过程 。 

1、驱动编写

1、将驱动配置信息中(HCS文件)服务策略policy字段设置为2(SERVICE_POLICY_CAPACITY)。

2、在Bind时实现服务基类成员IDeviceIoService中的Dispatch方法。device->service = (struct IDeviceIoService *)(&sampleDriverA)。

int32_t SampleDriverBind(struct HdfDeviceObject *device)
{
    HDF_LOGE("test for lite os sample driver A Open!");
    if (device == NULL) {
        HDF_LOGE("test for lite os sample driver A Open failed!");
        return -1;
    }
    static struct ISampleDriverService sampleDriverA = {
        .ioService.Dispatch = SampleDriverDispatch,
        .ServiceA = SampleDriverServiceA,
        .ServiceB = SampleDriverServiceB,
    };
    device->service = (struct IDeviceIoService *)(&sampleDriverA);
    return 0;
}

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

用户态打开服务结点函数为 struct HdfIoService *serv = HdfIoServiceBind("sample_driver", 0)。启动消息机制函数serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply);

实际上就是1、open设备结点。

                  2、ioctl传入相关CMD。注意的是HdfIoServiceAdapterObtain函数调用的是 frameworks\core\shared\src\hdf_io_service.c 文件下。    

2,消息机制在HDF实现过程

从发布服务开始分析 ,参考大神HDF框架分析文章。DeviceNodeExtPublishService传参inst为Node结点信息(Node结点参考官方文档:/docs/driver/驱动开发.md ),serviceName为服务名。

其执行动作如下:

1、根据HCS文件中的服务策略,在文件系统中创建一个以服务名为名称的设备结点。

2、在register_driver时会加入私有数据vnodeAdapter,并与Node结点绑定。

3、注册服务dispatch处理函数。

.Dispatch = DeviceNodeExtDispatch。

devNodeExt->ioService->target = (struct HdfObject*)(&inst->deviceObject);(指向Bind时实现服务基类成员)

 

当应用层open这个服务名时。

1、获取register_driver的私有数据vnodeAdapter。

2、分配结点客户端client。

3、获取到 发布的服务与Bind时实现服务基类成员。

当应用层ioctl时:

根据传入的CMD执行服务的Dispatch函数。

实际上就是执行DeviceNodeExtDispatch

1、根据传入的Bind时实现服务基类成员找到Node结点。

2、获取到Bind时的服务基类函数,并调用Dispatch。

HDF消息机制数据走向图