1、HAL硬件抽象層是創建在Linux驅動之上的一個程序庫。屬於Linux內核層上的應用層,添加它的主要緣由是儘可能避免應用程序直接訪問Linux驅動,保護我的的商品利益,傳統的Linux驅動通常有兩種類型的代碼:訪問硬件寄存器的代碼和業務邏輯的代碼。linux
2、如何編寫一個支持HAL的Linux驅動程序的主要步驟: (1)編寫Linux 驅動 「編寫Linux 驅動」,從代表上看是廢話,但若是要爲linux 驅動添加HAL,並且想盡可能保護敏感數據。Linux 驅動的代碼就要儘可能簡潔,儘量將業務邏輯放到HAL Library 中。 (2)編寫HAL HAL Library 就是普通的Linux Library (*.so )文件。但這類庫文件有一個接口。經過HAL MODULE_INFO SYM 變量實現。Service Library 就是經過在這個接口中定義的ID 定位HALLibrary的。 (3)編寫Service Library 儘管這步並非必需的,但新的HAL 架構要求咱們這樣作。Service Library 也是Linux Library 。這一步比較靈活。Service Library 能夠是通常的Linux Library,也能夠是JNI Library。架構
3、 Google爲Android加入HAL的主要目的: (1)統一硬件的調用接口。因爲HAL 有標準的調用接口,因此能夠利用HAL屏蔽Linux 驅動複雜、不統一的接口。函數
(2)解決了GPL版權問題。因爲Linux 內核基於GPL協議,而Android 基於Apache Licence 2 . 0、協議。所以Google 玩了個「穿越「,將本來位於Linux驅動中的敏感代碼向上移了一個層次。這樣這些敏感代碼就擺脫了GPL 協議的束縛, 那些不想開源的Linux驅動做者也就不必開源了。接口
(3)針對一些特殊的要求。對於有些硬件,可能須要訪一些用戶空間的資源,或在內核空間不方便完成的工做以及特殊需求。在這些狀況下,能夠利用位於用戶空間的HAL代碼來輔助Linux驅動完成一些工做。資源
4、編寫hal模塊的步驟與原理:變量
(1)、定義結構體與宏module
(2)、編寫hal模塊的open函數原理
(3)、定義hw_module_methods_t結構體變量硬件
(5)、定義HAL_MODULE_INFO_SYM變量程序
(6)、編寫hal模塊的close函數
(7)、編寫控制led的函數