0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HDI硬件设备接口介绍

OpenAtom OpenHarmony 来源:OpenAtom OpenHarmony 作者:OpenAtom OpenHarmony 2022-06-02 11:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

HDF 驱动框架是 OpenAtom OpenHarmony(简称“OpenHarmony”)系统硬件生态开放的基础,为驱动开发者提供了驱动加载、驱动服务管理和驱动消息机制等驱动框架能力,同时还为开发者提供了规范的HDI硬件设备接口,让开发者能屏蔽南向设备差异,提供更好的硬件。本文将为大家带来 HDI 硬件设备接口的介绍。

327e0238-e1b8-11ec-ba43-dac502259ad0.png

图1 HDF驱动框架

一、HDI介绍

HDI(Hardware Device Interface,硬件设备接口)是 HDF 驱动框架为开发者提供的硬件规范化描述性接口。在 OpenHarmony 分层结构中,HDI 位于 “基础系统服务层”和“设备抽象层(DAL)”之间。硬件设备通过 DAL 抽象化,并基于 IDL(Interface Description Language)接口描述语言描述后,为上层应用或服务提供了规范的硬件设备接口。

32a4b0c2-e1b8-11ec-ba43-dac502259ad0.png

图2 OpenHarmony 分层结构

HDI 支持“IPC 模式”及“直通模式”两种调用方式。其中,IPC 模式即跨进程通信模式,基于 binder 机制实现,调用端通过 Proxy 代理库调用 HDI 接口,具备良好的解耦性和安全性,是标准系统的默认部署方式。直通模式,将 HDI 实现为共享库,调用端使用 dlopen 加载 HDI 实现库并直接调用 HDI 接口,是小型系统的默认部署方式,同时还适用于对性能有特殊需求的标准系统模块。

32d2f680-e1b8-11ec-ba43-dac502259ad0.jpg

图3 两种调用方式

HDI 硬件设备接口的优点用一句话总结就是:为硬件的接入提供了统一的实现通路。屏蔽了硬件接口的具体实现,实现系统软件与硬件的架构解耦。让开发者专注于硬件接口的使用,从而简化开发过程,提升开发效率。

二、HDI实现

通过上文的介绍,相信很多小伙伴会有疑问,HDI 接口是怎么实现的呢?下面我们将为你介绍 IPC 模式下基于 C/S(Client-Server 客户端与服务端)结构的 HDI 接口实现。

2.1 IDL接口描述语言

为方便后文的理解,我们先简单了解一下 IDL 接口描述语言。

IDL(Interface Description Language)是一类用来描述接口的语言,通过一种中立的方式来定义客户端与服务端均认可的编程接口,可以实现在二者间的跨进程通信(IPC)。跨进程通信意味着可以在一个进程访问另一个进程的数据,或调用另一个进程的方法。通常把应用接口提供方(供调用)称为服务端,调用方称为客户端。

IDL 先把需要传递的对象分解成操作系统能够理解的基本类型,然后根据接口声明编译,生成 IPC/RPC代理(Proxy)和桩(Stub)的 C/C++ 代码,从而为调用者提供一致的接口和调用方式。

33023dd2-e1b8-11ec-ba43-dac502259ad0.png

图4 IDL IPC模式通信模型

2.2 基于IDL语言实现HDI接口

首先,使用 IDL 语法描述 HDI 接口并保存为.idl文件,然后编写 .idl 文件的编译脚本 BUILD.gn 文件,最后编译 .idl 文件即可。下面我们将为大家演示电源子系统的 HDI 接口的实现过程。

(1)使用IDL语法编写 .idl 文件

● 定义电源接口 IPowerInterface.idl


package ohos.hdi.power.v1_0;import ohos.hdi.power.v1_0.IPowerHdiCallback;import ohos.hdi.power.v1_0.PowerTypes;
interface IPowerInterface {    RegisterCallback([in] IPowerHdiCallback ipowerHdiCallback);    StartSuspend();    StopSuspend();    ForceSuspend();    SuspendBlock([in] String name);    SuspendUnblock([in] String name);    PowerDump([out] String info);}

● 如果需要从服务端回调,可以定义 callback 接口类 IPowerHdiCallback.idl


package ohos.hdi.power.v1_0;
[callback] interface IPowerHdiCallback {    OnSuspend();    OnWakeup();}

● 如果 interface 中用到了自定义数据类型,将自定义类型定义到 powerTypes.idl


