电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1695|回复: 1
收起左侧

【信盈达】鸿蒙系统驱动程序--1、HDF开发指南

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-9-14 11:56:33 | 显示全部楼层 |阅读模式
【信盈达】鸿蒙系统驱动程序--1、HDF开发指南,   
1,HDF开发指南    HDF(HarmonyOS Driver Foundation)鸿蒙驱动框架,提供驱动框架能力,包括驱动加载,驱动服务管理,驱动消息机制和驱动电源管理。基于HDF框架的能力,驱动开发者可以更集中于驱动自身功能的开发,骑士提升驱动开发效率。
1.1驱动加载介绍 实现驱动的加载功能,包括按需加载和按序加载: 第一:按需加载    HDF框架支持驱动在系统启动过程中交替加载,同时支持驱动在系统启动之后动态加载。 第二:按序加载    HDF框架支持驱动在系统启动的过程中按照驱动的优先级进行加载。
1.2驱动服务管理    HDF框架会集中管理驱动服务,使用者可以直接通过HDF框架对外提供的能力接口获取驱动相关的服务。    HDF框架提供统一的驱动消息机制,支持用户态向内核态驱动发送消息,也支持内核态驱动向用户态应用发送消息。    HDF框架提供休眠和唤醒功能,驱动能力在首次被使用时,框架会通知驱动进行唤醒操作。在最后一次使用结束时,框架会通知驱动进行休眠操作。
1.3驱动加载开发指导    驱动必须基于HDF框架开发才能使用HDF框架相关功能。驱动聚焦于自身功能的实现,依赖HDF框架的机制将驱动驱动进来,不需要关注驱动加载的过程。HDF框架开放能力包含两个部分,配置文件和注册接口。
1.4编写驱动程序    这跟Linux的驱动框架不一样,在Linux中,APP打开设备中断后,APP调用的读取函数会直接进入内核状态调用驱动的读取函数。

    在liteos-a中使用HDF时,APP需要先获得服务,然后调用服务的调度函数:它可以向驱动发送数据,获得返回结果。

    所以写驱动时,我们要先“编写驱动”,在“驱动中实现服务”。
1.5编写驱动    编写hello_drv.c源文件,在HDF中,一个驱动被抽象为“ HdfDriverEntry”,代码如下:

18.png (22.28 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 上述代码中,使用HDF_INIT定义了某些段属性的结构体,内核启动后会注册这个HdfDriverEntry。



重要的是其中的Bind函数,Init和Release函数的作用暂时无了解,不写又不行,我直接写空函数,代码如下:

19.png (25.88 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 在哪里实现服务呢?在Bind函数中。
1.6在驱动中实现服务

这被称为“绑定”,给驱动程序提供一个IHelloDriverService结构体,代码如下:

20.png (31.2 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传

重要的是:IHelloDriverService结构体中第一个成员必定是“ struct IRemoteService”,代码如下:

21.png (13.85 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 绑定时就是设置device-> service指向一个“ struct IRemoteService”,上面的代码第49行。

在“ struct IRemoteService”结构体中,设置“ Dispatch”函数,上面代码第47行。 您可以认为Dispatch函数相当于ioctl,在Linux中通过ioctl(fd,cmd,arg)来操作驱动。 在liteos-a中通过service->> dispatcher-> Dispatch(ojb,cmd,数据,重播)来操作驱动(后面会看到)。


1.7实现调度函数

我现在只是实现了APP读取驱动的值,在驱动中设置reply即可,代码如下:

22.png (34.85 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传
1.8把驱动放入内核中   这段代码可以,参考内核自带的gpio驱动。
1.9具体驱动加入内核的实现流程

第一步:把代码放入到vendor / Huawei / hdf / platform / hello目录中:

23.png (44.56 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 上面的Kconfig,Makefile是参考同级目录gpio中的文件,具体代码如下:

Hell0_drv.c具体代码为:


/ *
*版权所有(c)2020华为设备有限公司 *根据Apache许可2.0版(“许可”)获得许可; *未经许可,您不得使用此文件。 *您可以在以下位置获得许可证的副本: * *   http://www.apache.org/licenses/LICENSE-2.0 * *除非适用法律要求或书面同意,否则软件 *根据许可协议分发的内容是按“原样”分发的, *不作任何明示或暗示的保证或条件。 *有关特定语言的管理权限,请参阅许可证 *许可中的限制。 * / #include“ hdf_device_desc.h” #include“ hdf_log.h” #include“ los_hwi.h” #include“ osal_io.h” #include“ osal_irq.h” #include“ osal_mem.h” #include“ osal_spinlock.h”
静态uint32_t g_hello_val = 0x12345678; struct IHelloDriverService {          构造IRemoteService remoteService; }; int32_t HelloDriverDispatch(struct HdfDeviceObject * device,int id,struct HdfSBuf * data,struct HdfSBuf * reply) {          (void)设备;          (无效)数据;      HDF_LOGE(“%s:收到cmd%d,并设置回复”,__func__,id);      如果(!HdfSbufWriteInt32(reply,g_hello_val)){          HDF_LOGE(“%s:回复int32失败”,__func__);      }      返回HDF_SUCCESS; // HdfDeviceSendEvent(device,id,data); } 静态int32_t HelleloDrvBind(结构HdfDeviceObject *设备) {      HDF_LOGI(“ HelleloDrvBind:Enter \ n”);      IF(device == NULL){          返回HDF_ERR_INVALID_OBJECT;      }      静态结构IHelloDriverService helloDrv = {               .remoteService.Dispatch = HelloDriverDispatch,      };      device-> service =(struct IRemoteService *)(&helloDrv);      返回0; } 静态int32_t HelleloDrvInit(struct HdfDeviceObject * device) {          (void)设备;      返回HDF_SUCCESS;       } 静态void HelleloDrvRelease(struct HdfDeviceObject * device)    {          (void)设备; } struct HdfDriverEntry g_helloDriverEntry = {        .moduleVersion = 1,        .Bind = HelleloDrvBind,      .Init = HelleloDrvInit,      .Release = HelleloDrvRelease,      .moduleName =“ PLATFORM_HELLO”, }; HDF_INIT(g_helloDriverEntry);
第二步:Kconfig的具体代码如下:

24.png (29.51 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传

第三步:添加Makefile的具体代码如下:

25.png (31.06 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传

第四步:修改上一级目录的Kconfig,如下图增加最后一行:

26.png (39.46 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 第五步:修改hcs文件

1.vendor / huawei / hdf / config / hi3516dv300 / hdf_manager / manager_config.hcs:

27.png (26.12 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传

2.vendor / huawei / hdf / config / hi3516dv300 / hello / hello_config.hcs:

28.png (14.53 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 第六步:修改mk文件

    drivers / hdf / lite / hdf_tables_ldflags.mk:

29.png (55.44 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 drivers / hdf / lite / hdf_lite.mk:

30.png (26.92 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传

注:文档和视频中所有的图片及代码截图皆为示意图,具体以HarmonyOS官网发布内容为准。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表