Hi3516 OpenHarmony_release_v1.1.0 LTS版本led内核态驱动与用户态应用贯通篇
此文档是针对 OpenHarmony 2021年4月10日发布的OpenHarmony_release_v1.1.0 LTS 版本分析。
1. 开发环境
-
HiSpark_AI_Hi3516D300开发板
-
虚拟机安装Ubuntu18.04版本,参考https://device.harmonyos.com/cn/docs/start/introduce/oem_minitinier_environment_lin-0000001105407498搭好建开发环境。
2. 开发目标
在HiSpark_AI_Hi3516D300开发板上实现红外LED灯的亮灭控制,支持内核态驱动程序和用户态应用程序双向通信,实现用户态发送一个控制红外灯亮灭的消息到内核态,同时内核态返回灯的状态消息发送到用户态程序。
3. 开发准备
1)板卡级编译配置文件:device/hisilicon/hispark_taurus/sdk_liteos/config.gni
2)hi3516dv300驱动闭源lib库的路径在目录:device/hisilicon/drivers/libs/ohos/llvm/hi3516dv300
3)Hi3516开发板的红外灯的 IO 口编号为GPIO5_1。

4. 内核态开发
4.1 HDF简介
HDF(OpenHarmony Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。
HDF框架以组件化的驱动模型作为核心设计思路,为开发者提供更精细化的驱动管理,让驱动开发和部署更加规范。HDF框架将一类设备驱动放在同一个host里面,驱动内部实现开发者也可以将驱动功能分层独立开发和部署,支持一个驱动多个node,HDF框架管理驱动模型如下图所示。

4.2 HDF实现
4.2.1 框架驱动实现
在vendor/huawei/hdf/sample/platform目录下新增led目录,新建如下文件夹和文件,其中include文件夹包含led_driver.h,src文件夹包含led_driver.c,led_driver.c文件实现HDF驱动框架代码。
主要代码如下。
#include "hdf_device_desc.h" // HDF框架对驱动开放相关能力接口的头文件
#include "hdf_log.h" // HDF框架提供的日志接口头文件
#include "device_resource_if.h" // HDF框架获取设备配置信息的接口头文件
//驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架
int32_t HdfLedDriverBind(struct HdfDeviceObject *deviceObject)
{
if (deviceObject == NULL)
{
HDF_LOGE("Led driver bind failed!");
return HDF_ERR_INVALID_OBJECT;
}
static struct IDeviceIoService ledService = {
.Dispatch = LedDriverDispatch,
};
deviceObject->service = (struct IDeviceIoService *)(&ledService);
HDF_LOGD("Led driver bind success");
return HDF_SUCCESS;
}
// 驱动自身业务初始的接口
int32_t HdfLedDriverInit(struct HdfDeviceObject *deviceObject)
{
if (deviceObject == NULL)
{
HDF_LOGE("Led driver Init failed!");
return HDF_ERR_INVALID_OBJECT;
}
HDF_LOGD("Led driver Init success");
return HDF_SUCCESS;
}
// 驱动资源释放的接口
void HdfLedDriverRelease(struct HdfDeviceObject *deviceObject)
{
if (deviceObject == NULL)
{
HDF_LOGE("Led driver release failed!");
return;
}
HDF_LOGD("Led driver release success");
return;
}
// 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量
struct HdfDriverEntry g_ledDriverEntry = {
.moduleVersion = 1,
.moduleName = "HDF_LED",
.Bind = HdfLedDriverBind,
.Init = HdfLedDriverInit,
.Release = HdfLedDriverRelease,
};
// 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。
HDF_INIT(g_ledDriverEntry);
4.2.2 驱动编译
在vendor/huaw

本文档详细介绍了在OpenHarmony v1.1.0 LTS版本上,如何在Hi3516D300开发板上实现红外LED灯的内核态驱动与用户态应用的双向通信。通过HDF驱动框架,创建并注册LED驱动,实现了用户态发送控制命令到内核态,并接收状态反馈。用户态应用程序通过HdfIoService与内核态驱动交互,完成LED灯的亮灭控制。整个过程涉及驱动配置、消息机制、编译链接等多个步骤,展示了OpenHarmony驱动开发的基本流程。
最低0.47元/天 解锁文章
3378

被折叠的 条评论
为什么被折叠?



