HAL 硬件抽象層介紹
和你一起終身學(xué)習(xí),這里是程序員 Android
本篇文章主要介紹?Android?開發(fā)中的部分知識點(diǎn),通過閱讀本篇文章,您將收獲以下內(nèi)容:
一、HAL 概述
二、HAL 模塊介紹
三、HAL 設(shè)備介紹
四、構(gòu)建HAL模塊
一、HAL 概述
HAL定義了供硬件供應(yīng)商實施的標(biāo)準(zhǔn)接口,該接口使Android無需考慮底層驅(qū)動程序的實現(xiàn)。使用HAL可使您實現(xiàn)功能而不會影響或修改更高級別的系統(tǒng)。本頁介紹了較舊的架構(gòu),該架構(gòu)從Android 8.0開始不再受支持。對于Android 8.0及更高版本,請參見 HAL類型。
圖 1. HAL 組件
您必須為產(chǎn)品提供的特定硬件實現(xiàn)相應(yīng)的HAL(和驅(qū)動程序)。HAL實現(xiàn)通常內(nèi)置于共享庫模塊(.so文件)中,但是由于Android并未強(qiáng)制HAL實現(xiàn)與設(shè)備驅(qū)動程序之間進(jìn)行標(biāo)準(zhǔn)交互,因此您可以根據(jù)自己的情況采取最佳措施。但是,為了使Android系統(tǒng)能夠與您的硬件正確交互,您必須遵守每個特定于硬件的HAL接口中定義的合同。
為了確保HAL具有可預(yù)測的結(jié)構(gòu),每個特定于硬件的HAL接口都具有在中定義的屬性?hardware/libhardware/include/hardware/hardware.h。此界面允許Android系統(tǒng)以一致的方式加載正確的HAL模塊版本。HAL接口包含兩個組件:模塊和設(shè)備。
二、HAL 模塊介紹
模塊代表打包的HAL實現(xiàn),存儲為共享庫(.so file)。該?hardware/libhardware/include/hardware/hardware.h頭文件定義一個結(jié)構(gòu)(hw_module_t),其表示一個模塊,并包含元數(shù)據(jù),如版本,名稱,以及該模塊的作者。Android使用此元數(shù)據(jù)來正確查找和加載HAL模塊。
另外,該hw_module_t結(jié)構(gòu)包含指向另一個結(jié)構(gòu)的指針,該結(jié)構(gòu)包含指向hw_module_methods_t模塊的打開函數(shù)的指針。此開放功能用于啟動與HAL用作其抽象的硬件的通信。每個特定于硬件的HAL通常hw_module_t 使用該特定硬件的附加信息來擴(kuò)展通用結(jié)構(gòu)。例如,在攝像機(jī)HAL中,該camera_module_t結(jié)構(gòu)包含一個 hw_module_t結(jié)構(gòu)以及其他攝像機(jī)特定的函數(shù)指針:
typedef struct camera_module {
hw_module_t common;
int(* get_number_of_cameras)(void);
int(* get_camera_info)(int camera_id,struct camera_info * info);
} camera_module_t;
實現(xiàn)HAL并創(chuàng)建模塊struct時,必須將其命名為?HAL_MODULE_INFO_SYM。Nexus 9音頻HAL中的示例:
struct audio_module HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = AUDIO_MODULE_API_VERSION_0_1,
.hal_api_version = HARDWARE_HAL_API_VERSION,
.id = AUDIO_HARDWARE_MODULE_ID,
.name = "NVIDIA Tegra Audio HAL",
.author = "The Android Open Source Project",
.methods = &hal_module_methods,
},
};
三、HAL 設(shè)備介紹
設(shè)備會抽象您產(chǎn)品的硬件。例如,音頻模塊可以包含主要音頻設(shè)備,USB音頻設(shè)備或Bluetooth A2DP音頻設(shè)備。
設(shè)備由該hw_device_t結(jié)構(gòu)表示。類似于模塊,每種類型的設(shè)備都定義了泛型的詳細(xì)版本, hw_device_t其中包含針對硬件特定功能的功能指針。例如,audio_hw_device_t結(jié)構(gòu)類型包含指向音頻設(shè)備操作的函數(shù)指針:
struct audio_hw_device {
struct hw_device_t common;
/ **
*由音頻flinger用來枚舉受支持的設(shè)備
*每個audio_hw_device實現(xiàn)。
*
*返回值是audio_devices_t的1個或多個值的位掩碼
* /
uint32_t(* get_supported_devices)(const struct audio_hw_device * dev);
...
};
typedef struct audio_hw_device audio_hw_device_t;
除了這些標(biāo)準(zhǔn)屬性,每個特定于硬件的HAL接口都可以定義更多自己的功能和要求。有關(guān)詳細(xì)信息,請參見HAL參考文檔以及每個HAL的單獨(dú)說明。
四、構(gòu)建HAL模塊
HAL實現(xiàn)內(nèi)置于模塊(.so)文件中,并在適當(dāng)時由Android動態(tài)鏈接。您可以通過Android.mk為每個HAL實現(xiàn)創(chuàng)建文件并指向源文件來構(gòu)建模塊。通常,必須以特定格式命名共享庫,以便可以找到并正確加載它們。各個模塊的命名方案略有不同,但遵循以下一般模式:。
友情推薦
至此,本篇已結(jié)束,如有不對的地方,歡迎您的建議與指正。同時期待您的關(guān)注,感謝您的閱讀,謝謝!
分享到朋友圈吧,方便您使用時快速查找!
