成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony-HDF驅動框架介紹及加載過程分析

系統 OpenHarmony
OpenHarmony 系統 HDF 驅動框架主要由驅動基礎框架、驅動程序、驅動配置文件和驅動接口這四個部分組成。

??想了解更多內容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術社區??

??https://ost.51cto.com??

前言

HarmonyOS面向萬物互聯時代,而萬物互聯涉及到了大量的硬件設備,這些硬件的離散度很高,它們的性能差異與配置差異都很大,所以這要求使用一個更靈活、功能更強大、能耗更低的驅動框架。OpenHarmony系統HDF驅動框架采用C語言面向對象編程模型構建,通過平臺解耦、內核解耦,來達到兼容不同內核,統一平臺底座的目的,從而幫助開發者實現驅動一次開發,多系統部署的效果。

1、HDF 驅動框架

OpenHarmony 系統 HDF 驅動框架主要由驅動基礎框架、驅動程序、驅動配置文件和驅動接口這四個部分組成。

(1)HDF 驅動基礎框架提供統一的硬件資源管理,驅動加載管理以及設備節點管理等功能。驅動框架采用的是主從模式設計,由 Device Manager 和 Device Host 組成。Device Manager 提供了統一的驅動管理,Device Manager 啟動時根據 Device Information 提供驅動設備信息加載相應的驅動 Device Host,并控制 Host 完成驅動的加載。Device Host 提供驅動運行的環境,同時預置 Host Framework 與 Device Manager 進行協同,完成驅動加載和調用。根據業務的需求 Device Host 可以有多個實例。

(2)驅動程序實現驅動具體的功能,每個驅動由一個或者多個驅動程序組成,每個驅動程序都對應著一個 Driver Entry。Driver Entry 主要完成驅動的初始化和驅動接口綁定功能。

(3)驅動配置文件.hcs 主要由設備信息(Device Information)和設備資源(Device Resource)組成。Device Information 完成設備信息的配置。如配置接口發布策略,驅動加載的方式等。Device Resource 完成設備資源的配置。如 GPIO 管腳、寄存器等資源信息的配置。

(4)驅動接口 HDI(Hardware Driver interface )提供標準化的接口定義和實現,驅動框架提供 IO Service和IO Dispatcher 機制,使得不同部署形態下驅動接口趨于形式一致。

HDF框架以組件化的驅動模型作為核心設計思路,為開發者提供更精細化的驅動管理,讓驅動開發和部署更加規范。HDF框架將一類設備驅動放在同一個host里面,開發者也可以將驅動功能分層獨立開發和部署,支持一個驅動多個node,HDF驅動模型如下圖所示:

2、HDF 驅動開發

基于HDF框架進行驅動的開發主要分為兩個部分,驅動實現和驅動配置,詳細開發流程如下所示:

2.1 驅動實現

驅動實現包含驅動業務代碼和驅動入口注冊。

2.1.1 驅動業務代碼

//驅動對外提供的服務能力,將相關的服務接口綁定到HDF框架。

int32_t HdfSampleDriverBind(struct HdfDeviceObject *deviceObject)  
{
HDF_LOGD("Sample driver bind success");
return 0;
}

// 驅動自身業務初始的接口。

int32_t HdfSampleDriverInit(struct HdfDeviceObject *deviceObject)  
{
HDF_LOGD("Sample driver Init success");
return 0;
}

// 驅動資源釋放的接口。

void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject)   
{
HDF_LOGD("Sample driver release success");
return;
}

2.1.2驅動入口注冊到HDF框架

// 定義驅動入口的對象,必須為HdfDriverEntry(在hdf_device_desc.h中定義)類型的全局變量

struct HdfDriverEntry g_sampleDriverEntry =
{
.moduleVersion = 1,
.moduleName = "sample_driver",
.Bind = HdfSampleDriverBind,
.Init = HdfSampleDriverInit,
.Release = HdfSampleDriverRelease,
};
HDF_INIT(g_sampleDriverEntry);

// 調用HDF_INIT將驅動入口注冊到HDF框架中,在加載驅動時HDF框架會先調用Bind函數,再調用Init函數加載該驅動,當Init調用異常時,HDF框架會調用Release釋放驅動資源并退出。

2.2 驅動配置

