OpenHarmony-简单的HDF驱动

OpenHarmony中基于HDF框架的驱动开发和使用 代码版本:openharmony 3.2 release。 阅读详情
AI摘要

本文围绕OpenHarmony系统的HDF驱动展开,介绍了HDF驱动框架规范。通过开发简单HDF驱动案例,阐述了HDF设备驱动开发、HCS设备节点描述、增加HDI调用接口服务、应用程序通过HDI接口访问驱动等步骤,还提及不同验证方式及运行效果。

学习于:https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-hdf-manage.md
首先,OpenHarmony系统里的HDF(Hardware Driver Foundation)驱动框架,已经规范设备驱动的模型、设备节点的配置与统一的HDI(Hardware Device Interface)驱动调用接口等等。
每个设备驱动都是由一个struct HdfDriverEntry对象来描述,如:

static struct HdfDriverEntry myTestEntry = {
    .moduleVersion = 1, //指定驱动源码版本
    .moduleName = "myTestDriver", //驱动模块名,.hcs文件必须有设备节点使用同名都会匹配
    .Bind = myBind, //指定驱动模块与设备节点匹配上后调用myBind函数,可绑定向应用程序提供HDI应用程序调用驱动的服务
    .Init = myInit, //匹配后,触发调用myInit函数完成初始化工作
    .Release = myRelease, //myInit初始化函数执行失败时触发调用myRelease函数释放资源
};
//通过HDF_INIT宏将结构体变量存储在系统镜像的".hdf.driver"段区,在系统启动时在取出此结构体变量进行注册至HDF框架中。
HDF_INIT(myTestEntry);

接下来通过开发一个简单的HDF驱动案例来学习,主要步骤过程:
1. HDF设备驱动的开发
这里为了省事,编写出的设备驱动源文件寄生于系统现存的驱动编译管理中。如在OpenHarmony系统源码drivers/hdf_core/adapter/khdf/liteos/platform/src/目录下创建myTestDriver.c,并在文件输入代码如下:

#include "hdf_device_desc.h"          // HDF框架对驱动开发相关能力接口的头文件
#include "hdf_log.h"                  // HDF框架提供的日志接口头文件
#include "hdf_base.h"                 // HDI驱动调用接口头文件

int32_t myBind(struct HdfDeviceObject *obj)
{
    HDF_LOGD("#### in %s\n", __func__);
    return HDF_SUCCESS;
}
int32_t myInit(struct HdfDeviceObject *obj)
{
    HDF_LOGD("#### in %s\n", __func__);
    return HDF_SUCCESS;
}
void myRelease(struct HdfDeviceObject *obj)
{
    HDF_LOGD("#### in %s\n", __func__);
}

struct HdfDriverEntry myTestEntry = {
    .Bind = myBind,
    .Init = myInit,
    .Release = myRelease,
    .moduleName = "myTestDriver",
    .moduleVersion = 1
};
HDF_INIT(myTestEntry);

为了将myTestDriver.c源文件编译进系统镜像,修改drivers/hdf_core/adapter/khdf/liteos/platform目录下的BUILD.gn,在42行增加以下内容:

 42     "src/myTestDriver.c"

修改drivers/hdf_core/adapter/khdf/liteos/platform目录下的Makefile,在37行增加内容如图所示:
在这里插入图片描述

完成后就可以编译OpenHarmony系统,编译完成后在out输出目录下找到相应的.o文件则表示驱动源文件已成功编译,如图所示:
在这里插入图片描述
但这时先不急着烧录更新系统镜像,因驱动并不是编译进系统镜像就表示产生作用的,设备驱动还需要在.hcs文件中有同样moduleName的设备节点描述,匹配上后驱动才会启动。

