HAL是建立在Linux驅動之上的的程式庫,他是一個應用層,它的作用保護內部私有。有一種是位於Android層次的系統運行庫層,Linux中只保留與寄存器相互的代碼,通過HAL進行數據的傳遞。 為Android加入HAL的主要目的是: 統一硬體的調用介面。 解決GPL版權問題。 資源等特殊要求。 這 ...
HAL是建立在Linux驅動之上的的程式庫,他是一個應用層,它的作用保護內部私有。有一種是位於Android層次的系統運行庫層,Linux中只保留與寄存器相互的代碼,通過HAL進行數據的傳遞。
為Android加入HAL的主要目的是:
統一硬體的調用介面。
解決GPL版權問題。
資源等特殊要求。
這個是新版的Android HAL架構,與原來的區別增加了新的代碼入口。他只需要用ID來定位,用Service程式庫。
在LED實驗中可以加入HAL,他不需要關心他們之間的交互方式,像普通的API就可以交互,將所有的邏輯從LED驅動移動到HAL模塊,而先前的LED驅動只保留讀寫寄存器的功能。
編寫一款支持HAL的Linux驅動程式的步驟:
- 編寫Linux驅動
- 編寫HAL Library
- 編寫Service Library
新改進了以後的LED的build.sh的腳本可以支持多個設備,處理多個設備,而不需要每一次都去關閉Android模擬器。
在測試讀寫寄存器時,因為是LED接受的不是字元串,而是位元組類型的數據,因此以位元組形式輸入在進行測試即可。
編寫調用LED驅動的HAL模塊
HAL規定不能直接使用hw_module_t結構體,因此在外部還要加一層結構體,要使用led函數指針,定義打開和關閉的指針。設置文件的句柄,控制LED開關的通用函數,根據它的開關輸出響應的日誌信息,存儲發送被設置文件或者從設備接收的數據,設置第一個位元組為讀取GPMDAT寄存器數據的狀態,讀取數據,保留有關數據。使用switch…case語句調用led;打開指定的led,led_off控制led,關閉設備函數;在初始化寄存器,打開設備為其分配記憶體空間,先清零,在設置。
總結它的原理和步驟:
- 定義結構體和巨集定義
- 編寫HAL模塊的open函數
- 定義he_module_methods結構體變數
- 定義HAL_MODULE_INFO_SYM變數
- 編寫HAL模塊的close函數
- 編寫控制LED的函數
在Android系統中使用Linux驅動有兩種方式:傳統方式直接與Linux驅動交互,例如讀取文件;還有就是HAL:本質上就是通過Linux共用庫(.so)與Linux驅動交互,然後再訪問Linux共用庫。