一、HAL層簡介
Android HAL層(Hardware Abstraction Layer硬體抽象層)是一種Android系統的硬體驅動架構,它的主要作用是提供一個硬體抽象層次給其他上層的框架(比如Android Framework層,Java層,Native層等)來訪問硬體。HAL層可以看做是硬體差異化的一個抽象,把所有不同平台、不同介面的硬體統一在一個介面下面並且對外提供一個相同的介面,這樣應用就可以直接調用這個介面完成操作,而不用關心底層封裝的細節。
HAL是一種基於C語言編寫的Nativelib庫,它暴露API常常以硬體的形式呈現,比如camera庫、audioflinger庫等。在Android系統啟動時,各個硬體模塊會通過HAL層載入,然後在系統整個生命周期中對應用程序的請求提供服務。在HAL層,硬體驅動程序會抽象為一個或多個模塊,每個模塊都有不同的作用,提供類似設備初始化、I/O訪問等服務。
下面我們來介紹幾個常見的HAL層API:
//camera的hal層API struct camera_module_t HAL_MODULE_INFO_SYM; struct camera_module_t { hw_module_t common; int (*get_number_of_cameras)(void); int (*get_camera_info)(int camera_id, struct camera_info *info); int (*set_callbacks)(const camera_module_callbacks_t *callbacks); void (*get_vendor_tag_ops)(vendor_tag_ops_t *ops); int (*open_legacy)(const struct hw_module_t* module, const char* id, uint32_t halVersion, struct hw_device_t** device); int (*set_torch_mode)(const char* camera_id, bool enabled); int (*init)(const struct camera_module_callbacks_t *callbacks); };
//audio的hal層API struct audio_module HAL_MODULE_INFO_SYM; struct audio_module { hw_module_t common; uint32_t (*get_supported_devices)(const struct audio_module *module); struct audio_device *(*get_device)(const struct audio_module *module, const char *name); int (*create_audio_patch)(const struct audio_module *module, unsigned int num_sources, const struct audio_port_config *sources, unsigned int num_sinks, const struct audio_port_config *sinks, audio_patch_handle_t *handle); int (*release_audio_patch)(const struct audio_module *module, audio_patch_handle_t handle); int (*get_audio_port)(const struct audio_module *module, struct audio_port *port); void (*set_audio_port_config)(const struct audio_module *module, const struct audio_port_config *config); };
二、HAL層開發流程
為了在Android系統中實現自己的硬體驅動,我們需要了解HAL層的開發流程,這個流程主要包括底層硬體驅動實現、HAL模塊實現和HAL介面部署,下面我們分別來講解:
- 底層硬體驅動實現:首先需要根據具體的硬體設備來編寫對應的硬體驅動程序,這個過程一般使用C或C++來編寫。硬體驅動編寫好後,需要編譯為動態庫文件,一般是為.so或者 .dll文件格式。
- HAL模塊實現:在HAL模塊實現中,我們需要定義硬體相關的抽象數據結構和HAL API介面之間的關係,通常我們會定義一個.h文件來定義這些介面,同時提供相應的.h和.cpp實現文件,以實現這些介面函數的功能。
- HAL介面部署:在HAL介面部署中,我們需要將我們實現好的HAL模塊部署到Android系統中,這裡我們有兩種方式來完成:第一種方式是直接將.so文件部署到$ANDROID_SYSTEM/lib/hw文件夾下;第二種方式是將.so文件和對應的.xml文件都打包成一個HAL module zip包,然後放到設備中的/system/vendor/,然後在設備重新啟動時,HAL層的庫文件會被自動載入。
三、HAL層開發注意點
在HAL層開發過程中,需要注意以下幾點:
- 高效處理多線程操作:在HAL層中,多線程運行是一個常見的使用場景,需要注意多線程並發訪問時的數據安全性。開發者需要注意鎖的使用,例如在camera HAL中,CPU控制器和ISP控制器需要使用鎖控制,以確保多線程操作能夠正常協作運行。
- 對硬體操作進行一些擴展:在有一些一些特定的設備實現中,硬體的操作可能比較特殊,比如需要將多個寄存器寫入一次操作中等。在HAL層中,需要增加對這些特定硬體的操作支持。
- 良好的適配性:對於HAL層開發,沒有標準的開發規範,每個供應商的開發方式都大不相同,所以作為一個HAL開發人員,需要確保你的HAL代碼是具有適配性的,兼容多種硬體設備,從而提供平台無關的代碼。
- 使用好模板:在Android HAL中,開發者需要定義一些基本的數據結構和函數,這些結構和函數是很多HAL模塊都有的,比如audio_hal_module_t和camera_module_t。HAL提供了一些模板代碼,可以把這些需要自己實現的結構初始化工作用代碼一次性完成,減輕開發者的工作量。
四、總結
本文介紹了Android HAL層的概念及開發流程,HAL層的重要性在於為其他上層框架提供硬體抽象,使得上層框架可以不用考慮如何訪問底層硬體設備。同時本文還介紹了HAL層開發時需要注意的一些問題。新手開發人員可以使用HAL層為自己的硬體設備編寫驅動程序,減輕了硬體驅動開發的負擔。
原創文章,作者:GNTJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147893.html