HDF驅(qū)動框架是OpenHarmony系統(tǒng)硬件生態(tài)開放的基礎(chǔ),為驅(qū)動開發(fā)者提供了驅(qū)動加載、驅(qū)動服務(wù)管理和驅(qū)動消息機制等驅(qū)動框架能力,同時還為開發(fā)者提供了規(guī)范的HDI硬件設(shè)備接口,讓開發(fā)者能屏蔽南向設(shè)備差異,提供更好 HDF驅(qū)動框架是OpenHarmony系統(tǒng)硬件生態(tài)開放的基礎(chǔ),為驅(qū)動開發(fā)者提供了驅(qū)動加載、驅(qū)動服務(wù)管理和驅(qū)動消息機制等驅(qū)動框架能力,同時還為開發(fā)者提供了規(guī)范的HDI硬件設(shè)備接口,讓開發(fā)者能屏蔽南向設(shè)備差異,提供更好的硬件。本文將為大家?guī)鞨DI 硬件設(shè)備接口的介紹。 圖1 HDF驅(qū)動框架 1. HDI介紹HDI(Hardware Device Interface,硬件設(shè)備接口)是HDF驅(qū)動框架為開發(fā)者提供的硬件規(guī)范化描述性接口。在OpenHarmony 分層結(jié)構(gòu)中,HDI位于 “基礎(chǔ)系統(tǒng)服務(wù)層”和“設(shè)備抽象層(DAL)”之間。硬件設(shè)備通過DAL抽象化,并基于IDL(Interface Description Language)接口描述語言描述后,為上層應(yīng)用或服務(wù)提供了規(guī)范的硬件設(shè)備接口。 圖2 OpenHarmony 分層結(jié)構(gòu) HDI支持“IPC模式”及“直通模式”兩種調(diào)用方式。其中,IPC模式即跨進程通信模式,基于binder機制實現(xiàn),調(diào)用端通過Proxy代理庫調(diào)用HDI接口,具備良好的解耦性和安全性,是標準系統(tǒng)的默認部署方式。直通模式,將HDI實現(xiàn)為共享庫,調(diào)用端使用dlopen加載HDI實現(xiàn)庫并直接調(diào)用HDI接口,是小型系統(tǒng)的默認部署方式,同時還適用于對性能有特殊需求的標準系統(tǒng)模塊。 圖3 兩種調(diào)用方式 HDI硬件設(shè)備接口的優(yōu)點用一句話總結(jié)就是:為硬件的接入提供了統(tǒng)一的實現(xiàn)通路。屏蔽了硬件接口的具體實現(xiàn),實現(xiàn)系統(tǒng)軟件與硬件的架構(gòu)解耦。讓開發(fā)者專注于硬件接口的使用,從而簡化開發(fā)過程,提升開發(fā)效率。 2. HDI實現(xiàn)通過上文的介紹,相信很多小伙伴會有疑問,HDI接口是怎么實現(xiàn)的呢?下面我們將為你介紹IPC模式下基于C/S(Client-Server客戶端與服務(wù)端)結(jié)構(gòu)的HDI接口實現(xiàn)。 2.1 IDL接口描述語言 為方便后文的理解,我們先簡單了解一下IDL接口描述語言。 IDL(Interface Description Language)是一類用來描述接口的語言,通過一種中立的方式來定義客戶端與服務(wù)端均認可的編程接口,可以實現(xiàn)在二者間的跨進程通信(IPC)。跨進程通信意味著可以在一個進程訪問另一個進程的數(shù)據(jù),或調(diào)用另一個進程的方法。通常把應(yīng)用接口提供方(供調(diào)用)稱為服務(wù)端,調(diào)用方稱為客戶端。 IDL先把需要傳遞的對象分解成操作系統(tǒng)能夠理解的基本類型,然后根據(jù)接口聲明編譯,生成IPC/RPC代理(Proxy)和樁(Stub)的C/C++代碼,從而為調(diào)用者提供一致的接口和調(diào)用方式。 ![]() 圖4 IDL IPC模式通信模型 2.1 基于IDL語言實現(xiàn)HDI接口 首先,使用IDL語法描述HDI接口并保存為.idl文件,然后編寫.idl文件的編譯腳本BUILD.gn文件,最后編譯.idl文件即可。下面我們將為大家演示電源子系統(tǒng)的HDI接口的實現(xiàn)過程。 (1)使用IDL語法編寫 .idl 文件 ● 定義電源接口 IPowerInterface.idl ● 如果需要從服務(wù)端回調(diào),可以定義callback接口類IPowerHdiCallback.idl ● 如果interface中用到了自定義數(shù)據(jù)類型,將自定義類型定義到powerTypes.idl (2)編寫.idl 文件的編譯腳本BUILD.gn (3)編譯 .idl文件 使用編譯工具hdi-gen編譯IDL文件,IDL文件在編譯過程中轉(zhuǎn)換為C/C++語言的函數(shù)接口聲明、客戶端與服務(wù)端IPC相關(guān)過程代碼,開發(fā)者只需要基于生成的power.h函數(shù)接口實現(xiàn)具體服務(wù)功能即可。編譯后生成代碼在out/product/gen/drivers/interface/power中,接口代碼如下: (4)實現(xiàn)HDI接口 ● 實現(xiàn)UHDF Driver,用于將HDI實現(xiàn)加載為獨立進程,并基于HDF驅(qū)動框架發(fā)布設(shè)備服務(wù)。 ● 實現(xiàn)HDI接口 3. HDI使用通過上文的介紹,相信大家已經(jīng)對HDI有了一定的了解,下面我們將為大家介紹HDI的使用,在直通模式下,對HDI接口調(diào)用為同一進程空間函數(shù)調(diào)用,過程較為直接,這里我們重點闡述IPC模式下的調(diào)用原理,然后通過CPP語言來展示電源子系統(tǒng)HDI的調(diào)用。 3.1 調(diào)用原理 在IPC模式下,當系統(tǒng)服務(wù)調(diào)用HDI接口時,通過proxy庫將函數(shù)調(diào)用轉(zhuǎn)換為IPC請求,將接口調(diào)用的參數(shù)進行序列化;IPC請求通過IPC框架發(fā)送到服務(wù)端,請求將被stub庫先處理,然后對接口調(diào)用的參數(shù)進行反序列化,再轉(zhuǎn)換成對服務(wù)實現(xiàn)的函數(shù)調(diào)用,從而實現(xiàn)接口調(diào)用過程。 ![]() 圖5 HDI調(diào)用過程 3.2 基于CPP語言的使用 上文已經(jīng)編譯生成了電源子系統(tǒng)的HDI接口,下面我們來看看如何使用CPP語言來調(diào)用HDI接口吧。 (1)客戶端在BUILD.gn中增加依賴: //drivers/interface/foo/v1.0:libfoo_proxy_1.0" (2)在實現(xiàn)電源子系統(tǒng)的代碼中調(diào)用HDI接口,代碼如下: 4. 結(jié)語以上就是本文全部內(nèi)容,我們在這里簡單介紹了HDI接口的實現(xiàn)思路及使用,對于廣大南向開發(fā)者,我們還在社區(qū)提供了詳細的HDI接口實現(xiàn)指導,歡迎大家在gitee社區(qū)參與更多討論。 |
|