HDI硬體裝置介面介紹

科技前鋒發表於2022-04-28

HDF驅動框架是OpenHarmony系統硬體生態開放的基礎,為驅動開發者提供了驅動載入、驅動服務管理和驅動訊息機制等驅動框架能力,同時還為開發者提供了規範的HDI硬體裝置介面,讓開發者能遮蔽南向裝置差異,提供更好的硬體。本文將為大家帶來HDI 硬體裝置介面的介紹。

HDI硬體裝置介面介紹

圖1 HDF驅動框架

1.  HDI介紹

HDI(Hardware Device Interface,硬體裝置介面)是HDF驅動框架為開發者提供的硬體規範化描述性介面。在OpenHarmony 分層結構中,HDI位於 “基礎系統服務層”和“裝置抽象層(DAL)”之間。硬體裝置透過DAL抽象化,並基於IDL(Interface Description Language)介面描述語言描述後,為上層應用或服務提供了規範的硬體裝置介面。

HDI硬體裝置介面介紹

圖2 OpenHarmony 分層結構

HDI支援“IPC模式”及“直通模式”兩種呼叫方式。其中,IPC模式即跨程式通訊模式,基於binder機制實現,呼叫端透過Proxy代理庫呼叫HDI介面,具備良好的解耦性和安全性,是標準系統的預設部署方式。直通模式,將HDI實現為共享庫,呼叫端使用dlopen載入HDI實現庫並直接呼叫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++程式碼,從而為呼叫者提供一致的介面和呼叫方式。

HDI硬體裝置介面介紹

圖4 IDL IPC模式通訊模型

2.1 基於IDL語言實現HDI介面

首先,使用IDL語法描述HDI介面並儲存為.idl檔案,然後編寫.idl檔案的編譯指令碼BUILD.gn檔案,最後編譯.idl檔案即可。下面我們將為大家演示電源子系統的HDI介面的實現過程。

(1)使用IDL語法編寫 .idl 檔案

● 定義電源介面 IPowerInterface.idl

HDI硬體裝置介面介紹

● 如果需要從服務端回撥,可以定義callback介面類IPowerHdiCallback.idl

HDI硬體裝置介面介紹

● 如果interface中用到了自定義資料型別,將自定義型別定義到powerTypes.idl

HDI硬體裝置介面介紹

(2)編寫.idl 檔案的編譯指令碼BUILD.gn

HDI硬體裝置介面介紹

(3)編譯 .idl檔案

使用編譯工具hdi-gen編譯IDL檔案,IDL檔案在編譯過程中轉換為C/C++語言的函式介面宣告、客戶端與服務端IPC相關過程程式碼,開發者只需要基於生成的power.h函式介面實現具體服務功能即可。編譯後生成程式碼在out/product/gen/drivers/interface/power中,介面程式碼如下:

HDI硬體裝置介面介紹

(4)實現HDI介面

● 實現UHDF Driver,用於將HDI實現載入為獨立程式,並基於HDF驅動框架釋出裝置服務。

HDI硬體裝置介面介紹

● 實現HDI介面

HDI硬體裝置介面介紹

3.  HDI使用

透過上文的介紹,相信大家已經對HDI有了一定的瞭解,下面我們將為大家介紹HDI的使用,在直通模式下,對HDI介面呼叫為同一程式空間函式呼叫,過程較為直接,這裡我們重點闡述IPC模式下的呼叫原理,然後透過CPP語言來展示電源子系統HDI的呼叫。

3.1 呼叫原理

在IPC模式下,當系統服務呼叫HDI介面時,透過proxy庫將函式呼叫轉換為IPC請求,將介面呼叫的引數進行序列化;IPC請求透過IPC框架傳送到服務端,請求將被stub庫先處理,然後對介面呼叫的引數進行反序列化,再轉換成對服務實現的函式呼叫,從而實現介面呼叫過程。

HDI硬體裝置介面介紹

圖5 HDI呼叫過程

3.2 基於CPP語言的使用

上文已經編譯生成了電源子系統的HDI介面,下面我們來看看如何使用CPP語言來呼叫HDI介面吧。

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

HDI硬體裝置介面介紹

(2)在實現電源子系統的程式碼中呼叫HDI介面,程式碼如下:

HDI硬體裝置介面介紹

4.  結語

以上就是本文全部內容,我們在這裡簡單介紹了HDI介面的實現思路及使用,對於廣大南向開發者,我們還在社群提供了詳細的HDI介面實現指導,歡迎大家在gitee社群參與更多討論。

社群連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997629/viewspace-2889164/,如需轉載,請註明出處,否則將追究法律責任。

相關文章