HAL 硬體抽象層介紹

程式設計師Android發表於2020-02-09

和你一起終身學習,這裡是程式設計師Android

本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收穫以下內容:

和你一起終身學習,這裡是程式設計師 Android

本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收穫以下內容:

一、HAL 概述
二、HAL 模組介紹
三、HAL 裝置介紹
四、構建HAL模組

一、HAL 概述

HAL定義了供硬體供應商實施的標準介面,該介面使Android無需考慮底層驅動程式的實現。使用HAL可使您實現功能而不會影響或修改更高階別的系統。本頁介紹了較舊的架構,該架構從Android 8.0開始不再受支援。對於Android 8.0及更高版本,請參見 HAL型別。HAL 硬體抽象層介紹圖 1. HAL 元件

您必須為產品提供的特定硬體實現相應的HAL(和驅動程式)。HAL實現通常內建於共享庫模組(.so檔案)中,但是由於Android並未強制HAL實現與裝置驅動程式之間進行標準互動,因此您可以根據自己的情況採取最佳措施。但是,為了使Android系統能夠與您的硬體正確互動,您必須遵守每個特定於硬體的HAL介面中定義的合同。

為了確保HAL具有可預測的結構,每個特定於硬體的HAL介面都具有在中定義的屬性 hardware/libhardware/include/hardware/hardware.h。此介面允許Android系統以一致的方式載入正確的HAL模組版本。HAL介面包含兩個元件:模組和裝置。

二、HAL 模組介紹

模組代表打包的HAL實現,儲存為共享庫(.so file)。該 hardware/libhardware/include/hardware/hardware.h標頭檔案定義一個結構(hw_module_t),其表示一個模組,幷包含後設資料,如版本,名稱,以及該模組的作者。Android使用此後設資料來正確查詢和載入HAL模組。

另外,該hw_module_t結構包含指向另一個結構的指標,該結構包含指向hw_module_methods_t模組的開啟函式的指標。此開放功能用於啟動與HAL用作其抽象的硬體的通訊。每個特定於硬體的HAL通常hw_module_t 使用該特定硬體的附加資訊來擴充套件通用結構。例如,在攝像機HAL中,該camera_module_t結構包含一個 hw_module_t結構以及其他攝像機特定的函式指標:

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;

實現HAL並建立模組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 裝置介紹

裝置會抽象您產品的硬體。例如,音訊模組可以包含主要音訊裝置,USB音訊裝置或Bluetooth A2DP音訊裝置。

裝置由該hw_device_t結構表示。類似於模組,每種型別的裝置都定義了泛型的詳細版本, hw_device_t其中包含針對硬體特定功能的功能指標。例如,audio_hw_device_t結構型別包含指向音訊裝置操作的函式指標:

struct audio_hw_device {
struct hw_device_t common;

/ **
*由音訊flinger用來列舉受支援的裝置
*每個audio_hw_device實現。
*
*返回值是audio_devices_t的1個或多個值的位掩碼
* /
uint32_t* get_supported_devices)(const struct audio_hw_device * dev);
...
};
typedef struct audio_hw_device audio_hw_device_t;

除了這些標準屬性,每個特定於硬體的HAL介面都可以定義更多自己的功能和要求。有關詳細資訊,請參見HAL參考文件以及每個HAL的單獨說明。

四、構建HAL模組

HAL實現內建於模組(.so)檔案中,並在適當時由Android動態連結。您可以通過Android.mk為每個HAL實現建立檔案並指向原始檔來構建模組。通常,必須以特定格式命名共享庫,以便可以找到並正確載入它們。各個模組的命名方案略有不同,但遵循以下一般模式:<module_type>.<device_name>

友情推薦

Android開發乾貨分享

至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

HAL 硬體抽象層介紹

分享到朋友圈吧,方便您使用時快速查詢!

相關文章