概述
HDF驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。旨在构建统一的驱动架构系统,为驱动开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。
开发者可以通过DevEco Device Tool的HDF功能管理和添加设备的驱动,添加驱动时,工具会自动生成相应的驱动目录结构、初始化驱动模板、代码及头文件等信息。
前提条件
- 开发板:Hi3516DV300开发板(目前只支持该开发板,并且支持LiteOS内核和Linux内核的HDF驱动模板生成)
- 源码:OpenHarmonyV3.1 Release及后续版本源码。
- 工具:DevEco Device Tool。
使用体验
通过HDF框架自动生成确实对于小型系统和标准系统的开发带来很大便利,编写驱动代码时可以减少对编译构建的关注,而更加关注到驱动代码编写本身,提高代码编写效率,并且会生成代码框架,命名格式什么都比较规范,可以省去很多时间用于框架的编写或复制修改。缺点就是目前支持的开发板只有一个,希望后续可以完善,支持更多的开发板,这个功能是真的很好用。
新建HDF驱动模块
点开Deveco Device Tool插件图标,在工具控制区中点击HDF进入驱动添加页面,选择产品,目前只有ipcamera_hispark_taurus与ipcamera_hispark_taurus_linux与hispark_taurus_standard三款产品支持使用,未支持的产品无法点击+号添加HDF模块。
在添加驱动模块对话框中,填写模块名称,然后点击添加。
说明:
只有标准系统的产品,在添加驱动的时候,需要选择“RunMode”:user和kernel;小型系统的产品只需要填写Module名称即可。
添加后,可点击Action下的删除按钮删除已添加的模块。
添加后,可以在Driver Module下看到已添加的模块,使用LiteOS内核与Linux内核生成的会有所不同。
生成后会自动帮我们配置好编译链,自动生成MakeFile,BUILD.gn,Kconfig,C++驱动代码模板等。
驱动代码实现
点击模块文件下的文件图标,可以打开文件,进行驱动开发。点击c/c++即可进行驱动代码的开发。生成的模板如下。(找了官方的含有中文注释的图)。
为了验证HDF驱动是否成功编译进内核,对驱动代码进行些许修改,在Init函数中加入了红外LED灯的点亮,通过查阅原理图得到,红外led的引脚号为41,代码如下,需包含#include "gpio_if.h"头文件用于控制gpio,只是验证的话就不写用户态的函数了。
#include "hdf_device_desc.h" // Header file that describes the APIs provided by the HDF to the driver.
#include "hdf_log.h" // Header file that describes the log APIs provided by the HDF.
#include "gpio_if.h" //添加GPIO驱动头文件
#define HDF_LOG_TAG hello_linux_driver // Tag contained in logs. If no tag is not specified, the default HDF_TAG is used.
// The driver service struct definition
struct ITestDriverService {
struct IDeviceIoService ioService; // The first member of the service structure must be a member of type IDeviceIoService
};
// The driver service interface must be bound to the HDF for you to use the service capability.
static int32_t HdfHelloLinuxDriverBind(struct HdfDeviceObject *deviceObject) {
HDF_LOGI("hello_linux driver bind success");
return 0;
}
// Initialize the driver service.
static int32_t HdfHelloLinuxDriverInit(struct HdfDeviceObject *deviceObject) {
HDF_LOGI("Hello Linux");
GpioSetDir(41,GPIO_DIR_OUT);//引脚设置为输出
GpioWrite(41,GPIO_VAL_HIGH);//输出高电平,红外灯亮
return 0;
}
// Release the driver resources.
static void HdfHelloLinuxDriverRelease(struct HdfDeviceObject *deviceObject) {
HDF_LOGI("hello_linux driver Release success");
return;
}
// Define the object of the driver entry. The object must be a global variable of the HdfDriverEntry type (defined in hdf_device_desc.h).
struct HdfDriverEntry g_hello_linuxDriverEntry = {
.moduleVersion = 1,
.moduleName = "hello_linux_driver",
.Bind = HdfHelloLinuxDriverBind,
.Init = HdfHelloLinuxDriverInit,
.Release = HdfHelloLinuxDriverRelease,
};
// Call HDF_INIT to register the driver entry with the HDF framework. When loading the driver, call the Bind function and then the Init function. If the Init function fails to be called, the HDF will call Release to release the driver resource and exit.
HDF_INIT(g_hello_linuxDriverEntry);
烧录验证
接着进行编译烧录启动,不清楚的可以看下面这篇文章:
Hi3516DV300 OpenHarmony3.1环境配置及烧录。
点击monitor开启串口监视,可以看到打印出了Hello Linux的LOG,说明驱动成功初始化,同时可以看到红外灯成功点亮。
后记
虽然通过工具自动生成代码很方便,但还是建议初学者要搞清楚HDF框架的具体实现流程,手动实现一遍,了解编译的整个流程,这对理解OpenHarmony代码及框架还是非常有帮助的,工具最好当成你能熟练掌握后提高效率的助手。而且工具也不一定支持所有情况,理解整个HDF后即使遇到一些特殊情况也能有办法解决,后面的一篇文章我将会深入HDF的驱动开发流程,并且比较LiteOS内核与Linux内核HDF驱动开发的区别。