鸿蒙操作系统系列——Hi3516 OpenHarmony_release_v1.1.0 LTS版本led内核态驱动与用户态应用贯通篇

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

Hi3516 OpenHarmony_release_v1.1.0 LTS版本led内核态驱动与用户态应用贯通篇

此文档是针对 OpenHarmony 2021年4月10日发布的OpenHarmony_release_v1.1.0 LTS 版本分析。

1. 开发环境

  1. HiSpark_AI_Hi3516D300开发板

  2. 虚拟机安装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

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CPUOS2010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值