HAL硬體抽象層是建立在Linux驅動之上的一套程式庫。這套程式庫並不屬於Linux核心,而是屬於Linux核心層上的應用層。在傳統的Linux系統中Linux驅動一般有兩種型別的程式碼。Google為Android加入HAL主要有以下目的:統一硬體的呼叫介面。由於HAL有標準的呼叫介面,所以可以利用HAL遮蔽了Linux驅動複雜、不統一的介面;解決了GPL協議;針對一些特殊的要求。對於一些硬體,可能需要訪問一些使用者空間的資源,或在核心空間不方便完成的工作以及特殊需求。在這種情況下,可以利用位於空間的HAL程式碼來輔助Linux完成一些工作。
本章實現的LED驅動包含了Linux驅動、HAL模組、Service程式庫、NDK程式和Java程式。
編寫HAL模組的步驟和原理如下:
- 定義結構體和巨集;
- 編寫HAL模組的open函式;
- 定義hw_module_methods_t結構體變數;
- 定義HAL_MODULE_INFO_SYM變數;
- 編寫HAL模組的close函式;
- 編寫控制LED的函式;
支援HAL的Linux驅動程式步驟如下:
1.編寫Linux驅動;
2.編寫HAL Library;
3.編寫Service Library;
HAL模組本質上就是通過Linux共享庫(.so)與Linux驅動互動,然後應用程式再訪問Linux共享庫與Linux驅動互動,然後應用程式再訪問Linux共享庫。每一個HAL共享庫指定一個ID,再利用這個ID配合一定的規則找到Linux共享庫。