精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenHarmony驅動框架解讀

電子發燒友開源社區 ? 來源:OpenAtom OpenHarmony ? 作者:yuanbo ? 2021-11-06 09:23 ? 次閱讀

IoT時代下,終端設備差異較大、形態各異、尺寸各異、交互方式各異,解決設備適配問題無疑是實現萬物互聯的一個關鍵。但是,在驅動框架的開發和部署過程中,由于終端設備對硬件的計算和存儲能力的需求不同、設備廠商提供的設備軟硬件操作接口不同、內核提供的操作接口不同,這就使得OEM廠商部署系統的時候需要投入大量的精力來適配和維護驅動代碼。

能否提供了一個跨芯片平臺、跨內核的驅動框架,使得設備驅動軟件可以在不同的設備上運行?OpenHarmony作為一個自主研發、全新技術生態的全領域下一代開源操作系統,提供了一套驅動框架來滿足此訴求。

下面我們將帶著大家解讀OpenHarmony驅動框架。

一、OpenHarmony驅動框架解讀 1. 設計目標

為解決在開發和部署過程中遇到的困難,OpenHarmony驅動框架設計目標如下:

  • 支持百K級~G級容量的設備部署,如手機、手環等

  • 提供統一硬件IO抽象,屏蔽SoC芯片差異,兼容不同內核,如LinuxLiteOS等。

  • 屏蔽驅動和系統組件間交互。可動態拆解,滿足不同容量設備的部署。

  • 面向不同容量的設備,提供統一的配置界面。

2. 設計思路

OpenHarmony驅動框架(下面簡稱為HDF)通過提供驅動與芯片平臺、內核解耦的底座,規范硬件驅動接口,實現驅動軟件在不同設備中部署。

HDF驅動框架架構如下圖所示。

988caab8-3e41-11ec-82a9-dac502259ad0.png

1 驅動架構

為了達成設計目標,OpenHarmony驅動框架采用如下核心設計思路:

(1)彈性化架構
  • 框架可動態伸縮:通過對象管理器,多態加載不同容量設備實現方式,實現彈性伸縮部署。
  • 驅動可動態伸縮:支持統一的設備驅動插件管理,實現設備驅動任意分層,積木式組合拼接

(2)組件化設備模型

  • 提供設備功能模型抽象,屏蔽設備驅動與系統交互的實現,為開發者提供統一的驅動開發接口
  • 提供主流IC的公版驅動能力,支持配置化部署

(3)歸一化平臺底座

提供規范化的內核、SoC硬件IO適配接口,兼容不同內核、SoC芯片,對外開發規范化的平臺驅動接口

(4)統一配置界面

構建全新的配置語言,面向不同容量的設備,提供統一配置界面,支持硬件資源配置和設備信息配置

3. 構建策略

面向Liteos的輕量級設備,主要基于HDF構建主流IC驅動,形成公版驅動和通用設備功能模型,支撐不同硬件芯片、不同內核(LiteOS-M/LiteOS-A)部署。98ea93ee-3e41-11ec-82a9-dac502259ad0.png

2 輕量級設備部署模式

面向標準設備,除了支持內核態驅動,還支持用戶態驅動。用戶態驅動的重點在于構建設備抽象模型,為系統提供統一的設備接口,兼容Linux原生驅動和HDF驅動。內核態則使用Linux驅動與HDF驅動并存的策略,提供端到端的解決方案。

994f368c-3e41-11ec-82a9-dac502259ad0.png

3 標準設備部署模式

4. 現狀與演進

目前HDF驅動框架已經支持Liteos-m、Liteos-a、Linux內核,以及OpenHarmony輕量級、標準級上部署,并且在標準系統上同時支持內核態與用戶態部署。

經過開發者的不斷努力,OpenHarmony驅動框架正在不斷完善和增強,在OpenHarmony LTS3.0中,基礎框架新增了對熱插拔設備的管理以及HDI編譯工具hdi-gen,驅動模型部分新增了Audio、Camera、Senso、USB DDK等多個模塊的支持。