2. HCS设备节点描述
OpenHarmony官方文档对hcs语法提供了非常详细的指导,这里不表。匹配设备驱动的设备节点描述如下:

      myTestHost :: host{ //继承template模板host,表示某种类型的设备,host名必须唯一
            hostName = "myTestHost";    // host名称
            priority = 100;        // host启动优先级(0-200),值越大优先级越低
            testDevice :: device {     //testDevice设备节点继承于template模板device
                device0 :: deviceNode {   //节点device0继承于template模板deviceNode,表示具体一个设备对象,设备名不能重复
                    policy = 2;      // policy字段是驱动服务发布的策略,2表示向用户态提供服务接口
                    priority = 100;       // 驱动启动优先级(0-200),值越大优先级越低
                    preload = 0;             //驱动在系统启动时加载。
                    permission = 0664;       //驱动创建设备节点权限
                    moduleName = "myTestDriver"; //此名必须与设备驱动的moduleName一致才会匹配。可以有多个设备节点使用同样的moduleName
                    serviceName = "myTestService";//驱动对外发布服务的名称,应用程序通过此名获取设备驱动提供的服务,从而交互操作,所以此服务名必须唯一。
                }
            }
        }

下面可选使用模拟设备或Hi3516开发板进行验证:
1). 如使用OpenHarmony的qemu模拟设备,则在device/qemu/arm_virt/liteos_a/hdf_config/device_info/device_info.hcs尾部增加设备节点描述,如图所示:
在这里插入图片描述
完成后编译系统,启动虚拟设备后,执行命令“hilogcat",即可查看到设备驱动函数的输出信息如图所示:
在这里插入图片描述
2). 如使用Hi3516开发板,则在vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs尾部增加设备节点描述,如图所示:
在这里插入图片描述
这里注意即使编译并更新使用新系统镜像也无法查看到设备驱动输出信息的,因系统在启动时通过uart接口输出hilog信息,并且uart接口速率无法及时输出大量信息,导致发生多次"hilog ringbuffer full, drop 4 line(s) log"爆缓冲区的状况,所以无法像模拟设备一样查看到设备驱动函数的输出。

3. 设备增加HDI调用接口服务
修改myTestDriver.c驱动源文件内容,增加HDI调用接口服务函数,增加与修改内容如下:

//增加myDispatch函数,在应用程序通过服务Dispatch时触发调用
static int32_t myDispatch(
    struct HdfDeviceIoClient *client, int id, struct HdfSBuf *data, struct HdfSBuf *reply)
{
    HDF_LOGD("### in %s : %d\n", __func__, id);
    return HDF_SUCCESS;
}

int32_t myBind(struct HdfDeviceObject *obj) //修改
{
    //每个struct IDeviceIoService对象表示一个HDI调用服务对象
    static struct IDeviceIoService testService = {
        .Dispatch = myDispatch, //指定由myDispatch函数处理服务
    };
    obj->service = &testService; //指定设备obj使用testService服务对象
    HDF_LOGD("#### in %s\n", __func__);

    return HDF_SUCCESS;
}

4. 应用程序通过HDI调用接口访问设备驱动
编写应用程序,实现通过hcs设备节点描述的moduleName获取设备驱动服务,并传递参数。源文件mytest.c内容如下:

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "hdf_log.h"
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"

int main(void)
{  //通过moduleName获取设备驱动的服务对象
    struct HdfIoService *serv = HdfIoServiceBind("myTestService");
    if (serv == NULL) {
        printf("fail to get service\n");
        return 1;
    }


    for (int n = 0; n < 20; n++)
    {  //向设备驱动服务传递参数,触发调用驱动的myDispatch函数
        int ret = serv->dispatcher->Dispatch(&serv->object, n, NULL, NULL);
        if (ret < 0)
            break;
        sleep(5);
    }
    printf("test end\n");
    return 0;
}

应用程序编译的BUILD.gn内容如下:

hdf_framework_path = "../../../../../framework"

executable("mytest") {
  sources = [ "mytest.c" ]

  include_dirs = [
    "$hdf_framework_path/ability/sbuf/include",
    "$hdf_framework_path/core/shared/include",
    "$hdf_framework_path/core/host/include",
    "$hdf_framework_path/core/master/include",
    "$hdf_framework_path/include/core",
    "$hdf_framework_path/include/utils",
    "$hdf_framework_path/utils/include",
    "$hdf_framework_path/include/osal",
    "//third_party/bounds_checking_function/include",
    "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits",
  ]

  deps = [
    "//drivers/hdf_core/adapter/uhdf/manager:hdf_core",
    "//drivers/hdf_core/adapter/uhdf/posix:hdf_posix_osal",
    "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
  ]

  public_deps = [ "//third_party/bounds_checking_function:libsec_shared" ]
  defines = [ "__USER__" ]
}

