HAL層開發框架介紹

2021-07-05 07:23:16 字數 3832 閱讀 6012

android hal

層即硬體抽象層是google響應廠家「希望不公開原始碼」的要求推出的概念

1,源**和目標位置

源**: /hardware/libhardware目錄,該目錄的目錄結構如下:

/hardware/libhardware/hardware.c編譯成libhardware.so,目標位置為/system/lib目錄

android.mk中lib檔案預設使用local_module_path是等於target_out_shared_libraries的。

/hardware/libhardware/include/hardware目錄下包含如下標頭檔案:

hardware.h通用硬體模組標頭檔案hw_module_t和hw_get_module_by_class的定義

copybit.h copybit模組標頭檔案

gralloc.h gralloc模組標頭檔案

lights.h  背光模組標頭檔案

overlay.h overlay模組標頭檔案

qemud.h  qemud模組標頭檔案

sensors.h 感測器模組標頭檔案

/hardware/libhardware/modules目錄下定義了很多硬體模組

這些硬體模組都編譯成***.***.so,目標位置為/system/lib/hw目錄

2,hal層的實現方式

jni->通用硬體模組->硬體模組->核心驅動介面

具體一點:jni->libhardware.so->***.***.so->kernel

具體來說:android frameworks中jni呼叫/hardware/libhardware/hardware.c中定義的hw_get_module函式來獲取硬體模組,

然後呼叫硬體模組中的方法,硬體模組中的方法直接呼叫核心介面完成相關功能

3,通用硬體模組(libhardware.so)

(1)標頭檔案為:/hardware/libhardware/include/hardware/hardware.h

標頭檔案中主要定義了通用硬體模組結構體hw_module_t,宣告了jni呼叫的介面函式hw_get_module

hw_module_t定義如下:

typedef struct hw_module_t hw_module_t;

硬體模組方法結構體hw_module_methods_t定義如下:

typedef struct hw_module_methods_t hw_module_methods_t;

只定義了乙個open方法,其中呼叫的裝置結構體引數hw_device_t定義如下:

typedef struct hw_device_t hw_device_t;

hw_get_module函式宣告如下:

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

引數id為模組標識,定義在/hardware/libhardware/include/hardware目錄下的硬體模組標頭檔案中,

引數module是硬體模組位址,定義了/hardware/libhardware/include/hardware/hardware.h中

(2)hardware.c中主要是定義了hw_get_module函式和hw_get_module_by_class函式。load函式3個函式的實現。

從源**我們可以看出,hw_get_module完成的主要工作是根據模組id尋找硬體模組動態連線庫位址,然後呼叫load函式去開啟動態連線庫

並從動態鏈結庫中獲取硬體模組結構體位址。硬體模組路徑格式如下:

hal_library_path/id.prop.so

hal_library_path定義為/system/lib/hw

id是hw_get_module函式的第乙個引數所傳入,prop部分首先按照variant_keys陣列中的名稱逐一呼叫property_get獲取對應的系統屬性,

然後訪問hal_library_path/id.prop.so,如果找到能訪問的就結束,否則就訪問hal_library_path/id.default.so

舉例如下:

假定訪問的是camera模組,id定義為"camera"則系統會按照如下的順序去訪問檔案:

/system/lib/hw/ camera.[ro.hardware屬性值].so[ro.hardware]: [nufront-ns115-stick]

/system/lib/hw/ camera.[ro.product.board屬性值].so[ro.product.board]:

/system/lib/hw/ camera.[ro.board.platform屬性值].so[ro.board.platform]: [ns115]

/system/lib/hw/ camera.[ro.arch屬性值].so so[ro. arch]:

/system/lib/hw/ camera.default.so

6,hal編譯方法

應該是全部編譯。

camera hal module執行過程分析

1.  其初始化過程如下:

system.loadlibrary(「camera_runtime」)->jni_load()->register_android_hardware_camera-> androidruntime::registernativemethods;

system.loadlibrary("led_runtime")->jni_onload()->registermethods()-> ->env->registernatives(clazz,gmethods,sizeof(gmethods)/sizeof(gmethods[0]));

mediaserver->onfirstref 中使用下面的**load camera的so檔案到記憶體中。 

if (hw_get_module(camera_hardware_module_id,

(const hw_module_t **)&mmodule) < 0) ,

get_number_of_cameras : hal_getnumberofcameras,

get_camera_info       : hal_getcamerainfo

2.接下來看一下hw_get_module()函式。

hw_get_module()->property_get(variant_keys[i],prop,null)->__system_property_get(key, value) ->__system_property_find(const char *name)-> __system_property_read(pi, 0, value)-> load(id, prop, &hmi)->snprintf(path,sizeof(path), "%s/%s.%s.so", hal_library_path, id, variant)-> handle = dlopen(path, rtld_now)-> const char *sym = hal_module_info_sym_as_str; hmi = (const struct hw_module_t *)dlsym(handle, sym)

其實就是把camera的so檔案camera.default.so檔案load進來。

3. 最後我們看一下property_get(variant_keys[i],prop,null)

這個其實就是獲取 ro.hardware屬性,我們關心的就是這個值是什麼。

簡單的獲取方法是adb shell中getprop直接去找需要的人名字的數值。

**流程上則需要更詳細的了解property_set和property_get的實現了。

Android HAL層開發框架介紹

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

android系統開發 HAL層開發基礎

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

硬體抽象層 HAL

本章主要講硬體抽象層 hal硬體抽象層是建立在linux驅動之上的一套程式庫。這套程式庫並不屬於linux核心,而是屬於linux核心層上的應用層。google為android加入hal主要有以下目的 統一硬體的呼叫介面。由於hal有標準的呼叫介面,所以可以利用hal遮蔽了linux驅動複雜 不統一...