標籤:
1.每個硬體抽象層模組在核心中都對應一個驅動程式,硬體抽象層模組就時通過這些驅動程式來訪問硬體裝置的,它們是通過讀寫裝置檔案來進行通訊的。
硬體抽象層中的模組介面源檔案一般儲存在hardware/libhardware目錄中,為了方便起見,我們將虛擬硬體裝置freg在硬體抽象層中的模組名稱定義為freg,目錄結構如下:
hardware/libhardware/include/hardware/freg.h
hardware/libhardware/modules/freg/Android.mk
hardware/libhardware/modules/freg/freg.cpp
上述三個檔案分別對應模組的標頭檔、makefile檔案、源檔案。
2.HAL層的編譯步驟
首先要修改hardware/libhardware/modules下面的Android.mk檔案,如下:
hardware_modules := gralloc hwcomposer audio nfc nfc-nci local_time \ power usbaudio audio_remote_submix camera consumerir sensors vibrator \ tv_input fingerprint freginclude $(call all-named-subdir-makefiles,$(hardware_modules))
修改點:將freg加入到hardware_modules變數當中
編譯:mmm ./hardware/libhardware/modules
結果:會產生一個HAL層的動態庫,比如freg.default.so
3.查看freg.default.so
使用linux的nm工具可以查看動態庫的符號表,我們查看out/target/product/XXXX/symbols/system/lib/hw
目錄下面的freg.default.so動態庫檔案,命令如下:
nm freg.default.so
輸出:
00000549 t _ZL12freg_get_valP13freg_device_tPi0000059d t _ZL12freg_set_valP13freg_device_ti000004b9 t _ZL16freg_device_openPK11hw_module_tPKcPP11hw_device_t000004ad t _ZL17freg_device_closeP11hw_device_t00002084 d _ZL19freg_module_methods
我們就可以看到確實是有HAL層的函數被編入。
4.載入硬體抽象層模組
上面我們產生了硬體抽象層對應的.so檔案,那麼怎麼載入.so呢?Android系統中的硬體抽象層是由系統統一載入的,當調用者需要載入這些模組時,只要指定ID就可以了,在Android硬體抽象層中,負責載入硬體抽象層的函數是hw_get_module函數,原型如下:
int hw_get_module(const char *id, const struct hw_module_t **module);
比如我們傳入參數FREG_HARDWARE_MODULE_ID,即”freg”,函數內部找到相應的.so檔案,然後,最後調用load載入。
為Android添加HAL模組(轉)