鸿蒙驱动消息机制实现原理(一)
本文主要讲解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。