文档管理中心
我的

HDF框架求助,萌新还是很困惑,请大佬进来喝茶聊聊

如题,萌新一直卡在这个HDF框架这里,这个框架和linux的驱动还是有点不一样的。

先梳理一下框架,如有错,请指出

驱动层函数入口,定义了这个驱动的服务名称叫 sample_driver 然后用户层可以通过这个服务名称来获取到对应的驱动,

然后这里是驱动层绑定驱动函数的地方,HdfSampleDriverDispatch这个函数就是用来处理用户层下发的消息


  1. #define SAMPLE_SERVICE_NAME "sample_service"

然后这里是用户层,也就是应用层的获取驱动的地方,用户通过这个服务名称来获取到对应的驱动


这里是用户层下发数据到应用层,这里的这个Dispatch应该就是上图的HdfSampleDriverDispatch函数,是这样吧

OK,如果我理解没有错的话,那么正常通过消息发送到驱动层,可以这样写:


serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply);

SAMPLE_WRITE_READ是控制ID,比如SAMPLE_WRITE_READ = 1,对应的是打印字符串

那么在驱动层就通过一个判断来获取用户发过来的数据,

如果SAMPLE_WRITE_READ = 2 ,对应下发uint8类型的数据,那么代码可以这样


OK,到这里,如果框架思路正确的话,那我就有问题了


先看下官方文档


这里自定义了一个结构体,应该是用户自行实现的例子,实现了两个驱动子函数并封装在自定义结构体里边


然后将这个自定义的结构体注册到框架中,这里跟开头的绑定没有什么区别。


Q1:这么做应该是可以方便让用户在用户层可以动过这个服务框架获取到这个结构体的句柄,然后直接操作这些子函数,对吧?


那么如何获取?

方式1:

Q2:看到这里,按照一般人的思路,应该是我在用户层获取到了这个句柄,然后就操作这个子函数了,对吧?要不然,如果在驱动层使用的话,写个5传进去,没有意义。

方式2:

Q3: 这里订阅的获取,应该是用户层订阅的吧?如果是,那这段代码应该是在用户层代码出现的吧?


OK,那么,我如何在用户层获取呢?官方能给个例子?一个例子应该用不了太多时间吧


然后现在这样的,按照上面的获取服务的思路,我在用户层代码的main函数中调用了这个函数会报错


会报错,错误是无法找到这个DevSvcManagerClntGetService函数,

Q4: 这个函数是不是只在内核态也就是驱动层有效?


Q5:当明确驱动已经加载完成时,(获取方式1)获取该驱动的服务可以通过HDF框架提供的能力接口直接获取,这里的明确加载完成是如何判断的? (获取方式2) 当对驱动(同一个host)加载的时机不感知时,可以通过HDF框架提供的订阅机制来订阅该驱动,怎么理解这个加载时机不感知?


Q6:如果使用回调函数来获取,那我如何实现?


Q7:以上所有问题,希望能提供一个例子,结合例子,才能更加理解这个框架,谢谢!


我之前问过一次,但是还是有点困惑,希望能详细解答,谢谢

点赞
收藏
回复
17
分享
举报
浏览828 发布于2021-01-18 10:13未知归属地
全部评论
最多点赞
最新发布
最早发布
您好,我也是最近刚接触HDF框架,看那个开发文档,感觉写的不是很清楚。我想问一下。这个驱动代码,用户态测试代码都需要放到哪个路径下。我这使用openharmony 最新的master代码,将代码放到driver/hdf_core/framework下,按照开发文档配置了Kconfig和makefile,结果还是编译不进去。您能简单告诉一下您那边的代码都是放在哪些路径下实现的编译吗,谢谢
9楼回复于2022-06-24 08:00 未知归属地

你好开发者关于调用DevSvcManagerClntGetService服务失败的原因:

   1、3516上使用的是liteOS KHDF,说白了就是HDF运行在内核态。

   2、驱动服务管理是运行在HDF框架中,因此用户层直接调用是不行的。建议采用open设备结点的方式调用。

   3、关键在于驱动服务管理的应用场景是什么?OHOS还处于婴儿期待续~~~

希望对你有帮助。

7楼回复于2021-01-29 11:29 未知归属地

当用户态应用和内核态驱动需要交互时,可以使用HDF框架的消息机制来实现。


openHMOS官方文档:

  docs/driver/驱动消息机制管理.md

  docs/quick-start/开发Hi3516第一个驱动程序示例.md

参考例子

  vendor/huawei/hdf/sample

6楼回复于2021-01-28 03:04 未知归属地

你好,关于DevSvcManagerClntGetService函数,目前只能在HDF框架中调用了。

参考开源源码

2
4楼回复于2021-01-27 02:41 未知归属地
  • 185******35

    那意思就是这个 自定义的结构体的例子就 行不通了?

    2021-01-27 02:55 未知归属地
  • denzel回复185******35

    例子是可以的,运行在HDF框架中。 只是目前没有把HDI调用驱动服务相关的文档发布出来。

    2021-01-27 03:36 未知归属地

配置参数设置错了呀。你的deviceMatchAttr与serviceName搞反了哈。

7
3楼回复于2021-01-22 09:40 未知归属地
  • 185******35

    改过来了,下一步呢?

    2021-01-22 09:45 未知归属地
  • denzel回复185******35

    需要将该配置文件添加到板级配置入口文件hdf.hcs,成功后会在/dev/下面创建设备结点

    2021-01-22 09:51 未知归属地
  • 185******35回复denzel

    噢,可能你还没明白我的问题,现在驱动是能正常使用,我是想弄明白那个私有的结构体怎么在用户层代码调用,

    2021-01-22 09:52 未知归属地
  • 展开剩余4条回复

你好开发者,在进行驱动服务获取时需要在HCS文件中指定服务发布策略与驱动对外发布服务的名称。

参考openHarmonyOS /docs/driver/驱动开发.md

  /docs/driver/驱动服务管理.md

在相应的HCS文件作相应配置。

policy = 1; //设备服务发布策略

//0不创建驱动service。

  1 对内核开放的service接口。

  2 对内核和用户开放的service接口。

serviceName = "sample_service";    // 驱动对外发布服务的名称,必须唯一。


1
2楼回复于2021-01-22 06:13 未知归属地
  • 185******35

    你看,这都是已经设置了的

    2021-01-22 08:19 未知归属地

开发者你好,您的问题已经为您转相关人员待处理中,有回复后我们会及时同步。

同时欢迎论坛开发小伙伴们互帮互助.............

感谢您对开发者论坛的支持!!

1楼回复于2021-01-19 02:37 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。