5. 应用程序运行效果
编译并更新使用新系统镜像后,执行bin目录下的mytest程序,输出信息如图所示:
在这里插入图片描述

OpenHarmony驱动框架HDF中设备管理服务构建过程详解 如下图,开源鸿蒙系统驱动框架HDF在内核中的实现,可以分为向用户层提供设备服务的管理模块(Manager),和实际管理硬件的Host模块。Manager分为DeviceManageService和 DeviceServiceManage,前者负责提供服务的设备,包括设备驱动匹配、设备驱动装载、设备启动等;后者负责关联设备提供的服务,包括管理Host端提供的设备服务,和接收用户发起的设备服务订阅请求。图1 开源鸿蒙系统驱动框架软件架构模块图。 阅读详情

相关推荐

OpenHarmony-3.HDF框架(2)

适配层提供具体平台硬件设备的驱动,按照核心层定义的模型创建设备对象,并完成对象的初始化(包括必要的成员变量初始化以及钩子方法挂接,以及相关的硬件初始化操作),最后使用核心层提供的注册方法将设备对象注册到核心层纳入统一管理。在内核态,这个指针可以直接指向实际设备对象,但是对于某些类型的平台设备,需要在用户态提供同样的DevHandle类型及配套API,而实际设备对象在内核空间,导致无法直接获取和使用内核空间的地址。提供统一适配接口:定义了标准的设备对象模型,驱动程序仅需关注标准对象模型的适配。

weixin_41028621的博客 1136

OpenHarmony内核态HDF驱动程序示例

基于OpenHarmony 3.1 release L2的内核态HDF驱动程序,测试程序,测试OK,便于参阅。

Openharmony - HDF驱动小示例和测试程序

Openharmony HDF驱动小示例和测试程序

fulinux的博客 2365

OpenHarmony HDF 框架介绍

openharmony 系统 HDF 驱动框架采用 C 语言面向对象编程模型构建,通过平台解耦、内核解耦,来达到兼容不同内核,统一平台底座的目的,从而帮助开发者实现驱动一次开发,多系统部署到的效果。为了达成这样一个目标,openharmony 系统 HDF 驱动框架提供了:操作系统适配层(OSAL):对内核操作系统相关接口进行统一封装,屏蔽不同系统的操作接口;

跑不了的你的博客 4872

OpenHarmony 测试适配的HDF驱动

可以基于open、write操作gpio,也可以基于HDI硬HDI件驱动接口操作GPIO,具体代码见applications/sample/taget_board/app/gpio/src/hdf_gpio_test.c。编译配置,applications/sample/taget_board/app/adc/BUILD.gn,参考gpio,只需修改如下内容。注:硬件不同,但可参考流程。实测:PwmOpen(0) 为PWM0_0 PwmOpen(1)为PWM0_1,PwmOpen(2)

liuhaojiabin的博客 896

OpenHarmony(鸿蒙南向)——HDF驱动开发流程

HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路,让驱动开发和部署更加规范,旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的驱动管理的开发环境,力求做到一次开发,多系统部署。

weixin_44796857的博客 1010

一个例子了解通过Openharmony的HDF框架实现简易驱动的流程

Openharmony HDF KHDF

流风的专栏 8956

OpenHarmony-HDF驱动框架介绍及加载过程分析

HarmonyOS面向万物互联时代,而万物互联涉及到了大量的硬件设备,这些硬件的离散度很高,它们的性能差异与配置差异都很大,所以这要求使用一个更灵活、功能更强大、能耗更低的驱动框架。OpenHarmony系统HDF驱动框架采用C语言面向对象编程模型构建,通过平台解耦、内核解耦,来达到兼容不同内核,统一平台底座的目的,从而帮助开发者实现驱动一次开发,多系统部署的效果。1)在系统启动时,DeviceManagerInit通过late_initcall先启动。

maniuT的博客 2490

基于OpenHarmony系统HDF Sensor驱动开发

在产品开发时就需要对不同厂家或者同一厂家的不同型号进行适配开发,就会增加开发者的开发难度。为了快速开发或者移植传感器驱动,基于HDF(Hardware Driver Foundation)驱动框架开发了Sensor(传感器)驱动模型。Sensor驱动模型主要为上层提供稳定接口能力,对驱动开发者提供开放的接口实现和抽象的配置接口能力。