二、OpenHarmony驅動開發 OpenHarmony驅動為了避免與具體內核產生依賴,實現可遷移目標,開發時需要遵循以下約定:
  • 系統相關接口使用HDF OSAL接口;
  • 總線和硬件資源相關接口使用平臺驅動提供的相關接口。

基于HDF框架,驅動開發的通常流程包含驅動代碼的實現、編譯腳本、配置文件添加、以及用戶態程序和驅動交互的流程。下面將詳細介紹HDF驅動開發一般步驟。

1. 實現驅動代碼

在HDF驅動框架中,HdfDriverEntry對象被用來描述一個驅動實現。
structHdfDriverEntry{int32_tmoduleVersion;constchar*moduleName;int32_t(*Bind)(structHdfDeviceObject*deviceObject);int32_t(*Init)(structHdfDeviceObject*deviceObject);void(*Release)(structHdfDeviceObject*deviceObject);};

編寫一個簡單的驅動,首先需要實現驅動程序(Driver Entry)入口中的三個主要接口:

  • Bind接口:實現驅動接口實例化綁定,如果需要發布驅動接口,會在驅動加載過程中被調用,實例化該接口的驅動服務并和DeviceObject綁定。當用戶態發起調用時,Bind中綁定的服務對象的Dispatch方法將被回調,在該方法中處理用戶態調用的消息。
  • Init接口:實現驅動或者硬件的初始化,返回錯誤將中止驅動加載流程。

  • Release接口:實現驅動的卸載,在該接口中釋放驅動實例的軟硬件資源。

一個基于HDF框架編寫的簡單驅動代碼如下,其功能是用戶態消息回環,即驅動收到用戶態發送的消息后將相同內容的消息再發送給用戶態:

#include"hdf_base.h"#include"hdf_device_desc.h"#include"hdf_log.h"#defineHDF_LOG_TAG"sample_driver"#defineSAMPLE_WRITE_READ0xFF00static 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);//發送事件到用戶態}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)中添加該驅動的配置信息,配置目錄與具體開發板關聯,如下所示:
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節點是用來存放某一類驅動的容器priority=100;//host啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證host的加載順序device_sample::device{//sample設備節點device0::deviceNode{//sample驅動的DeviceNode節點policy=1;//policy字段是驅動服務發布的策略,在驅動服務管理章節有詳細介紹priority=100;//驅動啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證device的加載順序preload=0;//驅動加載策略,參考《5.2HDF驅動框架章節》permission=0664;//驅動創建設備節點權限moduleName="sample_driver";//驅動名稱,該字段的值必須和驅動入口結構體的moduleName值一致serviceName="sample_service";//驅動對外發布服務的名稱,必須唯一deviceMatchAttr="sample_config";//驅動私有數據匹配的關鍵字,必須和驅動私有數據配置表中的match_attr值相等}}}}}

(左右滑動,查看更多)

定義設備列表時使用了HCS的模板語法,template host節點下的內容由HDF框架定義,新增host以及host中的device只需要繼承該模板并填充具體內容即可。

在配置中定義的device將在加載過程中產生一個設備實例,配置中通過moduleName字段指定設備對應的驅動名稱,從而將設備與驅動關聯起來。其中,設備與驅動可以是一對多的關系,即可以實現一個驅動支持多個同類型設備。

3. 用戶態程序與驅動交互

用戶態程序和驅動交互基于HDF IoService模型實現,該設計屏蔽了具體內核的差異,將驅動接口抽象為IoService對象,調用者基于名稱獲取該對象,并可以使用IoService系列接口進行接口調用和事件監聽。值得一提的是消息傳遞時使用了HDF Sbuf對象進行參數的序列化和反序列化,這樣可以避免不受控的內存訪問,也簡化了消息傳遞和分發過程中的內存所有權問題,有利于提升用戶態和內核態數據傳遞的安全性和便利性。HDF Sbuf相關接口可以參考HarmonyOS設備開發官網API Reference中頭文件hdf_sbuf.h部分。

