在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

HDI接口中如何實現驅動入口

HarmonyOS開發者 ? 來源:OpenAtom OpenHarmony ? 作者: OAOH ? 2021-09-08 11:23 ? 次閱讀

HDI接口概述

HDF 驅動框架的一個重要功能是為系統提供穩定的統一的硬件接口,這樣才能保證系統服務可以運行在不同硬件上而不需要額外的適配工作,而HDI(Hardware Device Interfaces)正是為了實現該目的而設計。

HDI 是對硬件功能的較高層次抽象接口,各類外設完成 HDI 接口定義后便只會在 HDI 的兼容性規則下進行變更,從而保證接口的穩定性。具體的驅動實現不需要再重復定義 HDI 接口,只需要按需實現即可接入系統功能。

在不同量級的 OpenHarmony 系統上,HDI 存在兩種部署形態,IPC 模式和直通模式。

在輕量級 OpenHarmony 系統上,出于減小系統性能負載考慮,HDI 實現為用戶態共享庫,由系統服務直接加載 HDI 實現到自己進程中函數調用使用。HDI 實現封裝具體的用戶態-內核態交互過程,當需要訪問驅動程序時使用 IO Service 請求將消息通過 system call 方式調用到內核驅動實現。

在 OpenHarmony 系統上,HDI 以獨立服務進程方式部署,系統服務只加載 HDI 客戶端實現到自己進程中,實際業務運行在獨立進程中,客戶端通過 IPC 與服務端交互,便于架構解耦、權限管理。

HDI接口實現

直通模式為函數實現方式,無論調用還是實現都不需要其他組件支持即可實現,這里將重點分析 IPC 模式的實現。

HDI發布

HDI IPC 模式基于 OpenHarmony 系統通信框架的通用模型,但是因為驅動很多時候涉及到底層操作和多系統遷移的場景而使用C語言編寫,所以驅動框架還提供了 HDI 服務的 C 語言實現的基礎組件,C++實現則主要使用系統通信框架組件。

HDI 服務發布基于 UHDF(用戶態 HDF 驅動框架)實現,通用的服務發布實現如下。

1.實現驅動入口

int SampleDriverBind(struct HdfDeviceObject *deviceObject){ HDF_LOGE(“SampleDriverBind enter!”); static struct IDeviceIoService testService = { .Dispatch = SampleServiceDispatch, // 服務回調接口 }; deviceObject-》service = &testService; return 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_sampleDriverEntry = { .moduleVersion = 1, .moduleName = “sample_driver”, .Bind = SampleDriverBind, .Init = SampleDriverInit, .Release = SampleDriverRelease,};

HDF_INIT(g_sampleDriverEntry);

首先要添加一個 UHDF 驅動用于發布 IoService 服務,IoService 設備服務即為 HDI 服務實體。實現方式與 KHDF 驅動一致。

2.實現服務響應接口

int32_t SampleServiceOnRemoteRequest(struct HdfDeviceIoClient *client, int cmdId, 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; }}static int32_t SampleServiceDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply){ return SampleServiceOnRemoteRequest(client, cmdId, data, reply);}

當收到 HDI 調用時,服務響應接口“SampleServiceDispatch”將會被調用。

client 調用者對象,在用戶態驅動中暫時未支持

cmdId 調用命令字,用于區分調用的 API

data 調用入參序列化對象,在 IPC 調用場景為 parcel 對象的 C 語言封裝,入參需要使用序列化接口從 data 對象中獲取后再使用

reply 調用出參對象,需要返回給調用的信息寫入該序列化對象

如果 C++實現客戶端可以使用下面接口將 sbuf 對象轉換為 parcel 對象后操作:

int32_t SbufToParcel(struct HdfSBuf *sbuf, OHOS::MessageParcel **parcel);

3.UHDF 驅動配置

platform :: host { hostName = “sample_host”; priority = 50; sample_device :: device { device0 :: deviceNode { policy = 2; priority = 100; moduleName = “libsample_driver.z.so”; serviceName = “sample_driver_service”; } }}

