Una funzione importante del HDI Il framework driver è quello di fornire un'interfaccia hardware stabile e unificata per il sistema, in modo da garantire che i servizi di sistema possano funzionare su hardware diverso senza ulteriori adattamenti. HDI (Hardware Device Interfaces) is designed for this purpose.
HDI è un'interfaccia astratta di alto livello per funzioni hardware. Dopo la definizione della HDI interfaccia, varie periferiche saranno cambiate solo sotto HDI regole di compatibilità per garantire la stabilità dell'interfaccia. L'implementazione specifica del driver non ha bisogno di definire il HDI interfaccia ripetutamente, ma deve essere implementato solo su richiesta per accedere alle funzioni del sistema.
Su sistemi OpenHarmony di diverse grandezze, HDI ha due modalità di distribuzione: IPC modalità e modalità passante.
Sul sistema leggero OpenHarmony, al fine di ridurre il carico di prestazioni del sistema, HDI è implementato come libreria condivisa in modalità utente, che viene caricato direttamente dal servizio di sistema nel proprio processo per la chiamata di funzione. HDI L'implementazione incapsula lo specifico processo di interazione del kernel utente. Quando è necessario accedere al driver, Utilizzare IO Service Request per chiamare il messaggio al driver del kernel tramite chiamata di sistema.
Sul sistema OpenHarmony, HDI è distribuito come processo di servizio indipendente. Il servizio di sistema carica solo il HDI client nel proprio processo. L'attività effettiva funziona in un processo indipendente. Il client interagisce con il server attraversoIPC, facilitare il disaccoppiamento dell'architettura e la gestione delle autorizzazioni.
HDI interface attuazione
The pass through modalità is a function implementation mode, che possono essere implementate senza il supporto di altri componenti, indipendentemente dall'invito o dall'attuazione. Qui ci concentreremo sull'attuazione di IPC mode.
Rilascio HDI
La modalitàIPC HDI si basa sul modello generale del framework di comunicazione del sistema OpenHarmony. Tuttavia, poiché il driver comporta spesso operazioni a basso livello e scenari di migrazione multi-sistema, è scritto in linguaggio C. Pertanto, il framework driver fornisce anche i componenti di base del servizio HDI implementato in linguaggio C, mentre l'implementazione utilizza principalmente i componenti del framework di comunicazione del sistema.
La pubblicazione dei servizi HDI è implementata sulla base di UHDF (user mode HDF driver framework). L'attuazione dell'editoria dei servizi generali è la seguente.
1. Ingresso di guida
int SampleDriverBindï¼struct HdfDeviceObject *deviceObjectï¼HDF_LOGEï¼SampleDriverBind enterï¼â'ï¼; struttura statica IDeviceIoService testService={. Dispatch=SampleServiceDispatch,//Service callback interface}; deviceObject-ãservice = &testService; restituisce HDF_ SUCCESS;} int SampleDriverInitï¼struct HdfDeviceObject *deviceObjectï¼HDF_LOGEï¼SampleDriverInit enterâ'ï¼; return HDF_SUCCESS;} void SampleDriverReleaseï¼struct HdfDeviceObject *deviceObjectï¼HDF_LOGEï¼âSampleDriverRelease enterâ'ï¼; return;} struct HdfDriverEntry g_ eDrive Entry = { .moduleVersion = 1ï¼ .moduleName = âsample_driverâ'ï¼ .Bind = SampleDriverBindï¼ .Init = SampleDriverInitï¼ .Release = SampleDriverReleaseï¼};
HDF_ INITï¼g_sampleDrive Entryï¼
Per prima cosa, è necessario aggiungere un driver UHDF per pubblicare il servizio IoService. Il servizio dispositivo IoService è l'entità del servizio HDI. La modalità di implementazione è coerente con l'unità KHDF.
2. Implementare l'interfaccia di risposta del servizio
int32_ t SampleServiceOnRemoteRequestï¼ struct HdfDeviceIoClient *clientï¼ int cmdï¼ struct HdfSBuf *dataï¼ struct HdfSBuf *replyï¼ switch ï¼cmdIdï¼ { case SAMPLE_SERVICE_PINGï¼ return SampleServiceStubPingï¼ clientï¼ dataï¼ replyï¼ â¦ â¦ â¦ default HDF_LOGEï¼âSampleServiceDispatchï¼ not support cmd%dâ'ï¼ cmdIdï¼ return HDF_ERR_INVALID_PARAM; } intstatic_ SampleServiceDispatchï¼ not support cmd%dâ'ï¼ cmdIdï¼ *replyï¼ return SampleServiceOnRemoteRequestï¼ clientï¼ cmdIdï¼ dataï¼ replyï¼
Quando viene ricevuta la chiamata HDI, verrà chiamata l'interfaccia di risposta del servizio "SampleServiceDispatch".
L'oggetto chiamante client non è supportato nel driver della modalità utente
CmdId chiama la parola comando, che viene utilizzata per distinguere l'API chiamata.L'oggetto di serializzazione del parametro di input della chiamata dati è incapsulato nel linguaggio C dell'oggetto pacchetto nello scenario di chiamataIPC. Il parametro di input deve essere ottenuto dall'oggetto dati utilizzando l'interfaccia di serializzazione prima dell'uso. La risposta richiama l'oggetto parametro e le informazioni restituite alla chiamata devono essere scritte nell'oggetto serializzato. Se il client di implementazione C++ può utilizzare la seguente interfaccia per convertire l'oggetto sbuf nell'oggetto pacchetto, allora l'operazione può essere eseguita:
3. Configurazione dell'unità UHDF
platform ï¼ï¼ host { hostName = âsample_hostâ"; priority = 50; sample_device ï¼ï¼ deviceNode { policy = 2; priority = 100; moduleName = âlibsample_driver.z.soâ"; serviceName = âsample_driver_serviceâ;}
Descrizione dei parametri:
host Un nodo host è un processo indipendente. Se è necessario un processo indipendente, aggiungere il proprio nodo host.Politica di pubblicazione dei servizi politici, servizio HDI è impostato su 2.ModuloName Libreria di implementazione driver Name.ServizioName Service name, mantenerlo unico a livello globale.Poiché le implementazioni HDI Service C e C++ utilizzano diversi componentiIPC e implementazioni orientate agli oggetti, ci sono alcune differenze nelle implementazioni specifiche. Al fine di supportare l'implementazione HDI, il framework UHDF fornisce i seguenti componenti di base (solo per l'implementazione HDI in linguaggio C):
SBuf is a tool object that supports both KHDF and UHDF to drive the serialization of IoService messages. Nell'UHDFIPC scenario di comunicazione, SBuf può convertire con il sistemaIPC framework serialization object MessageParcel object (only C++is supported) to achieveIPC interazione tra C e C++++.
Le API comuni sono le seguenti:
struct HdfSBuf; struct HdfSbufImpl; struct HdfRemoteService;
Tutti i IPC le interfacce sopra hanno interfacce di scrittura corrispondenti, che non sono elencati uno per uno. Si prega di fare riferimento al sito ufficiale HDI documento di riferimento.