驅動配置包含兩部分,HDF框架定義的驅動設備描述和驅動的私有配置信息。HDF使用HCS作為配置描述源碼,內容以 Key-Value 鍵值對為主要形式。它實現了配置代碼與驅動代碼解耦,便于開發者進行配置管理。HC-GEN (全稱 HDF Configuration Generator) 是 HCS 配置轉換工具,可以將 HDF 配置文件轉換為軟件可讀取的文件格式:在弱性能環境中,轉換為配置樹源碼,驅動可直接調用 C代碼獲取配置;在高性能環境中,轉換為 HCB(HDF Configuration Binary)二進制文件,驅動可使用 HDF框架提供的配置解析接口獲取配置。

HCS經過HC-GEN編譯生成HCB文件,HDF驅動框架中的HCS Parser模塊會從HCB文件中重建配置樹,HDF驅動模塊使用HCS Parser提供的配置讀取接口獲取配置內容。驅動配置過程的原理圖如下所示:

2.2.1 驅動設備描述(必選)

HDF框架加載驅動所需要的信息來源于HDF框架定義的驅動設備描述,因此基于HDF框架開發的驅動必須要在HDF框架定義的device_info.hcs配置文件中添加對應的設備描述,驅動的設備描述填寫如下所示:

sample_host :: host{
hostName = "host0"; //host名稱,host節點是用來存放某一類驅動的容器。
priority = 100; //host啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證host的加載順序。
device_sample :: device { //sample設備節點。
device0 :: deviceNode { //sample驅動的DeviceNode節點。
policy = 1; //驅動服務發布的策略
priority = 100; //驅動啟動優先級(0-200),值越大優先級越低,建議默認配 100,優先級相同則不保證 device 的加載順序
preload = 0; //驅動按需加載字段
permission = 0664;//驅動創建設備節點權限
moduleName = "sample_driver"; //驅動名稱,該字段的值必須和驅動入口結構的moduleName值一致
serviceName = "sample_service"; //驅動對外發布服務的名稱,必須唯一
deviceMatchAttr = "sample_config";//驅動私有數據匹配的關鍵字,必須和驅動私有數據配置表中的match_attr值相等。
}
}
}

2.2.2驅動私有配置信息(可選)

如果驅動有私有配置,則可以添加一個驅動的配置文件,用來填寫一些驅動的默認配置信息,HDF框架在加載驅動的時候,會將對應的配置信息獲取并保存在HdfDeviceObject 中的property里面,通過Bind和Init傳遞給驅動,驅動的配置信息示例如下:

root {  
SampleDriverConfig {
sample_version = 1;
sample_bus = "I2C_0";
match_attr = "sample_config"; //該字段的值必須和device_info.hcs中的deviceMatchAttr值一致
}
}

3、HDF 驅動加載

HDF驅動加載包括按需加載和按序加載。按需加載是HDF框架支持驅動在系統啟動過程中默認加載,或者在系統啟動之后動態加載;按序加載是HDF框架支持驅動在系統啟動的過程中按照驅動的優先級進行加載。HDF框架定義的驅動按需加載方式的策略是由配置文件中的 preload 字段來控制,preload 字段的取值范圍以及含義如下:

驅動的按序加載是通過配置文件中的 priority(取值范圍為整數 0 到 200)來決定的,priority 值越小,表示的優先級越高。驅動的加載順序,優先根據 host 的 priority 決定,如果host 的 priority 相同,再根據 host 內的驅動 priority 值來決定加載順序。

3.1 HDF_INIT宏展開

驅動入口注冊到HDF框架,會調用HDF_INIT函數將驅動入口地址注冊到HDF框架。

#define HDF_SECTION__attribute__((section(.hdf.driver”)))
#define HDF_DRIVER_INIT(module) \
const size_t USED_ATTR module##HdfEntry HDF_SECTION = (size_t)(&(module))

可以看到 HDF_INIT 宏是定義了一個“驅動模塊名+HdfEntry”的符號放到".hdf.driver"所在 section,該符號指向的內存地址即為驅動程序入口結構體的地址。這個特殊的 section 將用于開機啟動時查找設備驅動。

3.2獲取驅動列表

HDF驅動框架通過將驅動程序入口符號的地址集中存放到一個特殊的 section 來實現對驅動的索引,這個section的開頭和末尾插入了_hdf_drivers_start、_hdf_drivers_end兩個特殊符號,用于標記這個 section 的范圍,兩個特殊符號之間的數據即為驅動實現指針。

3.3獲取設備列表

配置文本編譯后會變成二進制格式的配置文件,其中設備相關信息被存放在一個用“hdf_manager”標記的 device_info 配置塊中,host的內容以塊的形式在device_info 塊中依次排列,host塊中記錄了host名稱、啟動優先級和設備列表信息。設備信息中的 moduleName字段將用于和驅動程序入口中的moduleName進行匹配,從而為設備匹配到正確的驅動程序,完成設備與驅動的匹配,具體流程圖如下:

