HDI驅動程序框架的一個重要功能是為系統提供一個穩定和統一的硬體介面,以確保系統服務可以在不同的硬體上運行,而無需額外的調整。 HDI(硬體設備介面)就是為此而設計的。
HDI是硬體功能的高級抽象介面。 定義HDI介面後,各種周邊設備將僅在HDI相容性規則下進行更改,以確保介面的穩定性。 特定的驅動程序實現不需要重複定義HDI介面,只需要按需實現即可訪問系統功能。
在不同規模的OpenHarmony系統上,HDI有兩種部署模式:IPC模式和直通模式。
在羽量級OpenHarmony系統上,為了降低系統性能負載,HDI被實現為用戶模式共亯庫,由系統服務直接加載到自己的行程中進行函數調用。 HDI實現封裝了特定的用戶內核互動過程。 當需要訪問驅動程序時,使用IO服務請求通過系統調用向內核驅動程序調用消息。
在OpenHarmony系統上,HDI被部署為一個獨立的服務流程。 系統服務僅將HDI用戶端加載到其自己的行程中。 實際業務在獨立的流程中運行。 用戶端通過IPC與服務器互動,促進架構解耦和許可權管理。
HDI介面實現
傳遞模式是一種函數實現模式,無論調用或實現,都可以在沒有其他組件支持的情况下實現。 這裡我們將重點介紹IPC模式的實現。
HDI發佈
HDI IPC模式基於OpenHarmony系統通信框架的通用模型。 然而,由於驅動程序經常涉及低級操作和多系統遷移場景,所以它是用C語言編寫的。 囙此,驅動程序框架還提供了用C語言實現的HDI服務的基本組件,而實現主要使用系統通信框架組件。
HDI服務發佈是基於UHDF(用戶模式HDF驅動程序框架)實現的。 通用服務發佈實現如下。
1.驅動器入口
int SampleDriverBind(結構HdfDeviceObject*deviceObject){HDF_LOGE(“SampleDriverBindenter!”);靜態結構IDeviceIoService testService={.Dispatch=SampleServiceDispatch,//服務回檔介面}; deviceObject-》服務=&testService; 返回HDF_ SUCCESS;} int SampleDriverInit(結構HdfDeviceObject*deviceObject){HDF_LOGE(“SampleDriverInit-enter”);返回HDF_SUCCESS;}void SampleDriverRelease(結構HdfDeviceObject*設備對象){HDL_LOGE(“SampleDriverRelease enter” ,.Bind=SampleDriverBind,.Init=SampleDriverInit,.Rlease=SampleDriverRelease,};
HDF_INIT(g_sampleDriverEntry);
首先,您需要添加UHDF驅動程序來發佈IoService服務。 IoService設備服務是HDI服務實體。 實施模式與KHDF驅動器一致。
2.實現服務響應介面
int32_ t SampleServiceOnRemoteRequest(結構HdfDeviceIoClient*用戶端,int cmdId,結構HdfSBuf*數據,結構HdfSBuf*回復){switch(cmdId){case SAMPLE_SERVICE_PING:返回SampleServiceStubPing(用戶端,數據,回復);……預設值:HDF_LOGE(“SampleServiceDispatch:不支持cmd%d”,cmdId);返回HDF_ERR_INVALID_PARAM;}}靜態int32_ SampleServiceDispatch(結構HdfDeviceIoClient*用戶端,int cmdId,結構HdfSBuf*數據,結構HdfSBuf*回復){return SampleServiceOnRemoteRequest(用戶端,cmdId,數據,回復);}
當收到HDI調用時,將調用服務響應介面“SampleServiceDispatch”。
用戶模式驅動程序不支持用戶端調用程式對象
CmdId調用命令字,用於區分被調用的API。數據調用輸入參數序列化對象在IPC調用場景中封裝在包對象的C語言中。 在使用之前,需要使用序列化介面從數據對象獲取輸入參數。 應答調用參數對象,返回到調用的資訊需要寫入序列化對象。 如果C++實現用戶端可以使用以下介面將sbuf對象轉換為包對象,則可以執行該操作:
3.UHDF驅動器配寘
平臺::主機{hostName=“sample_host”;優先順序=50;sample_device::設備{device0::設備節點{policy=2;優先順序=100;模塊名稱=“libsample_driver.z.so”;服務名稱=“sample_driver_service”;}}
參數說明:
主機主機節點是一個獨立的行程。 如果您需要獨立的行程,請添加自己的主機節點。策略服務發佈策略,HDI服務設定為2.ModuleName驅動程序實現庫名稱。ServiceName服務名稱,請保持其全域唯一。由於HDI服務C和C++實現使用不同的IPC組件和面向對像的實現,囙此在特定實現中存在一些差异。 為了支持HDI實現,UHDF框架提供了以下基本組件(僅適用於C語言HDI實現):
SBuf是一個支持KHDF和UHDF的工具對象,用於驅動IoService消息的序列化。 在UHDF IPC通信場景中,SBuf可以與系統IPC框架序列化對象MessageParcel對象(僅支持C++)進行轉換,以實現C和C++之間的IPC互通。
常見的API如下:
結構HdfSBuf; 結構HdfSbufImpl; 結構HdfRemoteService;
上述所有IPC介面都有相應的寫介面,未逐一列出。 請參攷官方網站HDI參攷檔案。