当前位置: 首页 > 科技观察

DevEcoDeviceTool:一键生成HDF框架!

时间:2023-03-13 14:28:21 科技观察

想要了解更多开源,请访问:开源基础软件社区https://ost.51cto.comHDF驱动框架概览,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。旨在构建统一的驱动架构体系,为驱动开发者提供更加精准高效的开发环境,力求实现一次开发,多系统部署。开发者可以通过DevEcoDeviceTool的HDF功能管理和添加设备驱动。添加驱动时,工具会自动生成对应的驱动目录结构、初始化驱动模板、代码、头文件等信息。前提条件开发板:Hi3516DV300开发板(目前只支持该开发板,支持LiteOS内核和Linux内核的HDF驱动模板生成)源码:OpenHarmonyV3.1Release及后续版本源码。工具:DevEco设备工具。通过HDF框架自动生成用户体验,确实给小型系统和标准系统的开发带来了极大的便利。在写驱动代码的时候,可以减少对编译构建的关注,更多关注驱动代码本身,提高代码编写效率,并且会生成一个代码框架,命名格式更规范,可以节省大量时间用于编写或复制和修改框架。缺点是目前只支持一种开发板,希望以后可以改进,支持更多的开发板。这个功能真的很好用。新建HDF驱动模块,点击DevecoDeviceTool插件图标,在工具控制区点击HDF进入驱动添加页面,选择产品。目前仅支持ipcamera_hispark_taurus、ipcamera_hispark_taurus_linux、hispark_taurus_standard。不支持的产品不能点击+号添加HDF模块。在“添加驱动模块”对话框中,填写模块名称,单击“添加”。注意:仅针对标准系统产品,添加驱动时需要选择“RunMode”:user和kernel;对于小系统产品,只需要填写Module名称即可。添加完成后,可以点击Action下的删除按钮,删除添加的模块。添加后在DriverModule下可以看到添加的模块,使用LiteOS内核和Linux内核时会有所不同。生成后会自动为我们配置编译链,自动生成MakeFile、BUILD.gn、Kconfig、C++驱动代码模板等。驱动代码实现点击模块文件下的文件图标,打开文件进行驱动开发。点击c/c++开发驱动代码。生成的模板如下。(我找的官方图片有中文注释)。为了验证HDF驱动是否成功编译进内核,对驱动代码稍作修改,在Init函数中加入红外LED灯。查阅原理图得到红外LED的引脚号为41,代码如下,需要包含#include"gpio_if.h"头文件用于控制gpio,如果只是为了验证,它不会写用户模式函数。#include"hdf_device_desc.h"//描述HDF提供给驱动的API的头文件。#include"hdf_log.h"//描述HDF提供的日志API的头文件。#include"gpio_if.h"//添加GPIO驱动头文件#defineHDF_LOG_TAGhello_linux_driver//日志中包含的标签。如果没有指定tag,则使用默认的HDF_TAG//驱动服务结构体定义structITestDriverService{structIDeviceIoServiceioService;//服务结构的第一个成员必须是IDeviceIoService类型的成员};//驱动程序服务接口必须绑定到HDF,以便您使用服务能力。staticint32_tHdfHelloLinuxDriverBind(structHdfDeviceObject*deviceObject){HDF_LOGI("hello_linux驱动绑定成功");return0;}//初始化驱动程序service.staticint32_tHdfHelloLinuxDriverInit(structHdfDeviceObject*deviceObject){HDF_LOGI("HelloLinux");GpioSetDir(41,GPIO_DIR_OUT);//设置引脚输出GpioWrite(41,GPIO_VAL_HIGH);//输出高电平,红外灯亮return0;}//释放驱动resources.staticvoidHdfHelloLinuxDriverRelease(structHdfDeviceObject*deviceObject){HDF_LOGI("hello_linux驱动发布成功");return;}//定义驱动入口的对象。该对象必须是HdfDriverEntry类型的全局变量(在hdf_device_desc.h中定义)。structHdfDriverEntryg_hello_linuxDriverEntry={.moduleVersion=1,.moduleName="hello_linux_driver",.Bind=HdfHelloLinuxDriverBind,.Init=HdfHelloLinuxDriverInit,.Releasein=HdfDriverHelloL,};//调用HDF_INIT向HDF框架注册驱动入口。加载驱动时先调用Bind函数,再调用Init函数。如果Init函数调用失败,HDF会调用Release释放驱动资源并退出。HDF_INIT(g_hello_linuxDriverEntry);烧录验证,然后编译烧录开始,不清楚的可以参考以下文章:Hi3516DV300OpenHarmony3.1环境配置与编程点击monitor打开串口监控,可以看到打印出HelloLinuxLOG,说明驱动初始化成功,可以看到红外灯成功点亮。后记虽然通过工具自动生成代码很方便,但是还是建议初学者自己弄清楚HDF框架的具体实现过程,手动实现,了解整个编译过程。这对于理解OpenHarmony代码和框架非常有帮助。熟练掌握后最好做你的助手,提高效率。而且该工具不一定支持所有情况。了解了整个HDF后,即使遇到一些特殊情况,也能想办法解决。在下一篇文章中,我将深入HDF驱动开发过程,对比LiteOS内核和Linux内核HDF驱动开发。不同之处。了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。