3.4驅動框架啟動

late_initcall宏展開。

__define_initcall宏展開。

___define_initcall宏展開。

宏含義:

(1)聲明一個類型為initcall_t,名稱為__initcall_DeviceManagerInit的函數指針。

(2)將這個函數指針初始化為DeviceManagerInit。

(3)編譯的時候需要把這個函數指針變量放置到名稱為“.initcall7.init”的section中,其實質就是將這個函數DeviceManagerInit的首地址放置到了這個.initcall7.init的section中。

內核初始化的內存圖:

其中__init用來標示的是初始化函數,在初始化后不會再調用,__initdata是初始化數據,__initparam是初始化參數,其他7個初始化宏就是初始化函數會用到的,初始化的時候按。

照.initcall1.init->.initcall7.init的順序初始化。do_basic_setup執行.initcall1.init->.initcall7.init的順序初始化。

4、總結

(1)在系統啟動時,DeviceManagerInit通過late_initcall先啟動。

(2) Device Manager 根據 Device Information 信息,解析配置文件中的 Host 列表,根據 Host 列表中的信息來實例化對應的 Host 對象。

(3)Host遍歷設備列表去獲取與之匹配的驅動程序名稱,然后基于驅動程序名稱遍歷.hdf.driver section 獲得驅動程序地址。

(4)設備與驅動匹配成功之后,獲取指定驅動的入口地址,加載對應的設備驅動程序。

()調用指定驅動的 Bind 接口,用于關聯設備和服務實例。

(6)調用指定驅動的 Init 接口,用于完成驅動的相關初始化工作。

(7)如果驅動被卸載或者因為硬件等原因 Init 接口返回失敗,Release 將被調用,用于釋放驅動申請的各類資源。

??想了解更多內容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-09-07 15:48:28

鴻蒙HarmonyOS應用

2021-09-10 15:12:04

鴻蒙HarmonyOS應用

2021-09-08 15:09:29

鴻蒙HarmonyOS應用

2022-05-16 11:50:45

HDF驅動框架

2021-05-13 21:51:38

鴻蒙HarmonyOS應用

2023-09-14 15:49:42

PWM鴻蒙

2023-09-06 15:35:14

2022-04-01 15:18:04

HarmonyHDF 驅動鴻蒙

2021-09-10 15:10:50

鴻蒙HarmonyOS應用

2023-03-20 16:05:49

HDF傳感器驅動開發

2021-11-26 15:34:27

鴻蒙HarmonyOS應用

2023-03-16 15:18:16

2023-09-13 15:33:57

I2C鴻蒙

2022-04-21 11:26:31

鴻蒙操作系統

2021-11-30 14:52:41

鴻蒙HarmonyOS應用

2022-10-17 14:29:24

鴻蒙應用開發

2023-03-08 15:55:53

Linux驅動鴻蒙

2022-08-08 19:35:37

HDF驅動開發鴻蒙

2023-03-02 20:52:11

? PWM脈沖寬度調制

2023-03-22 09:23:53

I2C總線溫度傳感器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美久久一区二区 | 国产福利在线 | 欧美精品啪啪 | 一区视频| 久久精品国产一区二区电影 | 免费一级片 | 搞av.com | av电影一区 | 亚洲三级在线观看 | 秋霞在线一区二区 | 天天色天天射天天干 | 99精品免费久久久久久久久日本 | 三级视频久久 | 午夜精品一区二区三区在线视 | 请别相信他免费喜剧电影在线观看 | 亚洲av一级毛片 | 精品国产欧美一区二区三区不卡 | 午夜成人免费视频 | 黄色一级毛片 | 久久一视频 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美久久电影 | www.蜜桃av.com| 亚洲国产精品人人爽夜夜爽 | 欧美中文字幕一区二区三区亚洲 | 在线成人av| 成人国产在线观看 | 国产精品高清一区二区三区 | 色婷婷综合在线观看 | 国产高清一区二区三区 | 亚洲精品一区二区 | 久久久妇女国产精品影视 | 日韩在线视频观看 | 亚洲欧美aⅴ | 国产无套一区二区三区久久 | 成人做爰9片免费看网站 | 综合激情久久 | 欧美性生活免费 | 日本三级网 | 午夜一级大片 | 国产精品久久国产精品久久 |