HDF驅動框架是OpenHarmony系統硬件生態開放的基礎,為驅動開發者提供了驅動加載、驅動服務管理和驅動消息機制等驅動框架能力,同時還為開發者提供了規范的HDI硬件設備接口,讓開發者能屏蔽南向設備差異,提供更好的硬件。本文將為大家帶來HDI 硬件設備接口的介紹。

圖1 HDF驅動框架
1. HDI介紹
HDI(Hardware Device Interface,硬件設備接口)是HDF驅動框架為開發者提供的硬件規范化描述性接口。在OpenHarmony 分層結構中,HDI位于 “基礎系統服務層”和“設備抽象層(DAL)”之間。硬件設備通過DAL抽象化,并基于IDL(Interface Description Language)接口描述語言描述后,為上層應用或服務提供了規范的硬件設備接口。

圖2 OpenHarmony 分層結構
HDI支持“IPC模式”及“直通模式”兩種調用方式。其中,IPC模式即跨進程通信模式,基于binder機制實現,調用端通過Proxy代理庫調用HDI接口,具備良好的解耦性和安全性,是標準系統的默認部署方式。直通模式,將HDI實現為共享庫,調用端使用dlopen加載HDI實現庫并直接調用HDI接口,是小型系統的默認部署方式,同時還適用于對性能有特殊需求的標準系統模塊。

圖3 兩種調用方式
HDI硬件設備接口的優點用一句話總結就是:為硬件的接入提供了統一的實現通路。屏蔽了硬件接口的具體實現,實現系統軟件與硬件的架構解耦。讓開發者專注于硬件接口的使用,從而簡化開發過程,提升開發效率。
2. HDI實現
通過上文的介紹,相信很多小伙伴會有疑問,HDI接口是怎么實現的呢?下面我們將為你介紹IPC模式下基于C/S(Client-Server客戶端與服務端)結構的HDI接口實現。
2.1 IDL接口描述語言
為方便后文的理解,我們先簡單了解一下IDL接口描述語言。
IDL(Interface Description Language)是一類用來描述接口的語言,通過一種中立的方式來定義客戶端與服務端均認可的編程接口,可以實現在二者間的跨進程通信(IPC)。跨進程通信意味著可以在一個進程訪問另一個進程的數據,或調用另一個進程的方法。通常把應用接口提供方(供調用)稱為服務端,調用方稱為客戶端。
IDL先把需要傳遞的對象分解成操作系統能夠理解的基本類型,然后根據接口聲明編譯,生成IPC/RPC代理(Proxy)和樁(Stub)的C/C++代碼,從而為調用者提供一致的接口和調用方式。

圖4 IDL IPC模式通信模型
2.1 基于IDL語言實現HDI接口
首先,使用IDL語法描述HDI接口并保存為.idl文件,然后編寫.idl文件的編譯腳本BUILD.gn文件,最后編譯.idl文件即可。下面我們將為大家演示電源子系統的HDI接口的實現過程。
(1)使用IDL語法編寫 .idl 文件
● 定義電源接口 IPowerInterface.idl

● 如果需要從服務端回調,可以定義callback接口類IPowerHdiCallback.idl

● 如果interface中用到了自定義數據類型,將自定義類型定義到powerTypes.idl

(2)編寫.idl 文件的編譯腳本BUILD.gn

(3)編譯 .idl文件
使用編譯工具hdi-gen編譯IDL文件,IDL文件在編譯過程中轉換為C/C++語言的函數接口聲明、客戶端與服務端IPC相關過程代碼,開發者只需要基于生成的power.h函數接口實現具體服務功能即可。編譯后生成代碼在out/product/gen/drivers/interface/power中,接口代碼如下:

(4)實現HDI接口
● 實現UHDF Driver,用于將HDI實現加載為獨立進程,并基于HDF驅動框架發布設備服務。

● 實現HDI接口

3. HDI使用
通過上文的介紹,相信大家已經對HDI有了一定的了解,下面我們將為大家介紹HDI的使用,在直通模式下,對HDI接口調用為同一進程空間函數調用,過程較為直接,這里我們重點闡述IPC模式下的調用原理,然后通過CPP語言來展示電源子系統HDI的調用。
3.1 調用原理
在IPC模式下,當系統服務調用HDI接口時,通過proxy庫將函數調用轉換為IPC請求,將接口調用的參數進行序列化;IPC請求通過IPC框架發送到服務端,請求將被stub庫先處理,然后對接口調用的參數進行反序列化,再轉換成對服務實現的函數調用,從而實現接口調用過程。

圖5 HDI調用過程
3.2 基于CPP語言的使用
上文已經編譯生成了電源子系統的HDI接口,下面我們來看看如何使用CPP語言來調用HDI接口吧。
(1)客戶端在BUILD.gn中增加依賴: //drivers/interface/foo/v1.0:libfoo_proxy_1.0"

(2)在實現電源子系統的代碼中調用HDI接口,代碼如下:
4. 結語
以上就是本文全部內容,我們在這里簡單介紹了HDI接口的實現思路及使用,對于廣大南向開發者,我們還在社區提供了詳細的HDI接口實現指導,歡迎大家在gitee社區參與更多討論。