衡阳派盒市场营销有限公司

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 = ["http://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

    文章

    8691

    瀏覽量

    151912
  • HDI
    HDI
    +關注

    關注

    6

    文章

    201

    瀏覽量

    21353

原文標題:OpenHarmony 3.1 Release版本關鍵特性解析——HDI硬件設備接口介紹

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    迅為RK3576開發板核心板與底板接口硬件介紹

    迅為RK3576開發板核心板與底板接口硬件介紹
    的頭像 發表于 01-14 15:15 ?359次閱讀
    迅為RK3576開發板核心板與底板<b class='flag-5'>接口</b><b class='flag-5'>硬件</b><b class='flag-5'>介紹</b>

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

    十分樂觀。 然而,HDI技術屬于特殊工藝,成本較高,對制造商的生產能力要求嚴格。沒有先進的設備和技術人員支持,難以保證高多層、多階HDI板的質量。此外,HDI技術還面臨 材料選擇、制造
    的頭像 發表于 12-18 17:15 ?1402次閱讀
    <b class='flag-5'>HDI</b>盲埋孔工藝及制程能力你了解多少?

    HDI技術在5G通信設備中的信號完整性優化方法

    隨著5G通信技術的快速發展,對通信設備的性能要求越來越高。信號完整性是5G通信設備性能的關鍵指標之一,本文主要探討HDI技術在5G通信設備中的信號完整性優化方法,包括信號路徑優化、電路
    的頭像 發表于 12-04 10:47 ?373次閱讀

    HDI板盲孔制作常見缺陷及解決

    HDI板是一種高密度互連印刷電路板,其特點是線路密度高、孔徑小、層間連接復雜。在HDI板的制作過程中,盲孔的制作是一個關鍵步驟,同時也是常見的缺陷發生環節。以下是根據搜索結果總結的HDI板盲孔制作的常見缺陷及其解決方法。
    的頭像 發表于 11-02 10:33 ?345次閱讀

    HDI板電鍍與堆疊過程

    HDI線路板 HDI板是一種高性能的電路板材料,它具有高密度、高可靠性和高互連性的特點。HDI板的制造過程涉及多個關鍵步驟,其中包括電鍍和堆疊兩個重要環節。 電鍍過程 電鍍是HDI板制
    的頭像 發表于 10-28 19:32 ?215次閱讀
    <b class='flag-5'>HDI</b>板電鍍與堆疊過程

    PCB HDI產品的介紹

    。那么HDI產品和普通多層板產品有什么不同呢?我們用4層通孔 vs 4層1階1壓HDI產品為例從流程、疊構、產品特性和產品要求四個方面對PCB HDI產品的介紹
    的頭像 發表于 10-28 09:44 ?507次閱讀
    PCB <b class='flag-5'>HDI</b>產品的<b class='flag-5'>介紹</b>

    如何判斷盲/埋孔HDI板有多少“階”?

    ● 盲/埋孔HDI板概述 盲/埋孔HDI (High Density Interconnect,高密度互連)板是一種高級的印刷電路板技術,它通過使用微小的盲孔和埋孔來 提高電路板上的布線密度
    發表于 10-23 18:38

    合宙Air700EAQ硬件設計手冊——應用接口1

    本文主要介紹合宙Air700EAQ的硬件設計中的應用接口部分。
    的頭像 發表于 08-26 17:13 ?568次閱讀
    合宙Air700EAQ<b class='flag-5'>硬件</b>設計手冊——應用<b class='flag-5'>接口</b>1

    合宙Air700ECQ硬件設計手冊——應用接口3

    合宙Air700ECQ硬件設計手冊——應用接口部分介紹
    的頭像 發表于 08-22 18:34 ?524次閱讀
    合宙Air700ECQ<b class='flag-5'>硬件</b>設計手冊——應用<b class='flag-5'>接口</b>3

    合宙Air700ECQ硬件設計手冊——應用接口2

    ? 合宙Air700ECQ硬件設計手冊——應用接口部分。本文介紹了Air700ECQ的應用接口中的開關機,串口,USB接口,USB下載模式和
    的頭像 發表于 08-22 15:06 ?482次閱讀
    合宙Air700ECQ<b class='flag-5'>硬件</b>設計手冊——應用<b class='flag-5'>接口</b>2

    什么是HDI?PCB設計基礎與HDI PCB制造工藝

    隨著科技的發展,將更多功能集成在更小的封裝中的需求也隨之增長。使用高密度互連(HDI)技術設計的PCB通常更小,因為更多的元件被裝在更小的空間里。HDIPCB使用盲孔、埋孔和微孔、焊盤內孔以及非常細
    的頭像 發表于 07-22 18:21 ?4773次閱讀
    什么是<b class='flag-5'>HDI</b>?PCB設計基礎與<b class='flag-5'>HDI</b> PCB制造工藝

    HDI線路板介紹——PCB領域的技術領先者-健翔升小何分享

    一、HDI線路板的定義與應用領域 HDI(High Density Interconnect)線路板,即高密度互連線路板,是一種具有高集成度、高精度、微型化的印刷線路板。它采用了先進的制作工藝,將
    的頭像 發表于 05-27 18:13 ?2214次閱讀

    HDI板工藝流程圖

    下面介紹的這款HDI板由芯板與積層構成,由導通孔進行層間連接。按所用積層絕緣材料不同和導通孔形成方法不同而有所區分。
    的頭像 發表于 03-26 11:21 ?1293次閱讀
    <b class='flag-5'>HDI</b>板工藝流程圖

    hdi板怎么定義幾階 hdi板與普通pcb的區別

    HDI板通常采用多層結構,包括4層以上的層次。多層結構提供了更多的信號層、電源層和地層,支持復雜的信號傳輸和電路連接。相比之下,普通PCB可能采用較少的層次。
    的頭像 發表于 03-25 16:00 ?5687次閱讀

    HDI板與普通pcb板有哪些不同

    HDI板與普通pcb板有哪些不同
    的頭像 發表于 03-01 10:51 ?1538次閱讀
    陆河县| 百家乐如何切牌好| 百家乐赢的技巧| 网络百家乐官网开户网| 澳门博彩公司| 足球竞猜| 玫瑰国际娱乐城| 网上百家乐官网追杀| 百家乐官网国际娱乐城| 百家乐官网游戏机说明书| 百家乐官网保单破解方法| 安桌百家乐官网游戏百家乐官网| 百家乐官网哪条下路好| 百家乐官网国际赌场娱乐网规则 | 三易博娱乐场| 镇原县| 百家乐官网保单破解方法| 百家乐官网反缆公式| 威尼斯人娱乐网上百家乐的玩法技巧和规则 | 百盛百家乐官网软件| 百家乐官网买对子技巧| 易胜博百家乐输| 亚洲百家乐博彩的玩法技巧和规则| 威尼斯人娱乐的微博| 足球改单平| 百家乐官网论坛博彩啦| 百家乐赌博机吧| 百家乐翻天主题曲| 大发888com| 太仓市| 金钱豹百家乐官网的玩法技巧和规则| gt百家乐平台| 大庆冠通棋牌下载| 百家乐官网娱乐城地址| 百苑百家乐官网的玩法技巧和规则| 百家乐打立了| 棋牌类玩具| 线上百家乐官网试玩| 至尊百家乐年代| 葡京娱乐城姚记| 百家乐官网排名|