weixin_44699830的博客 1930

鸿蒙OpenHarmony【HDF驱动开发流程】 子系统

HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路,让驱动开发和部署更加规范,旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的驱动管理的开发环境,力求做到一次开发,多系统部署。

CS9527DND的博客 1220

OpenHarmony HDF 平台驱动框架介绍及驱动适配指导

OpenHarmony系统平台驱动(PlatformDriver),即平台设备驱动,它用于驱动平台设备(PlatformDevice),为系统及外设驱动提供访接口。这里的平台设备,泛指I2C/UART等总线、以及GPIO/RTC等SOC片内硬件资源。

web13508588635的博客 1384

OpenHarmony - 驱动使用指南,HDF驱动开发流程

HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。在弱性能环境中,转换为配置树源码或配置树宏定义,驱动可直接调用C代码或宏式APIs获取配置。在高性能环境中,转换为HCB(HDF Configuration Binary)二进制文件,驱动可使用HDF框架提供的配置解析接口获取配置。图2配置使用流程图。

__Benco的博客 2128

OpenHarmony系统HDF驱动开发介绍(补充)

Open Harmony系统HDF驱动开发介绍

u014231040的博客 1920

【鸿蒙南向开发】OpenHarmony测试适配的HDF驱动

可以基于open、write操作gpio,也可以基于HDI硬HDI件驱动接口操作GPIO,具体代码见applications/sample/taget_board/app/gpio/src/hdf_gpio_test.c。编译配置,applications/sample/taget_board/app/adc/BUILD.gn,参考gpio,只需修改如下内容。注:硬件不同,但可参考流程。实测:PwmOpen(0) 为PWM0_0 PwmOpen(1)为PWM0_1,PwmOpen(2)

CTrup的博客 1174

OpenHarmony标准系统-HDF框架之音频驱动开发

OpenHarwony操作系统为了做到给干行百业(教育、金融、工业等)提供全场景(移动办公、社交通信运动健康等)业务能力,达到设备快速互联,硬件互助,资源共享:统一OS,,一次开发多端弹性部署的目标。在此背景下OpenHarwony提出在传统的单设备系统能力基础上,基于同一套系统能力、适配多种终端形态的分布式理念,并且内核层、系统服务层、框架层和应用层做了全新的设计与开发。

汽车电子软件领域知识分享 1461

OpenHarmony HDF传感器驱动开发

Sensor设备作为外接设备重要组成模块,Sensor驱动模型为上层Sensor服务系统提供稳定的Sensor基础能力接口,包括Sensor列表查询、Sensor使能释放、订阅去订阅、参数设置等。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7e89ef0e91c046a38c291de3bf2da24f.png#pic_centerHDI子模块,提供Sensor南向的标准接口定义和实现,其中包括:Dispatch、Register、Enable等。

weixin_62941746的博客 2052

OpenHarmony之HDF驱动框架

HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路,让驱动开发和部署更加规范,旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的驱动管理的开发环境,力求做到一次开发,多系统部署。驱动加载HDF驱动框架提供把和配置的设备列表匹配成功的驱动程序加载起来的功能驱动服务管理。

DD'Notes 512

多普勒频移测速与FMCW测距

文章目录时域与频域基于多普勒频移估计速度基于传统的FMCW测距什么是FMCWFMCW测距原理参考论文 时域与频域 时域 — 自变量是时间,即横轴是时间,纵轴是信号振幅的变化。表示振幅随时间的变化。 频域 — 自变量是频率,即横轴是频率,纵轴是该频率信号幅度的峰值。表示振幅峰值随频率的变化。 基于多普勒频移估计速度 当发送端静止而接收端相对运动时,有: v=FsFcv=\frac{F^s}{F}cv=FFs​c 其中,F是信号的原始频率;FsF^sFs 是接收信号频率与发送信号频率之差,即多普勒频移;c是

dsaaf21的博客 9186
上一篇: OpenHarmony增加应用程序到现成子系统的部件中
下一篇: OpenHarmony GPIO应用开发-LED
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值