Android HAL層庫載入原理

2021-10-08 10:30:04 字數 1921 閱讀 6555

android hal層庫載入原理

android hal層的由來:由於市面做移動晶元的廠商很多,大部分廠商考慮到自己硬體的設計架構、安全、專利等方面原因,不願意公開自己的這方面**,也出於不同廠商硬體架構不太一樣,適配開發難度周期長,google在kernel之上加了乙個hal層,只要各個廠商實現android 所需要的功能介面,可以以庫的方式提供不用開源。

問題來了,android如何實現針對不同的hardware module進行通用性呼叫的呢?

以載入camera hal層庫為例:

#define camera_hardware_nodule_id "camera"

首先在 void cameraservice::onfirstref()

............略..............

camera_module_t *rawmodule;

int err = hw_get_module(camera_hardware_module_id, (const hw_module_t **)&rawmodule);

............略..............

通過hw_get_module()函式以camera_hardware_module_id 引數獲得 camera_module_t 指標來初始化和呼叫cmaera 我們再看hw_get_module()的實現:

int hw_get_module(const char *id, const struct hw_module_t **module)

return hw_get_module_by_class(id, null, module);

而hw_get_module()又是通過 hw_get_module_by_class():

int hw_get_module_by_class(const char *class_id, const char *inst,

const struct hw_module_t **module)

.................核心看......................

return load(class_id, path, module);

static int load(const char *id,const char *path,const struct hw_module_t **phmi)

handle = dlopen(path, rtld_now);

if (handle == null)

camera_module_t hal_module_info_sym =

可以看到有乙個static hw_module_t camera_common變數的定義,就是我們通過dlsym()要獲取的變數型別,但是這個變數也不叫 hmi 啊,我們再看這變數是被camera_module_t hal_module_info_sym使用的,我們來看這個結構體定義:

typedef struct camera_module camera_module_t;

可以看出來 hw_module_t 是這個結構體的第乙個變數,這樣定義有個好處,可以實現類似c++的繼承效果,camera_module繼承於hw_module_t,可以通過hw_module_t控制camera_module,所以外面理論上應該通過hal_module_info_sym 獲得hw_module_t的,全域性搜尋hal_module_info_sym 發現所有的hal層模組都會有乙個hal_module_info_sym的定義,還發現hal_module_info_sym其實是個巨集定義:

#define hal_module_info_sym      hmi

也就是說

camera_module_t hal_module_info_sym = {

編譯解釋為:

camera_module_t hmi = {

這樣整個hal層呼叫通用性就解釋的通了。

android HAL層驅動對接例項

我們將通過裝置檔案 dev hello來連線硬體抽象層模組和linux核心驅動程式模組。二.進入到在hardware libhardware include hardware目錄,新建hello.h檔案 user name machine name android cd hardware libha...

Android HAL層開發框架介紹

android hal層即硬體抽象層是google響應廠家 希望不公開原始碼 的要求推出的概念 1,源 和目標位置 源 hardware libhardware目錄,該目錄的目錄結構如下 hardware libhardware hardware.c編譯成libhardware.so,目標位置為 s...

spring boot mybatis載入原理

在學習springboot原理的時候,一直想找個現實版的例項檢測和梳理下內容,於是著手打算從正在使用的mybatis試用開始。因為專案用到了tk.mybatis 因此直接從這個開始分析,慢慢梳理下 先從自動配置 開始mybatis的自動配置 auto configure org.springfram...