參數說明:

host 一個 host 節點即為一個獨立進程,如果需要獨立進程,新增屬于自己的 host 節點

policy 服務發布策略,HDI 服務設置為 2

moduleName 驅動實現庫名

serviceName 服務名稱,請保持全局唯一性

因為 HDI 服務 C 和 C++實現使用的 IPC 組件不一樣,面向對象實現也不一致,所以在具體實現上存在一些差異。

HDI基礎組件 UHDF 框架為了支持 HDI 實現,提供了以下基礎組件(僅用于 C 語言 HDI 實現):

SBuf

SBuf 是同時支持 KHDF 和 UHDF 驅動 IoService 消息序列化的工具對象。在 UHDF IPC 通信場景中,SBuf 可以與系統 IPC 框架序列化對象 MessageParcel 對象(僅支持 C++)相互轉換,從而實現 C 和 C++實現的 IPC 互通。

常用 API 如下:

struct HdfSBuf;struct HdfSbufImpl;struct HdfRemoteService;

/** * @brief HdfSBuf類型定義。 * * @since 1.0 */enum HdfSbufType { SBUF_RAW = 0, /* 用于用戶態內核態通信的sbuf類型 */ SBUF_IPC, /* 用于跨進程通信的sbuf類型 */ SBUF_IPC_HW, /* 用于擴展的預留類型 */ SBUF_TYPE_MAX, /* sbuf類型最大值 */};

上述接口均有對應的寫入接口,不再一一列舉,可查閱官網API參考文檔。

RemoteService

RemoteService 對象和系統 IPC 框架中的 IRemoteObject 對象(僅支持 C++)對應并可以相互轉換,表示一個 IPC 對象。相關 API 說明:

// 消息分發器,用于服務端響應調用或者在客戶端發起調用struct HdfRemoteDispatcher { int (*Dispatch)(struct HdfRemoteService *, int, struct HdfSBuf *, struct HdfSBuf *);};

// RemoteService 死亡回調對象struct HdfDeathRecipient { void (*OnRemoteDied)(struct HdfDeathRecipient *, struct HdfRemoteService *);};

struct HdfRemoteService { struct HdfObject object_; struct HdfObject *target; struct HdfRemoteDispatcher *dispatcher; bool isHw;};// 以自定義的消息分發器實例化一個RemoteServicestruct HdfRemoteService *HdfRemoteServiceObtain( struct HdfObject *object, struct HdfRemoteDispatcher *dispatcher);

// 回收RemoteService對象void HdfRemoteServiceRecycle(struct HdfRemoteService *service);

// 添加RemoteService的死亡通知,如果對應RemoteService的進程異常退出,HdfDeathRecipient的回調接口將被調用void HdfRemoteServiceAddDeathRecipient(struct HdfRemoteService *service, struct HdfDeathRecipient *recipient);

基于 RemoteService 實現一個服務端的示例:

int SampleServiceStubDispatch( struct HdfRemoteService* service, int code, struct HdfSBuf *data, struct HdfSBuf *reply){ // IPC 調用響應接口 int ret = HDF_FAILURE; switch (code) { case SAMPLE_IF_0: { // do something break; } default: { ret = HDF_ERR_INVALID_PARAM; } } return ret;}bool SampleStubConstruct(){ // 構造消息分發器,實現消息處理回調 static struct HdfRemoteDispatcher dispatcher = { .Dispatch = SampleServiceStubDispatch};// 實例化RemoteService inst-》remote = HdfRemoteServiceObtain((struct HdfObject *)inst, &dispatcher); if (inst-》remote == NULL) { HDF_LOGE(“Device service manager failed to obtain remote service”); return false;}… …

直接基于 RemoteService 實現服務端只適用于需要實現匿名 IPC 服務的情況,基于 UHDF 發布 HDI 服務只需要實現 Driver 綁定的 IoService 即可。

RemoteService 客戶端對象只能從 SBuf HdfSBufReadRemoteService 接口獲取。

HDI實現

Driver 為 HDI 服務的驅動入口實現

IoService 為 HDI 服務的服務入口實現,IoService 的 Dispatch 方法中調用 ServiceStub 中的真正服務響應接口(OnRemoteRequest)

ServiceStub 為服務端實現對象,主要處理與 IPC 相關的業務邏輯,在這里完成參數反序列化后調用真正的 Service 實現接口,即 ServiceImpl 接口

ServiceImpl 為 HDI 接口的真正實現,這里不關注 IPC 過程,只實現函數接口。

驅動框架提供了實現的樣例代碼,可參考 gitee driver 代碼倉。

HDI接口調用

HDI驅動框架HDI接口

HDI 服務管理功能由驅動框架 DeviceManager 實現,所以驅動框架提供了 HDI 服務管理相關 HDI 接口。

C++實現:

namespace OHOS {namespace HDI {namespace ServiceManager {namespace V1_0 {

struct IServiceManager : public IRemoteBroker {public: DECLARE_INTERFACE_DESCRIPTOR(u“HDI.IServiceManager.V1_0”); // get()靜態方法用于獲取IServiceManager對象實例 static ::sptr《IServiceManager》 Get(); // GetService()接口是真正提供的HDI接口,用于查詢并獲取其他HDI服務的客戶端對象 virtual ::sptr《IRemoteObject》 GetService(const char* serviceName) = 0;};} // namespace V1_0} // namespace ServiceManager} // namespace HDI} // namespace OHOS

C 實現:

#ifdef __cplusplusextern “C” {#endif /* __cplusplus */

struct HDIServiceManager { struct HdfRemoteService *remote;

struct HdfRemoteService *(*GetService)(struct HDIServiceManager *self, const char* serviceName);};

struct HDIServiceManager *HDIServiceManagerGet(void);void HDIServiceManagerRelease(struct HDIServiceManager *servmgr);

#ifdef __cplusplus}#endif /* __cplusplus */

C 語言因為缺少原生的面向對象支持,這里我們采用 OOC 的實現,函數方法 HDIServiceManagerGet/Release 用于 HDIServiceManager 對象的實例化和釋放,HDI 接口關聯在接口對象內部成員中,與 C++實現類似。

HDI客戶端實現

HDI 客戶端同時支持 C 和 C++實現,實現方法較為簡單,只需 realize HDI 接口類即可。提供 C++實現基于系統 IPC 子系統的統一模型,C 語言基于 RemoteService 和 SBuf 組件實現,但是有一些公共的約定:

1.客戶端提供接口對象,接口與對象綁定且必須與 HDI 一致

2.提供服務接口對象的實例化和釋放接口。

3.客戶端實現 IPC 過程,只為調用者暴露函數化接口。

HDI接口調用

HDI 客戶端接口已經提供了服務獲取接口,調用者調用服務獲取接口后再調用服務對象方法即可完成 HDI 調用。

這里以服務管理 HDI 接口為例:

C++接口調用:

#include 《iservmgr_hdi.h》

void GetTestService(){ auto servmgr = IServiceManager::Get(); if (servmgr == nullptr) { HDF_LOGE(“failed to get IServiceManager”); return; }

auto sampleService = servmgr-》GetService(TEST_SERVICE_NAME); if (sampleService == nullptr) { HDF_LOGE(“failed to get TEST_SERVICE”); return; } // do something}

C 接口調用:

#include 《servmgr_hdi.h》

void GetTestService(){ struct HDIServiceManager *servmgr = HDIServiceManagerGet(); if (servmgr == nullptr) { HDF_LOGE(“failed to get IServiceManager”); return; }

struct HdfRemoteService *sampleService = servmgr-》GetService(servmgr, TEST_SERVICE_NAME); if (sampleService == nullptr) { HDF_LOGE(“failed to get TEST_SERVICE”); return; } // do something}

總結

本文介紹了 HDI 的總體方案,重點介紹了 HDI 的 IPC 模式具體實現方法和驅動框架能力,相信對讀者理解和使用 HDI 有所幫助。

責任編輯:haq

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

    關注

    33

    文章

    8697

    瀏覽量

    151945
  • HDI
    HDI
    +關注

    關注

    6

    文章

    202

    瀏覽量

    21358
  • HarmonyOS
    +關注

    關注

    79

    文章

    1983

    瀏覽量

    30588

原文標題:OpenHarmony HDF HDI基礎能力分析與使用

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    口中斷需要清除標志位嗎,串口中斷標志位會自動清除嗎

    在電子通信領域,串口中斷作為一種重要的通信機制,廣泛應用于各種嵌入式系統和計算機設備中。串口中斷標志位的管理,尤其是是否需要手動清除以及是否會自動清除,是理解和實現串口通信的關鍵環節。
    的頭像 發表于 01-29 14:59 ?117次閱讀

    高密度PCB(HDI)制造檢驗標準

    本標準是Q/DKBA3178《PCB檢驗標準》的子標準,包含了HDI制造中遇到的與HDI印制板相關的外觀、結構完整性及可靠性等要求。
    的頭像 發表于 12-25 17:04 ?433次閱讀
    高密度PCB(<b class='flag-5'>HDI</b>)制造檢驗標準

    HDI盲埋孔工藝及制程能力你了解多少?

    HDI技術通過 增加盲埋孔來實現高密度布局 ,適用于高端服務器、智能手機、多功能POS機和安防攝像機等領域。通訊和計算機行業對HDI線路板需求較高,推動了科技的進步。目前,HDI板在國
    的頭像 發表于 12-18 17:15 ?1411次閱讀
    <b class='flag-5'>HDI</b>盲埋孔工藝及制程能力你了解多少?

    淺談HDI同位二階的實現方式

    在PCB HDI疊構中有很多種類型,常見的是一階二階HDI,在前文《一文講透HDI的疊構有哪些?》中我們提到了1-N-1,2-N-2,在《今天聊一聊HDI的盲孔是怎么做出來的?》也講解
    的頭像 發表于 11-27 09:24 ?490次閱讀
    淺談<b class='flag-5'>HDI</b>同位二階的<b class='flag-5'>實現</b>方式

    HDI板盲孔制作常見缺陷及解決

    HDI板是一種高密度互連印刷電路板,其特點是線路密度高、孔徑小、層間連接復雜。在HDI板的制作過程中,盲孔的制作是一個關鍵步驟,同時也是常見的缺陷發生環節。以下是根據搜索結果總結的HDI板盲孔制作的常見缺陷及其解決方法。
    的頭像 發表于 11-02 10:33 ?360次閱讀

    HDI板電鍍與堆疊過程

    HDI線路板 HDI板是一種高性能的電路板材料,它具有高密度、高可靠性和高互連性的特點。HDI板的制造過程涉及多個關鍵步驟,其中包括電鍍和堆疊兩個重要環節。 電鍍過程 電鍍是HDI板制
    的頭像 發表于 10-28 19:32 ?220次閱讀
    <b class='flag-5'>HDI</b>板電鍍與堆疊過程

    PCB HDI產品的介紹

    PCB HDI(高密度互連 High Density Interconnector)產品是現代電子制造業中的重要組成部分,它通過先進的微孔技術和多層結構設計,實現了更高的電路密度和更短的電連接路徑
    的頭像 發表于 10-28 09:44 ?513次閱讀
    PCB <b class='flag-5'>HDI</b>產品的介紹

    如何判斷盲/埋孔HDI板有多少“階”?

    電路板內部,用于連接兩個或多個內層之間,從外部看是不可見的。 采用盲/埋孔設計可以實現更細密的線路布局, 減少信號傳輸路徑長度 ,從而有助于提升信號完整性和降低電磁干擾。盲/埋孔HDI板可以使用機械鉆孔或
    發表于 10-23 18:38

    高速ADC與FPGA的LVDS數據接口中避免時序誤差的設計考慮

    電子發燒友網站提供《高速ADC與FPGA的LVDS數據接口中避免時序誤差的設計考慮.pdf》資料免費下載
    發表于 10-15 09:50 ?6次下載
    高速ADC與FPGA的LVDS數據<b class='flag-5'>接口中</b>避免時序誤差的設計考慮

    HDI板在5G技術中的應用

    HDI能夠支持更高的線路密度,從而滿足5G通信中大量數據快速傳輸的要求,如5G基站與移動終端之間高速信號的傳輸處理。 2、縮短信號路徑減少衰減和干擾 HDI板可以實現更短的信號路徑,這有助于減少信號衰減和干擾。在5G通信頻段較
    的頭像 發表于 10-11 16:30 ?317次閱讀

    hdi線路板生產工藝流程

    HDI線路板是一種多層線路板,其內部布局復雜,通常需要使用高密度互連技術來實現HDI線路板的生產工藝流程十分繁瑣復雜,需要注意各種細節,才能夠生產出穩定可靠的高質量HDI線路板。
    的頭像 發表于 10-10 16:03 ?444次閱讀

    什么是HDI?PCB設計基礎與HDI PCB制造工藝

    隨著科技的發展,將更多功能集成在更小的封裝中的需求也隨之增長。使用高密度互連(HDI)技術設計的PCB通常更小,因為更多的元件被裝在更小的空間里。HDIPCB使用盲孔、埋孔和微孔、焊盤內孔以及非常細
    的頭像 發表于 07-22 18:21 ?4783次閱讀
    什么是<b class='flag-5'>HDI</b>?PCB設計基礎與<b class='flag-5'>HDI</b> PCB制造工藝

    hdi板怎么定義幾階 hdi板與普通pcb的區別

    HDI板通常采用多層結構,包括4層以上的層次。多層結構提供了更多的信號層、電源層和地層,支持復雜的信號傳輸和電路連接。相比之下,普通PCB可能采用較少的層次。
    的頭像 發表于 03-25 16:00 ?5726次閱讀

    HDI板與普通pcb板有哪些不同

    HDI板與普通pcb板有哪些不同
    的頭像 發表于 03-01 10:51 ?1543次閱讀

    Miniwiggler-JTAG接口中BRKOUT引腳可否不接?

    JTAG接口中BRKOUT引腳可否不接。在做XE164的接口時選擇了JTAG-B模式,剛好搞錯了,P10.11在JTAG-B模式中是TMS引腳和brkout復用了,可否將brkout斷開不接,因為在這里留了接口,本來想用0歐姆電
    發表于 02-20 08:08
    主站蜘蛛池模板: 欧美色欧美亚洲高清在线观看 | 亚洲日本欧美日韩高观看 | 真人一级一级特黄高清毛片 | 性做久久久久久免费观看 | 成人免费国产gav视频在线 | 国产在线视频不卡 | 日韩三级视频在线观看 | 国产簧片 | 美女视频一区二区三区 | 91综合网 | 六月丁香婷婷网 | 美女牲交毛片一级视频 | 四虎免费永久观看 | 天天爽夜夜 | 日本精品卡一卡2卡3卡四卡三卡 | 婷婷综合久久中文字幕蜜桃三 | 色多多在线观看 | 手机在线看 | 亚洲乱码尤物193yw在线播放 | 欧美性受一区二区三区 | 欧美一卡二三卡四卡不卡 | 国产色秀视频在线观看 | 色综合色综合色综合色综合 | 亚洲欧洲无码一区二区三区 | 天天好b | 一区二区三区网站在线免费线观看 | 一级免费看片 | 免费国产午夜高清在线视频 | 亚洲午夜精品久久久久久人妖 | 免费特黄 | 国产剧情麻豆三级在线观看 | 亚洲 丝袜 制服 欧美 另类 | 三级精品 | 美女全黄网站免费观看 | 激情五月网站 | 精品卡一卡二 卡四卡视频 精品噜噜噜噜久久久久久久久 | 久久影视免费观看网址 | 特级做a爰片毛片免费看一区 | 国产性videosgratis| 91人成网站色www免费 | 东京加勒比 |