在IoT時代下,終端設備差異較大、形態(tài)各異、尺寸各異、交互方式各異,解決設備適配問題無疑是實現(xiàn)萬物互聯(lián)的一個關鍵。但是,在驅動框架的開發(fā)和部署過程中,由于終端設備對硬件的計算和存儲能力的需求不同、設備廠商提供的設備軟硬件操作接口不同、內核提供的操作接口不同,這就使得OEM廠商部署系統(tǒng)的時候需要投入大量的精力來適配和維護驅動代碼。
能否提供了一個跨芯片平臺、跨內核的驅動框架,使得設備驅動軟件可以在不同的設備上運行?OpenHarmony作為一個自主研發(fā)、全新技術生態(tài)的全領域下一代開源操作系統(tǒng),提供了一套驅動框架來滿足此訴求。
下面我們將帶著大家解讀OpenHarmony驅動框架。
一、OpenHarmony驅動框架解讀 1. 設計目標
為解決在開發(fā)和部署過程中遇到的困難,OpenHarmony驅動框架設計目標如下:
2. 設計思路
OpenHarmony驅動框架(下面簡稱為HDF)通過提供驅動與芯片平臺、內核解耦的底座,規(guī)范硬件驅動接口,實現(xiàn)驅動軟件在不同設備中部署。HDF驅動框架架構如下圖所示。
![988caab8-3e41-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1B/A1/pYYBAGGF2yiANO86AAA_syOBfQk676.png)
圖1 驅動架構
為了達成設計目標,OpenHarmony驅動框架采用如下核心設計思路:
(1)彈性化架構- 框架可動態(tài)伸縮:通過對象管理器,多態(tài)加載不同容量設備實現(xiàn)方式,實現(xiàn)彈性伸縮部署。
-
驅動可動態(tài)伸縮:支持統(tǒng)一的設備驅動插件管理,實現(xiàn)設備驅動任意分層,積木式組合拼接
(2)組件化設備模型
(3)歸一化平臺底座
提供規(guī)范化的內核、SoC硬件IO適配接口,兼容不同內核、SoC芯片,對外開發(fā)規(guī)范化的平臺驅動接口(4)統(tǒng)一配置界面
構建全新的配置語言,面向不同容量的設備,提供統(tǒng)一配置界面,支持硬件資源配置和設備信息配置3. 構建策略
面向Liteos的輕量級設備,主要基于HDF構建主流IC驅動,形成公版驅動和通用設備功能模型,支撐不同硬件芯片、不同內核(LiteOS-M/LiteOS-A)部署。![98ea93ee-3e41-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1B/A1/pYYBAGGF2yiAEiddAADcmbcyrZw444.png)
圖2 輕量級設備部署模式
面向標準設備,除了支持內核態(tài)驅動,還支持用戶態(tài)驅動。用戶態(tài)驅動的重點在于構建設備抽象模型,為系統(tǒng)提供統(tǒng)一的設備接口,兼容Linux原生驅動和HDF驅動。內核態(tài)則使用Linux驅動與HDF驅動并存的策略,提供端到端的解決方案。
![994f368c-3e41-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1B/A1/pYYBAGGF2yiAPq3mAAA5Yg1Jl9I477.png)
圖3 標準設備部署模式
4. 現(xiàn)狀與演進
目前HDF驅動框架已經支持Liteos-m、Liteos-a、Linux內核,以及OpenHarmony輕量級、標準級上部署,并且在標準系統(tǒng)上同時支持內核態(tài)與用戶態(tài)部署。經過開發(fā)者的不斷努力,OpenHarmony驅動框架正在不斷完善和增強,在OpenHarmony LTS3.0中,基礎框架新增了對熱插拔設備的管理以及HDI編譯工具hdi-gen,驅動模型部分新增了Audio、Camera、Senso、USB DDK等多個模塊的支持。
二、OpenHarmony驅動開發(fā) OpenHarmony驅動為了避免與具體內核產生依賴,實現(xiàn)可遷移目標,開發(fā)時需要遵循以下約定:
- 系統(tǒng)相關接口使用HDF OSAL接口;
-
總線和硬件資源相關接口使用平臺驅動提供的相關接口。
基于HDF框架,驅動開發(fā)的通常流程包含驅動代碼的實現(xiàn)、編譯腳本、配置文件添加、以及用戶態(tài)程序和驅動交互的流程。下面將詳細介紹HDF驅動開發(fā)一般步驟。
1. 實現(xiàn)驅動代碼
在HDF驅動框架中,HdfDriverEntry對象被用來描述一個驅動實現(xiàn)。structHdfDriverEntry{
int32_tmoduleVersion;
constchar*moduleName;
int32_t(*Bind)(structHdfDeviceObject*deviceObject);
int32_t(*Init)(structHdfDeviceObject*deviceObject);
void(*Release)(structHdfDeviceObject*deviceObject);
};
編寫一個簡單的驅動,首先需要實現(xiàn)驅動程序(Driver Entry)入口中的三個主要接口:
- Bind接口:實現(xiàn)驅動接口實例化綁定,如果需要發(fā)布驅動接口,會在驅動加載過程中被調用,實例化該接口的驅動服務并和DeviceObject綁定。當用戶態(tài)發(fā)起調用時,Bind中綁定的服務對象的Dispatch方法將被回調,在該方法中處理用戶態(tài)調用的消息。
-
Init接口:實現(xiàn)驅動或者硬件的初始化,返回錯誤將中止驅動加載流程。
-
Release接口:實現(xiàn)驅動的卸載,在該接口中釋放驅動實例的軟硬件資源。
一個基于HDF框架編寫的簡單驅動代碼如下,其功能是用戶態(tài)消息回環(huán),即驅動收到用戶態(tài)發(fā)送的消息后將相同內容的消息再發(fā)送給用戶態(tài):
#include"hdf_base.h"
#include"hdf_device_desc.h"
#include"hdf_log.h"
#defineHDF_LOG_TAG"sample_driver"
#defineSAMPLE_WRITE_READ0xFF00
static int EchoString(struct HdfDeviceObject *deviceObject, struct HdfSBuf *data, struct HdfSBuf *reply)
{
constchar*readData=HdfSbufReadString(data);
if(readData==NULL){
HDF_LOGE("%s:failedtoreaddata",__func__);
returnHDF_ERR_INVALID_PARAM;
}
if(!HdfSbufWriteInt32(reply,INT32_MAX)){
HDF_LOGE("%s:failedtoreplyint32",__func__);
returnHDF_FAILURE;
}
returnHdfDeviceSendEvent(deviceObject,id,data);//發(fā)送事件到用戶態(tài)
}
int32_tHdfSampleDriverDispatch(structHdfDeviceObject*deviceObject,intid,structHdfSBuf*data,structHdfSBuf*reply)
{
constchar*readData=NULL;
intret=HDF_SUCCESS;
switch(id){
switchSAMPLE_WRITE_READ:
ret=EchoString(deviceObject,data,reply);
break;
default:
HDF_LOGE("%s:unsupportedcommand");
ret=HDF_ERR_INVALID_PARAM;
}
returnret;
}
void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject)
{
//在這里釋放驅動申請的軟硬件資源
return;
}
int HdfSampleDriverBind(struct HdfDeviceObject *deviceObject)
{
if(deviceObject==NULL){
returnHDF_FAILURE
}
staticstructIDeviceIoServicetestService={
.Dispatch=HdfSampleDriverDispatch,
};
deviceObject->service=&testService;
returnHDF_SUCCESS;
}
int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject)
{
if(deviceObject==NULL){
HDF_LOGE("%s::ptrisnull!",__func__);
returnHDF_FAILURE;
}
HDF_LOGE("SampledriverInitsuccess");
returnHDF_SUCCESS;
}
structHdfDriverEntryg_sampleDriverEntry={
.moduleVersion=1,
.moduleName="sample_driver",
.Bind=HdfSampleDriverBind,
.Init=HdfSampleDriverInit,
.Release=HdfSampleDriverRelease,
};
HDF_INIT(g_sampleDriverEntry);
2. 配置設備信息
在HDF框架的配置文件(例如vendor/hisilicon/xxx/config/device_info.hcs)中添加該驅動的配置信息,配置目錄與具體開發(fā)板關聯(lián),如下所示:root{
device_info{
match_attr="hdf_manager";
templatehost{
hostName="";
priority=100;
templatedevice{
templatedeviceNode{
policy=0;
priority=100;
preload=0;
permission=0664;
moduleName="";
serviceName="";
deviceMatchAttr="";
}
}
}
sample_host::host{
hostName="host0";//host名稱,host節(jié)點是用來存放某一類驅動的容器
priority=100;//host啟動優(yōu)先級(0-200),值越大優(yōu)先級越低,建議默認配100,優(yōu)先級相同則不保證host的加載順序
device_sample::device{//sample設備節(jié)點
device0::deviceNode{//sample驅動的DeviceNode節(jié)點
policy=1;//policy字段是驅動服務發(fā)布的策略,在驅動服務管理章節(jié)有詳細介紹
priority=100;//驅動啟動優(yōu)先級(0-200),值越大優(yōu)先級越低,建議默認配100,優(yōu)先級相同則不保證device的加載順序
preload=0;//驅動加載策略,參考《5.2HDF驅動框架章節(jié)》
permission=0664;//驅動創(chuàng)建設備節(jié)點權限
moduleName="sample_driver";//驅動名稱,該字段的值必須和驅動入口結構體的moduleName值一致
serviceName="sample_service";//驅動對外發(fā)布服務的名稱,必須唯一
deviceMatchAttr="sample_config";//驅動私有數(shù)據匹配的關鍵字,必須和驅動私有數(shù)據配置表中的match_attr值相等
}
}
}
}
}
(左右滑動,查看更多)
定義設備列表時使用了HCS的模板語法,template host節(jié)點下的內容由HDF框架定義,新增host以及host中的device只需要繼承該模板并填充具體內容即可。
在配置中定義的device將在加載過程中產生一個設備實例,配置中通過moduleName字段指定設備對應的驅動名稱,從而將設備與驅動關聯(lián)起來。其中,設備與驅動可以是一對多的關系,即可以實現(xiàn)一個驅動支持多個同類型設備。
3. 用戶態(tài)程序與驅動交互
用戶態(tài)程序和驅動交互基于HDF IoService模型實現(xiàn),該設計屏蔽了具體內核的差異,將驅動接口抽象為IoService對象,調用者基于名稱獲取該對象,并可以使用IoService系列接口進行接口調用和事件監(jiān)聽。值得一提的是消息傳遞時使用了HDF Sbuf對象進行參數(shù)的序列化和反序列化,這樣可以避免不受控的內存訪問,也簡化了消息傳遞和分發(fā)過程中的內存所有權問題,有利于提升用戶態(tài)和內核態(tài)數(shù)據傳遞的安全性和便利性。HDF Sbuf相關接口可以參考HarmonyOS設備開發(fā)官網API Reference中頭文件hdf_sbuf.h部分。基于HDF框架編寫的用戶態(tài)程序和驅動交互的代碼如下:
#include"hdf_log.h"
#include"hdf_sbuf.h"
#include"hdf_io_service_if.h"
#defineHDF_LOG_TAG"sample_test"
#defineSAMPLE_SERVICE_NAME"sample_service"
#defineSAMPLE_WRITE_READ0xFF00
intg_replyFlag=0;
static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data)
{
constchar*string=HdfSbufReadString(data);
intret=HDF_SUCCESS;
if(string==NULL){
HDF_LOGE("failedtoreadstringineventdata");
ret=HDF_FAILURE;
}else{
HDF_LOGE("%s",string);
}
g_replyFlag=1;
returnret;
}
static int SendEvent(struct HdfIoService *serv, char *eventData)
{
intret=0;
structHdfSBuf*data=HdfSBufObtainDefaultSize();//申請需要發(fā)送的序列化對象
if(data==NULL){
HDF_LOGE("failedtoobtainsbufdata");
return1;
}
structHdfSBuf*reply=HdfSBufObtainDefaultSize();//申請返回數(shù)據的序列化對象
if(reply==NULL){
HDF_LOGE("failedtoobtainsbufreply");
ret=HDF_DEV_ERR_NO_MEMORY;
gotoout;
}
if(!HdfSbufWriteString(data,eventData)){//準備消息內容
HDF_LOGE("failedtowritesbuf");
ret=HDF_FAILURE;
gotoout;
}
ret=serv->dispatcher->Dispatch(&serv->object,SAMPLE_WRITE_READ,data,reply);//發(fā)起接口調用
if(ret!=HDF_SUCCESS){
HDF_LOGE("failedtosendservicecall");
gotoout;
}
intreplyData=0;
if(!HdfSbufReadInt32(reply,&replyData)){//反序列化返回數(shù)據
HDF_LOGE("failedtogetservicecallreply");
ret=HDF_ERR_INVALID_OBJECT;
gotoout;
}
HDF_LOGE("Getreplyis:%d",replyData);
out:
HdfSBufRecycle(data);
HdfSBufRecycle(reply);
returnret;
}
int main()
{
structHdfIoService*serv=HdfIoServiceBind(SAMPLE_SERVICE_NAME);//通過名稱獲取IoService對象,與驅動配置中的名稱一致
if(serv==NULL){
HDF_LOGE("failedtogetservice%s",SAMPLE_SERVICE_NAME);
returnHDF_FAILURE;
}
staticstructHdfDevEventlistenerlistener={//構造驅動事件監(jiān)聽器對象
.callBack=OnDevEventReceived,//填充事件處理方法
.priv=NULL;
};
if(HdfDeviceRegisterEventListener(serv,&listener)!=HDF_SUCCESS){//注冊事件監(jiān)聽
HDF_LOGE("failedtoregistereventlistener");
returnHDF_FAILURE;
}
if(SendEvent(serv,"HelloWorld,HDFDriver!")){//調用驅動接口,樣例驅動收到事件
HDF_LOGE("failedtosendevent");
returnHDF_FAILURE;
}
while(g_replyFlag==0){//等待驅動上報事件
sleep(1);
}
HdfDeviceUnregisterEventListener(serv,&listener));//去注冊事件監(jiān)聽器
HdfIoServiceRecycle(serv);//回收IoService對象
return0;
}
(左右滑動,查看更多)
該示例執(zhí)行后會在終端中打印出"Hello World, HDF Driver!"字符串,表明我們的用戶態(tài)測試程序和驅動成功地進行了一次交互。
三、使用DevEco Device Tool進行驅動開發(fā)
上一小節(jié)介紹了OpenHarmony驅動的一般開發(fā)方法,那么有沒有更簡單的方法添加一款驅動呢?答案就是華為南向開發(fā)IDE——DevEco Device Tool。DevEco Device Tool最新版本已經集成了HDF驅動開發(fā)功能,下面介紹如何使用DevEco Device Tool進行驅動開發(fā)。
DevEco Device Tool下載鏈接:https://device.harmonyos.com/cn/develop/ide#download_release。
1. 創(chuàng)建驅動
(1)導入工程
參考DevEco Device Tool手冊,通過npm或網絡下載的方式導入OHOS工程。(2)使用HDF頁面工具創(chuàng)建新驅動,按照需求填寫Module名稱,工具將根據Module名稱創(chuàng)建對應驅動代碼與。
DevEco Device Tool將自動生成驅動實現(xiàn)代碼:
![9b2055f4-3e41-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1B/A1/pYYBAGGF2yiACW3LAAHWNogv9w0568.png)
圖7 Device Eco Tool 生成驅動代碼
為源碼文件自動生成編譯腳本:
![9b9fadf4-3e41-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1B/A1/pYYBAGGF2yiAee0GAAIzhHCsON4357.png)
圖8 Device Eco Tool 生成驅動編譯腳本
DevEco Device Tool還會在對應單板的驅動配置中生成驅動設備配置信息:
![9bfb783c-3e41-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1B/A1/pYYBAGGF2ymAA4LKAAFBS8lV4sU969.png)
圖9 Device Eco Tool 生成驅動配置信息
2. 修改驅動
DevEco Device Tool提供了快捷方式直達源碼、編譯腳本、配置文件,點擊鏈接修改相關文件,實現(xiàn)驅動功能。DevEco Device Tool自動生成代碼已經提供了DriverEntry的基礎實現(xiàn),只需填充對應函數(shù)的實際功能即可。
3. 編譯版本
使用DevEco Device Tool build功能一鍵編譯版本,編譯輸出顯示在終端窗口:![9cb753ea-3e41-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1B/A1/pYYBAGGF2ymACZW3AAJEK3ahF1U441.png)
圖11 Device Eco Tool編譯界面
4. 燒錄驗證
DevEco Device Tool提供了一站式的燒錄、調試環(huán)境。使用upload功能將編譯好的鏡像燒錄進開發(fā)板。![9d136d6a-3e41-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1B/A1/pYYBAGGF2ymAcQk4AABKftRgdbQ078.png)
圖12 Device Eco Tool燒寫功能界面
燒錄過程和進度顯示在終端窗口
圖13 Device Eco Tool燒寫輸出
四、總結
除了在此次HDC大會與大家分享驅動框架的設計和最新進展,開放原子基金會還在OpenHarmony公眾號、gitee社區(qū)等渠道發(fā)布了一系列技術分享、指導文檔等資料,歡迎大家關注并一起建設OpenHarmony驅動生態(tài)。
-
芯片
+關注
關注
455文章
50818瀏覽量
423721 -
驅動
+關注
關注
12文章
1840瀏覽量
85296 -
鴻蒙系統(tǒng)
+關注
關注
183文章
2634瀏覽量
66353 -
HarmonyOS
+關注
關注
79文章
1975瀏覽量
30213 -
OpenHarmony
+關注
關注
25文章
3722瀏覽量
16323
原文標題:HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發(fā)實踐
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
第三屆OpenHarmony技術大會星光璀璨、致謝OpenHarmony社區(qū)貢獻者
基于ArkTS語言的OpenHarmony APP應用開發(fā):HelloOpenharmony
![基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應用開發(fā):Hello<b class='flag-5'>Openharmony</b>](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
拓維信息旗下開鴻智谷精彩亮相OpenHarmony開發(fā)者大會2024
![拓維信息旗下開鴻智谷精彩亮相<b class='flag-5'>OpenHarmony</b>開發(fā)者大會2024](https://file.elecfans.com/web2/M00/46/D0/pYYBAGKV5wiAQkFLAAA0HUPKaH4034.jpg)
開鴻智谷與OpenHarmony的創(chuàng)新對話
![開鴻智谷與<b class='flag-5'>OpenHarmony</b>的創(chuàng)新對話](https://file.elecfans.com/web2/M00/8E/8D/pYYBAGPcpICAAruWAAAuPj7FFhI697.png)
OpenHarmony開發(fā)者大會2024:誠邁科技多項榮譽加冕再證實力
![<b class='flag-5'>OpenHarmony</b>開發(fā)者大會2024:誠邁科技多項榮譽加冕再證實力](https://file1.elecfans.com/web2/M00/E9/99/wKgZomZUXYyAP4NoAAAc0w9vw74389.jpg)
OpenHarmony 成功亮相國際學術會議 ASPLOS 2024
![<b class='flag-5'>OpenHarmony</b> 成功亮相國際學術會議 ASPLOS 2024](https://file1.elecfans.com//web2/M00/E6/C9/wKgaomZFYSCAHogvAAImv_Hx5ZA79.jpeg)
專家解讀 | NIST網絡安全框架(1):框架概覽
![專家<b class='flag-5'>解讀</b> | NIST網絡安全<b class='flag-5'>框架</b>(1):<b class='flag-5'>框架</b>概覽](https://file1.elecfans.com/web2/M00/E0/40/wKgZomY4QLOAGat4AABoZ537-Dg354.png)
【六】Purple Pi OH開發(fā)板帶你7天入門OpenHarmony!
![【六】Purple Pi OH開發(fā)板帶你7天入門<b class='flag-5'>OpenHarmony</b>!](https://file1.elecfans.com/web2/M00/8F/50/wKgZomTMciWAD54NAABOGP2pQZY452.png)
介紹一種OpenAtom OpenHarmony輕量系統(tǒng)適配方案
![介紹一種OpenAtom <b class='flag-5'>OpenHarmony</b>輕量系統(tǒng)適配方案](https://file1.elecfans.com/web2/M00/C3/89/wKgaomXmdQ2API-MAAAONfnizq8510.png)
OpenHarmony4.0源碼解析之媒體框架
![<b class='flag-5'>OpenHarmony</b>4.0源碼解析之媒體<b class='flag-5'>框架</b>](https://file1.elecfans.com/web2/M00/C2/0F/wKgaomXcmcOANuqWAACuNGSccUo398.png)
【鴻蒙】OpenHarmony 4.0藍牙代碼結構簡析
![【鴻蒙】<b class='flag-5'>OpenHarmony</b> 4.0藍牙代碼結構簡析](https://file1.elecfans.com/web2/M00/C1/09/wKgZomXcRo6AFtQ8AAIhJd6EgqI689.png)
淺談兼容 OpenHarmony 的 Flutter
![淺談兼容 <b class='flag-5'>OpenHarmony</b> 的 Flutter](https://file1.elecfans.com/web2/M00/C0/5E/wKgaomW8l6-ALEZbAAF4sZQzeVA995.png)
OpenHarmony 之 NAPI 框架介紹
![<b class='flag-5'>OpenHarmony</b> 之 NAPI <b class='flag-5'>框架</b>介紹](https://file1.elecfans.com//web2/M00/C0/26/wKgaomW7ZZyAYgmdAACKb1Siseo870.png)
智能制造,創(chuàng)新未來 | OpenHarmony Meetup 2023南京站圓滿舉辦
![智能制造,創(chuàng)新未來 | <b class='flag-5'>OpenHarmony</b> Meetup 2023南京站圓滿舉辦](https://file1.elecfans.com//web2/M00/BB/E9/wKgaomWWsIeAYtKqAAAbitXkUio570.png)
資訊速遞 | 廈門大學OpenHarmony技術俱樂部正式揭牌成立
![資訊速遞 | 廈門大學<b class='flag-5'>OpenHarmony</b>技術俱樂部正式揭牌成立](https://file1.elecfans.com/web2/M00/BA/63/wKgZomWTzqeACjmnAABn-WVgwNE208.png)
評論