基于HDF框架編寫的用戶態程序和驅動交互的代碼如下:

#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_READ0xFF00intg_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();//申請需要發送的序列化對象if(data==NULL){HDF_LOGE("failedtoobtainsbufdata");return1;}structHdfSBuf*reply=HdfSBufObtainDefaultSize();//申請返回數據的序列化對象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);//發起接口調用if(ret!=HDF_SUCCESS){HDF_LOGE("failedtosendservicecall");gotoout;}intreplyData=0;if(!HdfSbufReadInt32(reply,&replyData)){//反序列化返回數據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={//構造驅動事件監聽器對象.callBack=OnDevEventReceived,//填充事件處理方法.priv=NULL;};if(HdfDeviceRegisterEventListener(serv,&listener)!=HDF_SUCCESS){//注冊事件監聽HDF_LOGE("failedtoregistereventlistener");returnHDF_FAILURE;}if(SendEvent(serv,"HelloWorld,HDFDriver!")){//調用驅動接口,樣例驅動收到事件HDF_LOGE("failedtosendevent");returnHDF_FAILURE;}while(g_replyFlag==0){//等待驅動上報事件sleep(1);}HdfDeviceUnregisterEventListener(serv,&listener));//去注冊事件監聽器HdfIoServiceRecycle(serv);//回收IoService對象return0;}

(左右滑動,查看更多)

該示例執行后會在終端中打印出"Hello World, HDF Driver!"字符串,表明我們的用戶態測試程序和驅動成功地進行了一次交互。

三、使用DevEco Device Tool進行驅動開發

上一小節介紹了OpenHarmony驅動的一般開發方法,那么有沒有更簡單的方法添加一款驅動呢?答案就是華為南向開發IDE——DevEco Device Tool。DevEco Device Tool最新版本已經集成了HDF驅動開發功能,下面介紹如何使用DevEco Device Tool進行驅動開發。

DevEco Device Tool下載鏈接:https://device.harmonyos.com/cn/develop/ide#download_release

1. 創建驅動

(1)導入工程

參考DevEco Device Tool手冊,通過npm或網絡下載的方式導入OHOS工程。

(2)使用HDF頁面工具創建新驅動,按照需求填寫Module名稱,工具將根據Module名稱創建對應驅動代碼與。

DevEco Device Tool將自動生成驅動實現代碼:

9b2055f4-3e41-11ec-82a9-dac502259ad0.png

7 Device Eco Tool 生成驅動代碼

為源碼文件自動生成編譯腳本:

9b9fadf4-3e41-11ec-82a9-dac502259ad0.png

8 Device Eco Tool 生成驅動編譯腳本

DevEco Device Tool還會在對應單板的驅動配置中生成驅動設備配置信息:

9bfb783c-3e41-11ec-82a9-dac502259ad0.png

9 Device Eco Tool 生成驅動配置信息

2. 修改驅動

DevEco Device Tool提供了快捷方式直達源碼、編譯腳本、配置文件,點擊鏈接修改相關文件,實現驅動功能。DevEco Device Tool自動生成代碼已經提供了DriverEntry的基礎實現,只需填充對應函數的實際功能即可。

3. 編譯版本

使用DevEco Device Tool build功能一鍵編譯版本,編譯輸出顯示在終端窗口:9cb753ea-3e41-11ec-82a9-dac502259ad0.png

11 Device Eco Tool編譯界面

4. 燒錄驗證

DevEco Device Tool提供了一站式的燒錄、調試環境。使用upload功能將編譯好的鏡像燒錄進開發板。9d136d6a-3e41-11ec-82a9-dac502259ad0.png

12 Device Eco Tool燒寫功能界面

燒錄過程和進度顯示在終端窗口