package ohos.hdi.power.v1_0;
enum PowerHdfCmd {    CMD_REGISTER_CALLBCK = 0,    CMD_START_SUSPEND,    CMD_STOP_SUSPEND,    CMD_FORCE_SUSPEND,    CMD_SUSPEND_BLOCK,    CMD_SUSPEND_UNBLOCK,    CMD_DUMP,};
enum PowerHdfCallbackCmd {    CMD_ON_SUSPEND = 0,    CMD_ON_WAKEUP,};
enum PowerHdfState {    AWAKE = 0,    INACTIVE,    SLEEP,};

(2)编写 .idl 文件的编译脚本 BUILD.gn


import("//drivers/adapter/uhdf2/hdi.gni")if (defined(ohos_lite)) {  group("libpower_proxy_1.0") {    deps = []    public_configs = []  }} else {  hdi("power") {    module_name = "power_interface_service"
    sources = [      "IPowerHdiCallback.idl",      "IPowerInterface.idl",      "PowerTypes.idl",    ]
    language = "cpp"     subsystem_name = "hdf"     part_name = "power_device_driver"   }}

(3)编译 .idl文件

使用编译工具 hdi-gen 编译 IDL 文件,IDL 文件在编译过程中转换为 C/C++ 语言的函数接口声明、客户端与服务端 IPC 相关过程代码,开发者只需要基于生成的 power.h 函数接口实现具体服务功能即可。

编译后生成代码在 out/product/gen/drivers/interface/power 中,接口代码如下:


namespace OHOS {namespace HDI {namespace Power {namespace V1_0 {using namespace OHOS; enum {    CMD_POWER_INTERFACE_REGISTER_CALLBACK,    CMD_POWER_INTERFACE_START_SUSPEND,    CMD_POWER_INTERFACE_STOP_SUSPEND,    CMD_POWER_INTERFACE_FORCE_SUSPEND,    CMD_POWER_INTERFACE_SUSPEND_BLOCK,    CMD_POWER_INTERFACE_SUSPEND_UNBLOCK,    CMD_POWER_INTERFACE_POWER_DUMP,    CMD_POWER_INTERFACE_GET_VERSION,}; class IPowerInterface : public IRemoteBroker {public:    DECLARE_INTERFACE_DESCRIPTOR(u"ohos.hdi.power.v1_0.IPowerInterface");    virtual ~IPowerInterface() = default;    static sptr Get();    static sptr GetInstance(const std::string& serviceName);    virtual int32_t RegisterCallback(const sptr& ipowerHdiCallback) = 0;    virtual int32_t StartSuspend() = 0;    virtual int32_t StopSuspend() = 0;    virtual int32_t ForceSuspend() = 0;    virtual int32_t SuspendBlock(const std::string& name) = 0;    virtual int32_t SuspendUnblock(const std::string& name) = 0;    virtual int32_t PowerDump(std::string& info) = 0;    virtual int32_t GetVersion(uint32_t& majorVer, uint32_t& minorVer) = 0;};} // V1_0} // Power} // HDI}//OHOS

(4)实现HDI接口

● 实现 UHDF Driver,用于将 HDI 实现加载为独立进程,并基于 HDF 驱动框架发布设备服务。


static int32_t PowerInterfaceDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data,    struct HdfSBuf *reply){   ......
    return hdfPowerInterfaceHost->service->OnRemoteRequest(cmdId, *dataParcel, *replyParcel, option); // 将接口调用转发到stub实现}
static int HdfPowerInterfaceDriverBind(struct HdfDeviceObject *deviceObject){    ......    hdfPowerInterfaceHost->ioservice.Dispatch = PowerInterfaceDriverDispatch;    hdfPowerInterfaceHost->ioservice.Open = NULL;    hdfPowerInterfaceHost->ioservice.Release = NULL;    hdfPowerInterfaceHost->service = new PowerInterfaceImpl();
    deviceObject->service = &hdfPowerInterfaceHost->ioservice;    return HDF_SUCCESS;}
......
struct HdfDriverEntry g_powerinterfaceDriverEntry = {    .moduleVersion = 1,    .moduleName = "power_interface_service",    .Bind = HdfPowerInterfaceDriverBind,    .Init = HdfPowerInterfaceDriverInit,    .Release = HdfPowerInterfaceDriverRelease,};

● 实现 HDI 接口


#include "v1_0/power_interface_stub.h"
/* 继承PowerInterfaceStub并实现IPowerInterface 中的接口*/class PowerInterfaceImpl : public PowerInterfaceStub {public:    virtual ~PowerInterfaceImpl() {}    int32_t RegisterCallback(const sptr& ipowerHdiCallback) override;    int32_t StartSuspend() override;    int32_t StopSuspend() override;    int32_t ForceSuspend() override;    int32_t SuspendBlock(const std::string& name) override;    int32_t SuspendUnblock(const std::string& name) override;    int32_t PowerDump(std::string& info) override;};
// 在cpp中对相关接口进行实现,其中调用了内核相关接口,实现了具体功能
int32_t PowerInterfaceImpl::StopSuspend(){    suspendRetry_ = false;
    return HDF_SUCCESS;}
int32_t PowerInterfaceImpl::ForceSuspend(){    suspendRetry_ = false;
    NotifyCallback(CMD_ON_SUSPEND);    DoSuspend();    NotifyCallback(CMD_ON_WAKEUP);    return HDF_SUCCESS;}
int32_t PowerInterfaceImpl::SuspendBlock(const std::string& name){    std::lock_guard<std::mutex> lock(mutex_);    if (name.empty()) {        return HDF_ERR_INVALID_PARAM;    }    UniqueFd fd(TEMP_FAILURE_RETRY(open(LOCK_PATH, O_RDWR | O_CLOEXEC)));    bool ret = SaveStringToFd(fd, name);    if (!ret) {        return HDF_FAILURE;    }    return HDF_SUCCESS;}

三、HDI使用

通过上文的介绍,相信大家已经对 HDI 有了一定的了解,下面我们将为大家介绍 HDI 的使用,在直通模式下,对 HDI 接口调用为同一进程空间函数调用,过程较为直接,这里我们重点阐述 IPC 模式下的调用原理,然后通过 CPP 语言来展示电源子系统 HDI 的调用。

3.1 调用原理

在 IPC 模式下,当系统服务调用 HDI 接口时,通过 proxy 库将函数调用转换为 IPC 请求,将接口调用的参数进行序列化;IPC 请求通过 IPC 框架发送到服务端,请求将被 stub 库先处理,然后对接口调用的参数进行反序列化,再转换成对服务实现的函数调用,从而实现接口调用过程。

332891e4-e1b8-11ec-ba43-dac502259ad0.png

图5 HDI调用过程

3.2 基于CPP语言的使用

上文已经编译生成了电源子系统的 HDI 接口,下面我们来看看如何使用 CPP 语言来调用 HDI 接口吧。

(1)客户端在BUILD.gn中增加依赖://drivers/interface/foo/v1.0:libfoo_proxy_1.0"


ohos_executable("call_foo_hdi") {sources = ["src/call_foo_hdi.cpp",]deps = ["//drivers/interface/foo/v1.0:libfoo_proxy_1.0",]external_deps = ["hiviewdfx_hilog_native:libhilog","ipc:ipc_core","utils_base:utils",]part_name = "bar"subsystem_name = "bar_subsystem"}

(2)在实现电源子系统的代码中调用 HDI 接口,代码如下:


 #include "v1_0/power_interface.h" //包含Power HDI接口头文件 using namespace OHOS::V1_0; //使用HDI接口命名空间 namespace OHOS { namespace PowerMgr { sptr powerInterface = nullptr; SystemSuspendController::SystemSuspendController() {     sptr g_callback = new PowerHdiCallbackImpl();     powerInterface = IPowerInterface::Get(); //调用接口实例化接口获取客户端实例     if (powerInterface == nullptr) {         POWER_HILOGE(COMP_SVC, "The hdf interface is null");         return;     }     powerInterface->RegisterCallback(g_callback); // 调用HDI接口注册电源事件回调}

四、结语

以上就是本文全部内容,我们在这里简单介绍了HDI接口的实现思路及使用,对于广大南向开发者,我们还在社区提供了详细的HDI接口实现指导,欢迎大家在gitee社区参与更多讨论。

社区链接:

https://gitee.com/openharmony/drivers_interface

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9443

    浏览量

    156110
  • HDI
    HDI
    +关注

    关注

    7

    文章

    222

    浏览量

    22602

原文标题:OpenHarmony 3.1 Release版本关键特性解析——HDI硬件设备接口介绍

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    USB 接口无法识别外接设备怎么办?​

    可能是设置被误改。今天,我们就从硬件排查到系统修复入手,拆解不同场景下的解决方案,让大家遇到这种情况时不用送修,自己在家就能搞定! ​ 一、搞清楚USB 接口不识别的两大根本原因,不是接口坏了就是里面线路没通​ USB
    的头像 发表于 09-17 16:28 2748次阅读
    USB <b class='flag-5'>接口</b>无法识别外接<b class='flag-5'>设备</b>怎么办?​

    HDI盲埋孔PCB阶数区分方法解析

    HDI盲埋孔PCB的阶数是区分其结构复杂度的关键指标,主要通过增层次数、钻孔工艺及连接层数来综合判断,具体区分方法如下: 一、基于增层次数的阶数定义 HDI板结构通常以“a+N+a”或
    的头像 发表于 08-05 10:34 2244次阅读
    <b class='flag-5'>HDI</b>盲埋孔PCB阶数区分方法解析

    众阳电路HDI刚柔板介绍(一)

    随着电子产品向轻薄短小、高性能及多功能化方向发展,作为电子产品元器件支撑体的印制线路板(PCB)也需要向布线高密度化、轻薄化方向发展。高密度布线、高接点数的高密度互连(HDI)技术和可实现立体三维
    的头像 发表于 06-02 19:38 678次阅读
    众阳电路<b class='flag-5'>HDI</b>刚柔板<b class='flag-5'>介绍</b>(一)

    RCA接口适用哪些设备

    RCA接口,因其广泛的兼容性和易用性,被应用于多种音视频设备中。以下是一些常见的适用设备: 一、音频设备 音响系统 : RCA接口常用于连接
    的头像 发表于 02-17 15:46 2064次阅读

    RCA接口在音频设备中的应用

    RCA接口在音频设备中的应用非常广泛,其历史可以追溯到近一个世纪以前,最初是由美国无线电公司(RCA)开发并命名的。以下是对RCA接口在音频设备中应用的分析: 一、应用背景与特点 应用
    的头像 发表于 02-17 15:42 3222次阅读

    如何连接RCA接口设备

    连接RCA接口设备通常涉及将音频和视频信号从一个设备传输到另一个设备。以下是一些具体的步骤和注意事项,帮助您正确连接RCA接口
    的头像 发表于 02-17 15:30 3222次阅读

    HDI技术—设计奥秘与PCB制造的极致工艺之旅

    随着科技的发展,将更多功能集成在更小的封装中的需求也随之增长。使用高密度互连(HDI)技术设计的PCB通常更小,因为更多的元件被装在更小的空间里。HDIPCB使用盲孔、埋孔和微孔、焊盘内孔以及非常细
    的头像 发表于 02-05 17:01 13次阅读
    <b class='flag-5'>HDI</b>技术—设计奥秘与PCB制造的极致工艺之旅

    迅为RK3576开发板核心板与底板接口硬件介绍

    迅为RK3576开发板核心板与底板接口硬件介绍
    的头像 发表于 01-14 15:15 2344次阅读
    迅为RK3576开发板核心板与底板<b class='flag-5'>接口</b><b class='flag-5'>硬件</b><b class='flag-5'>介绍</b>

    hdi高密度互连PCB电金适用性

    高密度互连(HDI)PCB因其细线、更紧密的空间和更密集的布线等特点,在现代电子设备中得到了广泛应用。 一、HDI PCB具有以下显著优势: 细线和高密度布线:允许更快的电气连接,同时减少了PCB
    的头像 发表于 01-10 17:00 1396次阅读
    <b class='flag-5'>hdi</b>高密度互连PCB电金适用性

    高密度PCB(HDI)制造检验标准

    本标准是Q/DKBA3178《PCB检验标准》的子标准,包含了HDI制造中遇到的与HDI印制板相关的外观、结构完整性及可靠性等要求。
    的头像 发表于 12-25 17:04 2963次阅读
    高密度PCB(<b class='flag-5'>HDI</b>)制造检验标准

    HDI盲埋孔工艺及制程能力你了解多少?

    十分乐观。 然而,HDI技术属于特殊工艺,成本较高,对制造商的生产能力要求严格。没有先进的设备和技术人员支持,难以保证高多层、多阶HDI板的质量。此外,HDI技术还面临 材料选择、制造
    的头像 发表于 12-18 17:15 3823次阅读
    <b class='flag-5'>HDI</b>盲埋孔工艺及制程能力你了解多少?

    HDI盲埋孔工艺及制程能力你了解多少?

    十分乐观。 然而,HDI技术属于特殊工艺,成本较高,对制造商的生产能力要求严格。没有先进的设备和技术人员支持,难以保证高多层、多阶HDI板的质量。此外,HDI技术还面临材料选择、制造工
    发表于 12-18 17:13

    HDI线路板和多层线路板的五大区别

    HDI(高密度互连)线路板和普通的多层线路板在多个方面存在显著的区别。 以下是它们的五大主要区别: 1. 布线密度 HDI线路板:HDI技术允许在相同的面积上布置更多的布线层,从而实现更高的布线密度
    的头像 发表于 12-12 09:35 4569次阅读

    生产HDI线路板需要解决的主要问题

    生产HDI(高密度互连)线路板是一个复杂且技术密集的过程,涉及多个环节需要克服的挑战。以下是生产HDI线路板过程中需要解决的一些主要问题: 1. 材料的热膨胀系数差异导致的应力问题 问题描述:HDI
    的头像 发表于 12-09 16:49 1215次阅读