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...