9d6ac830-3e41-11ec-82a9-dac502259ad0.png

圖13 Device Eco Tool燒寫輸出

四、總結

除了在此次HDC大會與大家分享驅動框架的設計和最新進展,開放原子基金會還在OpenHarmony公眾號、gitee社區等渠道發布了一系列技術分享、指導文檔等資料,歡迎大家關注并一起建設OpenHarmony驅動生態。

責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    454

    文章

    50430

    瀏覽量

    421874
  • 驅動
    +關注

    關注

    12

    文章

    1826

    瀏覽量

    85181
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2634

    瀏覽量

    66220
  • HarmonyOS
    +關注

    關注

    79

    文章

    1967

    瀏覽量

    30025
  • OpenHarmony
    +關注

    關注

    25

    文章

    3661

    瀏覽量

    16159

原文標題:HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐

文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    拓維信息旗下開鴻智谷精彩亮相OpenHarmony開發者大會2024

    5月25日,以“鴻心聚力智引未來”為主題的OpenHarmony開發者大會2024(以下簡稱“大會”)在深圳成功舉辦。大會以OpenHarmony4.1Release版本根技術特性解讀為契機,聚焦
    的頭像 發表于 05-31 08:14 ?460次閱讀
    拓維信息旗下開鴻智谷精彩亮相<b class='flag-5'>OpenHarmony</b>開發者大會2024

    開鴻智谷與OpenHarmony的創新對話

    OpenHarmony4.1Release版本根技術特性解讀為契機,聚集廣大開發者、生態伙伴、行業領袖與百位技術專家共同討論技術話題。開鴻智谷作為互聯互通核心成員,不僅在現場榮獲多項獎項及授牌,同時多名
    的頭像 發表于 05-29 08:30 ?448次閱讀
    開鴻智谷與<b class='flag-5'>OpenHarmony</b>的創新對話

    OpenHarmony開發者大會2024:誠邁科技多項榮譽加冕再證實力

    5月25日,OpenHarmony開發者大會2024在深圳成功舉辦。大會以OpenHarmony 4.1 Release版本根技術特性解讀為契機,聚焦技術革新和社區生態進展
    的頭像 發表于 05-27 18:14 ?781次閱讀
    <b class='flag-5'>OpenHarmony</b>開發者大會2024:誠邁科技多項榮譽加冕再證實力

    專家解讀 | NIST網絡安全框架(1):框架概覽

    本文主要探討NIST CSF框架的起源目標、內容組成,及其在網絡安全風險管理中的關鍵作用,通過采用該框架,組織能夠更有效地實施風險識別、安全保護、威脅檢測和事件響應,從而構建更加堅固和彈性的網絡安全基礎設施。
    的頭像 發表于 05-06 10:30 ?1316次閱讀
    專家<b class='flag-5'>解讀</b> | NIST網絡安全<b class='flag-5'>框架</b>(1):<b class='flag-5'>框架</b>概覽

    【六】Purple Pi OH開發板帶你7天入門OpenHarmony

    今天我們來從OpenHarmony簡介、環境搭建、創建第一個OpenHarmony項目等方面開始OpenHarmony應用開發的第一步。一.OpenHarmony簡介
    的頭像 發表于 03-14 08:31 ?493次閱讀
    【六】Purple Pi OH開發板帶你7天入門<b class='flag-5'>OpenHarmony</b>!

    介紹一種OpenAtom OpenHarmony輕量系統適配方案

    本文在不改變原有系統基礎框架的基礎上, 介紹了一種OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)輕量系統適配方案。
    的頭像 發表于 03-05 09:24 ?1066次閱讀
    介紹一種OpenAtom <b class='flag-5'>OpenHarmony</b>輕量系統適配方案

    OpenHarmony4.0源碼解析之媒體框架

    及 audio-source 插件調用音頻框架的播放及采集功能來實現音頻的播放與錄制;通過 surface-sink 調用圖形框架,video-decoder 調用解碼驅動
    的頭像 發表于 02-26 22:05 ?772次閱讀
    <b class='flag-5'>OpenHarmony</b>4.0源碼解析之媒體<b class='flag-5'>框架</b>

    【鴻蒙】OpenHarmony 4.0藍牙代碼結構簡析

    /master/api當前所有應用層接口統一歸并到interface倉;api 10中藍牙接口按照profile拆分了多個d.ts文件 框架層https://gitee.com/openharmony/communication_bluetooth該倉之前包含
    的頭像 發表于 02-26 16:08 ?1496次閱讀
    【鴻蒙】<b class='flag-5'>OpenHarmony</b> 4.0藍牙代碼結構簡析

    OpenHarmony 之 NAPI 框架介紹

    環境中的 JS 變量與方法。 OpenHarmony 中的 NAPI OpenAtom OpenHarmony(以下簡稱 “OpenHarmony”)應用層基于 javascript 語言開發,而系統
    的頭像 發表于 02-01 17:34 ?653次閱讀
    <b class='flag-5'>OpenHarmony</b> 之 NAPI <b class='flag-5'>框架</b>介紹

    智能制造,創新未來 | OpenHarmony Meetup 2023南京站圓滿舉辦

    meetup線下交流形式,解讀OpenHarmony作為下一代智能終端操作系統的新版本及成果轉化,提升開發者對OpenHarmony的關注度,普及OpenHarmony開發技能,加速開
    的頭像 發表于 01-04 21:15 ?550次閱讀
    智能制造,創新未來 | <b class='flag-5'>OpenHarmony</b> Meetup 2023南京站圓滿舉辦

    資訊速遞 | 廈門大學OpenHarmony技術俱樂部正式揭牌成立

    個智能終端設備操作系統的框架和平臺,促進萬物互聯產業的繁榮發展。在OpenHarmony項目群技術指導委員會領導下,OpenHar
    的頭像 發表于 01-02 16:51 ?476次閱讀
    資訊速遞 | 廈門大學<b class='flag-5'>OpenHarmony</b>技術俱樂部正式揭牌成立

    OpenHarmony開源GPU庫Mesa3D適配說明

    ,對下使用Gallium框架,屏蔽驅動差異。在RK3568中,panfrost對ARM GPU提供了非常好的開源驅動支持。 二、適配方法 在RK3568 GPU 開源庫mesa3D適配時,我們同時依賴
    發表于 12-25 11:38

    OpenHarmony MeetUp 2023 城市巡回-南京站

    。本次大會以“OpenHarmony 正當時——智能制造·創新未來”為主題,邀請開放原子開源基金會權威專家、高校專家學者、產業鏈代表企業、廣大開發者齊聚一堂,深入解讀 OpenHarmony 作為
    的頭像 發表于 12-22 12:10 ?520次閱讀
    <b class='flag-5'>OpenHarmony</b> MeetUp 2023 城市巡回-南京站

    教程分享!OpenHarmony之NAPI框架介紹

    是 C++語言實現的,這些接口可以幫助 C++代碼創建 JS 變量,或訪問 JavaScript 運行環境中的 JS 變量與方法。 OpenHarmony 中的 NAPI OpenAtom OpenHarmony(以下簡稱“OpenHa
    的頭像 發表于 11-30 12:15 ?1352次閱讀
    教程分享!<b class='flag-5'>OpenHarmony</b>之NAPI<b class='flag-5'>框架</b>介紹

    OpenHarmony Meetup 2023北京站圓滿舉辦

    meetup線下交流形式,解讀OpenHarmony作為下一代智能終端操作系統的新版本及成果轉化,提升開發者對OpenHarmony的關注度,普及OpenHarmony開發技能,加速開
    的頭像 發表于 11-28 21:10 ?613次閱讀
    <b class='flag-5'>OpenHarmony</b> Meetup 2023北京站圓滿舉辦